声明:本文为学习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

如何写一个bootloader相关推荐

  1. 从零开始写一个简单的bootloader(1)

    前言 之前学习嵌入式裸板程序也有一定的时间了,而一个bootloader则是裸板程序的一个集大成者,能包含很多的知识点,所以编写一个bootloader能巩固之前的所学.废话少讲,下面就开始正式的编写 ...

  2. 自己动手写一个简单的bootloader

    自己动手写一个简单的bootloader 15年10月31日19:44:27 (一) start.S 写这一段代码前,先要清楚bootloader开始的时候都做什么了.无非就是硬件的初始化,我们想要写 ...

  3. 我是如何学习写一个操作系统(完结):总结和系列索引

    前言 从一开始的引导程序到现在的文件系统已经有十篇了,算是自己对操作系统的学习的一个笔记,原本是想结合自己之前写的玩具操作系统FragileOS,但是之后就转到了结合Linux 0.11的代码去写这个 ...

  4. 怎样写一个简单的操作系统?

    翻译:magictong(童磊)2011年1月 版权:Mike Saunders和Mike OS的全体开发 2009年 原文地址:http://mikeos.berlios.de/write-your ...

  5. 怎样写一个简单的操作系统?(原文标题:How to write a simple operating system) 分类: 翻译 2011-01-26 01:10 3175人阅读 评论(3) 收藏

    怎样写一个简单的操作系统?(原文标题:How to write a simple operating system) 分类: 翻译2011-01-26 01:10 3175人阅读 评论(3) 收藏 举 ...

  6. python-GUI:利用pyqt5设计一个bootloader上位机页面(ZLG驱动)及打包报错faild to execute script pyi_rth_multiprocessing精简方案

    python-GUI:利用pyqt5设计一个bootloader上位机页面 1.下载pyqt5和Qt Designer 2.利用Qt Designer设计页面 步骤一:打开Qt Designer 步骤 ...

  7. [Arduino]烧写Arduino BootLoader的几种方法

    [Arduino]烧写Arduino BootLoader的几种方法 身为Arduino 电子工程师,很多时候都会涉及到自制各种功能的Arduino 电路板(亦或者说是功能扩展板),但是从网上或者其他 ...

  8. 嵌入式系统烧写uboot/bootloader/kernel的一般方法

    嵌入式系统烧写uboot/bootloader/kernel的一般方法 本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,   ...

  9. [从 0 开始写一个操作系统] 一、准备知识

    从 0 开始写一个操作系统 作者:解琛 时间:2020 年 8 月 29 日 从 0 开始写一个操作系统 一.准备知识 1.1 实现方案 1.2 gcc 1.2.1 AT&T 汇编基本语法 1 ...

最新文章

  1. 让程序员头疼的文档问题怎么破?试试活文档
  2. 使用span标签为文字设置单独样式
  3. C#基础-面向对象-多态
  4. 嵌入式linux硬件成本,嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?...
  5. Linux 服务器注意事项
  6. 《Adobe Illustrator大师班:经典作品与完美技巧赏析》—Svetlana Makarova
  7. python CV2裁剪图片并保存
  8. 结晶紫行业调研报告 - 市场现状分析与发展前景预测
  9. paip.提升用户体验----错误信息提示结构总结
  10. 海思Hi3519A开发(5.梳理海思文档与运行sample代码)
  11. java socket唯一标识符_java Socket
  12. 【Rosalind】Mortal Fibonacci Rabbits
  13. 重疾险对比:“瑞泰瑞享安康” V.S. “信泰百万无忧”
  14. python爬取去哪网数据_用户观点:企查查数据爬取技术与Python 爬取企查查数据...
  15. win11玩游戏延迟_win11系统玩游戏卡顿性能提升小技巧
  16. C# 模拟鼠标移动和点击(转载)
  17. 推荐5个堪称神器的学习网站,在家你值得拥有
  18. 三维模型丨互联网时代的商品展示利器
  19. 服务器阵列工作原理,阵列卡的工作原理
  20. ROM、RAM、Flash的区别

热门文章

  1. python手机端秒杀_python实现淘宝秒杀脚本
  2. mysql adminer 导入csv_mysql导入csv的4种报错的解决方法
  3. php pdo参数化,php – 如何正确地使用PDO对象的参数化SELECT查询
  4. 数学--数论--最小公倍数+最大公约数
  5. CodeForces - 1058A. In Search of an Easy Problem
  6. 动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】
  7. 【个人网盘-updog】使用updog建立个人网盘,so easy
  8. Eigen入门之密集矩阵 3 - Array操作
  9. 线程监视器模型_为什么模型验证如此重要,它与模型监视有何不同
  10. 语义分析 文本矛盾点解析_关于解析文本的几点思考