这一节的内容并不长,因为在进入保护模式之前,我们能做的不多,loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载内核。本节只实现一个简单的loader,本loader只在实模式下工作,等学习了保护模式后,我们再来个真格的。

由于本节较容易,没有新知识,直接上菜啦,见代码

 1 %include "boot.inc"2 section loader vstart=LOADER_BASE_ADDR34 ; 输出背景色绿色,前景色红色,并且跳动的字符串"1 MBR"5 mov byte [gs:0x00],'2'6 mov byte [gs:0x01],0xA4 ; A表示绿色背景闪烁,4表示前景色为红色78 mov byte [gs:0x02],' '9 mov byte [gs:0x03],0xA41011 mov byte [gs:0x04],'L'12 mov byte [gs:0x05],0xA41314 mov byte [gs:0x06],'O'15 mov byte [gs:0x07],0xA41617 mov byte [gs:0x08],'A'18 mov byte [gs:0x09],0xA41920 mov byte [gs:0x0a],'D'21 mov byte [gs:0x0b],0xA42223 mov byte [gs:0x0c],'E'24 mov byte [gs:0x0d],0xA42526 mov byte [gs:0x0e],'R'27 mov byte [gs:0x0f],0xA42829 jmp $ ; 通过死循环使程序悬停在此

对这个loader中的代码,大家是否觉得好亲切、毫无压力呢。这和咱们最初的那个MBR好接近,不同的是,在这个loader中,打印的字符串是“2 loader”。

本loader程序第2行代码用到了LOADER_BASE_ADDR,所以在第1行中把boot.inc包含进来了,其值是0x900。其它代码就不用讲啦。

编译nasm -I include/ -o loader.bin loader.S回车

将生成的loader.bin写入硬盘第2个扇区。第0个扇区是MBR,第1个扇区是空的未使用,原因如前所述,纯粹个人喜好。

dd if=./loader.bin of=/此处替换成你的安装目录/bochs/hd60M.img bs=512 count=1 seek=2 conv=notrunc回车,下面是dd命令的三行输出。

记录了0+1 的读入

记录了0+1 的写出

98字节(98 B)已复制,8.9113e-05 秒,1.1 MB/秒

可见,我们的loader.bin只有98字节,远远小于64k。

小激动的时刻到了,我们该运行bochs来验证了。如果程序正确的话,MBR会跳转到loader.bin去运行,屏幕上会显示“2 loader”。

启动虚拟机,执行。效果如图

这次我只抓了一张图,但我人格保证这是跳动的字符,大家在自己的虚拟机上体验体验吧。

Loader刚刚开了个头,马上就要和大家暂别了。因为这个loader目前还没有实际意义,目前只是来验证MBR和loader的接力是否成功,它最终的任务是要加载内核。可是内核是运行在32位保护模式环境下,我们当前还在实模式下呢。首先咱们得知道什么是保护模式,其次还得想办法进入到保护模式,前面的路还很远。

好啦,本章到此告一段落,等我们学习保护模式后,我们还会回来继续改进loader。

【再续】

本内容摘自《操作系统真象还原》,请大伙儿支持正版,多谢多谢。

一步步编写操作系统 24 编写内核加载器相关推荐

  1. 从零开始操作系统------MBR直操硬盘、内核加载器

    本文基于郑纲的<操作系统还原>,仅为个人学习笔记,前期的虚拟机配置等不再详细记录,其中不理解或者出错的地方还望提出意见! 从零开始操作系统------MBR直操显卡 硬盘 存储逻辑 为了更 ...

  2. Windows内核加载器概念学习

    最近看ReactOS源码分析相关,看到内核加载器概念相关的:原文如下: ReactOS源码分析--内核加载器(一) 计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录 ...

  3. PyTorch 编写自定义数据集,数据加载器和转换

    本文为 pytorch 官方教程https://pytorch.org/tutorials/beginner/data_loading_tutorial.html代码的注释 w3cschool 的翻译 ...

  4. os从启动带内核加载

    操作系统实验(真象还原) 第0章 操作系统是什么 操作系统把资源获取到后交给用户进程,而不允许用户直接访问硬件资源写一个操作系统需要了解硬件知识,这些硬件提供了软件接口,于是操作系统可以通过接口操作硬 ...

  5. PyTorch基础-自定义数据集和数据加载器(2)

    处理数据样本的代码可能会变得混乱且难以维护: 理想情况下,我们想要数据集代码与模型训练代码解耦,以获得更好的可读性和模块化.PyTorch 域库提供了许多预加载的数据(例如 FashionMNIST) ...

  6. java编写hot_类的热加载(Hot Deployment)的简单例子

    应用服务器一般都支持热部署(Hot Deployment),更新代码时把新编译的确类 替换旧的就行,后面的程序就执行新类中的代码.这也是由各种应用服务器的独 有的类加载器层次实现的.那如何在我们的程序 ...

  7. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 参考文章: (1)关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 (2)https://www. ...

  8. python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器

    距离上一次讲Lua程序逆向已经有一段时间了,这一次我们书接上回,继续开启Lua程序逆向系列之旅. 在软件逆向工程实践中,为第三方文件编写文件格式分析器与指令反汇编器是一种常见的场景.这一篇的主要目的是 ...

  9. uboot加载linux内核加载那些内容,几个地址参数及uboot加载启动内核过程的理解

    关于uBoot和Linux内核中几个地址参数及uboot加载启动内核过程的理解 uboot一般使用mkimage工具先制作一个启动映象文件来引导识别内核的,uboot源代码的tools/目录下有mki ...

最新文章

  1. Thinking in java中关于Exception的一道面试题.
  2. SCVMM2008R2学习(八),硬件配置文件
  3. Maven详解(五)------ 坐标的概念以及依赖管理
  4. centos6.5下升级gnutls
  5. 品牌网络推广方案浅析在编写文章标题时都有什么技巧?
  6. Java学习之路-4_集合知识总结
  7. oracle within的用法,Oracle的 listagg() WITHIN GROUP ()函数使用
  8. C++异常处理(一) - iStack
  9. mysql 60万_MySQL5.7中60万数据的表分组统计很慢
  10. 有助提高效率的Web前端开发框架有哪些?
  11. java中可以让实例改变了类Feild(java这么干就是一个错误,你看到了就当做是类在该修改或这个类Feild)...
  12. harmonyos2.0系统,Harmonyos2.0刷机包
  13. 域名解析到服务器ip,域名解析到服务器ip上无法访问的原因汇总
  14. 微信小程序休眠setTimeout
  15. 草根程序员转型做项目管理走过的点点滴滴之_华为裁员感想
  16. 二维码图片生成工具C#winform源码
  17. 论文简介:Extract Line Art from Illustrations
  18. [Test]测试相关资料
  19. 如何写会议 Rebuttal
  20. [每日一题]152:仅仅反转字母

热门文章

  1. React Native 开发环境搭建
  2. Mac远程连接服务器
  3. BZOJ 1878 HH的项链 | 主席树
  4. HDU 1525 类Bash博弈
  5. 中科大开源镜像使用帮助列表
  6. cocos2d对动画的各种操作
  7. Dos下命令运行带有包名的Java类
  8. 住宅的结构有哪些形式
  9. 主题:的中间层框架 第一节
  10. Schrödinger's Knapsack ZOJ - 4019 线性DP