【写一个操作系统】1—hello world重出江湖_从0开始写一个输出hello world的操作系统基于risk-程序员宅基地

技术标签: Linux  操作系统  30天自制操作系统  

目的

开发一个,基于底层硬件的helloworld小程序.

第一阶段:利用二进制编辑器实现

先下载了一个二进制编辑器软件Bz.exe1,创建一个helloos.img镜像文件,制作软盘镜像文件(通过这二进制编辑器),实际上C语句被其他程序转化为一系列的低级机器语言指令,这些指令再按照可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来,我们是直接写了这个二进制文件,将此文件写入电脑,可以用来显示helloworld小程序。步骤如下:

  • 按照教程在Bz上编写一个helloos.img镜像文件
  • 教程附带toolset文件夹整个复制到另一个的文件夹下面
  • toolset文件夹下建立一个新的文件夹gq_helloos
  • 将编写好的helloos.img添加至gq_helloos
  • toolset文件中z_new_w文件夹下的!cons_nt.bat添加在新文件夹中
  • gq_helloos中创建一个文件命名为run.bat,编辑文件内容为:
copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe	-C ../z_tools/qemu
  • 同样,再在gq_helloos中创建一个文件命名为install.bat,编辑文件内容为:
..\z_tools\imgtol.com w a: helloos.img

.bat后缀为批处理文件格式,批处理文件是无格式的文本文件,它包含的是一些命令的代码,在命令提示下输入批处理文件名字或者双击批处理文件都会,按照文件中命令的顺序来执行命令。相当于一个集合了命令集的文件。)

  • 接下来就是将这个程序装在软盘上了,万一没钱买不起软盘怎么办?那就用模拟器吧,这里使用的模拟器是QEMU,教程已经把QEMU放在在文件..\z_tools\qemu中,使用时只要打开命令窗口,等一下!命令窗口怎么打开(黑人问号???),只要双击666之前添加的!cons_nt.bat就可以打开命令窗口了,然后在命令行窗口中输入"run"指令就可以了。

相当于run.bat中的内容就是"run"指令,在命令窗口中输入"run"就是调用了run.bat中的指令,从而开始运行程序

  • 下面就是调用QEMU模拟器显示的内容,一个hello,world
    在这里插入图片描述

第二阶段:使用汇编语言编写

接下来使用汇编语言来写这个程序,上一步构建的gq_helloos文件夹中进行修改

  • 先删除之前写好的helloos.img镜像文件(但程序最后的运行还是需要镜像文件,下面会利用汇编文件生成镜像文件的)
  • 创建汇编文件helloos.nas,编写内容为:
	DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
	DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
	DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
	DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
	DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
	DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
	DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
	RESB	16
	DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
	DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
	DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
	DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
	DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
	DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
	DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	368
	DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	4600
	DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
	RESB	1469432

不要看这个代码只有22行,短小精悍,RESB代表省略的字节,省略的全部都是0x00,比如最后的 RESB 1469432 ,就省略了1469432个0x00

  • 创建批处理文件asm.bat ,编写内容为:
    ..\z_tools\nask.exe helloos.nas helloos.img
    其命令就是按照汇编文件helloos.nas生成对应的镜像文件helloos.img
  • 接下来的步骤和上面一样:利用!cons_nt.bat打开命令行窗口,在命令行中输入"asm’'指令,然后会在文件夹中生成对应的镜像文件helloos.img,最后在命令行中输入"run"指令,程序就会像上面一样执行,显示helloworld窗口

第三阶段:改进汇编程序

主要是对helloos.nas文件的改进,使代码变得更可读(说实话我也看不懂,抄就是了)

; hello-os
; TAB=4

; 以下这段是标准FAT12格式软盘专用的代码

		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		; 启动区的名称可以是任意字符串(8字节)
		DW		512				;规定 每个扇区的大小(必须为512字节)
		DB		1				; 规定簇的大小,以扇区为单位(必须为1个扇区)
		DW		1				; 规定FAT的起始位置(一般是从第一个位置开始)
		DB		2				; FAT的个数(必须为2)
		DW		224				; 根目录的大小(一般设置224项)
		DW		2880			; 规定磁盘大小(必须2880个扇区大小)
		DB		0xf0			; 规定磁盘的种类
		DW		9				; 规定FAT的长度(必须是9个扇区)
		DW		18				; 规定一个磁道的扇区个数(必须18个)
		DW		2				; 规定磁头数(必须2个)
		DD		0				; 不使用分区,必须为0
		DD		2880			; 重新确定磁盘大小为2880个扇区
		DB		0,0,0x29		; 教程也不知道这是什么
		DD		0xffffffff		; たぶんボリュームシリアル番号
		DB		"HELLO-OS   "	; 磁盘的名称
		DB		"FAT12   "		; 磁盘的格式
		RESB	18				; 空出18个字节

;程序主体

		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd

; 信息显示部分

		DB		0x0a, 0x0a		;俩次换行
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x1fe-$			; 自动填写0x00,直到0x001fe

		DB		0x55, 0xaa

; 启动区以外部分输出

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

在里面的"hello, world"也可以换为其他字符串,一样可以显示出来,比如俗的不能再俗的 i love you
在这里插入图片描述

对汇编语言的指令说明在注释2

收获

忙了一天,多少有点收获,现在我可是精通代码的抄写、能够熟练使用复制粘贴…emm 多少了解了代码的执行过程,了解了一点点汇编语言,搞明白了镜像文件、批处理文件,对CPU处理数据的原理有了一定认识,会使用二进制编辑器,而且今天搜集了很多火影壁纸…帅气的第七班
在这里插入图片描述

注释


  1. 要知道所有在计算机上的文件、程序实质上都是一堆二进制数,而计算机所执行的所有操作都是这一堆二进制数来控制的,理论上利用二进制编辑器可以编写任意的文件或者软件,所以本文利用二进制编辑器来编写了一个helloos.img镜像文件。

  2. :这是个注释命令,相当于C中的注释符//
    DB:DB指令是define byte的缩写,意为往文件中直接写入一个字节,当然,也可以结合双引号""来写字符串
    RESB:意为省略字节,但省略的字节都是0x00,如RESB 7意为空出7个字节
    DW:是define word的缩写,计算机世界中word=16位,即俩个字节,所以DW意为写俩个字节
    DD:是define double-word的缩写,意为写四个字节
    TAB:TAB=4代表设置缩进4位
    $:美元符号,是个变量,代表当前的字节数,利用其可以控制代码中0x00的个数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43743762/article/details/99295245

智能推荐

我学cocos2d-x (三) Node:一切可视化对象的祖先_cococs cocos2d::node 使用-程序员宅基地

文章浏览阅读1k次。在cocos2d-x中一切可视化的元素都集成自Node,zhe's_cococs cocos2d::node 使用

20180806 考试记录-程序员宅基地

文章浏览阅读74次。20180806 考试记录 T1 【NOIP2013模拟联考8】最短路(path)Solution设s为第0个标记点,t为k+1个跑k+1次最短路然后全排列暴力求解qwq注意最大值要设为long long范围最大值CodePS:各种修改qwq//By Menteur_Hxy#include&lt;queue&gt;#include..._i <= 3000000000u

DBA整理的万字详解MySQL性能优化,值得收藏!-程序员宅基地

文章浏览阅读190次。点击关注公众号,实用技术文章及时了解作者:LanceToBigDatacnblogs.com/zhangyinhua/p/7620964.html说起MySQL的查询优化,相信大家积累...

云开发(3)云函数本地调试_本地云函数调试并发数量限制-程序员宅基地

文章浏览阅读921次。云函数/云函数本地调试云函数是云开发其中一项基础能力,在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码。云函数个数免费版云函数数量上限为 50写完自己的原函数后,可以通过云函数的本地调试来进行调试,调试没有问题了就可以上传云端,对于解决bug查找bug是很好用的使用像调试自己的哪一个云函数就直接右键开启本地调试即可。就是这样一个页面此时运行自己的云函数就是在本地运行不是再云端给运行了。可以调试没问题后再传到云端,有时候会弹出一个错误解决方法:右键点击你_本地云函数调试并发数量限制

SQL创建默认值语句(CREATE DEFAULT)-程序员宅基地

文章浏览阅读5.8k次。微软的解释:创建称为默认值的对象。当绑定到列或别名数据类型时,如果插入时没有显式提供值,则默认值将指定一个值,以便将其插入该对象所绑定的列中(或者,如果是别名数据类型,则插入所有列中)。后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。语法 ..._sql declare default

Linux分区格式化实训操作说明_sdb7这个分区的具体含义-程序员宅基地

文章浏览阅读2.2k次。首先介绍一下背景知识:Linux主分区,扩展分区,逻辑分区的联系和区别Linux硬盘分区有三种,主磁盘分区、扩展磁盘分区、逻辑分区。一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个。且主分区+扩展分区总共不能超过4个。逻辑分区可以有若干个。在linux下主分区和逻辑分区都可以用来放系统,引导os开机。分出主分区后,其余的部分可以分成扩展分区,一般情况是剩余磁盘空间全部配成扩展分区,..._sdb7这个分区的具体含义

随便推点

oracle9i打补丁,oracle11gr2打PSU补丁记录-程序员宅基地

文章浏览阅读72次。1、将数据库和监听程序关闭2、首先检查OPatch版本是否符合要求:$ORACLE_HOME/OPatch/opatch lsinventory3、若不符合要求,需先更新opatch:mv 掉原有的OPatch目录mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatchbakcp p6880880_112000_SOLARIS64-opatch11.2.0.3.12.z..._oracle9i 打补丁时ouihome设置

java ocr技术--tesseract-ocr:使用jTessBoxEditor制作训练库_jtessboxeditor训练英文和数字结合的图片-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏18次。几个常见的问题:问题一:相关的几个软件下载地址Tesseract:Index of /tesseractjTessBoxEditor: VietOCR - Browse /jTessBoxEditor at SourceForge.net问题二:jTessBoxEditor下载是注意一下,中文的话要下载jTessBoxEditorFX问题三:mftraining执行时提示停止工作,一般是Tesseract版本的问题,可以选择Tesseract3验证过是好的,Tesser._jtessboxeditor训练英文和数字结合的图片

天平称重,进制转换解法_天平称重(进制解法) python-程序员宅基地

文章浏览阅读302次。题目:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。如果只有5个砝码,重量分别是1,3,9,27,81则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。本题目要求编程实现:对用户给定的重量,给出砝码组合方案。例如:用户输入:5程序输出:9-3-1用户输入:19程序输出:27-9+1要求程序输出的组合总是大数在前小数在后。可以假设用户的输入的数字符合范围1~121。思路:观察输出,都是3的多少次方,所以我们可以把输入的值,转换成3进制的_天平称重(进制解法) python

druid-1.1.21.jar-程序员宅基地

文章浏览阅读954次。链接:https://pan.baidu.com/s/1w5_GTiWuAR_X2t8J7JIP4Q提取码:a0u1_druid-1.1.21.jar

pthread_spinlock_t与pthread_mutex_t性能对比_pthread 性能 效率-程序员宅基地

文章浏览阅读8k次。看到一篇pthread_spinlock_t与pthread_mutex_t性能对比做的非常细致的博客,记录下来原文在此:http://www.cnblogs.com/diyunpeng/archive/2011/06/07/2074059.html_pthread 性能 效率

mysql innodb与myisam存储文件的区别-程序员宅基地

文章浏览阅读1.1k次。myisam:.frm: 存储表定义.myd(MYData):存储数据.MYI(MYindex):存储引擎innodb:.frm:存储表定义.idb:存储数据和索引,在同一个文件中_innodb和mylsam生成文件的区别