所有物理内存都映射到内核的虚拟地址?

时间:2015-03-21 01:57:09

标签: kernel

我最近正在研究设备驱动程序,并提醒虚拟内存的概念。虽然我在学生时就读过计算机体系结构课程,但老实说,虚拟内存在概念上是如此复杂,以至于它总是让我感到困惑。我是一个EE人,因此,请从 BIG PICTURE 的角度解释,这真正区分了这个概念。我自己可以深入了解技术细节。

当我们谈论虚拟内存时,我们正在讨论进程的内存分配方法。进程是虚拟内存所服务的,对吧?对于具有4GB地址空间的32位系统,通常将0-3G分配给用户空间虚拟地址,并将3-4G空间分配给内核。这就是所谓的3G / 1G部门,来自下面列出的帖子:

http://users.nccs.gov/~fwang2/linux/lk_addressing.txt

然而,这篇文章还说明了所有物理内存都映射到内核空间,并没有任何用户空间。这让我很困惑。我在这里的帖子中列出了这一部分:

因此,在3G / 1G拆分中,内核的虚拟地址空间为1GB。 请记住,要访问物理地址,您需要一个虚拟地址 从内核开始,即使是内核。所以,如果你不做任何特别的事,1GB 虚拟地址有效地限制了内核可以访问的物理空间 1GB。好吧,也许这是第三个不那么明显的细节:内核需要来访问 每个物理内存,以充分利用它。

在早期,机器的物理空间远小于1GB 没问题,整个物理内存都映射到这个1GB的虚拟地址。

   process address space 

4GB +---------------+
    |     512MB     |
    +---------------+ <------+     physical memory               
    |     512MB     |        | 
3GB +---------------+ <--+   +---> +------------+ 
    |               |    |         |   512 MB   |
    |     /////     |    +-------> +------------+
    |               |     
0GB +---------------+     

当物理内存高于2G时,这篇文章也说明了同样的事情:

                                       physical mem
   process address space    +------> +------------+
                            |        |  3200 M    |
                            |        |            |
4GB +---------------+ <-----+        |  HIGH MEM  |
    |     128 MB    |                |            |
    +---------------+ <---------+    |            |
    +---------------+ <------+  |    |            | 
    |     896 MB    |        |  +--> +------------+         
3GB +---------------+ <--+   +-----> +------------+ 
    |               |    |           |   896 MB   |
    |     /////     |    +---------> +------------+
    |               |     
0GB +---------------+     

我的问题是,为什么所有物理内存都映射到内核空间? 0-3G用户空间没有?

我想我错过了与该帖子背后的大图有关的内容,但是,我错过了什么?

感谢您的时间和努力!

2 个答案:

答案 0 :(得分:3)

具有映射 DOES NOT 的网页自动表示它位于物理内存中的某个位置。它只是给你物理内存中where to look for the page的地址。

在任何情况下,通常我们都有记忆​​层次。如今,三级层次结构并非典型。因此很可能在其中一个缓存中找到给定的内存地址。如果不是,则内核必须通过从内存中驱逐(未锁定)页面来启动它的页面替换算法。

用户和内核页面AFAIK之间的唯一区别是内核页面具有更高的&#34;更高的&#34;特权代码允许它访问特权指令,在32位Linux的情况下,任何给定进程的内核部分将始终具有固定虚拟地址空间,在进程上下文之间执行 NOT 更改开关。并且为了简化并因此将转换固定到物理地址,映射也通过预先配置的偏移来固定。除此之外,用户空间页面和内核空间页面之间没有太大区别。他们俩都在竞争&#34;对于物理记忆。

在任何情况下,调度程序都会确定下一个要运行的实体,无论是常规用户空间进程,内核控制路径(捎带当前进程)还是内核线程。根据该决定,交换器将从RAM交换页面以腾出空间,然后将交换所选实体的页面。

中断有一个完全不同的上下文绕过调度程序完全让CPU处于怜悯状态。在这种情况下,将运行ISR,该ISR也将访问虚拟内存。如果对应于ISR的页面不驻留在内存中,则会发生双重故障,并且通常会显示作者编程不良。处理方式因架构而异。有些人将故障处理到某一点,有些人抛出内核OOP消息并停止。然而,与你的问题相关的是,即使是系统中具有最高优先级的ISR(上面的进程/线程)也必须确保有足够的内存来完成这项工作。

P.S:在本次讨论中,我们假设我们所有的缓存请求都是未命中的,因此我们必须一直到RAM(再次打包)。

答案 1 :(得分:1)

虚拟内存的用户空间部分也具有到物理内存的映射。链接的文章是关于内核如何能够访问所有物理内存。因此,为简洁起见,用户空间映射只是从图表中删除。