`
weiyinchao88
  • 浏览: 1209637 次
文章分类
社区版块
存档分类
最新评论

内核源码学习:LILO的运行分析

 
阅读更多

我们知道了LILO怎么安装,包含什么东西,有什么功能,但LILO到底是怎么运行的呢?下面是代码分析层次的LILO运行过程,通过介绍这个过程,希望你能对整个Boot Loader这部分内容有一个深入的认识。

1.从软盘启动

Linux内核可以存入一张1.44MB的软盘中,这样做的前提是对“Linux内核映像”进行压缩,压缩是在编译内核时进行的,而解压是由装入程序在引导时进行的。

当从软盘引导Linux时,Boot Loader比较简单,其代码在arch/i386/boot/bootsect.S汇编语言文件中。当编译Linux内核源码时,就获得一个新的内核映像,这个汇编语言文件所产生的可执行代码就放在内核映像文件的开始处。因此,制作一个包含Linux内核的软磁盘并不是一件困难的事。

把内核映像的开始处拷贝到软盘的第一个扇区就创建了一张启动软盘。当BIOS装入软盘的第一个扇区时,实际上就是拷贝Boot Loader的代码。BIOSBoot Loader读入至内存中物理地址0x<?XML:NAMESPACE PREFIX = ST1 /><chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C">07c</chmetcnv>00处,控制权转给Boot LoaderBoot Loader执行如下操作:

· 把自己从地址0x<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C">07c</chmetcnv>00 移到 0x90000

· 利用地址0x03ff,建立“实模式”

· 建立磁盘参数表,这个表由BIOS用来处理软盘设备驱动程序。

· 通过调用BIOS的一个过程显示“Loading”信息。

· 然后,调用BIOS的一个过程从软盘装入内核映像的setup( )代码,并把这段代码放入从地址0x90200开始的地方。

· 最后再调用BIOS的一个过程。这个过程从软盘装入内核映像的其余部分,并把映像放在内存中从地址0x10000开始的地方,或者从地址0x100000开始的地方,前者叫做“低地址”的小内核映像(以“make zImage”进行的编译),后者叫做“高地址”的大内核映像(以“make bzImage”)进行的编译。

2.从硬盘启动

一般情况下,Linux内核都是从硬盘装入的。BIOS照样将引导扇区读入至内存中的0x<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C">00007c</chmetcnv>00处,控制权转给Boot LoaderBoot Loader把自身移动至0x90000处,并在0x9B000处建立堆栈(0x9B000处向0x<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="9" unitname="a">9A</chmetcnv>200增长),将第二级的引导扇区读入至内存的0x9B000处,把控制权交给它。在引导扇区移动之后,将显示一个大写的L字符,而在启动第二级的引导扇区之前,将显示一个大写的I字符。如果读入第二级的引导扇区的过程有错误的话,屏幕上的LI之后会显示一个十六进制的错误号。

二级引导扇区内的代码将把描述符表读入至内存中的0x9D200处,把包含有命令行解释程序的扇区读入至内存的0x9D600处。接着,二级引导扇区将等待用户的输入,不管这时用户输入了一个选择还是使用缺省配置,都将把对应的扇区读入至内存的0x9D600(覆盖命令行解释程序的空间),把生成的启动参数保存在0x9D800处。

如果用户定义了用于启动的RAM盘的话,这部分文件将被读入到物理内存的末尾。如果你的内存大于16MB的话,它会被读入至16MB内存的结尾,这是因为BIOS程序不支持对16MB以上内存的访问(它用于寻址的指令中只有24位的地址描述位)。并且它开始于一个新的页,以便于启动后系统把它所占的内存回收到内存池。

接下来,操作系统的初始化代码将被读入到内存的0x90200处。而系统的内核将被读入到0x10000处。如果该内核是以make bzImage方式编译的,它将被读入到内存的0x100000处。在读入的过程中,存放map文件的扇区被读入至内存的0x9D000处。

如果读入的imageLinux的内核,控制权将交给处于0x90200Setup.S。如果读入的是另外的操作系统,过程要稍微麻烦一点:chain loader被读入到内存的0x90200处。该系统用于启动的扇区被读入到0x90400chain loader将把它所包含的分区表移到0x00600处,把引导扇区读入到0x<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="7" unitname="C">07c</chmetcnv>00。做完这一切,它把控制权交给引导扇区。

第二级引导扇区在得到控制权以后马上显示一个大写的L字符。读入命令行解释程序后显示一个大写的O字符。

13.11LILO运行完后,内存的分布情况。


13.11 LILO运行后的计算机内存分布情况

分享到:
评论

相关推荐

    轻松学习Linux操作系统内核源码的方法

    ### 轻松学习Linux操作系统内核源码的方法 Linux作为全球最广泛使用的开源操作系统之一,其内核源代码的学习对于计算机科学领域的学生、软件开发者甚至是系统管理员来说都是至关重要的。掌握Linux内核源码不仅可以...

    linux内核源码

    了解Linux内核源码有助于深入理解操作系统的运行机制,对于系统优化、驱动开发以及问题排查具有重要意义。 在Linux内核源码的组织结构中,`Arch`目录包含了所有与特定体系结构相关的代码,例如`arch/i386`目录就...

    自己动手编译Linux内核

    1. **获取内核源码**: 首先,你需要从官方网站(http://www.kernel.org/)下载最新的内核源码。在示例中,使用的版本是Linux-2.4.22,但你应始终选择最新的稳定版本以确保兼容性和安全性。 2. **准备环境**: 将...

    如何编译你自己的linux内核.txt

    登录后,运行: ```bash uname -r ``` #### 常见问题解答 - **Q: 我需要重新编译内核吗?** - A: 如果您的标准内核已经满足了所有需求,则通常不需要重新编译。但在某些情况下,例如需要支持新的硬件设备时,...

    linux内核分析 0.11版内核完全注释

    该书详细注释了Linux 0.11版本的内核源码,是理解Linux内核工作原理、学习操作系统核心概念的重要参考资料。书中涵盖了从内核启动过程、进程管理、内存管理到设备驱动等多个关键领域的知识点。 首先,Linux内核是...

    linux内核下载,【转载】菜鸟编译Linux内核[借鉴].pdf

    1. **获取内核源码**:首先,你需要从官方Linux内核网站(https://kernel.org/)下载最新或者特定版本的内核源代码。例如,文中提到的是2.4.22版本,但现在最新的稳定版本可能远超这个数字。确保选择与你当前系统...

    编译你自己的Linux内核.pdf

    1. **获取内核源码**:首先需要从官方或其他可靠渠道获取内核源代码。通常情况下,Linux内核源代码可以从官方网站`http://www.kernel.org/`下载获得。如果使用的是发行版自带的内核源码包,则需确保安装了相应的...

    《边干边学LINUX内核指导》实验材料补充说明

    1. **重新编译内核**:这个实验要求读者以root权限修改内核源码,例如在`unistd.h`中添加新系统调用的宏定义,在`entry.S`中插入系统调用的入口点,并在`sys.c`中编写系统调用的实现代码。完成后,需要重新编译内核...

    Linux操作系统内核技术详细解读

    通过以上分析可以看出,Linux内核源码的解析不仅仅是技术上的挑战,更是一次深度探索计算机底层知识的过程。通过逐步理解和分析内核代码,不仅可以学习到许多底层技术,还能感受到操作系统设计的精妙之处,进而提高...

    neihe.rar_linux编译内核

    4. 配置内核:运行`make menuconfig`命令,这将启动一个基于文本的配置界面,你可以在这里选择要编译的内核模块和选项。这些选项包括硬件支持、文件系统、网络协议等。 5. 编译内核:配置完成后,执行`make`命令...

    编译Linux内核的操作流程

    - 发行版源码:如果发行版(如Fedora 4.0)提供了内核源码,优先使用这些源码,因为它们通常与系统更加兼容,且配置文件已针对该发行版进行了优化。 - 最新稳定版本:可以从kernel.org获取最新的稳定内核版本。新...

    新手推荐的linux 内核编译学习.docx

    通常,如果您在`/usr/src/`目录下看到一个名为`linux`的子目录,那就意味着内核源码已经存在。如果没有,您可以通过RPM包管理器安装,如在Red Hat Linux中,使用`rpm -ivh kernel-source-2.xx.xx.rpm`命令,这里的`...

    Linux内核编程经验实践

    - 修改`/etc/lilo.conf`文件,添加新的内核条目,并运行`lilo`更新启动配置。 5. **重启测试** - 重启计算机以验证新内核是否能够正常启动: ``` # reboot ``` #### 三、增加系统调用 系统调用是用户态程序与...

    linux 内核学习笔记

    它可以让你深入理解Linux启动流程,包括BIOS如何加载MBR、引导程序如LILO或GRUB如何加载内核,以及内核如何初始化硬件、启动init程序等。同时,这个过程也涉及到了软盘启动的特殊性。 在着手制作BabyLinux之前,你...

    操作系统课程设计实验大纲毕业论文.doc

    - 工作源码环境:需要一个调试的Linux内核源码,版本不低于2.4.18。 2. **实验内容**: - **安装Red Hat Linux**:这是实验的第一步,学生将学习如何在PC上安装Linux操作系统,理解安装过程中的分区、文件系统...

    linux内核详解 描述linux内核 方便调用linux内核

    在分析内核源码时,由于其复杂性和大量的相互关联,需要查看不同目录下的多个文件。尽管如此,通过逐步学习和实践,可以深入理解底层操作,提高编程技能,并掌握专业程序员的思维方式。 以Intel Pentium II运行...

Global site tag (gtag.js) - Google Analytics