0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析Linux系统中的内存管理

冬至配饺子 来源:廣廣的随笔 作者:廣廣的随笔 2022-08-17 16:27 次阅读

当使用Inter 80x86微处理器时,必须区分三种地址:

逻辑地址:有段基址和段偏移量组成。

线性地址:32位无符号整数。

物理地址

CPU通过分段单元将逻辑地址转换为线性地址,再通过分页单元将线性地址转化为物理地址

硬件的分段单元

从80386CPU开始,Intel微处理器能执行两种不同的地址转换模式,分别称为实模式(为了与早期OS兼容)和保护模式,这里重点放在保护模式上。

寄存器

一个逻辑地址由两部分组成,一个段标识符(16位)和一个相对地址的偏移量(32位),段寄存器是用来存放段选则符的,包括cs,ss,ds,es,fs,gs。

cs:代码段寄存器,用于存放程序指令的段。

ss:栈段寄存器,指向当前存放程序栈的段;什么是程序栈空间,即主要用来 存放函数和数组等。

ds:数据段寄存器,指向存放静态数据(永久性不变的数据)或者外部数据的段。

其它三个寄存器做一般用途,可以用来访问任意段。

cs寄存器还有一个两位域,用来指明cpu的特权级,linux中只有0和3级,分别为内核态和用户态。

段描述符

占8字节,段描述符被放在全局描述符表(GDT)或者局部描述符表(LDT)。

系统通常只定义一个GDT(其地址被存放在GDTR寄存器中),每个进程可以有自己的LDT(其地址被存放在LDTR寄存器中)。

其中,系统段存储内核数据结构,任务状态段用于保存处理器寄存器的内容。

poYBAGL8pW-AGAWRAAHG9TXbiqo817.png

段选择符

为了加速逻辑地址到线性地址的转换,Intel处理器提供一种附加的非编程的寄存器(不能被程序员设置),这样在访问段寄存器中段选择符时,就不能(不需要)访问GDT或LDT了。

poYBAGL8pZCADVOQAAB7_2jDXOg703.png

段单元

逻辑地址转化为线性地址总览:

poYBAGL8pZWAKmXeAACQTXbd8y8728.png

Linux中的段

Linux更喜欢分页的方式,当所有的进程使用相同的段寄存器值时,内存管理变得更简单,它们能共享相同的线性地址。而且许多RISC处理器不支持段功能,Linux不好做移植。

硬件的分页单元

分页单元认为所有的RAM被分成固定长度的页框,每一个页框包含一页。在Intel处理器中,通过设置CR0寄存器的PG标志启动分页。当PG=0时,线性地址就被解释成物理地址。

常规分页

从i80386起,Intel处理器的分页单元处理4KB的页。32位线性地址被分成三个域:目录(10),页表(10),偏移量(12)。

正在使用的页目录表的物理地址存放在处理器的CR3寄存器中。

pYYBAGL8pa2AEsipAAB19_aIcCI268.png

这里要说明下,在页目录和页表表项中由Page Size标志为1,页目录项指的是4MB的页框。如果Present为0,分页单元就把这个线性地址存放在处理器的CR2寄存器中,并产生14号缺页异常。

扩展分页

从奔腾处理器开始,Intel80x86微处理器引进了扩展分页,它允许页框大小为4KB或4MB(页目录10位,偏移量22位)。

pYYBAGL8pcCADBJEAABvfjdl1u0649.png

之后就是引入cache和TLB(计算机组成原理内容),就不详细说了。

Linux的分页

Linux采用三级分页,页全局目录(10),页中间目录(10),页表(10),偏移量(13)。

poYBAGL8pdOAQmGMAACqMsGtvIM563.png

保留的页框

内核代码和数据结构存放在一组保留的页框中,这些页框所含的页从不动态分配或者交换到内存中。

作为一条常规,Linux内核被安装在RAM物理地址0x00100000开始的地方,为什么从这个地方开始?

因为页框0由BIOS使用,存放硬件配置。

物理地址0x000a0000到0x000fffff被BIO程序使用同时映射ISA上的显存。

前1MB的其它页框可能被保留用作特定的计算机模式。

为了避免把内核装入一组不连续的页框,Linux更愿跳过第1MB的RAM。(内核小于1MB _text---_etext)

pYYBAGL8peaAbwPJAAB8xS_WqQA758.png



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5329

    浏览量

    120136
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10835

    浏览量

    211320
  • 微处理器
    +关注

    关注

    11

    文章

    2249

    浏览量

    82354
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27368
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21630
收藏 人收藏

    评论

    相关推荐

    Linux内存管理是什么,Linux内存管理详解

    Linux内存管理 Linux内存管理是一个非常复杂的过程,主要分成两个大的部分:内核的
    的头像 发表于 05-11 17:54 6001次阅读
    <b class='flag-5'>Linux</b>的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>详解

    走进Linux内存系统探寻内存管理的机制和奥秘

    Linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍Linux 内存组织结构
    的头像 发表于 01-05 09:47 1606次阅读

    关于Linux内存管理的详细介绍

    Linux内存管理是指对系统内存的分配、释放、映射、管理、交换、压缩等一系列操作的
    发表于 03-06 09:28 1062次阅读

    Linux内核的内存管理详解

    内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。
    发表于 08-31 14:46 763次阅读
    <b class='flag-5'>Linux</b>内核的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>详解

    嵌入式Linux内存管理是什么

    点击 嵌入式 Linux 内存管理
    发表于 11-05 07:01

    浅析SoC中断与Linux内存管理

    什么是SoC中断?Linux内存管理包括哪些?linux的进程调度时机有哪些?
    发表于 11-30 06:18

    linux内存管理机制浅析

    本内容介绍了arm linux内存管理机制,详细说明了linux内核内存管理,
    发表于 12-19 14:09 73次下载
    <b class='flag-5'>linux</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>机制<b class='flag-5'>浅析</b>

    linux内存管理

    linux内存管理
    发表于 10-24 11:12 3次下载
    <b class='flag-5'>linux</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>

    基于Linux内存管理与Android内存分配机制

    Android采取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存
    的头像 发表于 03-30 14:52 6217次阅读

    你知道linux内存管理基础及方法?

    linux内存管理采取的分页存取机制,会将内存不经常使用的数据块交换到虚拟内存
    发表于 04-28 17:12 1145次阅读

    嵌入式 Linux 内存管理

    点击 嵌入式 Linux 内存管理
    发表于 11-02 10:36 12次下载
    嵌入式 <b class='flag-5'>Linux</b> <b class='flag-5'>中</b>的<b class='flag-5'>内存</b><b class='flag-5'>管理</b>

    Linux内存管理体系介绍

    内存是计算机最重要的资源之一,内存管理是操作系统最重要的任务之一。内存管理并不是简单地
    的头像 发表于 08-08 09:28 1599次阅读

    Linux内存管理系统开发必知的3个结构概念

    Linux内存管理系统使用节点(node)、区域(zone)和页(page)三级结构描述物理内存
    的头像 发表于 08-28 09:34 872次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>子<b class='flag-5'>系统</b>开发必知的3个结构概念

    Linux 内存管理总结

    一、Linux内存管理概述 Linux内存管理是指对系统
    的头像 发表于 11-10 14:58 508次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>内存</b><b class='flag-5'>管理</b>总结

    Linux下如何管理虚拟内存 使用虚拟内存时的常见问题

    Linux系统,虚拟内存管理是操作系统内核的一个重要功能,负责
    的头像 发表于 12-04 09:19 190次阅读