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