Linux系统调用

什么事系统调用

  • linux虚拟地址空间分为用户空间和内核空间
  • 用户空间不可直接访问内核空间,帝王班的内核空间可直接访问用户空间
  • 用户空间只能通过系统调用访问内核空间
  • 系统调用时内核提供的一组函数接口,使得用户空间上进程可以和内核空间交互

系统调用过程

  • 执行用户程序
  • 根据glibc中实现,取得系统调用号,将其存入EAX并执行int $0x80(128号中断)
  • 用户态可以传递变量、参数值给内核,内核态运行时候会保存用户进程的一些寄存器值等(上下文环境)
  • 触发中断后内核根据系统调用号执行对应的中断处理函数
  • 系统调用结束将访问址存入EAX,返回中断处理函数
  • 中断处理函数根据存储用户态进程上下文环境恢复用户态,同时用户态就获取了内核态函数执行的返回值

系统调用汇编

1
2
3
4
5
6
// pid = fork();
asm volatile(
"mov $0x2, %%eax\n\t" // 将fork的系统调用号2存到eax寄存器
"int $0x80\n\t" // 产生int 0x80中断
"mov %%eax,%0\n\t" // 将结果存入pid中
: "=m" (pid)

系统调用实现分析

待续

添加系统调用

待续