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