首页 文章

系统调用实现

提问于
浏览
4

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

3 回答

  • 8

    它在Linux Assembly Howto中解释 . 你应该阅读维基百科syscall页面(以及约VDSO),以及intro(2)syscalls(2)手册页 . 另见this回答和this一 . 另请参阅Gnu Libcmusl-libc源代码 . 还要学习使用 strace 来找出给定命令或进程发出的系统调用 .

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

  • 1

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

    您可以通过转储 vsyscall 部分来获取代码,该部分由内核自动映射到每个进程 .

    $ cat /proc/self/maps 
    blah blah blah
    ...
    blah blah blah
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    

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

  • 3

    可以使用Intel x86汇编指令 int n 触发软件中断,其中 n 是中断号 . 系统调用是软件中断的特例;在你可以手动做一个系统调用

    mov eax, m
    int 0x80
    

    其中 m 应替换为中断号 . 以下是链接到每个功能的在线联机帮助页的32-bit syscall numbers64-bit syscall numbers的列表 . 您还需要通过其他寄存器( ebxecx 等)将参数传递给系统调用,您可以阅读有关here的更多信息 .

    这是进行系统调用的最常用方法,因为它独立于外部库,如libc,如果需要使用内联汇编,可以在C / C中实现 .

相关问题