MMU笔记(5) 要把线性地址、物理地址、磁盘空间、磁盘地址结合起来看待

发布于 2021-08-24  35 次阅读


背景

在学习内存相关的知识时,映射不应被看作是一个普通的指针,而应该是被看作是双向指针,或者是迭代器

正文

算是真正理解了映射,虽然细节上会有一些出入(因为那些细节有点太深了,不知道如何观察,比如先后顺序什么的,姑且先不考虑),但是下面的内容如果能把映射这一操作理解为迭代器,或者双向指针就好理解很多了

线性内存的某一块映射到物理内存,这并不是单纯意味着物理内存指向线性内存的指针,同理,把磁盘文件映射到线性内存也不单是指向磁盘内存的fp指针,因为他们是双向互认的

假设用户程序A需要使用到用户自行编写的dll库B,其他任何程序都不会使用B

那么在打开A的时候物理内存当中并未加载B,因此A掷错缺页,尝试加载B,但并非直接加载而是先从磁盘空间加载到线性内存,再映射物理内存

如果调用的是已经存在物理内存当中的dll,这时候就要结合起来看待了,首先尝试把磁盘当中的dll映射到线性内存,但是操作系统维护的表表明该DLL已经加载到物理内存了,这时候是便是从物理内存映射到线性内存了

这样挺难理解的,因为我们并不能说从线性内存映射到物理内存,因为不能说一个没有的东西映射到已经存在的东西上面(实际上很多地方就是这样说的,个人感觉不好)

但是从物理内存映射到线性内存也不是很好理解,因为线性内存是会经过MMU映射到物理内存的有点回调的味道

所以应该把这种映射理解为双向互认,是一种迭代(实际是查表,操作系统维护一张表,但是查表个人感觉就复杂了,如果描述成迭代就好理解多了),而非简单的单向指针