首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统调用实现

系统调用实现
EN

Stack Overflow用户
提问于 2012-10-08 14:26:20
回答 3查看 3.6K关注 0票数 4

如果用户应用程序进行系统调用,则会触发软件中断/异常。如何查看生成软件中断的源代码?

EN

回答 3

Stack Overflow用户

发布于 2012-10-09 03:18:42

Linux Assembly Howto中对此进行了说明。你应该阅读维基百科的syscall页面(也是关于VDSO的),还有intro(2) & syscalls(2)的手册页。另请参阅this answer和this one。也可以看看Gnu Libcmusl-libc的源代码。还要学习使用strace来找出由给定命令或进程发出的系统调用。

另请参阅与您的系统相关的calling conventions和应用程序二进制接口规范。对于x86-64,它是here

票数 9
EN

Stack Overflow用户

发布于 2012-10-08 16:33:47

很久很久以前,有一个进入内核的int 0x80陷阱,但现在sysenter是首选的。

你可以通过转储由内核自动映射到每个进程的vsyscall部分来获得代码。

代码语言:javascript
复制
$ cat /proc/self/maps 
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

有关更多信息,请查看this article

票数 3
EN

Stack Overflow用户

发布于 2012-10-08 15:21:23

可以使用英特尔x86汇编指令int n触发软件中断,其中n是中断号。系统调用是软件中断的一种特殊情况;在中,您可以通过以下方式手动执行系统调用

代码语言:javascript
复制
mov eax, m
int 0x80

其中m应替换为中断号。以下是链接到每个函数的在线手册页的32-bit syscall numbers64-bit syscall numbers列表。您还需要通过其他寄存器(ebxecx等)将参数传递给syscall,您可以阅读有关该here的更多信息。

这是执行syscall的最通用方法,因为它独立于外部库,如libc,如果需要,可以使用内联汇编在C/C++中实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12776340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档