现在的位置: 首页 > 综合 > 正文

读核笔记之用户进程与内核线程

2013年11月29日 ⁄ 综合 ⁄ 共 909字 ⁄ 字号 评论关闭

1

"每个用户进程都有自己独立的地址空间0~3G;内核线程没有自己的地址空间,而是共用同一内存空间3~4G。" 

所有的内核空间都用的是 3G-4G的线性地址,然后通过 线性地址-3G 可以得到物理地址(当然实现上还是通过页表做的)。 
而每个进程都具有自己的页目录和页表。因此是独立的。 
而内核 公用 用户进程的 页目录的 高部分。 因此可以说 没有自己的地址空间。 

 

linux内核的虚拟空间技术采用段页式,一般的段式映射是每个用户进程会有一段自己的线性地址空间(比如进程A地址空间是0x10000~~0x20000,进程B地址空间0x30000~~40000,正常运行情况下,进程A访问不到地址地址0x30000~~40000,只能访问自己的地址空间),而在linux系统中,每个用户进程是线性地址空间都是0~~3G,这样一个进程可以访问另一个进程的数据,但事实上是不可以了,如果可以的话,大家可以想象的到这样的一个系统绝对运行不了.linux在这样段映射的基础上采用了一种技术,每个进程拥有自己的一组页表,使虚拟空间映射到特定的物理空间,这样每个进程拥有自己的物理空间,一个进程就不会访问到另一个进程的数据了(可能有的人会想那进程是怎么通讯的,原因是进程的内核空间映射是一样的,也就是所有进程3~~4G线性地址到物理地址的映射是一样的,每一线性地址的物理内存实体是一样的,一进程写到内核空间的数据,另一进程就可以从这个线性地址对应的物理地址取数据出来).所谓的内核线程是只在内核空间运行的特殊进程,它只有内核数据堆栈空间,它的程序体是整块内核空间的一部分,换句说内核线程是内核提供的完成某些特定功能任务的特殊进程,它能执行到的那些函数是内核中逻辑的一组函数.(线程跟进程一样必须有一个ts_stuct结构跟系统堆栈),内核线程没有自己的地址空间是指没有用户空间,0~~3G没有映射到物理内存,也没必要有自己空间,因为所有的进程运行的指令是在内核中,即3~~4G中.这是我读了一些源代码后,对一句话的理解.

2

"每个进程都拥有自己的地址空间,但线程没有自己独立的地址空间,而是运行在一个进程里的所有线程共享该进程的整个虚拟地址空间。" 

 

抱歉!评论已关闭.