探讨Linux内核启动之BIOS启动阶段

简介: 本文讲解linux内核启动之BIOS启动阶段,640KB的RAM是BIOS设计者自由使用的区域,如何使用取决于 BIOS软件的设计者,4GB的物理地址空间至少被划分为两个部分,一部分是内存的地址空间,另外一部分地址空间用于对BIOS芯片存储单元进行寻址。

本文讲解linux内核启动之BIOS启动阶段,640KB的RAM是BIOS设计者自由使用的区域,如何使用取决于 BIOS软件的设计者,4GB的物理地址空间至少被划分为两个部分,一部分是内存的地址空间,另外一部分地址空间用于对BIOS芯片存储单元进行寻址。

  Linux内核启动有很多值得学习的地方,这里我们主要介绍BIOS启动阶段,包括介绍指令寄存器CS:EIP等方面。

  Linux内核启动代码复杂、庞大,让人感觉难以入手,正是因为它的复杂性,任何一本教材都会把相关的内容进行分类讲解,例如中断处理,文件系统,等等。然而在阅读相关章节时,你是不是常常想弄明白某个相关的数据结构是在什么时候建立的?是在什么时候初始化的?本章讲解BIOS启动阶段。

  Linux内核启动之BIOS启动阶段

  CPU在上电初始化时,指令寄存器CS:EIP总是被初始化为固定的值,这就是CPU复位后的第一条指令的地址。断电后内存中的内容就丢失了,所以这一条指令必须保存在“非易失”的存储器中。此类存储器包括ROM,PROM,EPROM,Nor Flash等。早期的BIOS存放在只读存储器中,非常不方便修改。现在EPROM和Nor Flash都能够通过电的方式来进行擦除和编程写入,所以通常升级BIOS就是利用BIOS芯片的电可擦除编程特性。

  对于32位地址总线的系统来说,4GB的物理地址空间至少被划分为两个部分,一部分是内存的地址空间,另外一部分地址空间用于对BIOS芯片存储单元进行寻址。除此之外,随着系统外部设备的增加以及设备本身的板载存储空间的增加,16位8086处理器拥有的64KB的IO地址空间早已不够(通过in/out汇编指令来访问的I/O端口。),实际上4GB的物理内存地址空间还有一部分用于外部设备的板载存储空间的寻址。x86复位后工作在实模式下,该模式下CPU的寻址空间为1MB。 CS:IP的复位值是FFFF:0000,物理为FFFF0。主板的设计者必须保证把这个物理地址映射到BIOS芯片上,而不是RAM上。

  早期的IBM PC地址空间映射如图4.1所示。其中高256KB的只读存储空间映射到BIOS芯片中,中间的128KB VVDR映射到视频卡的存储空间,屏幕上面的像素点受该区域控制,剩下的640KB映射到RAM上面。可以看出对于硬件系统的设计者来说,物理地址空间也是一种资源,而这里所说的映射就是以硬件方式对物理地址资源的分配。

  640KB的RAM是BIOS设计者自由使用的区域,如何使用取决于 BIOS软件的设计者。CPU执行BIOS代码对系统进行必要的初始化,并在物理地址0开始的1KB内存中建立实模式下的中断向量表,随后的一部分内存被用来保存BIOS在启动阶段检测到的硬件信息。另外BIOS代码在执行期还需要使用随后的一部分内存。最后BIOS会根据配置把引导设备的第一个扇区加载到物理地址0x07C00的地方,然后跳转到这里继续执行。通常这是Boot Loader的代码,Boot Loader接着把内核加载到内存中。前面说过arch/x86/boot/tools/build工具把setup和vmlinux合成一个 bzImage。setup是实模式的代码,vmlinux是保护模的代码。以上给大家讲解了Linux内核启动之BIOS启动阶段。

 

http://linux.ctocio.com.cn/302/12435302.shtml

目录
相关文章
|
9天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
28天前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】Linux 生成并更新内核模块的依赖 depmod命令 使用指南
【Shell 命令集合 系统设置 】Linux 生成并更新内核模块的依赖 depmod命令 使用指南
30 0
|
28天前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
29 1
|
2月前
|
Ubuntu Linux 虚拟化
Linux下的IMX6ULL——构建bootloader、内核、文件系统(四)
Linux下的IMX6ULL——构建bootloader、内核、文件系统(四)
67 0
Linux下的IMX6ULL——构建bootloader、内核、文件系统(四)
|
2天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
8天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
18 3
|
15天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
15天前
|
Ubuntu Linux
Linux查看内核版本
在Linux系统中查看内核版本有多种方法:1) 使用`uname -r`命令直接显示版本号;2) 通过`cat /proc/version`查看内核详细信息;3) 利用`dmesg | grep Linux`显示内核版本行;4) 如果支持,使用`lsb_release -a`查看发行版及内核版本。
36 6
|
17天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
14 1
|
24天前
|
存储 网络协议 Linux
【Linux 解惑 】谈谈你对linux内核的理解
【Linux 解惑 】谈谈你对linux内核的理解
23 0