当前位置: 澳门新濠3559 > 操作系统 > 正文

当用户态进程发起一个系统调用,一般现代CPU都

时间:2019-10-07 00:25来源:操作系统

原稿地址:https://learn-linux.readthedocs.io
玩转Linux旧群已满,请加新群:278378501。
接待关切大家的万众号:小菜学编制程序 (coding-fan)

动用程序 ( application program )与 库函数 ( libc )之间, 系统调用管理函数 ( system call handler )与 系统调用服务例程 ( system call service routine )之间, 均是日常函数调用,应该简单驾驭。 而 库函数 与 系统调用管理函数 之间,由于涉及客商态与内核态的切换,要复杂一些。

system_call是linux中颇负系统调用的入口点,每种系统调用起码有贰个参数,即由eax传递的种类调用号

当客户态进度调用叁个系统调用时,CPU切换来内核态并早先实践七个内核函数。
  • 在Linux中是透超过实际行int $0x80来实践系统调用的,那条汇编指令发出向量为128的编制程序万分
    系统调用号讲xyz和sys_xyz关联起来了

参照他事他说加以考察文献

  1. Serg Iakovlev
  2. write(2) - Linux manual page
  3. syscall(2) - Linux manual page
  4. _exit(2) - Linux manual page

澳门新濠3559 1

  • 文件汇报符 ,标准输出文件汇报符为 1 ;
  • 写入内容(缓冲区)地址;
  • 写入内容长度(字节数);

三个应用程序调用fork()封装例程,那么在实行int $0x80在此以前就把eax存放器的值置为2(即__NR_fork)
其一存放器的安装是libc库中的封装例程实行的,由此顾客日常不关怀系统调用号
进入sys_call之后,马上将eax的值压入内核仓库

system_call是linux中具备系统调用的入口点,每一种系统调用至少有三个参数,即由eax传递的系统调用号
  • 一个应用程序调用fork()封装例程,那么在实施int $0x80在此以前就把eax存放器的值置为2(即__NR_fork)。
  • 其一寄放器的设置是libc库中的封装例程进行的,因而客商日常不关切系统调用号
  • 进入sys_call之后,立时将eax的值压入内核宾馆

•寄放器传递参数具备如下限制:
•1)每种参数的长度不可能超过存放器的长度,即34人
•2)在系统调用号(eax)之外,参数的个数不能够超越6个(ebx,ecx,edx,esi,edi,ebp)
•超越6个如何是好? 若是越过五个,某三个存放器作为八个指南针指向一块内部存款和储蓄器,步向到内核态今后,它能够访谈具有的内部存款和储蓄器空间,能够经过那块内部存款和储蓄器来传递数据。


编制程序实施

上边,通过贰个简短的次序,看看应用程序如何在 用户态 计划参数并经过 int 指令触发 软中断 以陷入 内核态 执行 系统调用 :

.section .rodata

msg:
    .ascii "Hello, world!n"

.section .text

.global _start

_start:
    # call SYS_WRITE
    movl $4, 
	

编辑:操作系统 本文来源:当用户态进程发起一个系统调用,一般现代CPU都

关键词: 澳门新濠3559