当前位置: 技术问答>linux和unix
关于“进程的地址空间”的几个问题
来源: 互联网 发布时间:2016-10-20
本文导语: 关于“进程的地址空间”的几个问题 大家好! 小弟有下面几个问题:(32位处理器) 1,进程的地址空间是由两部分构成:内核态和用户态。 这样说对吗? 2,进程的内核态空间是8K,由进程的内核态堆栈和thread_info...
关于“进程的地址空间”的几个问题
大家好!
小弟有下面几个问题:(32位处理器)
1,进程的地址空间是由两部分构成:内核态和用户态。 这样说对吗?
2,进程的内核态空间是8K,由进程的内核态堆栈和thread_info构成。除了这8K以外,进程不再拥有任何内核态空间。这样说对吗?
3,我们知道,0-3G 是用户空间,那么是“每个进程都可以拥有3G的用户空间”吗?还是“所有的进程共享这3G的用户空间,每个进程只能分到这3G空间的一部分”?
4,如果是每个进程都可以拥有3G的用户空间,那么这样各个进程会不会冲突?通过什么办法回避冲突的呢?
5,内核拥有整个4G的空间吗?内核可以访问0-3G的用户空间吗?
以上,非常感谢!!!
大家好!
小弟有下面几个问题:(32位处理器)
1,进程的地址空间是由两部分构成:内核态和用户态。 这样说对吗?
2,进程的内核态空间是8K,由进程的内核态堆栈和thread_info构成。除了这8K以外,进程不再拥有任何内核态空间。这样说对吗?
3,我们知道,0-3G 是用户空间,那么是“每个进程都可以拥有3G的用户空间”吗?还是“所有的进程共享这3G的用户空间,每个进程只能分到这3G空间的一部分”?
4,如果是每个进程都可以拥有3G的用户空间,那么这样各个进程会不会冲突?通过什么办法回避冲突的呢?
5,内核拥有整个4G的空间吗?内核可以访问0-3G的用户空间吗?
以上,非常感谢!!!
|
3. 用户空间0-3G是虚拟地址。从任何一个进程的角度来看,他可以独立拥有这3G空间
4. 不会冲突。用户进程只能使用虚拟地址,而虚拟地址要映射到物理地址。两个不同的进程,可以访问相同的虚拟地址,但是映射到物理地址肯定是不同的。
4. 不会冲突。用户进程只能使用虚拟地址,而虚拟地址要映射到物理地址。两个不同的进程,可以访问相同的虚拟地址,但是映射到物理地址肯定是不同的。
|
我来回答前面两个问题吧?
1,进程的地址空间是由两部分构成:内核态和用户态。 这样说对吗?
对。
2,进程的内核态空间是8K,由进程的内核态堆栈和thread_info构成。除了这8K以外,进程不再拥有任何内核态空间。这样说对吗?
错,内核空间不仅包含内核数据而且包含内核代码。应该是1G。
1,进程的地址空间是由两部分构成:内核态和用户态。 这样说对吗?
对。
2,进程的内核态空间是8K,由进程的内核态堆栈和thread_info构成。除了这8K以外,进程不再拥有任何内核态空间。这样说对吗?
错,内核空间不仅包含内核数据而且包含内核代码。应该是1G。
|
我的理解:
1)一般说来,线程运行代码包括两部分:内核级代码和用户级代码。因此每个线程拥有一个完整的虚拟空间,例如在i386体系结构(下面都以i386来说明)上为0~(4G-1)的虚拟地址范围。另外,内核线程只有内核级代码。
2)用户级代码只能在用户态的虚拟地址范围内寻址,即(0~3G-1)的虚拟地址范围。
3)内核级代码原则上可以在完整的虚拟空间上虚拟,即(0~4G-1)。
4)所有线程的内核级代码全部在(3G~4G-1)的空间上,因此不同线程内核级代码之间有了共享的可能,从而能够实现线程之间的通信。
5)线程的内核级代码需要对自身用户态数据进行访问,这种访问过程又可能遭到线程切换以及目标页换出的影响,所以需要在线程的内核级代码在访问自身用户态数据之前,需要将目标页重新映射到内核空间来。
1)一般说来,线程运行代码包括两部分:内核级代码和用户级代码。因此每个线程拥有一个完整的虚拟空间,例如在i386体系结构(下面都以i386来说明)上为0~(4G-1)的虚拟地址范围。另外,内核线程只有内核级代码。
2)用户级代码只能在用户态的虚拟地址范围内寻址,即(0~3G-1)的虚拟地址范围。
3)内核级代码原则上可以在完整的虚拟空间上虚拟,即(0~4G-1)。
4)所有线程的内核级代码全部在(3G~4G-1)的空间上,因此不同线程内核级代码之间有了共享的可能,从而能够实现线程之间的通信。
5)线程的内核级代码需要对自身用户态数据进行访问,这种访问过程又可能遭到线程切换以及目标页换出的影响,所以需要在线程的内核级代码在访问自身用户态数据之前,需要将目标页重新映射到内核空间来。
|
内核有访问用户空间的权限,它可以为所欲为,但是他不应该乱操作。
比如,printf("hello"); 内核就会从用户空间取出一个字符串,显示到屏幕上。
scanf("%d", &n); 内核就会从键盘读取一个整数,把它写到用户空间里面&n的位置。
这个有点像client/server的概念。一般只有当用户进程通过系统调用要求内核访问用户空间的时候,内河才会通过copy_to_user和copy_from_user这些函数来访问用户进程指定的地址。
|
好好看看 《深入理解Linux内核》 这本书 的内存管理 一章。或看《深入理解Linux虚拟内存管理》 这本书。如果有不懂的,再上来讨论。
|
是的。
|
|
没有水贴呀,我来一个