如果用户应用程序进行系统调用,则会触发软件中断/异常 . 如何查看生成软件中断的源代码?
它在Linux Assembly Howto中解释 . 你应该阅读维基百科syscall页面(以及约VDSO),以及intro(2)和syscalls(2)手册页 . 另见this回答和this一 . 另请参阅Gnu Libc&musl-libc源代码 . 还要学习使用 strace 来找出给定命令或进程发出的系统调用 .
strace
另请参阅与系统相关的calling conventions和应用程序二进制接口规范 . 对于x86-64,它是here .
很久以前,有一个 int 0x80 陷阱进入内核,但现在 sysenter 是首选 .
int 0x80
sysenter
您可以通过转储 vsyscall 部分来获取代码,该部分由内核自动映射到每个进程 .
vsyscall
$ cat /proc/self/maps blah blah blah ... blah blah blah ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
有关更多信息,请查看this article
可以使用Intel x86汇编指令 int n 触发软件中断,其中 n 是中断号 . 系统调用是软件中断的特例;在你可以手动做一个系统调用
int n
n
mov eax, m int 0x80
其中 m 应替换为中断号 . 以下是链接到每个功能的在线联机帮助页的32-bit syscall numbers和64-bit syscall numbers的列表 . 您还需要通过其他寄存器( ebx , ecx 等)将参数传递给系统调用,您可以阅读有关here的更多信息 .
m
ebx
ecx
这是进行系统调用的最常用方法,因为它独立于外部库,如libc,如果需要使用内联汇编,可以在C / C中实现 .
3 回答
它在Linux Assembly Howto中解释 . 你应该阅读维基百科syscall页面(以及约VDSO),以及intro(2)和syscalls(2)手册页 . 另见this回答和this一 . 另请参阅Gnu Libc&musl-libc源代码 . 还要学习使用
strace
来找出给定命令或进程发出的系统调用 .另请参阅与系统相关的calling conventions和应用程序二进制接口规范 . 对于x86-64,它是here .
很久以前,有一个
int 0x80
陷阱进入内核,但现在sysenter
是首选 .您可以通过转储
vsyscall
部分来获取代码,该部分由内核自动映射到每个进程 .有关更多信息,请查看this article
可以使用Intel x86汇编指令
int n
触发软件中断,其中n
是中断号 . 系统调用是软件中断的特例;在你可以手动做一个系统调用其中
m
应替换为中断号 . 以下是链接到每个功能的在线联机帮助页的32-bit syscall numbers和64-bit syscall numbers的列表 . 您还需要通过其他寄存器(ebx
,ecx
等)将参数传递给系统调用,您可以阅读有关here的更多信息 .这是进行系统调用的最常用方法,因为它独立于外部库,如libc,如果需要使用内联汇编,可以在C / C中实现 .