理解linux0.11加载过程

2024-01-01 04:32
文章标签 加载 理解 过程 linux0.11

本文主要是介绍理解linux0.11加载过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阅读linux0.11源码Boot部分很多次了,每次看着看着就晕了,主要是因为对X86芯片和汇编不熟悉;虽然赵炯博士的<<Linux内核完全注释>>讲的非常详细,网上资料也很多,但毕竟不是自己的东西,只有用自己的思维理解了才会记忆深刻。我就试着用自己的思路,也小结一下。

0. 加载步骤: Bois->bootsect.s->setup.s->(head.s->main.c)。(head.s->main.c合为system模块)
1. PC加电,80x86CPU处于实模式,从CS:IP=FFFF:0000处开始执行指令(CPU在上电或者复位时总是执行物理地址0xFFFF0处的代码)。
0xFFFF0地址是Bois的默认地址。Bios进入硬件自检(内存、硬盘、显卡...)
Bios最后将磁盘的第一个扇区(512字节的bootsect.s)读入内存绝对地址0x7C00处,并跳到这个地方去执行。

2. bootsect.s执行过程:
  1).将自己移动到内存绝对地址0x90000开始处并继续执行;
  2).将磁盘第2个扇区开始的4个扇区的setup.s模块(setup.s编译成)加载到内存0x90200(bootsect.s后面);        
  3).然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数,屏幕上显示“Loading system…”字符串;
  4).将system模块加载到内存0x10000。(0x10000~0x8ffff);
  5).确定根文件系统的设备号; 并保存其设备号于root_dev(引导块的508地址处);
  6).跳转到setup.s程序的开始处(0x90200)执行setup.s程序。
     
3. setup.s是一个操作系统加载程序,它的主要过程是:
  1).使用BIOS中断来获得相关系统信息:内存大小,硬盘分区信息,显示卡信息(这些信息都保存在bios,把这些信息读出来放到内存),并将这些数据保存到0x90000开始的位置(覆盖掉了bootsect.s程序所在的地方);
  2).将head.s代码拷贝到内存地址为0X0000的地方;
  3).加载idt表和gdt表地址;
  4).开启A20地址线,只有开启它了才能访问高于1M地址的内存;
  5).重新设定中断控制器。这之后以前的BIOS中断号就没用了;
  6).置位CR0寄存器的最后一位进入保护模式, 然后跳转到地址0x0000处开始执行,也就是head.s的起始代码处。
 
4. head.s过程
 1:将堆栈设定在static_stack处,堆栈大小为1KB;
 2:重新设定设定IDT(此时全部IDT的都设置为ignore_int,即仍然忽略中断)和GDT;
    GDT中为内核代码、数据段,所有进程的LDT和任务状态段(TSS);
 3:设定分页(目录项和页表);
    页目录最大为0x0000~0xffff,目录项为页表描述符(每个页表描述符占4个字节),所以最多有4096/4个页表
 页表有4个,每个页表有1024项,每项占4个页地址,可对应物理地址4*1024*4 = 16M
    (这里的设置GDT和分页是内存分配的基础,将在后续的学习中进行详细总结)
 
5. 开始执行init/main.c中的main函数。
   ......

系统加载起来后,物理内存布局(从0到16M)

页目录

4K

页表1

4K

页表2

4K

页表3

4K

页表4

4K

软盘缓冲区

1K

head.s后半部分代码

IDT

2K

GDT

2K

main.o代码部分

内核其余部分

大约512K

setup保存的系统参数

(90000H~900200)

BIOS

(640K-1M)

主内存区

(1M-16M)

 

这里借用<<Linux内核完全注释>>书中的图描述boot内部启动搬迁过程:

有一些疑问,先自我圆了答案吧,等后续理解深入后如有问题再更正。
1.为什么bios将bootsect.s读到0x7c00,而不是从0x0000依次加载开始呢?
  在加载bootsect.s之前,bios从0地址开始加载了中断向量表,为了不覆盖中断向量表,从0x7c00开始。
 
2.为什么bootsect.s将自己移动到内存绝对地址0x90000开始处并继续执行?
  为存放system模块预留空间(0x10000~0x8ffff)?
  
3.为什么bootsect.s将system模块加载到内存0x10000后,setup.s又将将head.s代码从0x10000拷贝到内存地址为0X0000的地方。
  bootsect.s将system模块加载到内存0x10000时,位于0x7c00的bootsect.s还有用(没执行完);
  setup.s又将将head.s代码从0x10000拷贝到内存地址为0X0000的地方,此时此刻,位于0x7c00的bootsect.s已经执行完毕,0x7c00以下的bios中断向量表也不再需要(后面的代码都不再调用bios中断),可以覆盖掉。
  至于加载到0x0000的好处是对于其中的代码,线形地址和物理地址是一样的,写程序、理解更方便。

 

 

 

这篇关于理解linux0.11加载过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558171

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是