![e2db0c0df323baf19af0f33196c74b9d.png](https://i-blog.csdnimg.cn/blog_migrate/6961550e2fc9c78e5f2cab5f802a3c2c.jpeg)
BIOS已经将引导程序(bootsect)加载进内存了,那么现在的工作就是需要将第二批以及第三批的程序陆续加载到内存里面。为了将第二批以及第三批的程序加载到内存中的适当位置,bootsect首先做的工作就是规划内存。
通常,我们一般写代码都是用高级语言写的,而且这些程序都是在操作系统上运行的。我们只管写高级语言的代码、数据。至于这些代码、数据在运行的时候放在内存的什么地方,是否会发生覆盖,我们都不用进行操心,因为操作系统和高级语言帮我们做了大量的看护工作,确保不会出错。
但是,我们现在操作系统本身使用的是汇编语言,没有高级语言编译器替操作系统提供保障,只能靠操作系统的设计者把内存的安排想清楚,确保无论操作系统如何运行,都不会出现代码与代码、数据与数据、代码与数据之间相互覆盖的情况。因此,我们必须清楚操作系统的设计者是如何对内存进行规划的。
在实模式状态下,寻址的最大范围是1MB。为了规划内存,bootsect首先设计了如下代码:
.globl begtext, begdata, begbss, endtext, enddata, endbss.textbegtext:.databegdata:.bssbegbss:.textSETUPLEN = 4! nr of setup-sectorsBOOTSEG = 0x07c0! original address of boot-sectorINITSEG = 0x9000! we move boot here - out of the waySETUPSEG = 0x9020! setup starts hereSYSSEG = 0x1000! system loaded at 0x10000 (65536).ENDSEG = SYSSEG + SYSSIZE! where to stop loading! ROOT_DEV:0x000 - same type of floppy as boot.!0x301 - first partition on first drive etcROOT_DEV = 0x306
这些源代码的作用是为后续操作所涉及的内存位置进行设置。
要加载的setup程序的扇区数(SETUPLEN)
被加载到的位置(SETUPSEG)
启动扇区被BIOS加载的位置(BOOTSEG)
将要移动到的新位置(INITSEG)
内核被加载的位置(SYSSEG)
内核的末尾位置(ENDSEG)
根文件系统设备号(ROOT_DEV)
设置这些位置的作用是确保将要载入内存的代码与已经载入内存的代码及数据各在其位,互不覆盖,并且各自有够用的内存空间。
实模式下的内存使用规划
![7263ccb51e22d5f591adc1335141925a.png](https://i-blog.csdnimg.cn/blog_migrate/36e242a56209c64ec673e5124c80215d.jpeg)
请记住下面这句非常重要的话:
操作系统的设计者是要全面地、整体地考虑内存的规划的。