操作系统
子翊寒
放开,请让我带你入门
展开
-
内存访问全过程
这一篇,是重点!我们将去讲解操作系统根据代码(逻辑)地址去访问真实物理地址的全过程。将把全面几节的东西全部用上,并完全梳理,完善细节。前面讲了分段、分页机制,他们都可以实现,从虚拟地址(地址空间)向物理地址的转换。但是,实际使用过程中,使用的是分段+分页机制,段页结合。段页结合全过程分析(高能)我们现在采用边实验边讲解翻译全过程。写了一段 c 代码,编译,然后在 Linux 0.11 中,进行调试#include <stdio.h>int i = 0x12345678;in原创 2020-05-10 16:54:40 · 2963 阅读 · 0 评论 -
多级页表与快表
之前页表结构的不足之前的页表结构看起来挺好的呀,有什么问题呢?如果每个页的大小是4k,也就是2的12次方。如果是32位的地址话,也就是说,有2的20次方个页。那么对应到页表,也就说页表应该有2的20次方个项。因为每个项表示的是一个内存地址,也就说一个项的大小是32位,也就是4个字节。这样算下来,对应于一个32位的内存地址,一个页表应该4M大小。看起来还可以接受啊。但注意,每个进程都有一个页表。看下,我的电脑现在有280个进程,也就说如果采用之前的结构,光页表结构就得占用280*4M=1120M,原创 2020-05-09 16:27:54 · 2173 阅读 · 0 评论 -
分页
前面说到了采用分段技术来进行虚拟地址(地址空间)到物理内存的转换。分段有什么问题?肯定得有不足,才需要提出新的技术来改进。那么我们刚才的分段机制,不是挺好的嘛?有什么问题呢?比如说,我们现在存放一些内容,需要占用 160K 的空间,但是我们来看空间的地址空间,分别是150K和50K,每个段都不足以满足 160 K 的要求,但是两个加起来,的的确确可以满足要求。只使用 分段机制,会造成内存碎片,浪费空间。如何解决呢?针对上面的问题,我们可以想到有下面的一些方法:移动已经使用的内存,把空闲的内原创 2020-05-09 16:11:48 · 395 阅读 · 0 评论 -
虚拟内存
背景我们一般把内存看成一块连续的字节数组。我们通过指定地址来访问其中的内容。我们看到图上,0KB-64KB 地址范围内,存放着操作系统。如果现在 A 同学想要写一个程序,它指定代码放在64KB-128KB的位置。现在B同学也写了一个程序,为了避免覆盖A同学程序,需要指定将代码放在128KB以后的位置。这样,就很麻烦了,你需要提前知道其他程序所在的位置,这样写代码就特别痛苦。为此,引入了虚拟内存的概念。地址空间的引入为此,引入了地址空间的概念,或者叫做虚拟地址。现在,对每一个程序,进程,都原创 2020-05-09 15:22:57 · 255 阅读 · 0 评论 -
内存分段机制
我们可以写一段简单的c代码(code/memory/segment_1.c):#include <stdio.h>int main(){ int a = 1; printf("Hello, World!"); return 0;}然后将其转为汇编,运行:gcc -S segment_1.c之后会生成一个.s 文件(code/memory/segmen...原创 2020-05-07 17:37:49 · 461 阅读 · 0 评论