当前位置: 技术问答>linux和unix
用户空间/内核空间
来源: 互联网 发布时间:2016-08-08
本文导语: 关于用户空间和内核空间,理解的不是很清楚,望高手给解答下阿,谢谢 1.在内核空间运行,在用户空间运行,怎么理解? 按我自己的理解,是内存中有一部分是特殊的,是专门用来给内核使用的。 如果是在...
关于用户空间和内核空间,理解的不是很清楚,望高手给解答下阿,谢谢
1.在内核空间运行,在用户空间运行,怎么理解?
按我自己的理解,是内存中有一部分是特殊的,是专门用来给内核使用的。
如果是在这段内存中运行,就是在内核空间运行,反之就是在用户空间中运行
2.程序通过系统调用进入内核空间---比如我自己写了个程序,调用了read()这个函数,就是说在read()执行过程中,其实是在内核空间中运行的,而在read()返回后,从内核空间返回用户空间?
1.在内核空间运行,在用户空间运行,怎么理解?
按我自己的理解,是内存中有一部分是特殊的,是专门用来给内核使用的。
如果是在这段内存中运行,就是在内核空间运行,反之就是在用户空间中运行
2.程序通过系统调用进入内核空间---比如我自己写了个程序,调用了read()这个函数,就是说在read()执行过程中,其实是在内核空间中运行的,而在read()返回后,从内核空间返回用户空间?
|
内核空间是不允许随便访问修改的
这是出于安全等方面考虑
程序运行在用户态时为了要访问内核的资源,必须经过内核提供的接口,通过系统调用linux下就是int ox80
中断 中断号由eax传入 参数由ebx ecx edx 压栈等方式传入
发生了中断则现场保护,控制权交给内核,由内核根据中断号调用相应函数,结束后清栈,pc指向原保存的返回地址,回到用户态。
这是出于安全等方面考虑
程序运行在用户态时为了要访问内核的资源,必须经过内核提供的接口,通过系统调用linux下就是int ox80
中断 中断号由eax传入 参数由ebx ecx edx 压栈等方式传入
发生了中断则现场保护,控制权交给内核,由内核根据中断号调用相应函数,结束后清栈,pc指向原保存的返回地址,回到用户态。
|
进程的空间实际上被分为了两个部分。一部分供进程独立使用,成为用户空间,另一部分容纳操作系统的内核,成为内核空间,或称为系统空间。具体到可以容纳4gb内存空间的32位Windows系统上,低2gb是用户空间,高2gb是内核空间。
用户空间是各个进程隔离的,但是内核空间是共享的,也就是说,每个进程看见的高2gb空间范围内的数据,都是一样的。
内核空间是受硬件保护的,比如x86架构下的ring0层的代码才能访问内核空间。内核模块运行在内核空间,普通ring3程序作为一个进程执行。
用户空间是各个进程隔离的,但是内核空间是共享的,也就是说,每个进程看见的高2gb空间范围内的数据,都是一样的。
内核空间是受硬件保护的,比如x86架构下的ring0层的代码才能访问内核空间。内核模块运行在内核空间,普通ring3程序作为一个进程执行。
|
从两方面理解,一是内存管理一是程序执行。
从内存管理角度来讲:
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,
因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最
高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间
”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称
为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内
的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
从程序执行来讲:
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。事实上,CPU的指令分级比Linux分级的级别还多。
总之,这一切都是为了安全和系统的稳定性来考虑的
从内存管理角度来讲:
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,
因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最
高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间
”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称
为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内
的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
从程序执行来讲:
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。事实上,CPU的指令分级比Linux分级的级别还多。
总之,这一切都是为了安全和系统的稳定性来考虑的
|
关于用户空间和内核空间,理解的不是很清楚,望高手给解答下阿,谢谢
1.在内核空间运行,在用户空间运行,怎么理解?
按我自己的理解,是内存中有一部分是特殊的,是专门用来给内核使用的。
如果是在这段内存中运行,就是在内核空间运行,反之就是在用户空间中运行
答:对于x86硬件平台,在内核空间,CPU的工作特权级是0,当然内核是常驻内存的,有将近1GB的线性地址空间。其余的线性地址为用户空间,此时CPU工作是特权级3。
更多的关于intel x86 CPU的特权级信息,请参考CPU data sheet, 或参考些贴:http://blog.csdn.net/drshenlei/archive/2009/06/12/4265101.aspx
2.程序通过系统调用进入内核空间---比如我自己写了个程序,调用了read()这个函数,就是说在read()执行过程中,其实是在内核空间中运行的,而在read()返回后,从内核空间返回用户空间?
答:是这样。
[/Quote]