Chinaunix

标题: linux系统可以在512MB内存运行吗? [打印本页]

作者: _nosay    时间: 2015-09-19 21:08
标题: linux系统可以在512MB内存运行吗?
本帖最后由 _nosay 于 2015-09-19 21:50 编辑

     请教linux系统可以在512MB内存运行吗?因为书上说:系统空间占据了虚存空间的最高1G字节,在物理内存是从最低的0地址开始,以0xC0000000做一下偏移,便完成了地址映射。这句话是不是等同于说:物理内存的低1G空间,必须给内核留着。那如果在低于1G的内存条上运行,用户进程岂不没有一点自己的空间?那不就跑不了用户程序了吗?
     还有个问题是,反正1G都是自己的,为什么不直接使用物理地址,还要0xC0000000偏移一下?
作者: Jean_Leo    时间: 2015-09-19 23:50
本帖最后由 Jean_Leo 于 2015-09-19 23:51 编辑

1、可以在512M的内存上运行;
2、通常32位的系统,最高1GByte的虚拟内存是内核的,注意是虚拟内存;
3、最高1GByte的虚拟内存是内核的,并非代表这1GByte内存都必须映射到物理内存上面,通常超过1GByte物理内存的情况下会这么做,但是少于这个内存的环境,是不会这么做的;
4、用户进程还是有3GByte的虚拟内存空间可用的,这点不必担心,至于分配给进程的虚拟内存是否映射物理内存,具体是按需映射的;
5、至于偏移到0xC0000000做映射,个人觉得是历史原因导致的,具体我也不懂;
6、为什么不直接用物理内存?假设内核独占了所有内存,那么看来很多人都得在内核态写应用程序了,如果不做映射进行虚拟规划的话,个人的第一直觉是应用程序的可移植性会很差。
——以上是个人的一点愚见。
作者: _nosay    时间: 2015-09-20 12:33
本帖最后由 _nosay 于 2015-09-20 12:34 编辑
Jean_Leo 发表于 2015-09-19 23:50
1、可以在512M的内存上运行;
2、通常32位的系统,最高1GByte的虚拟内存是内核的,注意是虚拟内存;
3、最 ...





我不理解的是这2句话是什么意思:
① “对于系统空间而言,给定一个虚拟地址x,其物理地址是从x中减去PAGE_OFFSET”
    内核虚拟地址x - PAGE_OFFSET = 物理地址? 物理地址不是MMU根据段寄存器和程序中的逻辑地址经过段式映射、页式映射,得到的吗?
② “当然,CPU并不是通过这里所说的计算方法进行地址映射的,__pa()只是为内核代码中为知道与一个虚地址对应的物理地址时提供方便”
    这句话不矛盾吗?CPU不通过这种方法映射,也能将内核中某个虚拟地址x映射成和__pa(x)同样的结果吗?
作者: 夕阳下的孤影    时间: 2015-09-20 14:34
第一个问题:这种说法是指的直接映射的区域,也就是896M以内的虚拟空间。
该部分虚拟地址与物理地址相差PAGE_OFFSET,它也确实是由页表建立的映射,页表里面建立的就是这种对应关系。

第二个问题:作者想说的是程序员在使用时,可借助__pa进行地址转换,但实际上MMU做的工作要远远比这个复杂的多。
作者: _nosay    时间: 2015-09-20 14:57
本帖最后由 _nosay 于 2015-09-20 15:11 编辑
夕阳下的孤影 发表于 2015-09-20 14:34
第一个问题:这种说法是指的直接映射的区域,也就是896M以内的虚拟空间。
该部分虚拟地址与物理地址相差PA ...


虚拟地址与物理地址的对应,是由内核事先安排,CPU只是完成在这种安排下通过虚拟地址找到物理地址,而内核之所以有自信把自己使用的地址安排到固定的物理地址,不担心这些物理地址已经被映射到用户进程的虚拟地址,那是因为它比用户进程先运行,而且不会被换出。是这样吗?

另外再请教个问题:如果一个应用程序需要很多内存,会把896MB以下的物理内存映射给该应用进程吗?那这个应用进程执行一段时间后,如果释放了1G地址以上的物理空间,内核又需要申请内存时,由于896MB以内的内存被占用太多,会不会把1G以上的物理内存拿来用?如果会就是通过高端内存来访问的吧?
作者: nswcfd    时间: 2015-09-21 11:22
这是哪本书里的插图?
作者: _nosay    时间: 2015-09-21 16:46
nswcfd 发表于 2015-09-21 11:22
这是哪本书里的插图?


《Linux内核源代码情景分析》里面的。
作者: cascle    时间: 2015-09-22 18:56
当年512M内存的安卓手机一大票
作者: _nosay    时间: 2015-09-23 09:12
cascle 发表于 2015-09-22 18:56
当年512M内存的安卓手机一大票


其实我本意不是问能不能,不过还是感谢你参与回答
作者: _nosay    时间: 2015-09-24 13:14
Jean_Leo 发表于 2015-09-19 23:50
1、可以在512M的内存上运行;
2、通常32位的系统,最高1GByte的虚拟内存是内核的,注意是虚拟内存;
3、最 ...


你好,你和夕阳下的孤影的回答对我帮助很大,我现在的理解是这样:
内核将系统空间安排到实际内存的低1G空间,目的是什么?为什么不是高1G呢?
① 为什么必须划分系统空间和用户空间?
   用户进程进入内核,不要误以为是切换到“内核进程”,而是该用户进程进入了“内核态”,CPU还是按照该用户进程的PGD、PT内容进行地址映射,所以存在这样一个划分,“告诫”每个用户进程将3G-4G空间按统一规律映射,才可以共享内核的“服务”。
② 系统空间空间为什么要映射到低1G物理空间?
   这个问题简单,物理内存可能比较小,比如256MB,只有0-256MB的物理空间。
③ 实际内存小于1G时,用户空间岂不是分不到物理内存?
   3G-4G的虚拟地址,一定会被映射到0-1G物理空间(这里先忽略高端内存的概念),但并不是说0-1G物理空间只能与3G-4G虚拟空间建立映射。
④ 不用担心由于系统空间的这种“一根筋”映射规律,把3G-4G中某个虚拟地址映射到已经建立映射关系的物理地址吗?
   内存先于用户进程执行,并且占用的内存不会被换出。
⑤ 那内核不就只能访问低1G物理内存了吗?
   参考“高端内存”资料。
⑥ 虚拟空间,为什么不是划为系统0-1G,用户1G-4G?
   不要误以为这样可以让0-1G直接对应着物理地址,其实MMU映射的映射过程还是不变的,都要经过一次内核的事先安排。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2