当前位置: 技术问答>linux和unix
linux高端内存的理解
来源: 互联网 发布时间:2017-05-20
本文导语: 我现在在学习linux设备驱动程序,在对linux高端内存这一块表示非常不了解。 我大致了解了linux高端内存的由来,但是我对高端内存由来的原因非常不理解。 按照这篇文章的说法 http://blog.csdn.net/tommy_wxie/article/details/1...
我现在在学习linux设备驱动程序,在对linux高端内存这一块表示非常不了解。
我大致了解了linux高端内存的由来,但是我对高端内存由来的原因非常不理解。
按照这篇文章的说法
http://blog.csdn.net/tommy_wxie/article/details/17122923
问:为什么不把所有的地址空间都分配给内核?
答:若把所有地址空间都给内存,那么用户进程怎么使用内存?怎么保证内核使用内存和用户进程不起冲突?
我知道之所导致高端内存的存在,就是因为linux内核对地址空间做了3:1的划分。
但是我不理解为什么做这个划分,做这个划分难道就会导致用户进程没有地址空间可用了?它们应该是分开的吧。
那么我就假设作者的说法是正确的,就是为了让内核和用户进程不冲突。
但是上面还有一个问话我觉得和上面的说法相互矛盾。
64位内核中有高端内存吗?
目前现实中,64位Linux内核不存在高端内存,因为64位内核可以支持超过512GB内存。若机器安装的物理内存超过内核地址空间范围,就会存在高端内存。
64位的内核可以支持超过512GB的内存,这句话是什么意思?换成32位系统做类比的话,是说32位的内核可以支持4GB的内存,还是说32位的内核可以支持1GB的内存呢?
512GB的内存全部划分给内核了吗???假如是的,这个时候不担心内核和用户进程的冲突了吗?同样会冲突啊。
我大致了解了linux高端内存的由来,但是我对高端内存由来的原因非常不理解。
按照这篇文章的说法
http://blog.csdn.net/tommy_wxie/article/details/17122923
问:为什么不把所有的地址空间都分配给内核?
答:若把所有地址空间都给内存,那么用户进程怎么使用内存?怎么保证内核使用内存和用户进程不起冲突?
我知道之所导致高端内存的存在,就是因为linux内核对地址空间做了3:1的划分。
但是我不理解为什么做这个划分,做这个划分难道就会导致用户进程没有地址空间可用了?它们应该是分开的吧。
那么我就假设作者的说法是正确的,就是为了让内核和用户进程不冲突。
但是上面还有一个问话我觉得和上面的说法相互矛盾。
64位内核中有高端内存吗?
目前现实中,64位Linux内核不存在高端内存,因为64位内核可以支持超过512GB内存。若机器安装的物理内存超过内核地址空间范围,就会存在高端内存。
64位的内核可以支持超过512GB的内存,这句话是什么意思?换成32位系统做类比的话,是说32位的内核可以支持4GB的内存,还是说32位的内核可以支持1GB的内存呢?
512GB的内存全部划分给内核了吗???假如是的,这个时候不担心内核和用户进程的冲突了吗?同样会冲突啊。
|
就是你用户程序里的所有变量和函数的 逻辑地址都是介于0~3G的
内核代码里所有变量和函数的逻辑地址都是介于3~4G的
所谓用户空间和内核空间,从cpu角度来说,只是运行的级别不一样,是否处于特权级别而已
逻辑地址到物理地址的MMU映射是不变的。
不管是用户态还是内核态,最终都是通过MMU映射到你的物理上的896M内存
mmap就可以映射物理内存到用户空间,你可以清楚的看到同一块物理内在用户态和内核态的不同逻辑地址
两个不同的逻辑地址(一个介于0~3G,一个介于3-4G) 通过MMU映射到同一块物理内存
2.linux为什么把内核映射到3G-4G这个地址呢。
假如linux把内核映射到0-1G的空间,其他进程共享1-4G的空间不可以吗?
这个技术上也是可以的,而且不难实现。为什么不采用估计有历史原因吧
毕竟cpu和程序出来的年代比MMU早多了
没有MMU的年代里,对于x86,逻辑地址就是物理地址。物理地址从0开始,那么程序的逻辑地址从一开始也是从0开始的
内核代码里所有变量和函数的逻辑地址都是介于3~4G的
所谓用户空间和内核空间,从cpu角度来说,只是运行的级别不一样,是否处于特权级别而已
逻辑地址到物理地址的MMU映射是不变的。
不管是用户态还是内核态,最终都是通过MMU映射到你的物理上的896M内存
mmap就可以映射物理内存到用户空间,你可以清楚的看到同一块物理内在用户态和内核态的不同逻辑地址
两个不同的逻辑地址(一个介于0~3G,一个介于3-4G) 通过MMU映射到同一块物理内存
2.linux为什么把内核映射到3G-4G这个地址呢。
假如linux把内核映射到0-1G的空间,其他进程共享1-4G的空间不可以吗?
这个技术上也是可以的,而且不难实现。为什么不采用估计有历史原因吧
毕竟cpu和程序出来的年代比MMU早多了
没有MMU的年代里,对于x86,逻辑地址就是物理地址。物理地址从0开始,那么程序的逻辑地址从一开始也是从0开始的