Linux内核0.11——内核体系结构

Linux内核体系结构


linux内核主要由五部分组成:进程调度模块、内存管理模块、文件系统模块、进程间通信模块、网络接口模块。

这里写图片描述

如上图包括了各个部分的依赖关系,也大概表明了其在内核目录中的分布,其中进程调度模块是比较重要的一部分,所有模块都和它存在着依赖关系,相当于一个计算机资源的总管家。


内存管理和使用


这一部分不太好理解,建议多看几遍书,这里说一些我对书上的理解。

这里写图片描述

从上面这个物理内存分布中不难看出,并不是所有物理内存都是可用的(对于普通用户和上层应用开发来说),这就是为什么我们买电脑的时候人家说是4G的运行内存,而实际上开机之后你能用的总是那么多,远远不足4G。
所以说计算机的物理内存是远远不够用的,于是就产生了几种内存管理机制:分段系统、分页系统。分页是可选的,由系统编程人员决定,linux系统则是同时采用了这两种机制。

内存地址空间概念


想要搞懂linux内存管理,首先要弄清楚几个概念,不然那些什么虚拟地址、逻辑地址会把你搞得头昏。

这里写图片描述

  • 虚拟地址:由段选择符和段内偏移地址组成,因为这两部分并没有直接指向物理内存,需要经过分段变换机制(具体后面会说)才对应到物理内存,所以叫虚拟地址。虚拟地址空间包括GDT全局地址空间和LDT局部地址空间,选择符占13个bit,还有1bit是区分GDT or LDT,所以一共有2的14次方16384个选择符,若每个段取最大4G寻址空间,则整个虚拟地址空间有4 x 16384 = 64G。
  • 逻辑地址:一般是指程序代码段限长内的偏移地址,一般程序员只需知道逻辑地址,因为分段分页机制对于他们是透明的,由系统编程人员管理,所以一些资料上对虚拟地址和逻辑地址不区分。
  • 线性地址:虚拟到物理地址之间变换的中间层,也就是逻辑地址加上段选择符就是线性地址,如果不经分页机制,就直接得到的线性地址就是物理地址。

在linux0.11内核中,为每个进程分配了64M的虚拟内存空间,因此程序逻辑地址是0x0000000-0x4000000

好,那为什么要搞这些乱七八糟的又分段又分页的机制呢,整个物理内存就那么多,还要被系统占用一部分,windows用户还会说经常有流氓软件在后台运行占用内存和网络流量时不时出现内存占用率达到90以上的情况。
可是为什么我们还能在资源这么紧缺的情况下一边打撸一边看电影呢,答案就是虚拟内存系统。举个例子,你从北京到上海不需要很长的铁轨就能顺利完成任务,比如我们可以将后面的铁轨铺到前面,只要你够快够准。学过操作系统的应该会更了解虚拟内存机制(其实就是在进程暂时不用内存的时候给其他进程用,用一会再还回来嘛,或者再找别的进程借。),这个虚拟内存机制充分利用了CPU的地址总线,就拿上面的段来说,一个段最大4G空间,所以总的虚拟内存空间会比实际物理地址空间要大很多。

当然了真正的实现没这么简单,只是一个比喻。


分段机制

  • 实时模式下寻址一个内存地址用一个段值加上一个段内偏移,段值存放在段寄存器(如ds),段长固定为64KB,偏移值存放在任一个可用于寻址的寄存器(如si),通过这两个寄存器的值就可以计算处实际地址
  • 保护模式下段寄存器存放的不再是段基址,而是一个段描述符表中某一描述符项在表中的索引值,该描述符项中包含段基址、段长(可变,定义最大长度4G)、段的访问特权级别等。

    这里写图片描述

保存描述符项的描述符表有三种类型:

  • GDT全局描述符表
  • IDT 中断描述符表
  • LDT局部描述符表

GDT和LDT构成了整个虚拟地址空间,为了能够寻址这三个表,在gdtr、idtr、ldtr三个寄存器中分别存放了表基址和限长。

这里写图片描述


分页机制


上面说过线性地址如果不经过分页转换,那得到的就是物理地址,下面这张图告诉我们如果采用分页机制,线性地址是怎么转换的:

这里写图片描述

CR3保存页目录表基址在物理内存中的基址

内存分页管理机制主要原理就是,CPU将整个线性内存地址分为4096个字节为一页的内存页面,其实现机制从上图可以看出和分段机制类似,但没那么完善。在80x86体系结构中如果采用分页机制,需要将CR0的高位也就是bit31置位。
在80386中采用了分页管理,每个页目录表项或页表项格式基本相同都占4个字节,每个页目录表或页表必须只能包含1024个页表项,因此一个页目录表项或页表项占用4 x 1024个字节,也就是一个页面。
换句话说,一个页表项可以映射一个页面(也就是4096个字节=4KB),一个页表呢包含1024个表项,一个页目录表项包含1024个表项,就是说一个页目录表可以映射1024x1024x4KB=4GB的线性地址,也就是整个线性地址就可以用一个页目录表项映射了,神奇吧。

由于linux0.11中内核

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值