如何写一个bootloader

声明:本文为学习Codeproject文章的个人总结性文章,

    原文:http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part

 

本人开发环境:

  操作系统:Ubuntu 32位(64位的会有pushl等指令的不能执行等问题,最好为32位)

  工具:as ld dd bochs

  语言:at&t 16位汇编

 

计算机启动运行于real mode,ROM会读取硬盘(或其他介质,如软盘)的CHS模式的0柱面,0磁道,1扇区的的数据到内存0x7c00处,然后到此处执行。所以bootloader就是一段代码,将这段代码写入0柱面,0磁道,1扇区中。

好了,原理简单介绍完毕。

 

我的当前用户目录是/home/chao/,所以我要在~/Documents/目录下来写代码和进行其他的操作。

创建test.S文件

 1 .code16                    
 2 .text                        
 3      .global _start;
 4 _start:                    
 5 
 6      movb $'X' , %al
 7      movb $0x0e, %ah
 8      int  $0x10
 9 
10      . = _start + 510
11      .byte 0x55
12      .byte 0xaa

解释一下代码的意义。

1     movb $'X' , %al
2        movb $0x0e, %ah
3        int  $0x10

这是call BIOS interpret,调用号为0x10,查阅资料得知,0x10是Video Service,根据AH中的参数来调用不同的程序,这里AH中是0x0e,功能为Write Character in TTY Mode,也就是向终端写入字符,写入的字符从AL中获取,也就是字符X。

1 . = _start + 510
2       .byte 0x55
3       .byte 0xaa

因为一个有效的启动扇区最后的两个字节内容必须是0x55,0xaa(这是延续下来的,如果不是这两个字节内容,那么这个启动扇区会被认为是无效的,不能启动,所以这两个字节我把它称为验证字节),所以会有地2,3行内容,至于. = _start + 510,这里的 . 代表当前位置,也就是说,把当前位置设置为从代码开始增加510 bytes的位置,因为一个扇区大小为512 bytes(以前也有别的大小,但是后来512成为主流),所以两个字节的大小留给验证字节。

 

至此,我们的demo  bootloader代码就写好了,下面进行汇编,链接。

  • as test.S -o test.o
  • ld –Ttext 0x7c00 --oformat=binary test.o –o test.bin

-Ttext 0x7c00 告诉linker你想把代码加载到内存0x7c00处(至于为什么是这个地方,可以百度,很有意思),我们生成的是test.bin,也就是二进制文件,可以直接执行。

好了,程序有了,还需要把它写入存储介质的启动扇区,那我们就来创建一个。

  • dd if=/dev/zero of=floppy.img bs=512 count=2880
  • dd if=test.bin of=floppy.img

我们创建了一个512 bytes的img文件,然后把我们的程序写入。

现在/home/chao/Documents/目录下面应该是这个样子的

 

好了,启动设备已经就绪,我们还需要测试下它行不行,那就用到bochs了,它是一个虚拟机软件,

安装命令:

sudo apt-get install bochs bochs-sdl

有的地方说安装bochs-x,但是会出现问题,保险起见还是用bochs-sdl.

现在我们为bochs写一个配置文件

在/home/chao/Documents/目录下创建bochsrc.txt

1 megs: 32
2 #romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
3 #vgaromimage: /usr/share/bochs/VGABIOS-lgpl-latest
4 floppya: 1_44=floppy.img, status=inserted
5 boot: a
6 log: bochsout.txt
7 mouse: enabled=0
8 display_library: sdl

注意:2,3行中的路径可能不同,根据自己的系统查找BIOS-bochs-latest和VGABIOS-lgpl-latest(也可能是其它的而不是VGA,根据自己的情况设置)。

为了方便,可以创建一个build.sh脚本

 

1 as test.S -o test.o
2 ld -Ttext 0x7c00 --oformat=binary test.o -o test.bin
3 dd if=/dev/zero of=floppy.img bs=512 count=2880
4 dd if=test.bin of=floppy.img

 

如果把创建img文件的步骤放入脚本中,那么/home/chao/Documents/目录下现在有3个文件

 

 

 

打开终端,切换到此目录,执行build.sh,然后所需要的文件都有了

然后执行命令

bochs

可以看到在bochs中显示字符 X

至此,一个demo bootloader就写完了。

这段代码并没有干什么事情,只是解释了如何在计算机启动时执行我们的代码,真正的bootloader会加载内核程序(或者加载其他的程序,通过其他的程序来加载内核)。

转载于:https://www.cnblogs.com/folk/p/5202518.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定时执行某段程序

有时候我们需要每天 定时的 自动 去执行某段程序,那么这个功能如何实现呢? 经过百度,定时器就可以实现,总结如下: 我用控制台写了一个程序,用来在指定时间内 打印 “我执行了” 上面就是程序的运行结构&…

浅谈PROFINET IO通信的实时性

PROFINET由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技术的自动化总线标准。作为一项战略性的技术创新,PROFINET为自动化通信领域提 供了一个完整的网络解决方案,囊括了诸如…

今日头条核心技术“个性推荐算法”揭秘

今日头条核心技术“个性推荐算法”揭秘 最近面试华兴资本, 他们比较关注今日头条算法的实现, 今天特转载网上 今日头条算法解密【IT168 评论】互联网给用户带来了大量的信息,满足了用户在信息时代对信息的需求,也使得用户在面对大…

PROFINET及其同步实时通讯分析

1 概述 PROFINET实时以太网是由Profibus International(PI)组织提出的基于以太网的自动化标准。从2004年4月开 始,PI与Interbus Club总线俱乐部联手,负责合作开发与制定标准。PROFINET构成从I/O级直至协调治理级的基于组件的分…

【剑指offer15.二进制中1的个数】——位操作(左移右移等)

目录 二进制的表示 二进制的位操作 应用: 剑指offer15.统计二进制中1的个数(多种方法,位右移操作、与操作等) 转自:https://www.jianshu.com/p/3a31065a8e58 红色为自己添加 我们都知道在计算机中所有的信息最终都…

java 异常处理机制(java 编程思想)

一、概念  “异常”这个词有“我对此感到意外”的意思。问题出现了,你也许并不清楚该如何处理,但你的确知道不应该置之不理;你要停下来,看看是不是有别人或在别的地方,能够处理这个问题。只是在当前的环境中还没有足够…

怎样在CentOS 7.0上安装和配置VNC服务器

这是一个关于怎样在你的 CentOS 7 上安装配置 VNC 服务的教程。当然这个教程也适合 RHEL 7 。在这个教程里,我们将学习什么是 VNC 以及怎样在 CentOS 7 上安装配置 VNC 服务器 。 我们都知道 这是一个关于怎样在你的 CentOS 7 上安装配置 VNC 服务的教程。当然这个教…

Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】

2019独角兽企业重金招聘Python工程师标准>>> 之前在写Spring Boot基础教程的时候写过一篇《Spring Boot中使用RabbitMQ》。在该文中,我们通过简单的配置和注解就能实现向RabbitMQ中生产和消费消息。实际上我们使用的对RabbitMQ的starter就是通过Spring C…

20145225 《信息安全系统设计基础》第10周学习总结

cp1.c 进行复制文件的操作,需要有源文件和目的文件,第一次命令没有加入所以没有正常完成复制文件的操作fileinfo.c 用来实现显示文件信息。先判断命令是否有操作数,有的话才能继续进行下去,如果没有报错就打印出来相关文件信息&am…

【深度学习】——模型评估指标MAP计算实例计算

目录 一、知识储备 1、IOU——交集面积与并集面积之比 2、混淆矩阵(TP、FP、FN、TN) 问题1:上面的TP等具体是如何计算得到的? 3、精度precision&召回率recall 二、ap计算实战 1、计算流程 1)准备数据&#xf…

hdu5489 Removed Interval dp+线段树优化

现在看这题居然直接秒了。。。去年看的时候还以为神题。。 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j]>a[i]的g[j]就可以了。注意到如果将f[i]从后往…

NoSQL分类及ehcache memcache redis 三大缓存的对比

NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库。目前,可以将众多的NoSQL数据库按照内部的数据组织形式进行如下分类: Key/Value的…

乐视云计算基于OpenStack的IaaS实践

本文作者岳龙广,现在就职于乐视云计算有限公司,负责IaaS部门的工作。 从开始工作就混在开源世界里,在虚拟化方面做过CloudStack/Ovirt开发,现在是做以OpenStack为基础的乐视云平台。所以对虚拟化情有独钟,也对虚拟化/云…

【深度学习】——如何提高map值

目录 代码获取 map原理 map提高技巧 技巧总结: 实战: 1、效果不佳map55.55% 1)单独调整get_dr_txt.py中的self.iou 0.3 2)单独调整get_map,py中的minoverlap: 3)同时调整minoverlap和self.iou 本文是在faster_rcnn模型的…

数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)...

第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横…

【深度学习】——纠错error: Unable to find vcvarsall.bat:关于安装pycocotools

1、安装包下载 大佬改写支持 Windows 的 COCO 地址:https://github.com/philferriere/cocoapi 下载后如下: 进入pythonAPI 先后运行: python setup.py build_ext --inplacepython setup.py build_ext install 出现以下标志时&#xff0c…

[软件测试airtest软件安装]——填坑

目录 1、安装Python环境(版本问题) 2、连接手机出现连接上了但是无法进行点击 airtest官网: https://airtest.doc.io.netease.com/for_newer/ 关于软件测试刚入门的可以参考进行了解:https://airtest.doc.io.netease.com/tuto…

KUKA 机器人SPS.SUB程序解析

&ACCESS RVO&COMMENT PLC on controlDEF SPS ( );FOLD DECLARATIONS;FOLD BASISTECH DECL;Automatik externDECL STATE_T STAT定义STATE_T类型的变量。该结构为:STRUC STATE_T CMD_STAT RET1, CMD_STAT是枚举类型数据,组成了STATE_…

jquery validate表单验证插件

1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家。 1.点击表单项,显示帮助提示         2.鼠标离开表单项时,开始校验元素    3.鼠标离开后的正确、错误提示及鼠标移入时的帮助提醒 对于初学者而言&…

【Python位运算】——左移操作(<<)右移操作>>

目录 左移操作 右移操作 其他博主的理解 应用——力扣题目78. 子集 解法 深度优先搜索 位运算 参考文献 左移操作 # 左移操作&#xff0c;左移一位相当于乘以b&#xff0c;a<<b,a a*(2^b) print(2<<3) # 2*2^3 16&#xff0c;2的二进制10&#xff0c;向…