linux程序加载到内存中运行_Linux系列 --- 加载setup代码,bootsect规划内存

这篇博客探讨了在实模式下,操作系统如何通过BIOS加载程序到内存中,并详细介绍了内存规划的过程。代码示例展示了如何设置不同的内存区域,如BOOTSEG、SETUPSEG、SYSSEG等,以确保加载的程序不会相互覆盖。此外,还强调了操作系统设计者在内存规划上的重要工作,尤其是在没有高级语言编译器保障的情况下。
摘要由CSDN通过智能技术生成
e2db0c0df323baf19af0f33196c74b9d.png

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

请记住下面这句非常重要的话:

操作系统的设计者是要全面地、整体地考虑内存的规划的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值