linux-0.11 系统调用过程

746

操作系统(Operating System,简称OS)是管理计算机硬件软件资源的计算机程序

先了解下指令:

0000 1001 1100 0110 1010 1111 0101 1000

系统调用:

调用自定义函数是通过 call 指令直接跳转到该函数的地址,继续运行。

操作系统和应用程序是隔离的,不可能直接操作调用

调用系统调用,是调用系统库中为该系统调用编写的一个接口函数

叫 API。API 并不能完成系统调用的真正功能,它要做的是去调用真正的系统调用,过程是:

  • 应用程序调用库函数(API);
  • API 将系统调用号存入 EAX,然后通过中断调用使系统进入内核态;
  • 内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
  • 系统调用完成相应功能,将返回值存入 EAX,返回到中断处理函数;
  • 中断处理函数返回到 API 中;
  • API 将 EAX 返回给应用程序。

以printf()为例看下调用过程

#include <stdio.h>  
int main(int argc,char * argv[]){

  printf("Input ok!");

  return -1;
}

#define __NR_write 4 是系统调用号,放在eax寄存器中,供系统内部使用

 linux/include/unistd.h

通过中断指令,会触发中断处理函数:

     中断处理程序 : system_call 

 linux/kernel/system_call.s  

通过中call sys_call_table(,%eax,4)     //a(,%eax,4)=a+4*eax

找到相应的系统调用处理函数入口

 include/linuxx/sys.h 

通过__NR_write=4找到对应的系统调用函数sys_write