Linux内核剖析——操作系统的启动

一.总体功能

1.从通电到BIOS跳转

1.1 CPU在通电后,先进入实模式,设置CS=0XFFFF,IP = 0X0000(指向BIOS)
1.2 BIOS进行执行系统监测,并且在地址=0处初始化中断向量
1.3 将启动设备的第一个扇区(引导扇区,512B)读入0x7c00处
1.4 设置CS=0X07C0,IP=0X0000,跳转到该地址

2.BootSect.S

2.1 跳转到0x7c00时,该部分存放的是BootSect.S的程序,操作系统的所有故事从这开始
2.2 开始执行后,把自身移动到地址0x90000处,并把setup.S读入到0x90200处,内核其他部分被读入到0x10000处
机器从接电到开始的执行顺序如图

程序执行顺序

3.setup.S

3.1 进入setup.后,将会自动识别主机的某些特性和VGA卡类型,并可以要求用户选择显示模式。
3.2 将系统从0x10000处移动到0x0000处,进入保护模式并跳转到系统模块

4.head.S

设置并加载IDT,GDT,分页,CPU,并调用main.C中的main程序

5.Main.c

执行main程序

6.系统启动程序转移图

程序转移图

7.部分说明

7.1 bootsect.s为什么不直接移动内核程序位置,而要在setup.s中移动?
ans:

setup.s中的部分代码需要用到BIOS提供的中断向量表获取系统信息,在使用完BIOS之后才可将该区域覆盖。

  1. 2 仅在内存中加载了上述内核功能并不能让Linux系统运行,仍需要有完整的基本文件系统支持,即称为根文件系统。Linux0.12 使用了Minix的文件系统

二.BootSect.S 代码解析

主要作用

该程序的主要作用是把自己移动到0x90000处并执行,把第二个扇区开始的四个扇区的Setup.s模块加载到bootsect.s之后,使用0x13中断取用当前引导盘的参数,并显示Loading system字符串。随后确定根文件系统的设备号,保存于root_dev,最后跳转到setup处去执行setup.s程序。后缀是大写的S,可以使用GNU C的预处理功能。

核心代码

BOOTSECT = 0X07C0
INITSEG = 0X9000
SETUPSEG = 0X9020
mov ax,#BOOTSECT
mov ds,ax
mov ax,#INITSEG 
mov es,ax
mov cx,256
sub si,si
sub di,di
rep
movw //将DS:SI的内容赋值道ES:DI中,即把自身移动到0x90000处
jmpi go,INITSEG//因为程序空间已经移动,所以需要使用jmpi指令进行继续执行
go:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax//把段寄存器全部初始化为当前代码段
mov sp,0xff00//初始化栈
....//略过其余代码
load_setup://载入setup程序
xor dx,dx 
mov cx,0x0002//扇区号为2
mov bx,0x0200
mov ax,0x0200+SETUPLEN//从第二个扇区开始,读4个扇区
int 0x13
//以上初始化0x13参数,并进行读取扇区,读入到es:bx
jnc ok_load_setup
xor dx,dx
xor cx,cx
int 0x13
j load_setup
ok_load_setup:
//..略去打印loading system部分
call read_it//读磁盘上的system模块
jmpi 0,setupseg//跳转到setup.s
//

三.Setup.S 代码解析

主要作用

利用BIOS中断读取机器系统数据,并将这些数据保存到0X90000的位置,覆盖掉BootSect.s的数据,这些参数将被内核中的相关程序使用
接着将system模块移动到0x0000处,加载idtr和gdtr,开启CPU保护模式,并跳转到最前面的head.S运行
为了能让head.S在保护模式中运行,本程序中临时设定了IDT和GDT,并在GDT中设置了当前内核代码段的描述符和数据段的描述符

核心代码

start:
mov ax,INITSEG
mov ds,ax//将DS设置为INITSEG
mov ah,0x03
xor bh,bh
int 0x10
mov [0],dx//通过中断取得光标位置
mov ah,0x88//获取扩展内存中断的功能调用
int 0x15
mov [2],ax//存储扩展内存数值
....//进行一系列参数获取
cli //不允许中断
mov ax,0x0000
cld
do_move:
mov es,ax//目的地址
add ax,0x1000
cmp ax,0x9000//是否已经移动玩
jz end_move//是,则跳转
mov ds,ax//源地址
sub di,di
sub si,si
mov cx,0x8000//移动64KB
rep
movsw
jmp do_move
call empty_8042//选通A20地址控制线,为了能使用1MB以上内存
mov al,0xd1
out 0x64,al
call empty_8042
mov al,0xdf
out 0x60,al
call empty_8042
mov ax,0x0001
mov cr0,ax//开启保护模式
jmpi 0,8//保护模式寻址,查询GDT进入0地址处

四.head.S 代码解析

notice:

head.s使用AT&T汇编编写,语法略有不同

主要作用

加载各个数据段寄存器,重新设置中断描述符表idt,重新设置GDT,检测A20地址线是否打开,设置分页后,打开main

核心代码

//主要就是调用main函数,过于简单,不写了
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342