很好的一片有关分段和分页解释的

Linux内存寻址之分段机制及分页机制 前言 最近在学习Linux内核,读到《深入理解Linux内核》的内存寻址一章。原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解。于是,查找了很多资料,最终理顺了内存寻址的知识。现在把我的理解记录下来,希望对内核学习者有一定帮助,也希望大家指出错误之处。 分段到底是怎么回事 相信学过操作系统课程的人都知道分段分页,但是奇怪的是书上基本没提分段分页是怎么产生的,这就导致我们知其然不知 阅读详情

http://bbs.chinaunix.net/thread-3586493-1-1.html
首先实模式和保护模式是CPU的两种工作模式。一开始PC启动时CPU是工作在实模式下的,经过某种机制后,CPU跳转到保护模式。

Intel 8086是16位CPU,它只有16位寄存器、16位数据总线和20位地址总线,它只能运行在实模式
在实模式,
物理地址=段值*16+偏移 
段值和偏移都是16位的 具有1MB(2^16 * 2^4 + offset)的寻址能力。
而从80386开始CPU有32位地址线,所以寻址空间可以达到4GB。单从寻址这方面说,使用16位寄存器的方法已经不够用了,必须要开发一种新方法。在保护模式下,虽然CPU还是使用原来16位的cs、ds寄存器表示内存地址的段值,不过保护模式下的段值只是一个索引,这个索引指向一个数据结构的一个表项就是GDT(or LDT)。
在保护模式下,CPU有着巨大的寻址能力,并为强大的32位操作系统提供了更好的硬件保障。

所以实模式和保护模式其实就是随着CPU性能不断增强后为了前后能够兼容而设计出来的一套模式。是一个历史遗留产物。
--------------------------------------
为什么要分段?
当x86 CPU 工作在保护模式时,可以使用全部32根地址线访问4GB的内存,因为80386的所有通用寄存器都是32位的,所以用任何一个通用寄存器来间接寻址,不用分段就可以访问4G空间中任意的内存地址。但这并不意味着,此时段寄存器就不再有用了。实际上,段寄存器更加有用了,虽然再寻址上没有分段的限制了,但在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是不是允许执行等等涉及保护的问题就出来了。要解决这些问题,必须对一个地址空间定义一些安全上的属性。段寄存器这时就派上了用场。但是设计属性和保护模式下段的参数,要表示的信息太多了,要用64位长的数据才能表示。我们把着64位的属性数据叫做段描述符,上面说过,它包含3个变量:段物理首地址、段界限、段属性 80386的段寄存器是16位(注意:通用寄存器在保护模式下都是32位,但段寄存器没有被改变)的,无法放下保护模式下64位的段描述符。如何解决这个问题呢?方法是把所有段的段描述符顺序存放在内存中的指定位置,组成一个段描述符表(Descriptor Table);而段寄存器中的16位用来做索引信息,这时,段寄存器中的信息不再是段地址了,而是段选择子(Selector)。可以通过它在段描述符表中“选择”一个项目已得到段的全部信息。那么段描述符表存放在哪里呢?80386引入了两个新的寄存器来管理段描述符,就是GDT和LDT。这样,用以下几步来总体体验下保护模式下寻址的机制
1、段寄存器中存放段选择子Selector 
2、GDT中存放着段描述符表的首地址 
3、通过选择子根据GDT中的首地址,就能找到对应的段描述符 
4、段描述符中有段的物理首地址,就得到段在内存中的首地址 
5、加上偏移量,就找到在这个段中存放的数据的线性地址(只有分段机制情况下,就是真实物理地址)。 

接上面所述,GDT的作用就是用来提供段式存储机制,这种机制是通过段寄存器和GDT中的描述符共同提供的。
因为要能够访问4GB内存,所以在32位模式下
物理地址不能等于 段值*16+偏移 (这种方法寻址1MB)
于是,设计者让
段值*16指向一个数据结构的一个表项就是GDT(or LDT),表项中详细定义了段的起始地址,界限和属性等内容 
于是原先“段:偏移”形式的逻辑地址经过段机制转化成线性地址
如果只有分段机制,那么这个地址就是对应的真实内存的物理地址。

--------------------------------------
为什么要分页?
其实它的主要目的在于实现虚拟存储器。

接上面所述,刚刚说到线性地址,并且说如果只有分段机制,线性地址就是物理地址
如果打开了分页机制后:
逻辑地址-》分段机制-》线性地址-》分页机制-》物理地址
是这样一套转化机制。

另外,如果你写完一个程序后,复制了一份,然后同时调试。你会发现,从变量地址到寄存器的值,这两个程序几乎全部是都是一样的,而这些一样的地址之间完全不会被混淆,而是各自完成自己的职责,这也是分页机制的功劳。
另外,因为分页机制的存在,程序使用的都是线性地址空间,而不再直接是物理地址。这好像是操作系统位应用程序提供了一个不依赖于硬件(物理内存)的平台,应用程序不必关心实际上有多少物理内存,也不必关心正在使用的是哪一段内存,甚至不必关心某一个地址是在物理内存里面还是在硬盘中。只要像操作系统申请就行,而操作系统全权负责了这其中的转换工作。
--------------------------------------
SpringBoot+VUE3实战:如何用WebSocket搞定网页端语音通话(避坑指南) 本文详细介绍了如何使用SpringBoot和VUE3结合WebSocket技术实现网页端语音通话功能。从环境配置、WebSocket服务端实现到前端音频处理,提供了完整的开发指南和避坑建议,帮助开发者快速构建稳定高效的实时语音通信系统。 阅读详情

相关推荐

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 819

Linux内存管理之一 分段与分页

现代操作系统的内存管理机制有两种:段式管理和页式管理。段式内存管理,就是将内存分成段,每个段的起始地址就是段基地址。地址映射的时候,由逻辑地址加上段基地址而得到物理地址。纯粹的段式内存管理的缺点很明显,就是灵活性和效率比较差。首先是段的长度是可变的,这给内存的换入换出带来诸多不便,如何选择一个段的长度是一个棘手的问题;其次进程在运行过程中,可能会扩充地址空间,这就要增加段,从而造成进程的地址空间由...

cpongo5 431

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路

本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。

weixin_29220405的博客 263

内存分页、内存分段的区别

碎片处理:分页通过固定大小的页来消除外部碎片,但可能产生内部碎片;分段则可能产生外部碎片,但不会有内部碎片。地址结构:分页使用单一的线性地址空间,而分段则提供了分段的逻辑视图,每个段可以独立寻址。管理目的:分页主要是为了内存的有效利用和简化管理;分段则更侧重于满足程序员对程序结构的组织需求。硬件支持:分页和分段都需要硬件支持,分页需要页表,分段需要段表,有些现代操作系统和硬件支持分页和分段的结合使用。在实际应用中,许多操作系统采用分页作为主要的内存管理技术,同时结合分段来更好地支持程序的逻辑结构。

坚定目标,超越自我 1116

编译opencv4.2时出现undefined reference to `jpeg_default_qtables‘错误的解决方案

操作系统:kylinV10 opencv版本:4.2.0 在编译opencv4.2.0的版本时,出现undefined reference to `jpeg_default_qtables’的错误提示,导致openc编译中断,不能继续编译,所以这个错误必须解决。 解决方案 查看错误的名字,根据名字分析,很有可能是当前系统中没有安装jpeg第三方库,到 http://www.ijg.org/上下载最新的源码包 jpegsrc.v9e.tar.gz,按如下顺序开始编译安装: tar -xzvf jpegsr.

jndingxin的专栏 5105

Unity XR Interaction Toolkit(二)手柄交互

XR Interaction 手柄事件和抓取设置

qq_36608844的博客 8494

linux内存管理

对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图:

wwwlyj123321的博客 4544

【AI实践】Dify调用本地和在线模型服务

Ollama可以本地部署模型,如何集成私有数据、如何外部应用程序对接,因此需要有一个应用开发框架。ip地址需要换成自己电脑的IP地址;模型名称需要和Ollama模型名称保持一致;docker是虚拟环境的主机,Ollama部署在本地主机,无法通过本机访问。找到Ollama,配置本地Ollama已经验证的模型,如phi3。在docker页面里面,也可以看到running。docker已经安装完成的情况下。,打开dify,注册登录后。在工作区选择调用即可。

AI_Gump的博客 4854

内存分页和分段

无论是分段还是分页,都是为了更好的对内存进行管理才出现的。

airplanewuhu的博客 433

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入探讨了SAP CO模块中KKA2和CJ88结果分析码在项目收入成本匹配中的高阶应用。通过真实案例解析,详细介绍了这两种分析码在分阶段收入确认和终验法项目中的配置技巧与实战经验,帮助财务人员高效解决复杂业务场景下的财务数据处理难题。

weixin_29230773的博客 166

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 730

【面试】解释分页和分段

分页和分段是两种重要的内存管理技术,各有其优缺点和适用场景。分页适用于需要高效、简单的内存分配的场景,而分段则更适合需要灵活内存管理和强访问控制的应用。在实际操作系统中,分页和分段常常结合使用,提供更灵活和高效的内存管理解决方案。

Lewiz_124的博客 2040

Simulink开发项1000例实战专栏--实例38:基于Simulink的周波变换器(Cycloconverter)

需求分析周波变换器(Cycloconverter),也称为频率变换器或直接变频器,是一种将输入的固定频率交流电直接转换为不同频率的交流电的电力电子设备。它广泛应用于工业领域,如大功率电机驱动、风力发电、船舶推进系统等场合。与传统的间接变频器(如交-直-交变频器)相比,周波变换器具有更高的效率和更简单的结构,适用于需要低频输出的应用场景。

xiaoheshang_123的博客 334

分段和分页

一. 分页存储管理 1.基本思想     用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。 2. 分页存储管理的地址机构 15          12         11                  0      页号P                 页

复兴之路 3万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

分段和分页内存管理

两者描述         打个比方,比如说你去听课,带了一个纸质笔记本做笔记。笔记本有100张纸,课程有语文、数学、英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择。          第一种是,你从本子的第一张纸开始用,并且事先在本子上做划分:第2张到第30张纸记语文笔记,第31到60张纸记数学笔记,第61到100张纸记英语笔记,最后在第一张纸做个列表,记录着三门笔记各

TinyFisher的专栏 9536

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

操作系统原理——内存的分段、分页和平坦模型:区别与发展

对操作系统原理中,内存的分段、分页和平坦模型进行简单介绍,比较区别,介绍发展与演变。

Zheng__Huang的博客 6152

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

分页、分段、虚拟存储

将一个进程的地址空间划分成若干个大小相等的区域,称为页。相应地,将主存空间划分成与页相同大小的若干个物理块,称为块或页框。在为进程分配主存时,将进程中若干页分别装入多个不相邻接的块中。

qq_62835094的博客 2031

【Linux内核】内存管理——分段和分页的区别

分段和分页的工作方式相似,都是非连续存储。 分段的逻辑地址=段号+段内偏移。段表存放段描述符。段描述符=段基址+段界限。物理地址=段基址+段内偏移。 分页的虚拟地址=页号+页内偏移。页表存放页面映射。页面映射=虚拟页号+物理页号。物理地址=物理页号+页内偏移。

Ethan-Code's blog 2327

内存管理:分页,分段,段页结合

进程如何使用内存 进程是操作系统资源分配的最小单元。操作系统分配给进程的内存空间中包含五种段:数据段、代码段、BSS、堆、栈。 数据段:存放程序中的静态变量和已初始化且不为零的全局变量。 代码段:存放可执行文件的操作指令,代码段是只读的,不可进行写操作。这部分的区域在运行前已知其大小。 BSS段( Block Started By Symbol):存放未初始化的全局变量,在变量使用

zouliping的专栏 9943

Linux的内存寻址——浅谈分段和分页机制

本文会以80x86架构,linux2.6为例,简单介绍内存的分段和分页机制。1. 三种内存地址关于内存地址,首先要了解它有三种,分别是逻辑地址、线性地址和物理地址。把逻辑地址转换为线性地址是由一个叫做分段单元的硬件电路完成的。同样地,还有一个叫做分页单元的硬件电路负责把线性地址转换为物理地址。那现在很明确地,当我们讨论分段的时候,就是讨论逻辑地址是如何转换成线性地址的。当我们讨论分页的时候,就是在...

HelloNerd的博客 1644

Linux学习总结—内存分段和分页管理

1.x86 内存架构和Linux的分段管理x86 内存架构在 x86 架构中,内存被划分成 3 种类型的地址:·         逻辑地址 (logical address) 是存储位置的地址,它可能直接对应于一个物理位置,也可能不直接对应于一个物理位置。逻辑地址通常在请求控制器中的信息时使用。·         线性地址 (linear address) (或称为平面地址空间)是

cxy的Linux技术专栏 7765

分段分页方式的比较各自优缺点

分段和分页其实都是一种对地址的划分或者映射的方式。 两者的区别主要有以下几点:1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。2)页的大小...

Jay·Chou的博客 1万+

分段,分页与段页式存储管理

一.  分页存储管理 1.基本思想 用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。 1)      等分内存 页式存储管理将内存空间划分成等长的若干物理块,成为物理页面也成为物理块,每个物理块的大小一般取2的整数幂。内存的所有物理块从0开始编号,称作物理页号。 2) 逻

zephyr_be_brave的专栏 3万+

分页、分段

分页系统地址映射 内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。 一个虚拟地址分成两个部分,一部分存储页面号,一部分存储偏移量。 下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。例如对于虚拟地址(0010 000000000100),前 4 位是存储页面号 2,读取表项...

minose的博客 588

虚拟内存、分段分页

虚拟内存、分段分页

Warren++的博客 1118

【操作系统】分页分段

分页分段已知某分页系统,主存容量为64K字节,页面大小为1K,对一个4页大的作业,其0、1、 2、3页分别被分配到主存的2、4、6、7块中,试: (I)将十进制的逻辑地址1023、2500、 3500、4500 转换成物理地址: (2)以十进制的逻辑地址1023为例画出地址变换过程图。 某虚拟存储器的用户空间共有32个页面,每页1KB,主存16KB。假定某时刻,系统为用户的第0,1,2,3页分配的块号分别为5,10,4,7,而该用户的作业长度为6页,试将十六进制的虚拟地址0A5C转化成物理地址。

qq_62702607的博客 4966
上一篇: A trip through the Graphics Pipeline 2011, part 13
下一篇: 高端内存与低端内存
killcpp
博客等级 码龄20年 13粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值