完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
关于Linux系统的学习,切记不能一头雾水,我们需要大概的理解操作系统的结构体系.将这个大型的操作系统分割成每个核心的小部分进行学习.切记,不管是任何的操作系统都需要模块化的学习和编写它.
首先,Linux操作系统拥有很核心类似于很多操作系统一样的内存管理模块,进程调度模块,各种类型的驱动程序模块,文件系统这些很通常的东西.下面我会根据我初步学习的经验来大概的描述一下希望和亲爱的Linux爱好者一同去讨论和研究. 内存管理篇 内存管理部分:Linux的内存管理部分已经被很多操作系统所学习的.我们叫他分段和分页机制. 首先我们先普及一下关于内存这个硬件的基本属性.内存RAM 叫做随机读取存储.也就是说它上面的数据可以以很快的速度进行读写.他的直接交互就是CPU的寄存器和程序中的各个缓冲区.内存硬件就好像一个城镇一样,每个街道上都有排列整齐的房子,每个房子都有唯一的有顺序的门牌号,每个房子中都有家具和人.这就是内存硬件的贴切举例.下面我会根据举例的情况对内存属性进行一一匹配.城镇是内存的一个宏观概念,每条街道就是内存上每条顺序的存储寄存器的排列,存储寄存器就是每个房子,而门牌号就是代表这个寄存器在内存中的存在位置--地址(当然,叫做指针也是可以的),而房子内部的家具或者人就是这个地址上的寄存器的变量.以上的举例就是内存硬件的大概情况.内存存放数据的方式是通过寻址读写的.通过得知变量所在的地址完成对变量的读写操作.根据这个特性,所以就出现了分页机制的内存管理方式. 描述一下内存的分页管理机制: Linux系统的分段分页内存管理机制本质上也是一种寻址管理方式,为了迎合内存硬件的操作方式. 因为程序和数据的存储在运行的时候是存在于内存上的,所以我们需要用一种查询索引值的方式来调用数据和程序指令. 分段机制是将内存分成不同长度的段,通过查询段描述符列表以及选定的段选择符来共同选出段描述符,这个时刻的段描述符就是即将要执行的程序指令或者内存数据的载体.段描述符一般是由段基地址,段属性以及段长来组成的.所以由于段长的存在代表了段是一段区域的整体代表.那么如何调用已经定位后的段中的数据或者指令呢?这个时候会从逻辑地址中解析出的段内偏移值作为调用数据的根据.我们知道平时的程序是我们所说的逻辑地址,只有将逻辑地址变成线性地址之后我们才能从线性地址中解析出两个重要的数据(这两个值就组成了线性地址),一个是段选择符(更贴切称为段号索引),另一个就是偏移值.通过这两个数据来准确定位一个数据或程序指令在内存中的位置.所以分段机制的大概过程:从程序中获取逻辑地址->将逻辑地址变成线性地址(这个是通过改变一些数据就可以了)->从线性地址中获取两个重要参数(段索引和偏移值)->根据索引值从段描述表中获取对应的段描述符->根据段描述符中的段基址和段长来确定将要使用的段的基本属性信息->根据段基址和段内偏移值来确定一个数据或者指令的内存位置. 这就是逻辑地址向线性地址转化后,仅仅通过分段机制来调用内存数据. 然而Linux并没有简单的只使用分段机制来管理内存,而是在分段的基础上增加了分页管理机制,分页的作用很大.一方面启用了二级保护,另一方面对操作系统的写时复制和缺页加载机制提供了基础. 分页机制是在分段机制后的一种内存管理机制.在逻辑地址向线性地址转换之后通过分段机制来选择正确的段后与偏移值进行求和.这个地址(在分页机制开启的前提下),会表示页表中的一个页面,通过寻找到的页面加上页内偏移值来寻找内存数据. 简单描述一下分页机制的组成成分:页目录表的基地址寄存器(CR3-页目录表基地址寄存器),页目录表,页表,页面,面内偏移值. CR3寄存器是存放一级页表的基地址的寄存器,通过CR3的数据来寻找一级页表的地址. 页目录表(形象比喻书架)中存放了各个页表,使用一个4B大小的空间来存放一个页表属性标签,这个标签会包含页表基地址和页表属性. 页表(比喻一本书)存放了各个页面,也是使用一个4B大小的空间来存放一个页面的基地址和页面的属性(存在,读写,修改,等级). 页面(书上的一页)会存放物理内存中的数据或者指令.一个页面就会映射一段连续4KB长度的实际内存区域. 页面内偏移值,同样在找到正确页面后(其实就是找到了页面存在于内存的基地址),通过加上偏移值就可以寻址到页面内的数据和指令. 以上是分页机制的各个组成成分.接下来我会描述一下一个内存数据在分页机制下调用的过程. 程序中的逻辑地址通过变换变成线性地址,通过分段机制的段选择和偏移值的求和就得出了取页面的线性地址.这个线性地址中包含了三个数据,一个是页目录表中的页表索引,一个是页表中的页面索引,以及页面内的偏移值. 由于前面有了页目录表基地址,所以通过使用线性地址中的页表索引值来计算出页表的基地址,再通过页面索引号来得出页面的基地址,通过页面基地址加上偏移值就映射出了数据在内存中实际地址. 分页机制中实现的写时复制技术和缺页加载技术. 写时复制:是当任务0被复制产生新的任务的时候,此时系统并不会给新任务分配内存空间.只有当任务执行的时候才会根据具体情况进行内存分配.当新任务仅仅进行读操作的时候会和任务0共享内存空间,但是需要写操作的时候就必须取消内存共享,并且为这个待写的页面开辟一页内存,并且将原来共享页的内容复制给新的页面,然后在页面上进行需要的写操作.这样的写时复制能够减小内存空间的占用.尽量几个任务共享一些内存空间. 缺页加载技术: 是内存和硬盘的一个分区处通过分页机制进行物理页面的来回调用.因为页面条目的信息属性上有个P位表示此页面是否存在于内存中,如果为0就说明不在内存中,这个时候程序回去硬盘中查询此页面(这个是通过缺页异常中断来进行执行的).若不存在就出现异常终止,若存在就先开辟一页内存,将待调用的页面内容复制进来,并且将存在于硬盘的页面释放掉.这个时候从新执行异常中断前的指令.就完成了缺页的加载执行. |
|
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4897 浏览 0 评论
87415 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4728 浏览 2 评论
3624 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2484 浏览 0 评论
2003浏览 3评论
1287浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1345浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1236浏览 0评论
1176浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 20:43 , Processed in 1.173928 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号