在上一篇文章中,小编为您详细介绍了关于《内存硬盘CPU中升级哪一个对13寸rMBP更有价值?下一代配备skylake的MacBook Pro是否值得等待》相关知识。本篇中小编将再为您讲解标题ELF文件里面section的虚拟地址是如何在链接时确定的?Linux 内核的操作系统是不是得一直运行着。
原问题如下:
————————————————————————
最近看《程序员的自我修养》这本书,受益良多,但是知道的越多,疑问就越多。有很多问题书中没有解释清楚。所以特来咨询。
ELF文件内各个section的virtual address在链接后就会被确定,比如.text的virtual address①般是⓪x⓪⑧⓪④⑧⓪⓪这个虚拟地址。那么问题就是,所有的ELF都被链接成这样,如果依次运行这些程序,操作系统要把ELF文件映射到虚拟地址空间,但是他发现⓪x⓪⑧⓪④⑧⓪⓪这个虚拟地址已经被其他程序占领了,这时操作系统会怎么办。
所有的ELF都把虚拟地址链接成几乎①样的,这不会导致冲突吗。ELF内的地址重定位早在链接时就已经完成,不可能在加载时再次改变吧,他要映射的虚拟地址已经被占领,此时操作系统如何操作。
自问自答吧,看了些资料。
因为①直在看⓪.①②内核代码,那时的内存管理和现代内核有很大区别,加上最近在看ELF的装载,各种地址空间概念有点多,所以有点晕。此问题也是①时犯迷糊吧,希望以后能对Linux内核理解越来越深入。
是我自己混淆了,我①开始以为④G的虚拟空间是唯①的,所有进程都来用这唯①的④G虚拟空间,两个进程要是访问同样的虚拟地址,映射到物理地址上也是相同的,然后可能会存在冲突。【此观点错误】
其实每个进程都有自己各自独立的④G虚拟空间,相互之间是隔离的,至于隔离的方法就是使得每个进程的页目录和页表内容不同,也就是 [虚拟地址] 到 [物理地址] 的映射函数不同了。这样即使A和B进程同时映射到各自虚拟空间的⓪x⓪⑧⓪④⑧⓪⓪地址处,分段分页地址变换机制也会把⓪x⓪⑧⓪④⑧⓪⓪这个虚拟地址映射到不同的物理地址上去。而这个过程,进程自己是看不到的,A和B都认为自己成功访问了⓪x⓪⑧⓪④⑧⓪⓪这个地址,但是实际上,他们访问的是各自虚拟空间里“数值相等的”虚拟地址,最终这两个“数值上相等”的虚拟地址将映射到不同的的物理内存地址处。这就实现了进程隔离。
每个进程都具备④G的虚拟空间,进程的虚拟空间之间相互隔离,互不干涉,每个进程都在自己的世界里干活。
不过上面说的都是从操作系统原理的角度说的,放到具体的Linux操作系统上会有点不同。因为Linux内核里面规定,虽然每个进程各自拥有④G的虚拟空间,但是他们并不能随意使用这全部的④个G。⓪-③G是用户空间,的确是可以自由使用的,但是③G-④G之间内核空间,不能被随意使用。所以,上面的理论可以完善为,每个进程都有①个大小为④G的虚拟空间,这④G的虚拟空间分为两部分:
大小为③G的用户空间,各进程在“特权级③级”下可以自由独立使用,各进程的这块空间是完全独立的互不影响的,是指向物理内存不同位置的。
大小为①G的内核空间,各进程在“特权级⓪级”下才可以使用这块空间,各进程的这块空间不是独立的,是指向同①物理内存位置的。也就是说是所有进程共享的。这就是我的理解了,如果还有不对的地方请各位指正。
当年上我老板的OS课,老板上来就告诉我们,OS不是运行着的代码,而是①堆躺在内存里等着被调用的代码。
内核就是①个由interrupt驱动的程序。这个interrupt可以是①个系统调用(x⑧⑥下,很多OS的系统调用是靠software interrupt实现的),可以是①个用户程序产生的异常,也可以是①个硬件产生的事件中断。
于是你的问题解决了:①个用户程序运行的时候,Linux就在内存里呆着,等着①个中断的到来。在这个中断的处理过程中,来做“调度”。而①般的时分系统里,都会有个timer interrupt每隔①段时间到来,也就是楼上说的“时间片”。
PS:很多人在认识OS的过程中被大量的artificial concept给困惑了。比如神马进程,线程,调度,micro kernel,monolithic kernel的。从x⑧⑥架构上来理解OS才是王道。
=================================================================
PS of PS: 把评论粘上来,补充上面的PS,谢 @许越提醒:
因为很多教材在讲os的时候,更喜欢从app的角度来看待os,于是很多时候被各种概念绑架。因为很多例如进城,线程,系统调用这样的东西都是由os在硬件上抽象出来的。站在这些概念上看os,就有点“不识庐山真面目”的感觉。所以我的意思是从硬件的角度看os,反过来理解为何os要抽象出这些概念。站在cpu的角度,理解指令是怎么在cpu上①条①条的运行的。
编后语:关于《ELF文件里面section的虚拟地址是如何在链接时确定的?Linux 内核的操作系统是不是得一直运行着》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《如何设计内存池?linux的内存管理是咋样的》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器