sc32440 arm linux2.6.30.4 系统调用(一)

这篇是关于软中断之前部分,也就是app中请求系统调用到cpu发出swi指令这段.

先说结论

1.通过r7传递syscall idx(open的话为5)

2.swi 指令的Comment Field部分固定传0

当然还要传递系统调用对应的内核响应函数参数,这个等第二篇出来了,再更新.

用户程序c代码

int main(int argc, char* argv[]) {
    int fd = 0;
    int val = (1 << 16 | 1);
    int ledNo = 0;
    int onOff = 0;

    // if(argc != 3) {
        // printf("usage %s lenNo(1-4) onOff(1|0)\r\n", argv[0]);
        // return -1;
    // }
    system("insmod /home/sky/1drv.km");
    sleep(1);
    // ledNo = atoi(argv[1]);
    // onOff = atoi(argv[2]);
    ledNo  = 2;
    onOff = 1;
    
    val = ledNo << 16 | onOff;
    //printf("lenNo=%d, onOff=%d\r\n", ledNo, onOff);
    
    //printf("open /dev/xyz\r\n");
    fd = open("/dev/xyz", O_RDWR);
    if(fd < 0) {
        printf("open failed.\r\n");   
        return -1;
    }
    write(fd, &val, 4);
    //printf("main exit\r\n");
    return 0;
}

 调试过程

$ arm-linux-gdb ./1.test
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux"...
(gdb) target remote s:2331
Remote debugging using s:2331
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x00000000 in ?? ()
(gdb) b main
Breakpoint 1 at 0x850c: file test.c, line 7.
(gdb) c
Continuing.

Breakpoint 1, main (argc=1971528, argv=0x1bd78c) at test.c:7
7           int fd = 0;
(gdb) l
2       #include <sys/stat.h>
3       #include <fcntl.h>
4       #include <stdio.h>
5
6       int main(int argc, char* argv[]) {
7           int fd = 0;
8           int val = (1 << 16 | 1);
9           int ledNo = 0;
10          int onOff = 0;
11
(gdb) l
12          // if(argc != 3) {
13              // printf("usage %s lenNo(1-4) onOff(1|0)\r\n", argv[0]);
14              // return -1;
15          // }
16          system("insmod /home/sky/1drv.km");
17          sleep(1);
18          // ledNo = atoi(argv[1]);
19          // onOff = atoi(argv[2]);
20          ledNo  = 2;
21          onOff = 1;
(gdb) l
22
23          val = ledNo << 16 | onOff;
24          //printf("lenNo=%d, onOff=%d\r\n", ledNo, onOff);
25
26          //printf("open /dev/xyz\r\n");
27          fd = open("/dev/xyz", O_RDWR);
28          if(fd < 0) {
29              printf("open failed.\r\n");
30              return -1;
31          }
(gdb) b 20
Breakpoint 2 at 0x8540: file test.c, line 20.
(gdb) b 27
Breakpoint 3 at 0x8564: file test.c, line 27.
(gdb) c
Continuing.

Breakpoint 3, main (argc=1971528, argv=0x1bd78c) at test.c:27
27          fd = open("/dev/xyz", O_RDWR);
(gdb) si
0x00008568      27          fd = open("/dev/xyz", O_RDWR);
(gdb) x/5i $pc
0x8568 <main+112>:      pop     {r5}            ; (ldr r5, [sp], #4)
0x856c <main+116>:      bx      lr
0x8570 <main+120>:      tst     r1, #1  ; 0x1
0x8574 <main+124>:      beq     0x8588 <main+144>
0x8578 <main+128>:      ldrb    r2, [r1], #1
(gdb) si
0x0000856c      27          fd = open("/dev/xyz", O_RDWR);
(gdb) i r lr
lr             0x76c58  486488
(gdb) x/10i 0x76c58-20
0x76c44:        mov     r4, r0
0x76c48:        add     r0, r5, r0
0x76c4c:        add     r6, r0, #1      ; 0x1
0x76c50:        ldr     r1, [pc, #1556] ; 0x7726c
0x76c54:        bl      0x84d0 <frame_dummy+12>
0x76c58:        mov     r2, #64 ; 0x40
0x76c5c:        mov     r0, r5
0x76c60:        mov     r1, r6
0x76c64:        bl      0x1b2e4
0x76c68:        ldr     r2, [sp, #12]
(gdb) si
0x00076c58 in ?? ()
(gdb) i r r2
r2             0xff010003       4278255619
(gdb) si
0x00076c5c in ?? ()
(gdb) i r r2
r2             0x40     64
(gdb) si
0x00076c60 in ?? ()
(gdb) i r r0
r0             0x1e4fa8 1986472
(gdb) x/10c 0x1e4fa8
0x1e4fa8:       47 '/'  115 's' 121 'y' 115 's' 47 '/'  99 'c'  108 'l' 97 'a'
0x1e4fb0:       115 's' 115 's'
(gdb) x/1s 0x1e4fa8
0x1e4fa8:        "/sys/class/tty/tty0/dev"
(gdb) x/10i $pc
0x76c60:        mov     r1, r6
0x76c64:        bl      0x1b2e4
0x76c68:        ldr     r2, [sp, #12]
0x76c6c:        cmp     r0, #0  ; 0x0
0x76c70:        strb    r2, [r5, r4]
0x76c74:        ble     0x76c94
0x76c78:        mov     r0, r6
0x76c7c:        ldr     r1, [pc, #1516] ; 0x77270
0x76c80:        add     r2, sp, #188    ; 0xbc
0x76c84:        add     r3, sp, #184    ; 0xb8
(gdb) si
0x00076c64 in ?? ()
(gdb) i r r1
r1             0x1e4fbc 1986492
(gdb) x/10i 0x1b2e4-20
0x1b2d0:        mov     r0, r4
0x1b2d4:        bl      0x8d00
0x1b2d8:        mov     r0, r5
0x1b2dc:        pop     {r4, r5, r6, lr}
0x1b2e0:        bx      lr
0x1b2e4:        push    {r4, r5, r6, lr}
0x1b2e8:        mov     r5, r1
0x1b2ec:        mov     r1, #0  ; 0x0
0x1b2f0:        mov     r4, r2
0x1b2f4:        bl      0x12d5b0
(gdb) si
0x0001b2e4 in ?? ()
(gdb) si
0x0001b2e8 in ?? ()
(gdb) si
0x0001b2ec in ?? ()
(gdb) si
0x0001b2f0 in ?? ()
(gdb) si
0x0001b2f4 in ?? ()
(gdb) x/10i 0x12d5b0-20
0x12d59c:       rsb     r2, r2, #0      ; 0x0
0x12d5a0:       str     r2, [r0, r3]
0x12d5a4:       mvn     r0, #0  ; 0x0
0x12d5a8:       b       0x12d588
0x12d5ac:       andeq   r1, r11, r0, lsr r4
0x12d5b0:       push    {r1, r2, r3}
0x12d5b4:       push    {r4, r5, r6, r7, r8, lr}
0x12d5b8:       sub     sp, sp, #12     ; 0xc
0x12d5bc:       ldr     r5, [sp, #36]
0x12d5c0:       ands    r2, r5, #64     ; 0x40
(gdb) si
0x0012d5b0 in ?? ()
(gdb) si
0x0012d5b4 in ?? ()
(gdb) i r r7
r7             0xffffffff       4294967295
(gdb) si
0x0012d5b8 in ?? ()
(gdb) si
0x0012d5bc in ?? ()
(gdb) i r r5
r5             0x1e4fbc 1986492
(gdb) x/10i $pc
0x12d5bc:       ldr     r5, [sp, #36]
0x12d5c0:       ands    r2, r5, #64     ; 0x40
0x12d5c4:       addne   r3, sp, #44     ; 0x2c
0x12d5c8:       strne   r3, [sp, #4]
0x12d5cc:       ldr     r3, [pc, #184]  ; 0x12d68c
0x12d5d0:       moveq   r4, r2
0x12d5d4:       ldr     r2, [r3]
0x12d5d8:       ldrne   r4, [sp, #40]
0x12d5dc:       cmp     r2, #0  ; 0x0
0x12d5e0:       mov     r6, r0
(gdb) si
0x0012d5c0 in ?? ()
(gdb) i r r5
r5             0x0      0
(gdb) si
0x0012d5c4 in ?? ()
(gdb) i r cpsr
cpsr           0x40000010       1073741840
(gdb) i r r3 sp
r3             0x766564 7759204
sp             0xbedea890       0xbedea890
(gdb) si
0x0012d5c8 in ?? ()
(gdb) i r r3 sp
r3             0x766564 7759204
sp             0xbedea890       0xbedea890
(gdb) si
0x0012d5cc in ?? ()
(gdb) si
0x0012d5d0 in ?? ()
(gdb) i r r3
r3             0x1e390c 1980684
(gdb) i r cpsr
cpsr           0x40000010       1073741840
(gdb) i r r4 r2
r4             0x40     64
r2             0x0      0
(gdb) si
0x0012d5d4 in ?? ()
(gdb) i r r4 r2
r4             0x0      0
r2             0x0      0
(gdb) x/10i $pc
0x12d5d4:       ldr     r2, [r3]
0x12d5d8:       ldrne   r4, [sp, #40]
0x12d5dc:       cmp     r2, #0  ; 0x0
0x12d5e0:       mov     r6, r0
0x12d5e4:       bne     0x12d61c
0x12d5e8:       orr     r1, r5, #131072 ; 0x20000
0x12d5ec:       mov     r2, r4
0x12d5f0:       mov     r7, #5  ; 0x5
0x12d5f4:       svc     0x00000000
0x12d5f8:       cmn     r0, #4096       ; 0x1000
(gdb) si
0x0012d5d8 in ?? ()
(gdb) i r r2
r2             0x0      0
(gdb) si
0x0012d5dc in ?? ()
(gdb) si
0x0012d5e0 in ?? ()
(gdb) si
0x0012d5e4 in ?? ()
(gdb) i r cpsr
cpsr           0x60000010       1610612752
(gdb) si
0x0012d5e8 in ?? ()
(gdb) si
0x0012d5ec in ?? ()
(gdb) si
0x0012d5f0 in ?? ()
(gdb) si
0x0012d5f4 in ?? ()
(gdb) x/1i $pc
0x12d5f4:       svc     0x00000000
(gdb) i r r7
r7             0x5      5
(gdb) x/1x 0x12d5f4
0x12d5f4:       0xef000000
(gdb)

 

 

目前还没看c库中c代码的open函数的实现,从下面可以看出这是一个动态链接的符号.

$ arm-linux-readelf -s 1.test
Symbol table '.dynsym' contains 12 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 000083e4     0 FUNC    GLOBAL DEFAULT  UND open@GLIBC_2.4 (2)

当然还有很多细节没深究.比如明明打开的是地/dev/xyz,哪个/sys/class/tty/tty0/dev是个什么鬼.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值