linux内核之系统启动(二)

在上一节提到由BIOS构建实模式下的内存中断向量表和中断服务程序,那么接下来就是利用这些中断加载操作系统内核,这一步又有三个步骤:1、引导程序bootsect加载;2、setup程序加载;3、system内核加载。

在中断向量表和中断服务程序构建完成以后,BIOS会产生int 0x19中断,该中断的中断服务程序负责从系统盘的第一个扇区(512B)将bootsect程序拷贝到内存的0X07C00(BOOTSEG)位置。在这里int 0X19中断服务程序与操作系统无关,操作系统厂商与硬件厂商有一个约定,就是操作系统的引导盘在第一个扇区,int 0X19将从该扇区拷贝bootsect程序,然后放置在内存BOOTSEG的位置。

在加载完bootsect引导程序以后,bootsect做的第一件事,就是对内存进行规划,其实就是指定以后的每段程序放在哪个位置。SETUPLEN=4为setup程序的大小,以扇区为单位;BOOTSEG=0X07C0是bootsect程序的初始位置;INITSEG=0X9000是bootsect程序将要被拷贝到的新位置;SETUPSEG=0X9020是setup程序放置的位置,它紧邻bootsect程序;SYSSEG=0X1000是内核被加载的位置;ENDSEG=SYSSEG+SYSSIZE是内核结束的位置。

然后bootsect程序首先把自己从BOOTSEG位置拷贝到INITSEG位置,具体代码如下:

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

go: mov ax, cs

mov ds, ax

mov es, ax

mov ss, ax

mov sp, #0XFF00

在上述代码中,ds:si构成源地址0X07C00,es:si构成目的地址0X90000,循环此时为256,一次移动一个字,在实模式中,字长为16位,所以256次移动了512B也就是整个bootsect程序。在拷贝结束后,此时CS的值为0X07C0,但当执行完jmpi go, INITSEG指令后,CS的值就成为INITSEG了,而且后续将ds,es,ss寄存器的值都进行了改写,并对栈进行了设置。到目前为止,bootsect完成对自己的复制,之后就是加载setup程序。

在加载setup程序时,bootsect利用的是BIOS提供的int 0X13中断,该中断需要通过寄存器传入一些参数,具体代码如下:

load_setup:

mov dx, #0x0000

mov cx, #0x0002

mov bx, #0x0200

mov ax, #0x0200+SETUPLEN

int 0x13

jnc ok_load_setup

mov dx #0x0000

mov ax #0x0000

int 0x13

j load_setup

ok_load_setup:

从第二个扇区开始,拷贝4个扇区,拷贝到0x0200处,由于此时CS为0x9000,所以目的地址为0x90200。在加载完setup程序后,就要对系统内核进行加载了。

与加载setup一样,加载内核同样采用int 0x13中断,只是需要加载从第六扇区开始的240个扇区到SYSSEG处,之后整个操作系统代码全部已经家载入内存,bootsect任务完成。下面通过jmpi 0,SETUPSEG跳至setup程序开始执行。

setup程序利用BIOS提供的中断向量和中断服务程序获得机器系统数据义工内核运行需要,这些数据被放置在0x90000-0x901FC处。这些数据将会覆盖bootsect程序,因为bootsect程序的使命已经完成。

至此,操作系统内核加载已经完全完成,接下来,通过利用内存中的代码,linux将实现从实模式到保护模式的转换,后面将会继续学习!

时间: 2024-11-06 07:24:39

linux内核之系统启动(二)的相关文章

Linux内核分析(二)----内核模块简介|简单内核模块实现

Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某种意义上来说linux系统本身就是由一个个模块构成的,所以我会结合内核模块的设计,去分析内核,从而达到对linux内核的理解. 今天我们会分析到以下内容: 1.      Linux内核模块简介 2.      简单内核模块实现 l  Linux内核模块简介 1.       何为内核模块 在上一篇博文中我们先通过内核配置,在配置的过程中我们对内核的组件进行了选择(当

“Linux内核分析”实验二报告

张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内容总结 1.计算机工作“三大法宝” 首先,计算机工作原理最重要的三个内容就是:存储程序计算机工作模型.中断机制和函数调用堆栈. 存储程序计算机工作模型是计算机系统最最基础性的逻辑结构: 中断机制是多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序: 函数调用堆栈是高级语言得以

Linux 内核及系统启动流程

kernel的功能: 进程管理 文件系统 硬件驱动 内存管理 安全功能:SELinux 网络子系统 标准库:glibc 调用:返回 利用别的组件的功能,完成某特定事务 返回值 内核设计流派: 单内核体系: Linux 支持模块化 模块还可以动态装载或卸载 Linux内核:核心 + 外围模块 核心:/boot/vmlinux-VERSION-release 模块:/lib/modules/VERSION-release .ko: kernel object ramdisk: /boot/initr

例说Linux内核链表(二)

链表使用 我认为熟悉内核链表功能最好的方法就是看一些简单的实例,实例是一个非常好的素材去更好的理解链表. 下面是一个例子,包含创建,添加,删除和遍历链表. <span style="font-size:14px;"><span style="color:#330099;">#include <stdio.h> #include <stdlib.h> #include "list.h" struct

把握linux内核设计(二):硬中断及中断处理

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 操作系统负责管理硬件设备,为了使系统和硬件设备的协同工作不降低机器性能,系统和硬件的通信使用中断的机制,也就是让硬件在需要的时候向内核发出信号,这样使得内核不用去轮询设备而导致做很多无用功. 中断使得硬件可以发出通知给处理器,硬件设备生成中断的时候并不考虑与处理器的时钟同步,中断可以随时产生.也就是说,内核随时可能因为新到来的中断而被打断.当接收到一个中断后,中断控制器会给处

linux 内核移植(二)——操作系统

一:什么是操作系统 (1)linux.windows.android.ucos就是操作系统 (2)操作系统本质上是一个程序,由很多个源文件构成,需要编译 连接成操作系统程序(vmlinz.zImage) (3)操作系统的主要作用就是管理计算机硬件,给应用程序提供一 个运行环境. 二:操作系统的核心功能 (1)内存管理.如果没有操作系统,内存是需要程序自己来管理 的.譬.如在uboot中要使用内存的哪里是自己随便用的,没有注册也 没有限制.这时候如果程序自己不小心把同一块内存重复用了就会出 现程序

Linux内核(一)系统启动过程

转载请注明出处:jiq?钦's technical Blog (1) CPU自身初始化: CPU加电之后需要进行一系列的初始化工作: (2) CPU加载BIOS(Basic InputOutput System): CPU执行一个固定的位置(一般是0xFFFFFFF0)的指令.这是一条跳转指令,跳转到BIOS代码的首部.BIOS固化在主板上一个很小的ROM中,主要完成两个工作: (a) 加电自检(POST):完成系统硬件(内存,系统总线等)检测: (b) 加载内核引导程序:读取主引导记录MBR(

Linux内核分析实验二:mykernel实验指导(操作系统是如何工作的)

计算机是如何工作的?(总结)——三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能: enter pushl %ebp movl %esp,%ebp leave movl %ebp,%esp popl %ebp 函数参数传递机制和局部变量存储 中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程

编译Linux内核

这篇文章的目的是帮助理解如何编译一版Linux内核.熟悉Kconfig KBuild工具.无论是自己修改自己正在使用linux内核还是做嵌入式的交叉编译,都会有一些帮助. 内核编译体系 如果大家接触过一些Linux下的开源软件,就会知道它们使用 autotools 来进行配置及编译.通过执行./config --> make --> make install 命令来编译源代码.Linux内核的编译也需要先配置再编译.配置使用 Kconfig , 编译使用 KBuild , 这两个工具支撑起了L