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