ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

L5 系统调用的实现 System Call

2020-11-10 23:04:19  阅读:362  来源: 互联网

标签:__ int res 特权 System write L5 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有