gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:53:42 24 4
gpt4 key购买 nike

最近在学习设备驱动,想起了虚拟内存的概念。虽然我学生时代就参加过计算机体系结构类(class),但说实话,虚拟内存从概念上来说太复杂了,一直让我很困惑。我是一个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,OK,整个物理内存都映射到了这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用户空间?

我想我错过了一些与该帖子背后的大局相关的内容,但是,我错过了什么?

感谢您的时间和努力!

最佳答案

具有映射的页面自动意味着它位于物理内存中的某个位置。它只是为您提供物理内存中在何处查找页面的地址。

无论如何,我们通常都有内存层次结构。如今,三级层次结构并不罕见。因此很有可能在这些缓存之一中找到给定的内存地址。如果不是,那么内核将必须通过从内存中逐出(解锁)页面来启动页面替换算法。

据我所知,用户页面和内核页面之间的唯一区别是内核页面具有“更高”的特权代码,允许其访问特权指令,并且在 32 位 Linux 的情况下,任何给定进程的内核部分将始终具有 固定虚拟地址空间,在进程上下文切换之间改变。为了简化并加快物理地址的转换,映射也由预先配置的偏移量固定。除此之外,用户空间页面和内核空间页面之间没有太大区别。两者都在“竞争”物理内存。

无论如何,调度程序决定接下来运行哪个实体,无论是常规用户空间进程、内核控制路径(搭载当前进程)还是内核线程。根据该决定,交换器将从 RAM 中换出页面以腾出空间,然后从所选实体中换入页面。

中断具有完全不同的上下文,绕过调度程序,完全让 CPU 受其支配。在这种情况下,ISR 将运行,它也将访问虚拟内存。如果ISR对应的页没有驻留在内存中,就会出现双重错误,这通常表明作者的编程很差劲。这些的处理方式因架构而异。有些会处理故障直到某个点,有些会抛出内核 OOP 消息并停止。然而,与您的问题相关的是,即使是系统中具有最高优先级的 ISR(高于进程/线程)也必须确保有足够的内存来完成这项工作。

P.S:在本次讨论中,我们假设所有缓存请求均未命中,因此我们必须一直访问 RAM(再次被填满)。

关于kernel - 所有物理内存都映射到内核虚拟地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com