Linux有关用户空间和内核空间的知识梳理
昨晚做了个丑事,就是通过表针在内核空间和用户空间做了数据的传递linux内核空间访问用户空间,结果造成了Segmentationfault错误的形成,研究了半天,旋即恍悟,内核空间和数据空间难以通过表针进行数据的传递。
下边是是对相关知识点的再度梳理:
Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,二者不能简单地使用表针传递数据linux入门,由于Linux使用的虚拟显存机制,用户空间的数据可能被换出,当内核空间使用用户空间表针时,对应的数据可能不在显存中。用户空间的显存映射采用段页式,而内核空间有自己的规则;本文致力阐述内核空间的地址映射。
Linux内核地址空间界定
一般32位Linux内核虚拟地址空间界定0-3G为用户空间,3~4G为内核空间(注意,内核可以使用的线性地址只有1G)。注意这儿是32位内核地址空间界定,64位内核地址空间界定是不同的。
分辨内核空间和用户空间缘由
虽然初期操作系统是不分辨内核空间和用户空间的,并且应用程序能访问任意显存空间,假如程序不稳定往往把系统搞崩溃linux标准教程,例如清理操作系统的显存数据。后来认为让应用程序随意访问显存太危险了,就根据CPU指令的重要程度对指令进行了分级,指令分为四个级别:Ring0~Ring3(和影片分级有点像),linux只使用了Ring0和Ring3两个运行级别,进程运行在Ring3级别时运行在用户态,指令只访问用户空间,而运行在Ring0级别时被称为运行在内核态linux内核空间访问用户空间,可以访问任意显存空间。
用户态的程序不能随便操作内核地址空间,这样对操作系统具有一定的安全保护作用。
须要注意的问题
(1)内核空间中储存的是内核代码和数据,而进程的用户空间中储存的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
(2)Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。
内核态与用户态:
(1)当一个任务(进程)执行系统调用而身陷内核代码中执行时,称进程处于内核运行态(内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每位进程都有自己的内核栈。
(2)当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而忽然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。由于中断处理程序将使用当前进程的内核栈。
文章评论