3.操作系统接口与系统调用

【README】

本文内容总结自 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;


【1】操作系统接口

0)用户使用计算机3种方式:

  • 命令行; 命令行执行 hello world
  • 图形界面;如计算机磁盘浏览器,c,d盘;
  • 应用程序;如word;

1)命令行

系统启动完成后, 会执行shell主体程序, 并打印出 /home/username/ 字符串; 并scanf 等待用户输入;用户输入后,执行函数 fork()  exec() 申请cpu执行 output.c 代码;
具体的:

  • 调用Fork() exec() ,实现对cpu使用;
  • 调用scanf() ,实现对键盘的使用;
  • 调用printf(),实现对显示器的使用;

【总结】命令行就是一段程序,程序调用了一些函数,来对计算机硬件进行使用

  • 无论命令行,还是图形界面,都是普通C程序;关键是调用了重要函数,这才可以操作计算机硬件;

【1.1】操作系统接口

1)操作系统接口:

  • 指的就是 重要函数,这些函数是操作系统对外提供的接口;即,接口表现为 函数调用,又由操作系统提供,所以称为系统调用 system call;
  • 所以操作系统接口就是系统调用

2)有哪些具体的操作系统接口? 或系统调用呢?

2.1)操作系统接口标准: POSIX ;为操作系统接口定义了统一的标准;可以让相同的应用程序可以在不同的操作系统上运行,即调用系统接口;

POSIX(可移植操作系统接口)是一个公认的工业标准。规范中的操作系统是POSIX兼容的。

2.2)到哪里去查询系统调用, posix 查询
X 通常都指 Unix, 这是惯例;
Posix 常用系统调用:

8.1 posix --The most common POSIX system calls.


【小结】什么是操作系统接口?被称为系统调用的函数;

  • 具体来说,如 fork,open,read,write 等函数(如上图);
  • 系统调用函数可以理解操作系统开放出来的操作操作系统的api;


【2】系统调用实现

【2.1】为啥不直接访问内核数据

不能直接访问内核内存,需要通过系统调用访问内核数据;

  • 原因在于 内核有很多关键数据是不能被外泄的,如root用户名密码,而且访问可能带来被恶意修改的问题;内核被修改,可能导致操作系统不可用,带来严重后果;(不能随意调用内核数据,不能随意jmp的原因)

【2.2】内核态与用户态

0)引入硬件设计,把内存分为内核段与用户段;计算机对内存的使用都是一段一段的使用;

  • 用户段的程序不能直接访问内核段的数据,只能通过系统调用接口来完成;
  • 用户段,内核段都需要段寄存器来做,两个段寄存器 CS DS,代码段寄存器,数据段寄存器;

1)如何区分 内核态与用户态

  •  0 表示内核态, 3 表示用户态;  

2)可以看下 DPL >= CPL

  • DPL- destination privilege level:用于描述目标内存段的特权级;存储在 GDT表中; 特权级数字越大,权限越低;(DPL存储在GDT中)
  • CPL-current privilege level: 当前特权级; (CPL存储在cs段寄存器中)

3)    DPL  CPL 有什么作用

  • 只有当当前特权级 CPL 小于等于 目标函数的DPL时,才允许访问;否则访问权限不足;(DPL CPL 数值越小,级别越高)

4)    用户态请求内核态

  • 用户态的DPL是3,在执行用户态时,会请求cs段寄存器,会把DPL赋值给cs中的CPL;
  • 而内核态的DPL是0;
  • 当用户态访问内核态时, 因CPL=3,而内核态DPL=0,权限不足,所以访问段寄存器就会报错了;

【例】用户态访问内核态权限不足

序号

代码

内存区域

描述

1

void main() {

         whoami();

}

用户态

特权级CPL=3,CPL保存在cs段寄存器中;

2

void whoami() {

         printf(100,8);

}

内核态

特权级CPL=0;

所以代码1 无法访问代码2 ;

CPL保存在cs段寄存器中;

 【补充】GDT

  • 一个GDT表项就描述一段内存;GDT表示整个操作系统,所以gdt表项,无论数据段还是代码段,对应gdt表项的DPL 全等于0;

5)那用户态如何访问内核态的代码呢?

  • 通过中断;计算机提供的唯一进入内核的方法,通过中断才能进入内核;

6)系统调用核心:

  • 用户程序中包含一段包含 int指令的代码;
  • 操作系统写中断处理,获取想调用程序的编号;
  • 操作系统根据编号执行代码;


【2.3】 系统调用具体实现

操作系统通过 int 0x80 这条中断指令,操作系统才能进去;

Printf() 调用 printf库函数, printf库函数调用 write库函数,write库函数调用 write系统调用;write库函数被编译成宏,需要用宏 _syscall3 来展开成一段包含 int 0x80中断的 汇编代码,因为 int 中断时进入内核的唯一方式;
【小结】

  • 所以系统调用细节从宏 _syscall3 开始说起;

【2.4】linux系统调用实现细节

1)syscall3 宏

通过实参我们知道;

  • type赋值为int;
  • name赋值为write;
  • atype赋值为int;
  • a赋值为fd;

把type,name,atype,a 替换为右边的值, 就会得到

int write(int a, int b, int c)
{long __res;__asm_volative // 这个是内嵌汇编指令;。。。。。。  
}

其中

  • “=a”(__res) :把 %eax寄存器数据 赋值给 __res 变量,作为返回值;
  •  “”(__NR_##name) 把 __NR_write赋值给 %eax 寄存器;
  • “b”(long(a)) 把fd赋值给 %ebx寄存器;
  • “c((long)b)” 把 b 赋值给%ecx 寄存器;
  • 其中, __NR_write 是系统调用号,用来标识是哪种系统调用, 如write 为 __NR_write , open为  __NR_open 等;

【补充】

  • syscall3 表示有3个参数;syscall2 表示有2个参数;

【总结】系统调用步骤

  • 把一个系统调用号 赋值给eax;
  • 调用 int 0x80 ,进入内核;(进入内核的唯一方法依靠int指令

【2.5】int 0x80 (中断指令)

1)int 中断指令, 要查询 IDT 表;通过IDT 找到中断要转到哪个地方去执行(转到哪个中断服务程序执行);

2) IDT 中断描述符表结构

处理函数入口点偏移

P

DPL

01110

段选择符

处理函数入口点偏移

 补充:

  • 中断是计算机设计中的里程碑的创新;

通过 set_system_gate(0x80, &system_call) 直到 0x80中断跑去 system_call 执行,即初始化 中断描述符表 IDT表;
当中断发生时,查找  IDT,找到中断处理函数入口地址,并跳转到中断处理函数执行;
3)看代码

_set_gate(&idt[n], 15, 3, addr) // idt 是中断向量表基址;

3赋值给 dpl;又main函数入口的调用程序的cpl等于3,所以main函数可以访问内核态;

  • 换句话说,int80的在IDT的初始化故意把dpl设置为3了

&system_call 赋值给 addr;0x0008 赋值给 段选择符;
所以 cs:ip = 8 : &system_call ;跳转到 cs:ip 去执行 system_call 这个函数
补充:

  • cs=0x0008;又 cs的最后两位表示CPL;所以 CPL = 00; 

CS段寄存器结构

0000

0000

0000

1000

main函数 发起系统调用,如 write;此时 CPL=3,是用户态;
write系统调用通过中断 int 0x80,从 IDT 中断描述符表 查找80中断的服务程序入口地址;
入口地址通过 cs:ip 来表示,其中cs=0x0008 ,由cs的最后两位表示CPL=00=0所以进入内核态调用 system_call 执行,特权级变成0了;

【总结】

  • 在初始化IDT的时候,80号中断的DPL设置为3, 故意让 CPL=3 的用户代码能够进来,一旦进来后,又由于 cs设置为0x0008 其CPL=00=0,所以进入内核态的system_call 执行;

【2.6】system_call 功能

1) 代码1:

movl 0x10, %edx  mov %dx, %ds  mov %dx, %es

把ds es 都设置为0x10 ;

补充:

0x08是内核的代码段;

0x10是内核的数据段;

 2) 代码2:

Call_sys_call_table (, %eax, 4) ;

根据 eax% 跳转到 sys_call_table 去执行; 其中 eax是 __NR_write,系统调用号;
即跳转到 _sys_call_table 为基址的,以 4*%eax 为偏移量的地址去执行;
为啥是4? 每个函数的指针为4个字节,32位;
也可以 把 sys_call_table 理解为函数表;


【2.7】函数表 sys_call_table (存储函数指针的表)

以 __NR_write=4为例,则下标为4的元素就是 sys_write ;

【小结】写文件调用过程

  • Step1)用户调用  printf; CPL=3;
  • Step2)printf 展成 int 0x80 ;而在 初始化 IDT时,把 80号中断服务处理程序设置为
  • sys_call;补充:80号中断的 IDT表项的DPL初始化为3 ;
  • Step3)调用 system_call 中断处理程序时, cs:ip=0x0008:&system_call,其中cs的DPL=0,所以 CPL=0,进入内核态;
  • (补充 cs=0x0008表示代码段,ds=0x10表示数据段)
  • Step4)system_call 根据传入的 系统调用号 __NR_write=4  会查询 sys_call_table 函数表项 得到 sys_write;
  • Step5)调用 sys_write 函数;

【问题】

main函数所在内存的DPL=3;whoami所在内存的DPL=0,所以main函数无法直接调用 whoami函数;

解决方法:硬件提供了唯一渠道,即中断,让用户态访问内存态的程序;

 

  • 步骤1)设置 eax=72,72等于 whoami函数的系统调用号;int 0x80 发生中断;
  • 步骤2)又 80号中断在IDT初始化时的中断服务程序是  system_call;
  • 步骤3)system_call 根据 eax=72 查询 sys_call_table 系统调用函数表的72号元素值 sys_whoami;
  • 步骤4)执行 sys_whoami() 函数;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle入门(十二A)之数据类型

Oracle数据类型 (1)char(2)varchar2(3)Number(4)Date(5)Blob、Clob、Nclob

在Linux以及Mac OS X启用F#

随着.NET Core的推进,如今我们在Linux和Mac OS X平台上也可以和原先Windows平台之下一样运行F#程序。Microsoft的F#项目经理David Stephens先生在Build 2016大会上向大家介绍了如何在Linux以及Mac OS X启用F#。 第一步需要安装.NET Core工具。这一步对于C#和F#来说是…

flask执行python脚本_如何在flask后端运行python脚本?

我有一个小瓶子应用程序,它接受用户输入并返回一些文本。在这里,用户输入被输入到另一个python脚本,比如temp.py,这个temp.py将返回一个应该返回给用户的值。例如:烧瓶.pyfrom flask import Flask, render_template, r…

4.操作系统历史

【README】 本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 【1】IBM7094 批处理操作系统: 一个job 一个job的顺序执行; 【2】 IBM OS360 1) 多道程序: 程序1 程…

Oracle入门(三)之连接与登录

一、启动Oracle服务 #cmd net start oracleserviceORCL net stop oracleserviceORCL二、进入SQLPLUS (1)没登录进入SQL C:\Users\mk>sqlplus /nolog #没有提示 (2)登录进入SQL C:\Users\mk>sqlplus C:\Users\mk>用户名:…

玩玩Xamarin Evolve 2016带来的新特性(三)-Xamarin Workbooks

编者语:五一祝各位劳动者快乐。今天是该系列文章的最后一篇,当然Evolve 2016还有很多很多的内容,但是我觉得iOS Simulator(for Windows), Xamarin Previewer ,以及Xamarin Workbooks是最为关键的三个技术,也是国内开发者比较关注的…

springboot单测用例

【README】 本文阐述了 springboot 单测开发方式&#xff1b; 【1】引入springboot 单测制品库&#xff1b; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.3.…

车联网 python_利用百度车联网提供的天气查询接口用python查询天气信息

(1)程序查询结果图(图中较下的图是百度查询天气的结果)(2)http://developer.baidu.com/map/carapi-7.htm 百度车联网接口说明中有天气查询的接口&#xff0c;目前是免费提供的(一天可以查询5000次)下表是接口返回的json数据。(表中##及后内容是为了方便的查看数据填写的){‘dat…

Oracle入门(六)之用户操作

定义&#xff1a;也叫方案&#xff0c;是一组逻辑对象的所有者。 验证方式&#xff1a;数据库验证和操作系统验证。 表空间和临时表空间&#xff1a;表空间为用户创建数据对象的存储表空间&#xff1b;临时表空间用于创建临时段。空间分配&#xff1a;表空间中&#xff0c;必须…

使用VS2015进行C++开发的6个主要原因

在今年的Build大会上&#xff0c;进行了“将你的C代码转移至VS2015的6个原因”的演讲&#xff0c;其中探讨了VS2015中对于C开发者们更有用的新功能。自从它在2015年七月的第一次发布后&#xff0c;VS2015一直在完善&#xff0c;并且比起对它的启动状态而言&#xff0c;它的两个…

Oracle入门(八)之权限

定义&#xff1a;控制用户在数据库中所能进行的操作权限 分类&#xff1a;系统权限和对象权限 一、系统权限 系统权限(system Privilege)&#xff1a;允许执行一组特定的命令CREATE SESSION 创建会话CREATE/DROP USER 创建用户CREATE/DROP VIEW 创建视图CREATE/DROP SEQUENCE 创…

window批处理命令启动nginx

【README】 本文阐述了编写window批处理命令启动&#xff0c;停止nginx&#xff1b; 【1】启动nginx 文件&#xff1a; nginx-start.bat d: cd d:\temp\nginx nginx -s stop taskkill /im nginx.exe /f ping 127.0.0.1 -n 3 -w 1000 > nul start nginx pause 补充&#…

arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平

说起来&#xff0c;中国芯的发展史称得上是一部磨难史&#xff0c;因为技术、设备、人才等都被西方国家封锁&#xff0c;就是为了让中国这个大市场巨额进口芯片。但这些年&#xff0c;中国的企业也没有闲着&#xff0c;可以说把世界上的主流的芯片架构尝试了个遍&#xff0c;就…

Oracle入门(十)之概要文件

一、概要文件作用 &#xff08;1&#xff09;功能控制用户对系统和数据库资源的使用&#xff0c;保证系统正常运行&#xff0c;防止用户消耗大量资源造成的系统性能下降。 &#xff08;2&#xff09;方法设置预定义资源参数。这些参数包含在概要文件中&#xff0c;如果没有为用…

ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”

在Linux上运行ASP.NET网站或webapi的传统步骤一般是先安装libgdiplus&#xff0c;再安装mono&#xff0c;然后安装Jexus。在这个步骤中&#xff0c;安装Jexus非常简单&#xff0c;而安装mono就相对的比较费时费力了。 为了克服务安装Mono这个过程的繁琐&#xff0c;方便大家把A…

5.cpu管理的直观想法

【README】 本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 本文主要介绍了操作系统管理cpu的大致内容&#xff1b; 【1】操作系统管理硬件 1&#xff09; 多进程管理视图&#xff1a; cpu 管理&#xff0c;内…

python基础教程zip密码_python基础教程Python实现加密的RAR文件解压的方法(密码已知)...

博主之前在网上找了很多资料&#xff0c;发现rarfile库不能直接调用&#xff0c;需要安装unrar模块&#xff0c;下面将详细介绍整个实现流程。第一步&#xff1a;安装unrar模块,直接pip install unrar可能会找不到库&#xff0c;需要下载unrar library&#xff0c;也就是UnRAR.…

Oracle入门(九)之用户、角色与权限之间关系

转载自 Oracle 用户&#xff0c;角色&#xff0c;权限等权限管理是 Oracle 系统的精华&#xff0c;不同用户登录到同一数据库中&#xff0c;可能看到不同数量的表&#xff0c;拥有不同的权限。Oracle 的权限分为系统权限和数据对象权限&#xff0c;共一百多种&#xff0c;如果单…

Windows原生运行Linux的技术细节

Microsoft最近宣布了将Linux Bash与Windows 10进行集成的意图&#xff0c;通过这种集成&#xff0c;Windows 10用户将能在操作系统中原生运行Linux ELF64二进制程序。为避免对该技术的实现方法产生错误的猜测&#xff0c;Windows Subsystem for Linux团队主管Deepu Thomas详细介…

6.操作系统多进程图像

【README】 本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 多进程图像定义&#xff1a;多个进程使用cpu的图像&#xff1b; 多进程图像是操作系统的核心图像&#xff1b; 【1】概述 1&#xff09; PCB&#xf…