simonla 发表于 2006-9-14 11:46:06

求助:我的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界面,但执行应用大都是失败的,应该也是参数传递问题

edward98321 发表于 2006-9-14 20:53:38

我也遇到相同的问题

可惜没有能得到解决啊!

edward98321 发表于 2006-9-14 21:11:43

解决方案

建议采用uClinux-dist-20040408.tar.gz ,应该不会发生上述问题.

simonla 发表于 2006-9-18 10:19:34

谢谢,我的确用的是uclinux.org上的dist-20051110,还没有找到20040408下载,所以暂时没有用你提供的方法,但奇怪的是skeEye仿真(按lumit提示的来,没有改地址的)是可以的啊,郁闷~...
我上周最后是按照那段反汇编代码的要求,写了个my_start_thread宏替代start_thread供do_execve()调用,在应用的栈顶加好所需的参数,就能成功执行命令了,当然,这是治标不治本,等有空我回头再查,还有些怀疑是不是我哪里配置不对,我会把结果及时反馈的...谢谢

good02xaut 发表于 2006-9-23 10:27:35

编译器的错误啊,呵呵
编译器对代码有优化,因此对应特定的源码,必须使用对应的版本。
这个不足为奇:)
页: [1]
查看完整版本: 求助:我的uClinux启动至romfs后码乱,参数传递出错