Linux内核学习5:内存管理(1)

本文介绍了Linux内核架构,强调了内核内存管理的特殊性。内容涉及地址类型、逻辑地址转换为物理地址的过程,详细讲解了段式管理和页式管理,特别是16位和32位CPU的差异。在Linux中,尽管段机制被有限使用,但主要依赖于分页机制进行内存管理。
摘要由CSDN通过智能技术生成

关于Linux内存管理的问题之前,先用一张图来在深入的了解下整个Linux内核架构以及Linux内核之间的关系。

从这张图上我们可以清楚的看到了内核空间、用户空间、GNU C库、系统调用之间的关系。

接着我们再来讲Linux的内存管理。

问题一:在内核里分配内存是否可以像在其他地方分配内存一样?

对于这个问题,显然是不可以的。至于为何这样。从根本上讲,是因为内核本身不能像用户空间那样奢侈的使用内存。内核与用户空间不同,它不具备这样的能力,它不支持简单便捷的内存分配方式。

比如说:内核一般不能睡眠。而且处理内存分配错误对内核而言绝非易事。


因此我们在学习内存管理的时候,最后的目的是要了解在内核之中是如何获取内存的。因此在研究分配的接口之前,要理解内核如何管理内存1

1:内存管理子系统的基本概念

1)地址类型

物理地址:(最后想得到的那个地址)指出现在CPU外部地址总线上的寻址,物理内存的地址信号,是地址变换的最终结果。是CPU来使用的。

线性地址:(虚拟地址),在32位系统CPU架构下,可以表示4G的空间

逻辑地址:程序代码编译后在汇编程序中使用的地址

2)逻辑地址转换为物理地址



问题描述二:什么是段式管理?什么事页式管理?

段式管理(16位CPU)

16位CPU拥有20位地址总线,寻址范围2的20次方,即1M内存空间。

但是16位CPU只有16位的寄存器,那么16位的寄存器怎么存储20位地址?

只用一个寄存器存放地址是存放不下的。

采用分段:要求1)逻辑段的起始地址(段)必须是16的倍数

      2)逻辑段的最大容量为64k
物理地址的形成方式:

运用另一个寄存器来存放段内偏移量(两个寄存器来存放一个存储单元的地址)

寻找内存单元在存储器中的具体位置:

物理地址=段寄存器的值*16+逻辑地址

简述:16位CPU不能存放20位的物理地址。物理地址是我们想得到的地址信号。且20位地址寻址空间为1M,但是寄存器只有16位。因此需要分段管理,即有了段寄存器。段地址是为物理地址左移4位的结果。另一个寄存器存放其偏移量。


CPU的段;16位CPU有4个段寄存器,程序可以访问四个不同含义的段。

CS+IP:代码段访问。CS存放段基地址,IP存放地址偏移量

SS+SP:堆栈段访问

DS+BX:用于数据段访问

ES+BX:用于附加段访问


32位CPU有两种工作模式:实模式和保护模式

一般工作在保护模式,工作在实模式下,它的内存管理与16位的CPU的管理模式是一样的

保护模式:与16位的CPU不一样,区别在于段寄存器存放的信息。

段寄存器:16位CPU的寄存器存放的是高16位的基地址

32位CPU存放的是一个地址,是一个选择器的地址。通过这个地址找到在内存中的位置,这个位置是存放了信息。再拿出基地址与偏移量相加。

这就叫做段选择器(32),在16位中叫段地址寄存器



页式管理:

页式管理如何管理线性地址。

线性地址分成固定长度的组,每个组称之为页。


先理解一个概念:可以访问4个G的内存单元,不代表有4个G的物理内存单元。

物理页:把所有的物理内存化分为固定长度的管理单元,它的长度一般与线性地址是相同的。也可以叫做页框与页帧。

页与物理页的映射关系:就是把对页的访问转换成对物理存储单元的访问。



Linux如何使用这样的管理?
Linux中是有限的使用了段机制。(并没有全部采用Intel所提供的段式管理)

因为Linux中所有段的基地址为0。在X86中从逻辑地址到线性地址的映射而言,线性地址=基地址+逻辑地址,但是此时由于基地址为0,因此线性地址=逻辑地址,于是Linux系统中完全利用了分页机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值