1.简介

本文主要介绍三个文件bootsect.s、setup.s、head.s,主要是做了些从软盘加载内核和设置32位保护模式的操作。

2.程序分析

当PC电源打开后,BIOS自检后将bootsect读入内存绝对地址0x7c00处,因为bootsect.s的结尾是:

	.word 0xAA55

然后跳转到0x7c00处并把执行权交给此处的代码,从start:处开始执行。

BOOTSEG  = 0x07c0
INITSEG = 0x9000 start:
mov ax,#BOOTSEG
mov ds,ax
mov ax,#INITSEG
mov es,ax
mov cx,#256
sub si,si
sub di,di
rep
movw
jmpi go,INITSEG

BOOTSEG是当前程序的起始内存地址的段地址,INITSEG表示是bootsect将要移动要的内存地址的段地址,这段代码的意思是重复执行movw指令256次,每次从BOOTSEG(0x7c0段地址)+si的地址处移动一个字(2个字节)的数据到INITSEG(0x9000段地址)+di地址处,挨个移动256次,所以总共就是256字(512字节),bootsect.s编译出来也就是512字节的大小。所以这段代码执行完之后就是把自己拷贝到0x90000地址处,然后jmpi跳转到0x9000的偏移地址为go的地方执行。

所以接下来程序执行到go:处,但是整个程序的起始段地址变成了0x9000,go处的代码设置了下堆栈,接着是load_setup:

SETUPLEN = 4	

load_setup:
mov dx,#0x0000 ! drive 0, head 0
mov cx,#0x0002 ! sector 2, track 0
mov bx,#0x0200 ! address = 512, in INITSEG
mov ax,#0x0200+SETUPLEN ! service 2, nr of sectors
int 0x13 ! read it
jnc ok_load_setup ! ok - continue
mov dx,#0x0000
mov ax,#0x0000 ! reset the diskette
int 0x13
j load_setup

利用BIOS中断int 0x13将setup从磁盘第2个扇区开始读到0x90200开始处,共SETUPLEN(setup 程序的扇区数)读4个扇区。成功后跳转到ok_load_setup。

SETUPSEG = 0x9020

ok_load_setup:
...
mov ax,#SYSSEG
mov es,ax ! segment of 0x010000
call read_it
call kill_motor ...
jmpi 0,SETUPSEG

省略的代码都是一些读硬盘和驱动器的数据。这里比较关键的是call read_it,调用read_it:

SYSSIZE = 0x3000
SYSSEG = 0x1000
ENDSEG = SYSSEG + SYSSIZE read_it:
mov ax,es
test ax,#0x0fff
die: jne die ! es must be at 64kB boundary
xor bx,bx ! bx is starting address within segment
rp_read:
mov ax,es
cmp ax,#ENDSEG ! have we loaded all yet?
jb ok1_read
ret
ok1_read:
...

SYSSIZE是编译后system模块的大小,SYSSEG是system模块将加载到的内存段地址处,所以ENDSEG的值就是system模块停止加载的段地址。那么read_it的作用就是先判断一下es是不是到了system模块停止加载的段地址处,如果没有则跳转去读取system模块到这个地址。加载完成后就ret返回。然后关闭马达后读一些驱动器的信息,最后jmpi 0,SETUPSEG跳转到0x9020:0000也就是setup.s程序的开始处。

bootsect.s就此结束,到现在为止内核各个模块在内存中的位置如下图的第3步:

接下来进入setup.s。

未完待续

Linux0.11内核--引导程序分析的更多相关文章

  1. Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

    Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...

  2. Linux0.11内核--进程调度分析之2.调度

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ...

  3. Linux0.11内核--进程调度分析之1.初始化

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596746.html ] 首先看main.c里的初始化函数main函数里面有个函数是对进程调度 ...

  4. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  5. Linux0.11内核源码——内核态线程(进程)切换的实现

    以fork()函数为例,分析内核态进程切换的实现 首先在用户态的某个进程中执行了fork()函数 fork引发中断,切入内核,内核栈绑定用户栈 首先分析五段论中的第一段: 中断入口:先把相关寄存器压栈 ...

  6. linux0.11内核源码——进程各状态切换的跟踪

    准备工作 1.进程的状态有五种:新建(N),就绪或等待(J),睡眠或阻塞(W),运行(R),退出(E),其实还有个僵尸进程,这里先忽略 2.编写一个样本程序process.c,里面实现了一个函数 /* ...

  7. Linux0.11内核剖析--内核体系结构

    一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: ...

  8. Linux0.11内核--内存管理之1.初始化

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5597705.html ] Linux内核因为使用了内存分页机制,所以相对来说好理解些.因为内存 ...

  9. linux0.11内核源码——boot和setup部分

    https://blog.csdn.net/KLKFL/article/details/80730131 https://www.cnblogs.com/joey-hua/p/5528228.html ...

随机推荐

  1. 浏览器内核、渲染引擎、js引擎

    [1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎: fire ...

  2. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  3. 用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90)

    Neutron 通过 dnsmasq 提供 DHCP 服务,而 dnsmasq 如何独立的为每个 network 服务呢? 答案是通过 Linux Network Namespace 隔离,本节将详细 ...

  4. 改写yii2的listview功能

    在vendor\yiisoft\yii2\widgets路径下新增文件ListViewtest,将下列代码粘贴并保存 <?php namespace yii\widgets; use Yii;u ...

  5. mysql表名查询sql

    select table_schema,table_name,engine from information_schema.tables where table_schema not in('info ...

  6. android 通过访问 php 接受 or 传送数据

    先说传送数据,可以在 利用 php 代替传送,直接把 访问的url加上 xxx.php?informatin=xxxxxx 就行了 接收的看代码吧,详细注释. 首先是 我自己定义的php 文件 < ...

  7. 故障恢复和恢复模式(Crash Recovery & Recovery Models)

    数据库的恢复模型是否影响故障恢复,在简单恢复模式里,你是否会丢失事务?在今天的文章里我想谈下这点,详细讨论下. 恢复模式(Recovery Models) 对于这个问题的最简单的答案是不会:恢复模型不 ...

  8. VS编译链接时错误(Error Link2005)的解决方法

    近期参与的项目中使用了公司另外一个同事提供的一个静态库文件.该静态库文件集成了CUDA, OpenCL两个库,用于做图形加速计算,提高视频解码拼接速度.但是在编译链接项目时,VS爆出如下错误: 1&g ...

  9. iOS-重回block小白之路

    在我刚刚接触iOS开发的时候,是通过MJ老师讲的OC基础入门的,iOS圈的人应该基本都知道MJ大神吧,即便如此大神,讲解完block之后我依然感觉晕晕乎乎的,直到后来真正进公司做项目,依然感觉这是自己 ...

  10. 在Mac上使用Visual Studio Code开发/调试.NET Core代码

    .Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今天抽空研究了下在Mac下如何使用VS Code来开发.NET Core程序,并且调 ...