其他分享
首页 > 其他分享> > L5 系统调用的实现 System Call

L5 系统调用的实现 System Call

作者:互联网

1 系统调用的直观实现

2 操作系统分割用户态和核心态

DPL (Destination Privilege Level) 目标段的特权级
CPL (Current Privilege Level) 当前段的特权级
RPL (Request Privilege Level)
特权级的数值从0到3,代表的特权级别从高到低
特权级高的段可以访问特权级低的段,也就是特权级数值小的段可以访问特权级数值大的段
特权级数值低的段(最低是0)可以访问特权级数值高的段(最高是3)

硬件来检查跨段间的访问是否合法

硬件提供了“主动进入内核的方法"

中断是进入内核的唯一方法


通过宏定义来展开成包含int指令的代码

下图中,可以根据上图右边的

 _syscall3(int, write, int, fd, const char *, buf, off_t, conut)

来对应下边的宏展开

下图中type对应int,name对应write,atype对应int,a对应fd,btype对应const char *,b对应buf,ctype对应off_t, c对应count
则展开后,代码为:
int write(int fd, const char * buf, off_t, count)
{
    long __res;
    __asm__ volatile("int 0x80":"=a"(__res):""(__NR_write),"b"((long)(fd)),"c"((long)(buf)),"d"((long)(count)));
   if(__res>=0)    return (int)__res; errno=-__res; return -1;}


其中__NR_write是中断函数表的索引,4代表的是sys_write函数的索引

int指令去查IDT表,找到中断转去哪个地方执行:

中断处理程序


其中_sys_call_table是一个中断函数的入口地址表,%eax在前面的代码中被赋值为了被调用的中断函数的位置,乘以的数字4表示一个地址在中断函数入口表中占4个字节。

再来看_sys_call_table


第四个位置(从0开始)放的是sys_write的地址



来自为知笔记(Wiz)

标签:__,int,res,特权,System,write,L5,Call,对应
来源: https://www.cnblogs.com/scnbhit/p/13956517.html