求助:我的uClinux启动至romfs后码乱,参数传递出错
我的系统为4510B(ADS+wiggler),因特殊原因用自写的bootloader,没有remap,所以类似44B0,内存从1000000开始,程序下载至100d000处执行,已经做了相关修改.uclinux的初始化正常,直至运行至/sbin/init 等开始调用romfs的应用程序,发现应用程序接收到的参数argv等是错误的,导致无法正常执行(串口输出附后),比如执行 /bin/sh /etc/rc 时,其入口为0x12f0050,但sash的main将报无法打开文件,纠其原因,是argv传入出错了,通过ADS跟踪,发现start_thread中传递参数没有出错,问题出在进入用户态后 1250050 处的这段入口函数破坏了R1,R2,而实际sash的main对应地址是 1250080 ,(从50~80这段代码出现在每段应用程序反汇编代码中,这是什么啊?)我刚刚开始接触uClinux,也不知究竟问题出在哪里,恳请各位DX帮忙,先谢过了~
入口反汇编:
// 在入口时各寄存器按start_thread传递的正常值
012a0050 * mov r11,#0
012a0054 ldr r0,,#4
012a0058 mov r1,r13 //<--破坏了R1(argv)
012a005c add r2,r1,r0,lsl #2 // <-破坏了R2(env)
012a0060 add r2,r2,#4
012a0064 ldr r3,0x012a0078 ; = #0x012b0984
012a0068 ldr r4,0x012a007c ; = #0x012b098c
012a006c stmfd r13!,{r4}
012a0070 bl 0x12a5634; (_end + 0x8e9b4)//?
012a0074 bl 0x12a98c0; (_end + 0x92c40) // ?
012a0078 smlawbeq r11,r4,r9,r0
012a007c smlawbeq r11,r12,r9,r0
012a0080 * mov r12,r13// 最终会执行至此,对应sash.c中的main(argc, argv, env)
012a0084 stmfd r13!,{r4-r7,r11,r12,r14,pc}
012a0088 sub r11,r12,#4
012a008c sub r13,r13,#0x94
012a0090 mov r4,r0
012a0094 mov r5,r1
012a0098 mov r7,r2
....
串口显示如下
Linux version 2.4.31-uc0 (root@chenz) (gcc version 2.95.3 20010315 (release)
.... ....
Blkmem 1 disk images:
0: 10CCAB8-11EEEB7 (RO) <ROMFS>
RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize
Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) <[email protected]>
eth0: 00:40:95:36:35:34
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
VFS: Mounted root (romfs filesystem) readonly.
Freeing init memory: 40K
### sys_execv /sbin/init/sbin/init <NULL> <NULL>p=12ffffc
start_thread(regs=0x1239f90, entry=0x12f0050, start_stack=0x12fffb4)// ~其实我跟踪这里simpleinit中的argv已经错了
### sys_execv /bin/sh/bin/sh /etc/rc <NULL>p=12bfffc
start_thread(regs=0x12e5fb8, entry=0x12a0050, start_stack=0x12bff9c)
Shell invoked to run file: <乱码>
<乱码> 文件无法打开 //~~~~当然了,被破坏了
以下就是跳过执行,最后可以进sash界面,但执行应用大都是失败的,应该也是参数传递问题
我也遇到相同的问题
可惜没有能得到解决啊!解决方案
建议采用uClinux-dist-20040408.tar.gz ,应该不会发生上述问题. 谢谢,我的确用的是uclinux.org上的dist-20051110,还没有找到20040408下载,所以暂时没有用你提供的方法,但奇怪的是skeEye仿真(按lumit提示的来,没有改地址的)是可以的啊,郁闷~...我上周最后是按照那段反汇编代码的要求,写了个my_start_thread宏替代start_thread供do_execve()调用,在应用的栈顶加好所需的参数,就能成功执行命令了,当然,这是治标不治本,等有空我回头再查,还有些怀疑是不是我哪里配置不对,我会把结果及时反馈的...谢谢 编译器的错误啊,呵呵
编译器对代码有优化,因此对应特定的源码,必须使用对应的版本。
这个不足为奇:)
页:
[1]