欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何开发自定义的Boot Loader

来源:本站整理 作者:佚名 时间:2017-08-10 TAG: 我要投稿

在本文中,我们以一个简单的boot loader开发过程为例,简单介绍了如何使用低级语言完成自定义boot loader的开发。
读者可访问此处下载我们创建的自制boot loader。
一、目标读者
首先需要明确的是,这篇文章是为始终对不同事物的工作原理保持兴趣的那些人而准备的。具体说来,如果你是一名开发者,经常使用类似C、C++或Java之类的高级语言来开发应用程序,但有时依然需要使用低级语言来开发,那么你正是本文的目标受众。在本文中,我们会以具体案例,介绍低级编程语言在系统加载过程中的应用。
本文会分析计算机启动后的工作流程以及系统加载的具体过程,介绍如何开发自制的boot loader,而boot loader正是系统启动过程的第一个落脚点。
二、什么是Boot Loader
Boot Loader是位于硬盘第一个扇区的程序,该扇区也是系统开始启动的扇区。在主机加电后,BIOS会自动将第一个扇区的所有内容读入内存,然后跳转到相应位置。第一个扇区也称之为主引导记录(Master Boot Record)。实际上硬盘的第一个扇区没必要非得用来引导,只是历史上开发者使用这种机制来引导他们的操作系统,久而久之这个习惯就保留了下来。
三、深入分析
在这一部分,我会向大家介绍开发自制的boot loader所需要的背景知识以及相关工具,顺便也会介绍有关系统启动的一些背景知识。
3.1 自制Boot Loader所需掌握的语言
在计算机工作的第一个阶段,对硬件的控制主要是通过中断(interrupt)这个BIOS功能来实现的。中断功能的实现代码仅有汇编语言版本,因此如果你有一点汇编语言的功底是再好不过的一件事。不过这也不是一个非满足不可的条件,因为我们可以使用“混合代码(mixed code)”这种技术,这种情况下,我们可以将高级语言结构与低级语言命令结合在一起,减轻任务的复杂度。
本文所使用的开发语言主要是C++。如果你对C已经了如指掌,那么学习所需的C++知识肯定易如反掌。通常情况下,单单掌握C语言就已经足够,但此时你还需要修改我给出的示例代码。
如果你非常熟悉Java或C#,很不幸地告诉你,这一技能对我们的任务毫无帮助。症结在于Java和C#代码经过编译后生成的是中间代码,需要使用专门的虚拟机(对Java来说是Java Machine,对C#来说是.NET)来处理这些代码,以便将中间代码转化为处理器指令。只有经过转化代码才能执行。这种实现机制导致这些语言无法使用混合代码技术,而混合代码技术是我们用来减轻任务工作量不得不使用的技术,因此Java及C#不适应这种使用场景。
因此,为了开发自制的boot loader,你需要了解C或C++语言,如果能知道关于汇编语言的一些知识那再好不过,因为所有的高级语言代码最后都会转化为汇编语言。
3.2 所需的编译器
为了使用混合代码技术,你至少需要两种编译器:汇编语言以及C/C++编译器,你也需要链接器(linker)将对象文件(.obj)连接到可执行文件中。
现在我们来讨论一些特别的细节。处理器在功能上有两种模式:实模式(real mode)以及保护模式(protected mode)。保护模式为32位,完全用于操作系统的运行流程。当主机启动时,处理器处于16位工作模式下。因此,为了构建应用程序并生成可执行文件,你需要16位模式下汇编语言的编译器以及链接器。对于C/C++而言,你只需要能够创建16位模式下对象文件的编译器。
现在流行的编译器仅适用于32位应用程序,因此我们无法使用这些编译器。
我尝试了一些免费以及商业版本的16位模式编译器,最终选择使用微软出品的编译器。微软在Visual Studio 1.52软件包中集成了汇编语言、C以及C++的编译器及链接器,我们也可以从微软官网上下载这些工具。我们所需的编译器具体版本信息如下所示:
* ML 6.15:微软出品的16位模式汇编语言编译器。
* LINK 5.16:用来创建16位模式的.com文件的链接器。
* CL:16位模式下C以及C++的编译器。
你也可以使用一些替代工具:
* DMC:Digital Mars出品的一款免费编译器,可作为16位以及32位模式下的汇编语言、C以及C++编译器。
* LINK:DMC编译器的免费版链接器。
此外,Borland也出品了一些工具:
* BCC 3.5:可以创建16位模式下文件的C以及C++编译器。
* TASM:用于16位模式的汇编语言编译器。
* TLINK:可以创建16位模式下.com文件的链接器。
本文涉及的所有代码均使用了微软的工具进行编译构建。
3.3 系统启动过程
为了完成我们既定的任务,我们需要回想一下系统的启动过程。
让我们简单思考一下,系统在启动时,各系统组件之间的交互过程,如图1所示。
图1.系统启动过程

当控制权移交给0000:7C00地址时,主引导记录(MBR) 开始工作,触发操作系统引导过程。你可参考此处链接了解MBR结构的详细信息。
四、编写代码
在下一节中,我们将直接面对低级语言,也就是说,我们即将开发自己的boot loader。
4.1 程序架构
我们开发的boot loader仅用于教学目的,其任务只包含以下几点:
1. 正确载入内存中0000:7C00地址处。
2. 调用BootMain函数,该函数使用高级语言实现。
3. 以底层信息形式在显示器上显示“Hello, world...”信息。
程序架构如图2所示。

程序架构中,第一个实体是StartPoint,该实体完全由汇编语言开发而成,因为高级语言不具备我们所需的那些指令。StartPoint会告诉编译器应该使用什么内存模型,以及从磁盘读取数据后,需要将数据加载到RAM中的哪个地址。StartPoint也会校正处理器的寄存器,将控制权交给BootMain,后者使用高级语言编写而成。

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载