Linux退出功能

Linux退出功能,linux,linux-kernel,Linux,Linux Kernel,我试图理解linux系统调用机制。我正在读一本书,书中说退出函数是这样的(使用gdb): 我知道这是一个要退出的系统调用,但在我的Debian中,它看起来是这样的: jmp *0x8049698 push $0x8 jmp 0x80482c0 也许有人能解释一下为什么不一样?当我尝试在0x80482c0上执行disas时 gdb打印我: 没有函数包含指定的地址 另外,有人能给我一个很好的参考Linux内部资料(如Windows内部资料)吗 谢谢 您最可能调用的函数是C标准库中的

我试图理解linux系统调用机制。我正在读一本书,书中说退出函数是这样的(使用gdb):

我知道这是一个要退出的系统调用,但在我的Debian中,它看起来是这样的:

jmp    *0x8049698
push   $0x8
jmp    0x80482c0
也许有人能解释一下为什么不一样?当我尝试在0x80482c0上执行disas时 gdb打印我:

没有函数包含指定的地址

另外,有人能给我一个很好的参考Linux内部资料(如Windows内部资料)吗


谢谢

您最可能调用的函数是C标准库中的
exit()
(请参阅)。此函数是一个库函数,它依次调用
SYS\u exit
系统调用,但本身不是系统调用。在C程序反汇编中,您将看不到好看的
int0x80
代码。所有现有函数(
exit()
syscall()
等)都是从某个库中调用的,因此您的程序只调用该库,而这些函数不属于您的程序

如果您想确切地看到
int0x80
代码,可以在C应用程序中内联该asm代码。但是,这被认为是一种不好的做法,因为您的代码依赖于体系结构(在您的情况下,仅适用于x86体系结构)

有人能给我一个很好的参考Linux内部资料吗


代码本身是最好的最新参考。所有的书或多或少都过时了。还要查看内核源代码中的
Documentation/
目录。

您是如何在Debian上获得
jmp*0x8049698…
?你把程序分解了吗?谢谢你的回答。那么我在哪里可以看到int 0x80呢?我的意思是,退出函数的“OS”实现在哪里,这样我就可以看到实际的系统调用了?它应该在一个系统中,所以文件号?很高兴我能看到源代码,但我指的是更高级的机制。因为我是来自Windows世界的一名委员,我习惯了Windows机制。此外,在那本书中,作者编译了一个调用exit(0)的简单c程序,然后他可以看到exit函数实现(int 0x80):“gdb exit此gdb配置为“i386 redhat linux gnu”。。。(gdb)禁用函数的汇编器代码的退出转储程序:0x0804d9bc:MOV0x4(%esp,1),%ebx 0x0804d9c0:mov$0xfc,%eax 0x0804d9c5:int$0x80 0x0804d9c7:mov$0x1,%eax 0x0804d9cc:int$0x80 0x0804d9ce:hlt 0x0804d9cf:nop汇编器转储结束程序。@gtalst12实际的系统调用实现在glibc的某个地方。你可以查阅资料来源。或者,您可以使用
-static
标志编译您的C程序,这样您的程序二进制文件就嵌入了glibc。在这种情况下,您应该能够看到
int0x80
代码。好的,谢谢!我只是用-static做的,现在我可以看到int 80了!谢谢
jmp    *0x8049698
push   $0x8
jmp    0x80482c0