我最近正在研究设备驱动程序,并提醒虚拟内存的概念。虽然我在学生时就读过计算机体系结构课程,但老实说,虚拟内存在概念上是如此复杂,以至于它总是让我感到困惑。我是一个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用户空间没有?
我想我错过了与该帖子背后的大图有关的内容,但是,我错过了什么?
感谢您的时间和努力!
答案 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)
虚拟内存的用户空间部分也具有到物理内存的映射。链接的文章是关于内核如何能够访问所有物理内存。因此,为简洁起见,用户空间映射只是从图表中删除。