第二课 操作系统接口
上一章回顾:在操作系统启动后内存会变为如下的样子:
内存初始化之后的大致模样
操作系统接口的概念:上层应用通过接口来使用操作系统提供的功能使用硬件
用户如何使用计算机?
1.命令行(主要通过shell敲命令行)
①在操作系统启动的过程中,执行到main.c函数之后便执行启动shell的命令,此时跳出shell界面
②shell的程序如下图所示,循环打印cmd等待输入命令行,并对其进行执行
2.图形按钮
采用消息队列机制:
当硬件有输入时候,将该输入添加到系统消息队列中。
然后应用程序中不断循环的从系统消息队列中获取消息,对不同的消息调用不同的函数进行相应的操作。
什么是操作系统接口?
第三课 系统调用的原理
1.为什么要将内存分为内核态和用户态?
出于安全方面的考虑,防止系统root用户名密码,重要文档信息的丢失。
2.如何做到内核态和用户态之间的隔离?
通过特权级的方式实现用户态和内核态之间的隔离,特权级规则:
DPL:要访问的目标内核段特权级(内核态的DPL为0)
CPL:当前特权级
当DPL>=CPL时候,该指令才能被运行。
通过该方式进而实现用户态只能访问用户态而不能访问内核态;而内核态可以访问任何数据。
3.被隔离后,如何实现用户态对内核态的访问?
中断指令是用户态进入内核态的唯一方法。系统调用实际上是一段包含中断的即int指令的代码。(且为0x80中断)
printf的调用过程
中断int0x80通过初始化int0x80的DPL为3来实现用户态对内核态的访问。
总结:
用户态中的main函数调用whoani系统调用之后在内存中发生了什么?
调用系统调用whoani()不能直接访问到内核态中的相对应的代码,而是要经过以下步骤:
1.通过库函数将whoani扩展为包含0x80的代码,并指定系统调用号eax。int 0x80通过将DPL设置为3,而当前的CPL也为3来实现对内核的访问。进入内核后CPL变为0。
2.通过查表sys_call_table,找到需要调用的函数为sys_whoami。
3.执行sys_whoami中的内容。