linux 0.11 之内存管理

1、 概述

 

intel 80x86 CPU中,程序在寻址过程中使用的是由段和偏移值构成的地址CS:[EIP]。程序中由16位的段和32位的偏移构成48位地址或长指针称为一个逻辑地址(虚拟地址)。它唯一确定了一个数据对像的段地址和段内偏移地址。而仅由32位偏移地址或指针指定的地址是基于当前段的对象地址。

 

逻辑地址会由分段机制转换为线性地址。此时如果启用了分页机制,则线性地址会由分页机制转换为物理地址;如果没有启用分页机制,则此线性地址即为物理地址。

 

2、 分段机制

 

分段提供了隔绝各个代码、数据和堆栈区域的机制,因此多个程序(任务)可以运行在同一个处理器上而不会互相干扰。

 

一个系统中所有使用的段都包含在处理器线性地址空间中。为了定位指定段中的一个字节,程序必须提供一个逻辑地址。逻辑地址包括一个16位段选择符和一个32位的偏移量。通过段选择符可在GDTLDT在找到对应段的基地址,用这个基地址加上32位的偏移量便获得一个线性地址。

 

3、 分页机制

 

因为多任务系统通常定义的线性地址空间都要比其含有的物理内存容量大得多,所以用了分页机制把线性地址“虚拟化”了。当使用分页机制后,每个段被分成多个大小为4K的页,页面可存储于内存或硬盘上。

 

操作系统会维护一个页目录和一些页表来留意这些页面,当程序(任务)访问线性地址空间中的一个地址位置时,处理器就会使用页目录和页表把线性地址转换成一个物理地址。

 

4、 分段与分页的区别

 

分页机制使用大小固定的内存块,而分段机制使用了大小可变的块来管理内存。段表(描述符表)存储在线性地址空间,而页表则保存在物理地址空间。段变换机制把逻辑地址变换成线性地址,并在线性地址空间中访问自己的表,但并不知晓分页机制把这些线性地址转换到物理地址的过程。分页机制也不知道程序产生地址的逻辑地址空间。分页机制只是简单地把线性地址转换成物理地址,并且在物理内存中访问自己的转换表。

 

5、 linux中物理内存的管理和分配

 

0.11内核中,默认最多支持16M物理内存。在一个具有16M内存的80x86计算机系统中,linux内核占用物理内存最前段的一部分,随后是高速缓冲区,它的最高内存地址为4M。高速缓冲区被显示内存和ROM BIOS分成两段。剩余内存部分称为主内存区。若系统中还存在RAM虚拟盘时,则主内存区前段还要扣除虚拟盘所占的内存空间。

 

 

0.11内核中,页目录和页表是在程序head.s中设置的。head.s程序在物理地址0处存放了一个页目录表,紧随其后是4个页表。这4个页表将被用于内核所占内存区域的映射操作。由于任务0的代码和数据包含在内核区域中,因此任务0也使用这些页表。其他派生进程将在主内存区申请内存页来存放自己的页表。

 

6、 0.11内核对线性地址空间的使用分配

 

 

每个进程在线性地址中都是从nr*64MB的地址位置开始(nr是任务号),占用逻辑地址空间的64MB(也是线性地址空间的范围)。

 

7、 页面出错异常处理

 

在开启了分页机制的状态下,若CPU在执行线性地址变换到物理地址的过程中检测到以下条件,就会引起页出错异常中断int 14

 

a、  地址变换过程中用到的页目录项或页表项中存在位(P)为0

b、  当前执行程序没有足够的特权访问指定的页面(通常是写保护)。

 

此时CPU会向页出错异常处理程序提供以下两方面的信息:

 

a、  栈中的一个出错码;

b、  在控制寄存器CR2中的线性地址(引起异常的访问使用的线性地址)。

 

8、 写时复制(copy on write)机制

 

写时复制是一种推迟或免除复制数据的一种方法。当进程A创建出一个子进程B时,由于子进程B实际上是父进程A的一个拷贝,因此会拥有与父进程相同的物理页面。达到了节约内存和加快创建进程速度的目的,此时子进程B以只读方式共享父进程A的物理页面,同时父进程A对这些物理页面的访问也是只读的。

 

AB对这些共享物理页面执行写操作时,就会产生页面出错异常中断,此时系统就会对这块导致写入异常的物理页面进行取消共享操作,并为写进程复制一新的物理页面,这时才真正的进行了复制操作(只复制这一块物理页面)。并且把将要执行写操作的这块物理页面标记成可以写访问。最后从异常中断返回时,CPU会重新执行刚才导致异常的写操作指令。

 

9、 需求加载(load on demand)机制

 

当创建子进程后,调用execve()系统调用加载运行一个可执行映像时,内核除了在CPU4G线性地址空间中为对应进程分配了64MB的连续空间,并为其环境参数和命令行参数分配和映射了一定数量的物理内存以外,并没有给执行程序分配其他物理内存页面。当然也没有从文件系统上加载执行映像文件中的代码和数据。因此一旦该程序从设定的入口执行点开始运行就会引起CPU产生一个缺页异常(执行指针所在的内存页面不存在)。此时才会根据引起缺页异常的线性地址把执行文件中相关代码页加载到物理内存页面中,并映射到进程线性地址空间。然后重新执行引起异常的指令。

 

采用需求加载和好处是在调用execve()系统调用后能让执行程序立刻开始运行,无需等待多次的块设备I/O操作把整个执行映像加载到内存后才开始运行。这对被加载目标文件的格式有一定要求。它要求被执行的文件目标格式是ZMAGIC类型的,即需求分页格式的目标文件格式,在这种目标文件格式中,程序的代码段和数据段都是从页面边界开始存放,以适应内核以页面为单位读取代码或数据内容。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值