Linux核心原理————内存管理与寻址(参考内核完全剖析0.11版)

参照赵炯博士的《Linux完全剖析基于内核0.11版》和Linux 0.11源码,将阅读中的一些核心内容记录到个人博客。
整个核心原理部分打算初步分为五个部分:

1、内存管理与寻址

1.1 概要
1.2 内存分布
1.3 寻址
1.4 缓冲区管理

2、进程调度
3、中断与异常
4、驱动程序
5、文件系统
本篇博客主要关于内存管理与寻址。

1、概要
对于Linux 0.11,管理的物理内存为16M,使用段管理的权限部分,未使用段寻址,但是由于CPU强制保护模式下分段,Linux将所有段均限长都都设置为16M,段基址设为0,从而绕过这个限制。采用分页——二级页表的方式管理内存,页目录表1024项,对应1024个页表,1个页目录表项4字节,高20位指向页表的起始地址(0x1000,0x2000,…)。

2、内存分布
对于Linux 0.11使用的16M内存,从低位开始1M以内的空间视作内核区(实际上还有部分缓冲区的缓冲头),1M到4M为高速缓冲区(774个页),4到4.5M是虚拟盘(122个页),4.5M到16M为主内存区(2944个页)。对应下面书中原图:
源码解析内存原图
对于内核部分(1M以内),其内存占用情况如下:在这里插入图片描述
物理地址0开始分别存放的是页目录表,1024个4字节,4个页表(可以在此扩展),软盘缓冲区,中断描述符表、全局描述符表和其它模块的代码,其中在shced.c的代码中,有共任务0使用的user_stack栈。
其中全局描述符表,每项8字节,共256项,其分布如下:
在这里插入图片描述
3、寻址
对于一般的操作系统,通常采用逻辑地址——>线性地址——>物理地址的方式进行寻址。
逻辑地址到线性地址:有逻辑地址cs(16位段选择符):edi(32位偏移),取cs中的高13位(对应GDT表中的8092项),然后从GDTR获取GDT表的物理起始地址,就可得到段描述符,从段描述符中获取32位段基址base+edi = 线性地址,“+”是直接加和;
线性地址到物理地址:32位线性地址(4字节),高10位(对应代码“线性地址>>20) & 0xffc”)用于获取4字节页目录项,页目录项的高20位定位页表的起始地址(0x1000,0x2000…),中间10位用于获取页表项,页表项指向物理地址页面的起始地址,低12位定位物理地址1页中的位置,12位恰好对应4k,从而获得准确到字节的物理地址。
对于Linux操作系统来说,不使用段进行寻址。虽然Linux不使用段寻址,但是仍然存在段基址和段限长。Linux在寻址过程中仍然采用上述方式将线性地址转化到物理地址的过程,但是逻辑地址转化为线性地址不使用上述方法。
在Linux 0.11中,逻辑地址的段基址的高10位对应页目录项,比如段基址为4M,高10位最后一位为1,恰好对应于第二个页目录项(第一个为0),也即第二个页表(一个页表映射4M)。
Linux 0.11 中设置段基址 base = nr(任务号) * 64M,即每个任务的段基址的高10位分别是1000(16个4M),10000(32个4M),最多到(1024个4M,4G)
在这里插入图片描述
其中比较特殊的是任务0和任务1的线性地址空间为0-640k,64M-64M+640k,通过段限长约束到640k

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值