Linux 0.11的软件加载和块设备数据读取:

本文详细阐述了操作系统中页管理通过mem_map数组实现物理资源管理,以及缓冲区作为内存与外存交互的桥梁。在文件读取过程中,通过i节点获取数据块位置,触发页故障将数据加载到缓冲区。对于可执行文件,fork后变为只读页,写操作时采用写时复制技术。执行文件不在内存时,页错误中断根据代码、数据段长度判断加载相应内容。整个过程涉及页映射、页错误处理和物理页到线性地址的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

页管理是通过内核中的mem_map数组进行管理的,表示对应物理页资源已被占用;
缓冲块是内存和外存的转接层、mem_map是物理地址和线性地址之间的转接层;

首先是文件读取过程:
文件读取就是依据各个目录文件获取到目标文件的i节点编号,然后根据这个i节点编号得到需要的inode,该结构中包含目标文件数据所在的数据块位置,如果使用read或者write访问的时候,那么直接根据访问位置即可明确要访问位置然后触发页故障错误,将对应外存的页通过驱动加载到内存的缓冲块,然后访问缓冲区这样的操作;
而对于一个可执行文件的话,先进行fork,将对应可执行文件的页权限改为只读页,而后在写的时候触发页复制操作(写时复制技术);对于内存中没有的而CPU要读取应该也是页错误然后导致页加载;

首先,读取线性地址才会中断触发页加载,那么读取文件和执行文件的加载他是怎么和线性地址或者说逻辑地址扯上关系的?
读取文件:直接读取,然后将硬盘读取到物理页数据读取到缓冲区后,将缓冲区数据直接读取到待读取位置;
可执行文件:首先获取inode节点信息,然后设置当前可执行文件节点为inode节点,接着设置可执行文件入口;那么现在有个问题,就是说当执行可执行文件的时候,当可执行文件不在内存中,他是一个怎么样的触发方式?
整个程序运行过程中,对于内存,无非就是CPU根据指定地址去获取对应内存地址的数据,而如果对应内存位置没有页映射的话,就会触发页故障错误,在该错误中断中根据当前可执行文件的代码、数据段长度判断是否是要获取代码数据,或者是堆空间,从而进行分别操作,对于前者就是通过bread读取块设备的代码文件数据到物理页并进行一个映射,这样就可以正常执行代码!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值