探讨Linux内核启动之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

时间: 2024-10-03 22:16:01

探讨Linux内核启动之BIOS启动阶段的相关文章

UEFI启动与BIOS启动有何区别?

  UEFI启动是什么意思? 通俗的说,新的主板引导初始化的标注设置,相对于BIOS来说的,以前的U盘引导都是针对BIOS的,没法在UEFI主板上引导UEFI的文件到PE里,也有的PE把这个精简了.UEFI全称"统一的可扩展固件接口",是一种详细描述类型接口的标准.这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上. UEFI启动是一种新的主板引导项,正被看做是有近20多年历史的BIOS 的继任者.顾名思义,快速启动是可以提高开机后操作系统的启动速度.由于开机过程中UEF

探讨Linux内核时间系统的概况

时间系统的工作需要软硬件以及操作系统的互相协作,在上一部分,我们已经看到大多数时间函数都依赖内核系统调用,GlibC 仅仅做了一次请求的转发.因此必须深入内核代码以便了解更多的细节. 内核自身的正常运行也依赖于时钟系统.Linux 是一个典型的分时系统,CPU 时间被分成多个时间片,这是多任务实现的基础.Linux 内核依赖 tick,即时钟中断来进行分时. 为了满足应用和内核自己的需求,内核时间系统必须提供以下三个基本功能: 提供系统 tick 中断(驱动调度器,实现分时) 维护系统时间 维护

Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】

原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja  转自:http://blog.chinaunix.net/uid-25909619-id-4938390.html   在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段,      下面我就顺这代码逐个函数的解释,但是这

BIOS启动和UEFI启动比较说明

UEFI启动是什么意思? 通俗的说,新的主板引导初始化的标注设置,相对于BIOS来说的,以前的U盘引导都是针对BIOS的,没法在UEFI主板上引导UEFI的文件到PE里,也有的PE把这个精简了.UEFI全称"统一的可扩展固件接口",是一种详细描述类型接口的标准.这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上. UEFI启动是一种新的主板引导项,正被看做是有近20多年历史的BIOS 的继任者.顾名思义,快速启动是可以提高开机后操作系统的启动速度.由于开机过程中UEFI的

Linux内核编译与启动流程

(额-觉得Linux编译链接过程和启动过程还是有那么点作用的哈,要理清楚细节非常多-趟了不少源码-记此备忘) 编译流程 1.编译除arch/x86/boot目录外的其他目录,生成各模块的built_in.o,将静态编译进内核的模块链接成ELF格式的文件vmlinux大约100M,置于源码根目录之下 2.通过objcopy将源码根目录下的vmlinux去掉符号等信息置于arch/x86/boot/compressed/vmlinux.bin,大约15M,将其压缩为boot/vmlinux.bin.

Linux内核启动流程分析(一)【转】

转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程  1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息.符号表的最初的

【内核】linux内核启动流程详细分析【转】

转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程  arch/arm/kernel/head-armv.S  该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用是检查CPU ID, Architecture Type,初始化BSS等操作,并跳到start_kernel函数.在执行前,处理器应满足以下状态:  r0 - should be 0 r1 - unique

Linux内核启动流程分析(二)【转】

转自:http://blog.chinaunix.net/uid-25909619-id-3380544.html S3C2410 Linux 2.6.35.7启动分析(第二阶段) 接着上面的分析,第一阶段的代码跳转后,会进入第二阶段的代码. 第二阶段的代码是从\arch\arm\kernel\head.S开始的. 内核启动第二阶段主要完成的工作有,cpu ID检查,machine ID(也就是开发板ID)检查,创建初始化页表,设置C代码运行环境,跳转到内核第一个真正的C函数startkerne

ARM linux内核启动时几个关键地址【转】

转自:http://www.cnblogs.com/armlinux/archive/2011/11/06/2396787.html 1.       内核启动地址1.1.   名词解释ZTEXTADDR 解压代码运行的开始地址.没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态.这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介. Start address of decompressor. here's no point in talking about virtua