为什么要把内存划分为用户空间与内核空间
3个回答
展开全部
内存划分为用户空间与内核空间的原因:
用户空间和内核空间置于这种非对称访问机制下有很好的安全性,能有效抵御恶意用户的窥探,也能防止质量低劣的用户程序的侵害,从而使系统运行得更稳定可靠。用户空间与内核空间的权限不同,内核空间拥有所有硬件设备的权限,用户空间只有普通硬件的权限。
Linux系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。
相对地,应用程序则是在“用户空间”中运行。运行在用户空间的应用程序只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。
用户空间和内核空间置于这种非对称访问机制下有很好的安全性,能有效抵御恶意用户的窥探,也能防止质量低劣的用户程序的侵害,从而使系统运行得更稳定可靠。用户空间与内核空间的权限不同,内核空间拥有所有硬件设备的权限,用户空间只有普通硬件的权限。
Linux系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。
相对地,应用程序则是在“用户空间”中运行。运行在用户空间的应用程序只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。
2014-12-14
展开全部
Linux虚拟内存的大小为2^32(在32位的x86机器上),内核将这4G字节的空间分为两部分。最高的1G字节(从虚地址
0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到
0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。
于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存).
每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享。另外,进程的“用户空间”也叫“地址空间”,在后面的叙述中,我们对这两个术语不再区分。
用户空间不是进程共享的,而是进程隔离的。每个进程最大都可以有3GB的用户空间。一个进程对其中一个地址的访问,与其它进程对于同一地址的访问绝不冲
突。比如,一个进程从其用户空间的地址0x1234ABCD处可以读出整数8,而另外一个进程从其用户空间的地址0x1234ABCD处可以读出整数
20,这取决于进程自身的逻辑。
因此Linux对用户空间与内核空间的划分起到了一定程度上的冲突避免。
0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而较低的3G字节(从虚地址0x00000000到
0xBFFFFFFF),供各个进程使用,称为“用户空间”。因为每个进程可以通过系统调用进入内核,因此,Linux内核空间由系统内的所有进程共享。
于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟地址空间(也叫虚拟内存).
每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB内核空间则为所有进程以及内核所共享。另外,进程的“用户空间”也叫“地址空间”,在后面的叙述中,我们对这两个术语不再区分。
用户空间不是进程共享的,而是进程隔离的。每个进程最大都可以有3GB的用户空间。一个进程对其中一个地址的访问,与其它进程对于同一地址的访问绝不冲
突。比如,一个进程从其用户空间的地址0x1234ABCD处可以读出整数8,而另外一个进程从其用户空间的地址0x1234ABCD处可以读出整数
20,这取决于进程自身的逻辑。
因此Linux对用户空间与内核空间的划分起到了一定程度上的冲突避免。
追问
我的疑问是Why? 而您的回答是How
追答
帮楼主问了一下我朋友,他是腾讯公司的工程师,据他描述,Linux之所以把系统划分为内核空间与用户空间主要是为了安全考虑,
希望以上你能帮到你,祝你好运!
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-12-14
展开全部
我举例子和你说下吧:
我也刚刚学C++,对其理解也不是很深刻,希望对你有用。
节省资源:
比如说,当一个程序,它可以处理很多东西,
1, 可以处理一个五万人的学校的所有学生的资料。
2, 可以处理一个几十人的小班级。
1)如果你用静态的分配,比如说,数组。当你知道要处理这些问题的时候,你需要定义一个50000 长度的数组才能解决问题。
这时候,当你用这个程序去处理班级资料。这里分配的大量的内存地址都会造成了浪费。
2)你要处理50000人以上的学校的资料,又会出现分配不足的问题。需要重新修改代码。(这就是很麻烦的事情了)
这个在C++上叫溢出。
3)使用动态分配内存的好处。
动态的话,就是你使用多少,就用多少。
根据你输入的数据大小来分配内存。
比如说,这个程序处理50人的小班级,则会分配50个空间。
当增加一个人的时候,则程序就能自动在后面再加一个空间。
来给你使用。
这样优点如下:
1,不会造成浪费,基本上都是有多少用多少。
2,能够随时增加,减少。
程序的灵活性更高。也不会出现分配不足的问题。
专业语言不怎么清楚,希望对你理解不会造成太大的影响。
我也刚刚学C++,对其理解也不是很深刻,希望对你有用。
节省资源:
比如说,当一个程序,它可以处理很多东西,
1, 可以处理一个五万人的学校的所有学生的资料。
2, 可以处理一个几十人的小班级。
1)如果你用静态的分配,比如说,数组。当你知道要处理这些问题的时候,你需要定义一个50000 长度的数组才能解决问题。
这时候,当你用这个程序去处理班级资料。这里分配的大量的内存地址都会造成了浪费。
2)你要处理50000人以上的学校的资料,又会出现分配不足的问题。需要重新修改代码。(这就是很麻烦的事情了)
这个在C++上叫溢出。
3)使用动态分配内存的好处。
动态的话,就是你使用多少,就用多少。
根据你输入的数据大小来分配内存。
比如说,这个程序处理50人的小班级,则会分配50个空间。
当增加一个人的时候,则程序就能自动在后面再加一个空间。
来给你使用。
这样优点如下:
1,不会造成浪费,基本上都是有多少用多少。
2,能够随时增加,减少。
程序的灵活性更高。也不会出现分配不足的问题。
专业语言不怎么清楚,希望对你理解不会造成太大的影响。
追问
请看清问题:
为什么要把内存划分为用户空间与内核空间?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询