博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.2.3 加载第三部分代码—system模块(1)
阅读量:3672 次
发布时间:2019-05-21

本文共 1250 字,大约阅读时间需要 4 分钟。

1.2.3 加载第三部分代码—system模块(1)

第二批代码已经载入内存,现在要加载第三批代码。仍然是使用BIOS提供的int 0x 13h中断,如图1-11所示,方法与图1-9所示的方法基本相同。

 
图1-11 再次调用int 0x 13h中断

接下来bootsect程序就要执行第三批程序的载入工作,即将系统模块载入内存。

从底层技术上看,这次载入与前面的setup程序的载入没有本质的区别。比较突出的是这次加载的扇区数是240,是之前4个扇区的60倍,且所需时间也是之前的几十倍。为了防止加载期间用户误认为是机器故障,而执行不适当的操作,Linus在此设计了显示一行屏幕信息“Loading system ...”以提示用户计算机此时正在加载系统。值得注意的是,此时操作系统的main函数还没有开始执行,在屏幕上显示一行字符串远没有用C语言写一句printf(“Loading system ...\n”)调用那么容易,所有工作都要靠一行一行的汇编代码来实现,从体系结构的角度看,显示器也是一个外设,所以还要用到其他的BIOS中断。这些代码比较多,对理解操作系统的启动原理没有特别直接的帮助,只要知道大意就可以了。我们真正需要掌握的是:bootsect借着BIOS中断int 0x 13h,将240个扇区的system模块加载进内存。加载工作主要是由bootsect调用read_it子程序完成的,这个子程序将软盘第6扇区开始的约240个扇区的system模块加载至内存的SYSSEG(0x10000)处往后的120KB空间中。图1-12中对system模块所占用的内存空间给出了形象的说明。

 
图1-12 加载system模块

由于是长时间操作软盘,所以需要对软盘设备进行更多的监控,需要不断地对读盘结果进行检测,因此read_it后续的调用步骤比较多,但读盘工作最终是由0x13对应的中断服务程序完成的。

到此为止,第三批程序已经加载完毕,整个操作系统的代码已全部载入内存。bootsect的主体工作已经做完了,还有一点小事,就是要再次确定一下根设备号,如图1-13所示。

经过一系列检测,得知软盘为根设备,所以就把根设备号保存在root_dev中,这个根设备号作为机器系统数据之一,将在第2章中讲到的“根文件系统加载”中发挥关键性的作用。

小贴士

根文件系统设备(Root Device):Linux 0.11使用Minix操作系统的文件系统管理方式,要求系统必须存在一个根文件系统,其他文件系统挂接其上,而不是同等地位。Linux 0.11没有提供在设备上建立文件系统的工具,故必须在一个正在运行的系统上利用工具(类似FDISK和Format)做出一个文件系统并加载至本机。故Linux 0.11的启动需要两部分数据,即系统内核镜像和根文件系统。

注意,这里的文件系统指的不是操作系统内核中的文件系统代码,而是有配套的文件系统格式的设备,如一张格式化好的软盘。

 
图1-13 确认根设备号

转载地址:http://qkxbn.baihongyu.com/

你可能感兴趣的文章
2019/07/29 Linux容器和lxc(01)
查看>>
2019/07/31 docker容器和镜像(03)容器部分
查看>>
Dubbo与spi扩展
查看>>
微服务面试笔记
查看>>
SpringCloud-基础设施即服务day4-Docker中
查看>>
SpringCloud-基础设施即服务day5-DockerCompose
查看>>
SpringCloud-平台即服务day6-GitLab
查看>>
SpringCloud-平台即服务day7-Nexus和Registry
查看>>
Spring Security oAuth2
查看>>
2021网易游戏雷火2021春招游戏功能测试工程师 笔试记录----春招补录
查看>>
完全理解Docker安装软件,只需三步!
查看>>
整体学习Spring的Bean生命周期(上帝视角)
查看>>
Redis分布式锁逐步完善过程,最后推荐Redisson框架
查看>>
区块链11-区块链去中心化应用开发4-DAPP实战-应用介绍及前置知识
查看>>
Vue2.x中使用Bus遇到的问题及解决方法
查看>>
TypeScript从入门到精通(一)准备工作
查看>>
TypeScript从入门到精通(二)静态类型
查看>>
排序算法学习和总结
查看>>
缓存优化
查看>>
Java内存模型vs JVM运行时数据区
查看>>