Linux2.6对新型CPU快速系统调用的支持

http://tech.ddvip.com   2006年11月20日    社区交流

本文详细介绍Linux2.6对新型CPU快速系统调用的支持

  首先是一个静态编译的程序,代码很简单:

main() { getuid(); }

  将代码加上 static 选项用 gcc 静态编译,然后用 gdb 装载并反编译 main 函数。

[root@test opt]# gcc test.c -o ./static -static [root@test opt]
# gdb ./static (gdb) disassemble main 0x08048204 : 
push  %ebp 0x08048205 :  mov  %esp,%ebp 0x08048207 :  
sub  $0x8,%esp 0x0804820a :  
and  $0xfffffff0,%esp 0x0804820d :  
mov  $0x0,%eax 0x08048212 :  sub  
%eax,%esp 0x08048214 :  call  0x804cb20
<__getuid> 0x08048219 :  leave 0x0804821a :  ret

  可以看出,main 函数中调用了 __getuid 函数,接着反编译 __getuid 函数。

(gdb) disassemble 0x804cb20 0x0804cb20 <__getuid+0>:   
  push  %ebp 0x0804cb21 <__getuid+1>:    mov  
0x80aa028,%eax 0x0804cb26 <__getuid+6>:    mov 
 %esp,%ebp 0x0804cb28 <__getuid+8>:    test 
%eax,%eax 0x0804cb2a <__getuid+10>:    jle  
0x804cb40 <__getuid+32> 0x0804cb2c <__getuid+12>: 
   mov  $0x18,%eax 0x0804cb31 <__getuid+17>:   
 call  *0x80aa054 0x0804cb37 <__getuid+23>:   
pop  %ebp 0x0804cb38 <__getuid+24>:    ret

  上面只是 __getuid 函数的一部分。可以看到 __getuid 将 eax 寄存器赋值为 getuid 系统调用的功能号 0x18 然后调用了另一个函数,这个函数的入口在哪里呢?接着查看位于地址 0x80aa054 的值。

责编:豆豆技术应用

正在加载评论...