【Linux内核】从开机加电到main函数执行(1)

从开机加电到main函数执行(1)

启动BIOS,准备中断

BIOS的任务是将硬盘中的操作系统加载到内存中。

BIOS加载中断处理程序

BIOS的启动由硬件完成。8086系列在加电时进入16位实模式,将CS置为0xFFFF,IP置为0x0000, CS:IP指向0xFFFF0,指向了BIOS对应的地址。

CS是代码段寄存器,IP是指令指针寄存器,两者组合形成的地址是要执行的指令的内存地址,在实模式下是绝对地址

如果这个位置没有可执行代码会就此死机。有代码的话就会执行。BIOS会执行自检程序,检查显卡、内存,并建立中断向量表和中断服务程序。

BIOS在内存最开始的地方建立中断向量表(0x00000~0x003ff),在下面的256字节的内存构建BIOS数据区(0x00400~0x004FF),在56KB之后的内存中加载8KB左右的中断向量表对应的中断服务程序。

中断向量表中一共有256个中断向量,每个中断向量4个字节,每个中断向量对应一个中断处理程序。

加载内核程序

下面要进行的boot操作是把操作系统加载到内存,对于Linux而言,分三次将操作系统加载到内存中,第一批由BIOS中断int服务加载操作系统的bootsect,第二批和第三批由bootsect加载。

第一批bootsect

BIOS结束自检之后,执行一个int中断,对应启动加载服务程序。任务是找到硬盘并加载第一扇区,拷贝到0x07c00处。这个扇区中的内容是bootsect.s。

第二批setup

bootsect首先做的工作是规划内存。在实模式下,最大寻址空间是1MB,bootsect设计了如下的分布:

名字 含义 地址
SETUPLEN setup程序的扇区数 4
BOOTSEG 启动扇区被BIOS加载的位置 0x07c0
INITSEG 将要移动到的新位置 0x9000
SETUPSEG setup程序加载到的位置 0x9020
SYSSEG 内核加载的位置 0x1000
ENDSEG 内核的末尾位置

接下来,bootsect会将他自身(512B内容)从BOOTSEG位置复制到INITSEG位置。复制之后CS从BOOTSEG位置跳转到INITSEG位置。

然后bootsect初始化寄存器,将数据段寄存器(DS),附加段寄存器(ES),栈基址寄存器(SS)设置成CS的位置,将栈顶sp指向0xFF00处,如下图:

下面,bootsec程序将setup加载到内存中。

第三批system

由bootsect模块将系统模块载入内存,加载的扇区大小是240,加载到SYSSEG后面。

最后加载完成之后确定根设备号,将根设备号保存在root_dev中。

根文件系统设备:文件系统管理方式。要求系统有一个根文件系统,其他文件挂载在根文件上。Linux的启动需要两部分数据,内核镜像和根文件系统。(格式化好的设备)

bootsect的任务到此结束。下面进行setup程序。

setup的第一件事情是利用BIOS的中断服务从设备上提取及其系统数据,包括光标位置和显示页面等数据,并从0x41和0x46两个向量的内存地址处获得硬盘参数表,将这些数据加载到0x90000~0x901FC

原文地址:https://www.cnblogs.com/Ryan16231112/p/12238481.html

时间: 2024-10-10 08:43:26

【Linux内核】从开机加电到main函数执行(1)的相关文章

《Linux内核设计的艺术》学习笔记(一)从开机加电到执行main函数之前的过程

分享一个最近丢了手机心塞到爆炸的我,现在穷的只剩下满脑子的智慧了,好了,我要开始学习了. 首先,搭建一个linux0.11的系统环境,贴出结果图. 从开机加电到执行main函数之前的过程. 1. 启动BIOS,准备实模式下的中断向量表和中断服务程序; 2. 从启动盘加载操作系统程序到内存,加载操作系统程序的工作就是利用第一步中断服务程序实现的; 3. 为执行32位的main函数做过渡工作. 启动BIOS,准备实模式下的中断向量表和中断服务程序 cpu的硬件设计为加电即进入16位实模式下状态运行,

linux系统启动过程具体解释-开机加电后发生了什么 --linux内核剖析(零)

本文參考了例如以下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详细解释linux系统的启动过程及系统初始化 linux系统的启动流程 关于linux系统的启动流程我们能够按步进行划分为例如以下: BIOS POST自检 BIOS(Boot Sequence) 引导操作系统 载入对应引导上的MBR(bootloader) 主引导设置载入其BootLoader 载入操作系统 启动BIOS,准备实

电脑从开机加电到操作系统main函数之前执行的过程

总的来说在操作系统加电启动之后到main函数执行之前操作系统经历了以下3个大步骤 1.启动BIOS.这个时候位于实模式下,加载中断向量和中断服务程序 2.加载操作系统内核并为保护模式做准备.这个时候操作系统一共加载了3部分代码:引导程序bootsect,内核代码setup,内核代码system模块 3.从实模式转换为32位保护模式.这个过程要做大量重建工作,并且持续工作到操作系统main函数的执行过程.细说的话,主要包括打开32位寻址空间,打开保护模式,建立保护模式下的中断相应机制与保护模式配套

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

1.启动BIOS,准备实模式下中断向量表和中断服务程序 在按下电源按钮的瞬间,CPU硬件逻辑强制将CS:IP设置为0xFFFF:0x0000,指向内存地址的0xFFFF0位置,此位置属于BIOS的地址范围.关于硬件如何指向BIOS区,这是一个纯硬件动作,在RAM实地址空间中,属于BIOS地址空间部分为空,硬件只要见到CPU发出的地址属于BIOS地址范围,直接从硬件层次将访问重定向到BIOS的ROM区中.这也就是为什么RAM中存在空洞的原因. BIOS程序在内存最开始的位置(0x00000)用1K

Linux内核启动及加载根文件系统

</pre></h1><p><span style="font-family:KaiTi_GB2312;font-size:18px;">上接博文<<a target=_blank href="http://blog.csdn.net/gqb_driver/article/details/8931775" style="text-decoration: none; font-family: 'Mi

c/c++ main函数执行之前/后

转载自:http://bbs.csdn.net/topics/300103318#r_78088969 main函数之前--真正的函数执行入口或开始 一种解释: 实际上,在可执行文件被加载之后,控制权立即交给由编译器插入的Start函数,它将对后面这些全局变量进行准备: _osver 操作系统的构件编号      _winmajor 操作系统的主版本号      _winminor 操作系统的次版本号      _winver 操作系统完全版本号      __argc 命令行参数个数     

main函数执行前、后再执行的代码

一.main结束 不代表整个进程结束  (1)全局对象的构造函数会在main 函数之前执行,          全局对象的析构函数会在main函数之后执行:          用atexit注册的函数也会在main之后执行.  (2)一些全局变量.全局对象和静态变量.对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间.释放资源使用权等操作  (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行.全局对象的构造也在ma

main 函数执行以前以及以后,分别还会执行什么代码?(转载)

main函数执行之前,主要就是初始化系统相关资源: 1.设置栈指针 2.初始化static静态和global全局变量,即data段的内容 3.将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容 4.运行全局构造器,估计是C++中构造函数之类的吧 5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数 (1)全局对象的析构函数会在main函数之后执行: (2)可以用_onex

《Linux内核设计的艺术》学习笔记(一)从开机加电到执行main函数

  实验内核版本:0.11 ◆ 从开机到main函数的三步: ① 启动BIOS,准备实模式下的中断向量表和中断服务程序: ② 从启动盘加载OS程序到内存中,加载OS程序的工作就是利用第一步中的中断服务程序实现的: ③ 为执行保护模式下32位的main函数做过渡工作. ? Intel将所有80x86系列的CPU硬件都设计为加电即进入16位实模式状态运行: ? 将CPU硬件逻辑设计为在加电瞬间强行将CS置为0xFFFF,IP置为0x0000,即是CS:IP指向了0xFFFF0这个地址: 整个过程是一