我正在尝试了解linux系统调用机制。我正在读一本书,它在书中说退出函数看起来像那样(用gdb):
mov $0x0,%ebx
mov $0x1,%eax
80 int $0x80
我知道这是一个退出的系统调用,但在我的Debian中它看起来像是:
jmp *0x8049698
push $0x8
jmp 0x80482c0
也许有人可以解释一下为什么它不一样?当我尝试在0x80482c0上做disas时
gdb打印我:
没有函数包含指定的地址。
另外,有人可以给我一个很好的Linux Internals材料参考(作为Windows内部)吗?
谢谢!
答案 0 :(得分:1)
您最有可能调用的函数是来自C标准库的exit()
(请参阅man 3 exit)。此函数是一个库函数,它反过来调用SYS_exit
系统调用,但不是系统调用本身。您不会在C程序反汇编中看到漂亮的int 0x80
代码。所有现有函数(exit()
,syscall()
等)都是从某个库中调用的,因此您的程序只调用该库,而这些函数不属于您的程序。
如果您想要查看int 0x80
代码 - 您可以在C应用程序中内联asm代码。但是,这被认为是一种不好的做法,因为您的代码依赖于体系结构(在您的情况下仅适用于x86体系结构)。
有人可以给我一个很好的Linux Internals材料参考
代码本身是最新的参考。所有书籍或多或少都过时了。另请查看内核源代码中的Documentation/
目录。