关于Linux下的实模式,你需要了解的

最近有小伙伴给我提了个问题,在Linux系统实模式下,有哪些操作可以正常运行,分别有哪些比较常见的行为。

猛的一惊,虽说我不是专业搞这个的,但好歹也用了挺久的Linux系统,这是个啥子噢。之前把系统折腾坏了也没见过这玩意,所以悄悄地去补课,这次就给大家尽可能简洁地分享下,Linux下的实模式(Real Mode)和安全模式(Protected Mode)到底和怎么一回事。

要了解它们的含义及区别,还是要从寻址方式开始了解:

实模式下,虚地址到实地址转换:DS段寄存器左移4位与偏移地址相加,得到物理地址,最大寻址位是2的20次方,即1Mbyte。可寻址其中的任意地址,所有指令都相当于工作在特权级,直接操作CPU的各种功能,没有安全级别,没有分页功能,没有虚拟地址的概念,只有物理地址。各种寄存器的位宽基本上是16位的(段寄存器为20位)。

保护模式下,虚地址到实地址转换经过MMU(内存管理单元),内存管理采用段式+页式的方式,最大寻址位2的32次方,即4G。操作系统工作在最高优先级0上,应用程序则运行在较低优先级。各种寄存器的位宽基本上都是32位的,但是可以兼容同名的16位寄存器,兼容实地址模式,即实地址模式的程序无需再编译即可跑在保护模式下。

Intel 80286及以后的处理器除了安全模式,另一种工作模式是实模式(仅当系统启动的一瞬间),在此期间出于兼容性的考虑,会关闭一些芯片的新的保护功能特性,从而容许老的软件能够运行在新的芯片上。

实模式是一种比较原始的模式,能看到CPU设计的初始过程。在大多情况下,实模式就是在CPU启动的时刻的低级模式,无需OS在该模式上做过多的事情,而仅仅为向高级模式转化做准备。

相比之下,保护模式解决了实模式下的低劣的内存管理方式可能导致的问题,在实模式下用户程序自行通过指针访问物理地址,如果其中地址转换错误导致访问到系统区域并进行修改,后果可能是灾难性的。而在保护模式下,地址转换是由操作系统完成的,程序对此一无所知,确保了地址访问的正确性。

现代多数的x86处理器操作系统都运行在保护模式下,包括Linux, Free BSD, 和Windows3.0(它也运行在实模式下,为了和Windows 2.x应用程序兼容)及以后的版本。

通过寻址方式的不同及可访问的地址的区别,可以看出保护模式和实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的结果。

总结一下,实模式和保护模式在存储器寻址和虚地址到实地址的转换有所不同。处理器在刚刚上电或者重启后的时候,处于实地址模式,在那期间的操作是面向物理地址的,更深入底层,更容易出错。而在保护模式下,能更好地避免误操作的问题,而处于兼容性考虑又会关闭一部分安全性能。

最后再回到之前那位朋友提的问题,他提的是一道选择题。

下列过程在实模式下运行的有:

A.BIOS加载启动扇区

B.启动扇区加载Grub的kernel.img

C.Grub加载Linux内核

D.Linux内核加载驱动

上面给大家介绍的内容只是从一个大的概念上对比了保护模式和实模式的区别。要解决这道题还是要从实模式在实际运行中的作用以及Linux启动程序的流程来分析。

一般BIOS程序都是在实模式下使用的,BIOS是写进ROM(只读存储器 )里面的,但是BIOS程序物理地址空间不仅仅是RAM(随机存取存储器),还包含ROM和内存映射设备。A选项BIOS加载启动扇区,是在实模式下运行的。

Linux启动程序的流程大致为:上电BIOS自检;启动Boot Loader(GRUB);加载内核;启动第一个进程;配置环境。B选项扇区加载Grub的kernel.img,其中kernel.img是core.img的组成模块,用于协助启动内核。而在BIOS加载启动扇区,扇区加载Grub的kernel.img模块用于启动内核,引导程序是在实模式下运行的,因此此时还处于实模式下。

而引导程序的最后一步便是把内核加载到内存,之后就可以使用虚拟地址映射物理内存了。因此Grub加载Linux内核也在实模式下。

BIOS最后的工作将MBR(主引导程序)加载到内存开始运行。至此BIOS的工作就结束了,实模式也结束了。之后的工作是MBR中的程序又将loader从硬盘中加载到内存开始运行,即读取硬盘内的系统系统开始启动。因此后续的内核加载驱动已经不在实模式下了。

答案应该是:ABC

借此次机会也学习了一波,希望能给各位有兴趣的小伙伴一点学习思路。有什么问题的话可以私聊我,或是评论区讨论,希望这次分享对大家有帮助。

你可能感兴趣的:(关于Linux下的实模式,你需要了解的)