【发布时间】:2011-05-30 12:55:05
【问题描述】:
我正在学习 linux 内核内部结构,在阅读“理解 Linux 内核”时,我遇到了很多与内存相关的问题。其中之一是,如果我的系统上安装了 512 MB 的物理内存,Linux 内核如何处理内存映射。
据我所知,内核将 0(或 16)MB-896MB 物理 RAM 映射到 0xC0000000 线性地址并可以直接寻址。所以,在上述我只有 512 MB 的情况下:
内核如何从 512 MB 映射到 896 MB?在所描述的方案中,内核进行了设置,以便每个进程的页表将虚拟地址从 0xC0000000 直接映射到 0xFFFFFFFF (1GB) 到物理地址从 0x00000000 到 0x3FFFFFFF (1GB)。但是,当我只有 512 MB 物理 RAM 时,如何将虚拟地址从 0xC0000000-0xFFFFFFFF 映射到物理 0x00000000-0x3FFFFFFF ?重点是我的物理范围只有 0x00000000-0x20000000。
在这种情况下如何处理用户模式进程?
每篇文章都只解释这种情况,当您安装了 4 GB 内存并且内核将 1 GB 映射到内核空间并且用户进程使用剩余的 RAM 量时。
如果能帮助我加深理解,我将不胜感激。
谢谢..!
【问题讨论】:
-
这对 unix.stackexchange.com 来说是个好问题
-
虚拟地址内核内存映射到不一定是0xC0000000。
-
0xC0000000 是 x86 的默认地址
-
osgx,感谢您的 cmets。绝对有用。需要理解您提供的指针。如果有问题,会回来。非常感谢。
-
TheLoneJoker,我还可以向您推荐 Robert Love 的《Linux 内核开发》一书。它由文本组成,而不是由代码和 cmets 组成,就像 ULK 一样
标签: linux-kernel kernel arm linux-device-driver embedded-linux