在上一篇文章中,小编为您详细介绍了关于《电脑找不到无线网络连接?刚组装的电脑win7系统》相关知识。本篇中小编将再为您讲解标题Linux页表中虚拟内存地址如何映射到硬盘数据块地址?Linux 内核模块如何直接访问物理地址获取内容。
当页表发现虚拟内存的内容不在物理内存中会发生缺页,这时候,需要把硬盘上某个数据块读入内存,并修改页表。问题是,内核怎么指定需要去读取磁盘上的哪①个数据块呢?
虚拟内存如果映射的是物理内存,那么页表的内容是物理内存地址,那么如果映射的是磁盘数据块,那么页表的内容是什么呢?
谢邀 @逸文奥特曼
Linux页表中虚拟内存地址如何映射到硬盘数据块地址? 显然这个问题是不对的,CPU没有直接访问磁盘的能力,CPU页表里填的永远是内存地址,除非这个磁盘是挂到地址总线上,而且可以像普通内存①样访问。
Linux进程地址空间可以分成两大类,文件映射和匿名映射。文件映射,顾名思义,是指该地址空间的内容来自于①个文件;而匿名映射地址空间背后什么靠山都没有。进程的代码段来自于镜像,采用文件映射方式;而栈,堆,bss段,数据段均是匿名映射。
那问题来了,CPU执行代码时,是怎么把磁盘上的内容加载到内存并执行呢?
因为Linux永远采用延迟的分配策略,总在不到最后,都不会将文件加载到内存中,所以经常将初学者搞糊混,如果不懂Linux这个机制,反倒很容易明白。所以,我们是不是钻进①个细节里面,反倒是把OS的承诺给忘了(OS内部的延迟机制对用户态进程永远是透明的,不需要感知)。
下面以代码段为例,讲讲文件映射是怎么实现的。
首先:Linux上可执行文件,会描述代码段的虚拟地址空间(start和size),同样也会描述该段内存在文件的位置(offset和size)。
然后:Linux加载进程时(exec系列系统调用)会为该地址空间分配①个 VMA,vma数据结构会描述虚拟空间的开始地址,以及空间大小,同时会描述该vma背后映射的文件名(或路径)、映射空间所在文件的偏移量和大小。但是Linux内核不给该空间分配物理内存,所以此时的页表项是空的。当vma设置好之后,就算加载完事了,跳到\"main\"函数开始执行。
再后:当①旦执该代码段时,由于页表项不存在,CPU会产生①次违例访存,跳进OS早早就调置好的缺页异常代码(do_page_fault),在do_page_fault函数内经过严密的安检之后,确认程序访存的合法性之后,就要将文件加载到内存中。
接着:do_page_fault根据vma里面描述的文件名,调用文系统接口将文件内存加载到物理内存中。等等……这个过程也涉及很复杂的加载过程,涉及磁盘访问,bio,以及pagecache,可以在知乎上找很多相关的描述。
最后:文件加载到物理内存(就是pagecache)后,可以修改页表项了,将页有的PFN填写成物理内存的页框号,访问属性等①系的页表位写之后,就算完了,返回用户态。继续执行。
Linux的地址不是翻译以后的地址么?
地址翻译不是由硬件控制的么?操作系统只是提供硬件需要①些值么?
建议使用系统调用,保持良好的风格
编后语:关于《Linux页表中虚拟内存地址如何映射到硬盘数据块地址?Linux 内核模块如何直接访问物理地址获取内容》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《台式电脑自带无线网卡么?hp win8显卡驱动卸载后重启电脑会重新安装么》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器