Linux-0.11内核-阅读笔记-第一章
创始人
2024-06-02 11:12:16
0

第一章 从开机加电到执行main函数之前的过程

Linux-0.11 源码:http://www.oldlinux.org/Linux.old/Linux-0.11/sources/system/

我打算从CPU的角度来看操作系统加载的过程。

主演:CPU
喽喽1号:内存(RAM)
喽喽2号:BIOS(ROM)
客串人员:软盘

问题:操作系统的 main 函数被执行前,电脑里发生什么?

第一幕:开场

CPU 无所事事,内存(RAM)空空如也,操作系统静静地躺在软盘(硬盘)里。
CPU 的属下只有 BIOS 和内存,指挥不到软盘(硬盘),不在一个大陆板块,但CPU需要从软盘里把操作系统搬运到内存运行起来。只要操作系统搬进了内存,
做大做强,再创辉煌!
故事要从一指禅说起!开机按钮一按,CPU就被电了个透心凉!
受到刺激的 CPU 会默认设置寄存器 CS 和 IP 寄存器分别为0xF000和0xFFF0并执行。CS:IP 对应的地址是 0xFFFF0,是 BIOS 程序第一行代码所在。

CS 代码段寄存器:指向CPU当前执行代码在内存中的区域。
IP 指令指针寄存器:记录将要执行的指令在代码段内的偏移地址,和CS组合即为将要执行的指令的内存地址。
0XFFFF0: 一共是20位,因为早期的8086系列CPU的寻址线只有20根。也就是最大为0xFFFFF,五个F。是一个约定好的地址。因为不同厂家的BIOS代码长度不同,为了统一,这个地址的位置存放了一个无条件跳转指令,跳转到 BIOS 真正的代码位置。

BIOS-老中介了。

0xFFFF0 是BIOS程序的入口地址,也就是BIOS程序的第一条指令的位置。

BIOS 固化在一块ROM芯片中的程序。
ROM 只读存储器。出厂后不可擦写。

BIOS程序开始运行,将分别在内存中设置了中断向量表,BIOS数据区,中断服务程序。

中断向量表 由256个中断向量,每个占用4字节:CS+IP,共1024字节即1KB,每个中断向量都指向具体的中断服务程序。

BIOS在这一章里要做的事情就是将操作系统搬运到内存,但老中介BIOS做起事情来,步骤也比较多。

1. BIOS自检

BIOS 代码会先检查设备(自检),这部分内容雨我无瓜,不详述。

在这个过程中,如果按下del或者F2或者F8之类的按钮,就可以进入选择“启动盘”的界面。(此时的界面是BIOS程序的界面,不是操作系统的哦)

我们只看BIOS针对的人,软盘和内存(RAM)。

2. 搬运第一扇区

CPU 执行 BIOS 代码从软盘里加载了第一扇区(操作系统的第一部分代码)到内存的 0x07C00 位置。

第一扇区的代码们有个名字,叫做启动代码,也可以叫张三,啊,不,叫 bootsect, 操作系统代码路径 boot/bootsect.s

Linux0.11源码

BIOS: “好了,接着把余下的扇区全部加载到内存吧!”
CPU:“你在教我做事?!!”
BIOS 卒。。。

内存有了一个扇区,BIOS杀青。就这?太短了吧,BIOS就是搬运一下软盘的第一扇区就结束了?

开机启动也就那么回事儿:
开机启动流程

内存-我演我自己

cpu会接着执行内存中的 bootsect.s 代码,将 bootsect 自己拷贝到内存的0x90000位置。溜不溜?我拷我自己!

常用寄存器:
DS/ES/FS/GS/SS:存在于CPU中,SS指向栈段,就按栈机制管理。
SP:栈顶指针寄存器,指向栈段的当前栈顶。
栈:stack,以“后进先出”机制运作的内存空间
堆:heap,特指用C语言库函数malloc创建,free释放的动态内存空间。

操作系统运行的第一行代码究竟是什么,不是main函数吗?
当然不是,main还差得远呢。bootsect开头的代码:

BOOTSEG  = 0x07c0			! original address of boot-sector
INITSEG  = 0x9000			! we move boot here - out of the way
...mov	ax,#BOOTSEGmov	ds,axmov	ax,#INITSEG

mov ax,0x07c0 就是操作系统被执行的第一条命令。了解汇编语言的人一定知道,这是将 0x07c0 赋值给cpu中的 ax 寄存器。

每一个地址都有它的历史意义,这些东西很重要,但又不重要,因为主角是 CPU,它只想要王图霸业的结果,不在乎过程。

为什么 bootsect 要拷贝自己?因为后续的内容还要拷贝到内存,而 bootsect 这部分程序,将来无用,所以在拷贝的过程中将逐渐被后续扇区覆盖。总的来说,就是为了省钱。

bootsect: “没想到吧?!我连我自己都算计!”

bootsect 会加载 setup 扇区。等到程序将所有操作系统加载到内存以后,就要跳转到main函数了。此时已经运行到了 head.S :

after_page_tables:pushl $0		# These are the parameters to main :-)pushl $0pushl $0pushl $L6		# return address for main, if it decides to.pushl $_mainjmp setup_paging
L6:jmp L6			# main should never return here, but# just in case, we know what happens.

“_main” 也就是 C语言的 main 标识符。从此,开始了C语言编写的操作系统征程。
main函数其实平平无奇:
linux0.11main函数

CPU-隐世强者

在所有的事件中 CPU 仿佛举足轻重,又仿佛不着痕迹,可能,这就是隐世强者吧。CPU将来还会做什么惊天动地的事儿呢?

我想要以小说的口吻,写一下内核相关的内容,但自己了解也不深,可能描述有些乱,先写下来。
先发布一回。
main函数里到底有什么内容呢?欲知详情,下回分解。

相关内容

热门资讯

我的初一生活作文800字(优... 我的初一生活作文800字 篇一初一生活,是我人生中的一段重要时光。刚升入初中的我,面对新环境和新生活...
我的烦恼作文800字初一【精... 我的烦恼作文800字初一 篇一我对自己的学习成绩感到很烦恼。尽管我努力学习,但总是无法取得理想的成绩...
残缺也美丽初中作文【精简5篇... 残缺也美丽初中作文 篇一残缺也美丽人生如同一场旅行,每个人都扮演着不同的角色,经历着不同的风景。有时...
我的眼里只有你优秀作文(经典... 我的眼里只有你优秀作文 篇一在我的眼里,只有你是最优秀的。你是我最敬爱的人,也是我最佩服的人。无论是...
经典议论文(最新6篇) 经典议论文 篇一:商业竞争对市场发展的影响商业竞争是市场经济中不可避免的现象,对市场发展起着重要的推...
谈面子议论文【优秀5篇】 谈面子议论文 篇一面子在中国文化中一直扮演着重要的角色,它是人们社会地位和尊严的象征。因此,面子议论...
初一的女孩_(精选6篇) 初一的女孩_ 篇一初一的女孩初一的女孩,正值少女青春期的开始,充满了好奇心和朝气。在这个阶段,她们开...
初中生科幻作文:机器猫(最新... 初中生科幻作文:机器猫 篇一机器猫我叫小明,是一个普通的初中生。有一天,我意外地发现了一只神奇的机器...
初一军训作文(推荐3篇) 初一军训作文 篇一初一军训是每个初中生的必修课程,也是我们适应新环境、锻炼意志的一次重要机会。我国历...
寒梅墨香初中作文500字(精... 寒梅墨香初中作文500字 篇一:寒梅墨香寒梅墨香,这是我最喜欢的一句诗句。每当我看到这句诗时,心中就...
仰望星空,脚踏实地作文650... 仰望星空,脚踏实地作文650字 篇一仰望星空,脚踏实地星空,是人类永远的向往和追求。每当夜幕降临,我...
我的忏悔初中作文【精简5篇】 我的忏悔初中作文 篇一我曾经做出了一件让我深感愧疚的事情,我想在这里向大家忏悔并寻求原谅。那是一个晴...
生活中的语言_初中记叙文【经... 生活中的语言_初中记叙文 篇一我和爸爸妈妈一样,是普通的工薪阶层,生活虽然平凡,但却充满了各种语言的...
初一我的奋斗目标作文500字... 初一我的奋斗目标作文500字 第一篇俗话说:“你脸上云淡风轻,谁也不知道你呼吸得有多紧;你走路带风,...
谢谢你让我遇见你作文(精彩5... 谢谢你让我遇见你作文 篇一遇见你,是我这一生最美好的偶遇。谢谢你,让我在茫茫人海中找到了属于我的那份...
那道靓丽的风景线作文700字... 那道靓丽的风景线作文700字 篇一那道靓丽的风景线在我家附近有一道靓丽的风景线,它是一条蜿蜒曲折的小...
烟花泪的作文【通用5篇】 烟花泪的作文 篇一烟花泪,是我对烟花的一种特殊感受。每当夜幕降临,烟花绽放的瞬间,我总能感受到一种深...
红色精神的作文600字【最新... 红色精神的作文600字 篇一:传承红色精神,弘扬革命精神红色精神是我们中华民族宝贵的精神财富,它是中...
我终于七年级作文通用8篇 我终于七年级作文 第一篇我默默地坐在床上,眼泪不争气地从眼眶里骨碌骨碌滚了出来。我抽了一张纸巾,把眼...
我好想见你_初中记叙文(通用... 我好想见你_初中记叙文 篇一初中时光,是我们成长的岁月。那时候的我们,充满了青春的活力和对未来的期待...