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函数里到底有什么内容呢?欲知详情,下回分解。

相关内容

热门资讯

圣诞节活动主持词节目串词 圣诞节活动主持词节目串词3篇  根据活动对象的不同,需要设置不同的主持词。在人们积极参与各种活动的今...
生日华诞主持词 生日华诞主持词范文各位领导,各位朋友,各位来宾,女士们,先生们:  中午好。  今天是个喜庆的日子,...
学术会议主持词 学术会议主持词  什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会...
订婚仪式及主持词 订婚仪式及主持词范文(通用3篇)  活动对象的不同,主持词的写作风格也会大不一样。在现在的社会生活中...
古剑奇谭欧阳少恭经典台词参考 古剑奇谭欧阳少恭经典台词参考  大型古装玄幻剧《古剑奇谭》正在湖南卫视热播,剧中,乔振宇饰演温文尔雅...
幼儿园晨会主持词 幼儿园晨会主持词  美好的一天从早上开始,从晨会开始,从大家的好的状态开始,从最好的开始。以下是小编...
诗文诵读展示主持词 诗文诵读展示主持词  主持词没有固定的格式,他的最大特点就是富有个性。在当今不断发展的世界,很多晚会...
大学生毕业典礼的主持词 大学生毕业典礼的主持词(精选5篇)  活动对象的不同,主持词的写作风格也会大不一样。在当下的社会中,...
婚礼的主持词 婚礼的主持词  婚礼的主持词(精选21篇)  主持词的写作要突出活动的主旨并贯穿始终。随着社会一步步...
主婚人致辞 主婚人致辞(精选6篇)  在生活、工作和学习中,大家都写过致辞吧,致辞具有很强的实用性和针对性。还在...
促销活动主持词 促销活动主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在现今人们越来越重视活动...
小品活动的主持词 小品活动的主持词  【篇一】  各位亲爱的老师,同学们,大家下午好!  欢迎来到天津师范大学新闻传播...
森林报好词好句 森林报好词好句  好词:  小巧玲珑 飞云流雾 红日西垂 霞光四射 层峦叠嶂 水天相接  轻歌曼舞 ...
早会主持稿 早会主持稿(精选5篇)  在现在社会,我们可以使用主持稿的机会越来越多,主持稿是主持人为节目进行过程...
优秀员工颁奖词 优秀员工颁奖词大全  在平时的学习、工作或生活中,大家都经常接触到颁奖词吧,颁奖词是在某一主题的颁奖...
女儿出阁司仪主持词 女儿出阁司仪主持词范文  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在当下的中国社...
歌颂祖国串词 歌颂祖国串词一。各位领导 各位来宾,大家晚上好。今天我们这里篷壁生辉,喜气洋溢,是因为有您们的光临,...
小学生庆元旦联欢会主持词 小学生庆元旦联欢会主持词范文(精选5篇)  主持词要注意活动对象,针对活动对象写相应的主持词。在现今...