| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux进程如何实现用户空间与内核空间的转换 -> 正文阅读 |
|
[系统运维]Linux进程如何实现用户空间与内核空间的转换 |
为什么进程需要从用户态进入内核态?这里我不去细细区分什么是属于内核空间,什么又是属于用户空间。我讲一个逻辑:在用户空间,我们对进程不加限制,想干啥干啥,如果此时所有的资源都处于用户空间中,那么如果进程对那种系统级的资源随意修改,显然极易造成系统的崩溃。但同时又要保证进程有着足够的自由度,不然不利于开发。所以内核空间的开辟就显得极为重要,我们将不能随意修改的资源,放入内核空间中,比并创建一些函数(我们可以把这些函数理解为一些具体的规则,为了防止不正规的操作) ,当进程进入内核空间,也只能在一定规则之内比内核资源进行操作)。 用户态进入内核态的三种场景1、系统调用(软中断) 2、异常 3、硬件中断 系统调用1、系统调用实际上是发出一个int 80 的软中断,并给出系统调用号 2、内核响应80中断,调用syscall中断处理函数 3、然后调用GET_THREAD_INFO(%ebp), 获得thread_info结构体,就拿到了内核栈空间 4、此时进入内核栈,保存应用程序栈空间,返回时恢复使用 5、后续根据获得的系统调用号,进入不同的处理函数 ..从这里我们也可以看出,进程进入内核空间的操作,都是有明确清晰的路径,其并不可以在内核空间中为所欲为,这也保证了,虽说,所有进程共同使用内核空间,但进程在内核空间操作都是通过系统的处理函数,在规则之内进行。这也就保证了操作的安全性 系统调用按功能分配分为如下几种 用户态进入内核态的具体实现1、用户运行C库函数fork()。函数里面会执行int 0x80指令。 总结: 1、通过eax寄存器保存系统调用号,在内核中根据这个系统调用号找到对应的系统调用函数。2、切换前,用户态进程用的所有寄存器都已保存在内核态堆栈,这也包括ss和esp这对寄存器的内容(ss和esp寄存器中的内容决定进程处于用户栈还是内核栈,关于堆栈请看下一节)。3、返回时,将开始保存的各个寄存器进行恢复,包括数据寄存器,段寄存器,状态寄存器,堆栈指针寄存器等 用户栈和内核栈1、每个进程被创时, 2、当位于用户空间的进程系统调用时,它会陷入内核,让内核代其执行。 异常和硬件中断硬件中断是指外部硬件产生的一个电信号从CPU的引脚进入打断CPU的运行。 异常是指软件运行的过程中,发生一些必须做处理事件,CPU自动产生一个陷入来打断CPU的运行。异常在处理的时候必须考虑与处理器的时钟同步,实际上异常也称为同步中断,在处理器执行到因编译错误而导致的错误指令,或者在执行期间出现特殊错误,必须依靠内核处理的时候,处理器就会产生一个异常 无论是异常,系统调用还是硬件中断,进入如内核的过程可以由一张流程图所示,如下 1、CPU每次执行完一条指令后,总会先检查有无中断请求,无则执行下一条指令,有则在总线上读取中断向量号 4、如果此时处于用户态,则通过当前线程的数据结构找到内核栈地址,从CPU唯一的TSS段找到该内核栈的栈顶指针esp0,然后即可将用户态下的CPU各个寄存器保存到内核栈中。 5、如果此时处于内核态,那么需要保存当前进程的状态信息 6、CPU利用中断服务程序的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务程序。 鸣谢单位操作系统~用户态进入内核态的方式(中断、异常、系统调用)_Listen-Y的博客-CSDN博客_用户态访问内核态方法 如何从用户态进入内核态_每一个不曾起舞的日子,都是对生命的辜负的博客-CSDN博客_如何进入内核态 轻量级进程 +SS寄存器和ESP寄存器+怎么理解linux内核栈?+用户态/内核态、用户栈/内核栈_fgh431的博客-CSDN博客_ss和esp |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 21:48:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |