系统相关
首页 > 系统相关> > 趣谈Linux操作系统随笔——4.0 系统调用:公司成立好了就要开始接项目

趣谈Linux操作系统随笔——4.0 系统调用:公司成立好了就要开始接项目

作者:互联网

系统调用:公司成立好了就要开始接项目

目录


1、系统调用的封装——glibc

open()函数为例子,进行源码分析,由于我们是在linux基础上进行分析,所以所在的文件目录结构为:sysdeps\unix

2、32位系统调用过程

sysdeps\unix\sysv\linux\i386目录下的sysdep.h文件,有DO_CALL的定义:

2.1 执行32位对应的DO_CALL

2.2 在DO_CALL中陷入内核ENTER_KERNEL

2.3 小结

img

在32位中实现系统调用,以open为例子,过程如下:

  1. 用户层执行open(char *pathname, int flags, mode_t mode);

  2. 进入glibc库:

    2.1 最终会调用DO_CALL(syscall_name, args),在其中进行:

    ​ 2.1.1 把系统调用号与参数保存到寄存器

    ​ 2.1.2 调用ENTER_KERNEL陷入内核

    ​ 2.1.2.1 通过push和SAVE_ALL将当前用户态的寄存器保存在pt_regs结构里面

    ​ 2.1.2.2 然后调用do_int80_syscall_32函数 ,进行系统调用(进入内核)

    ​ 2.1.2.2.1 将系统调用号从eax里面取出来

    ​ 2.1.2.2.2 根据系统调用号,#define ia32_sys_call_table sys_call_table系统调用表中找到相应的函数进行调用;

    ​ 2.1.2.2.3 寄存器中保存的参数取出来,作为函数参数

    ​ 2.1.3 调INTERRUPT_RETURN返回恢复用户态

3、64位系统调用过程

3.1 执行64位对应的DO_CALL

sysdeps\unix\sysv\linux\x86_64\sysdep.h文件下

/* The Linux/x86-64 kernel expects the system call parameters in
   registers according to the following table:

    syscall number	rax
    arg 1		rdi
    arg 2		rsi
    arg 3		rdx
    arg 4		r10
    arg 5		r8
    arg 6		r9

    */

# undef	DO_CALL
# define DO_CALL(syscall_name, args)		\
    DOARGS_##args				\
    movl $SYS_ify (syscall_name), %eax;		\
    syscall;

3.2 在DO_CALL中陷入内核syscall

3.3 小结

img

在64位中实现系统调用,以open为例子,过程如下:

  1. 用户层执行open(char *pathname, int flags, mode_t mode);

  2. 进入glibc库:

    2.1 最终会调用DO_CALL(syscall_name, args),在其中进行:

   2.1.1 把系统调用号与参数保存到寄存器

   2.1.2 调用syscall陷入内核

      2.1.2.1 通过pushq将当前用户态的寄存器保存在pt_regs结构里面

      2.1.2.2 然后调用do_syscall_64函数 ,进行系统调用(进入内核)

         2.1.2.2.1 将系统调用号从rax里面取出来

         2.1.2.2.2 根据系统调用号,在系统调用表sys_call_table中找到相应的函数进行调用;

         2.1.2.2.3 寄存器中保存的参数取出来,作为函数参数

   2.1.3 调USERGS_SYSRET64返回恢复用户态

4、系统调用表的生成(在Linux内核中)

4.1 32位系统调用表的生成

4.1.1 系统调用表的定义

4.1.2 系统调用表的声明

4.1.3 系统调用表的实现

以open函数为例子:

4.1.4 建立联系

4.1.5 系统调用表的最终

4.2 64位系统调用表的生成

4.2.1 系统调用表的定义

4.2.2 系统调用表的声明

4.2.3 系统调用表的实现

以open函数为例子:

4.2.4 建立联系

4.2.5 系统调用表的最终

5、总结

5.1 系统调用的封装

5.2 32位系统调用过程

5.3 64位系统调用过程

5.4 系统调用表的生成

标签:__,趣谈,4.0,syscall,echo,sys,调用,Linux,define
来源: https://blog.csdn.net/weixin_42813232/article/details/110062765