QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2791|回复: 4

求助:我的uClinux启动至romfs后码乱,参数传递出错

[复制链接]
发表于 2006-9-14 11:46:06 | 显示全部楼层 |阅读模式
我的系统为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[0xe3a0b000] * mov      r11,#0
012a0054[0xe49d0004]   ldr      r0,[r13],#4
012a0058[0xe1a0100d]   mov      r1,r13     //  <--破坏了R1(argv)
012a005c        [0xe0812100]   add      r2,r1,r0,lsl #2 // <-破坏了R2(env)
012a0060[0xe2822004]   add      r2,r2,#4
012a0064[0xe59f300c]   ldr      r3,0x012a0078 ; = #0x012b0984
012a0068[0xe59f400c]   ldr      r4,0x012a007c ; = #0x012b098c
012a006c        [0xe92d0010]   stmfd    r13!,{r4}
012a0070[0xeb00156f]   bl       0x12a5634  ; (_end + 0x8e9b4)  //?
012a0074[0xeb002611]   bl       0x12a98c0  ; (_end + 0x92c40) // ?
012a0078[0x012b0984]   smlawbeq r11,r4,r9,r0
012a007c        [0x012b098c]   smlawbeq r11,r12,r9,r0
012a0080[0xe1a0c00d] * mov      r12,r13  // 最终会执行至此,对应sash.c中的main(argc, argv, env)
012a0084[0xe92dd8f0]   stmfd    r13!,{r4-r7,r11,r12,r14,pc}
012a0088[0xe24cb004]   sub      r11,r12,#4
012a008c        [0xe24dd094]   sub      r13,r13,#0x94
012a0090[0xe1a04000]   mov      r4,r0
012a0094[0xe1a05001]   mov      r5,r1
012a0098[0xe1a07002]   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 [VIRTUAL 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界面,但执行应用大都是失败的,应该也是参数传递问题
发表于 2006-9-14 20:53:38 | 显示全部楼层

我也遇到相同的问题

可惜没有能得到解决啊!
回复

使用道具 举报

发表于 2006-9-14 21:11:43 | 显示全部楼层

解决方案

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

使用道具 举报

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

使用道具 举报

发表于 2006-9-23 10:27:35 | 显示全部楼层
编译器的错误啊,呵呵
编译器对代码有优化,因此对应特定的源码,必须使用对应的版本。
这个不足为奇:)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-19 22:19 , Processed in 0.091852 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表