随笔 - 1  文章 - 0  评论 - 0  阅读 - 9

30天自制操作系统day1&day2

day1:

  二进制编辑器bz:https://www.vcraft.jp/soft/bz.html
  初识机器语言和汇编语言,并分别用其实现了软盘映像文件(完全用作者的复制粘贴)。

  二进制编辑器中输入内容如下:
  只有图中部分有非0内容,其余部分均为0,最末行首地址是001440。



  保存为helloos.img,即为一个极简的二进制的软盘映像文件。

  没有软盘可以用作者提供的模拟器。
  创建run.bat,内容:
copy helloos.img ..\z_tools\qemu\fdimage0.bin ..\z_tools\make.exe -C ../z_tools/qemu
  打开cmd进入helloos.img所在目录,运行run.bat

day2:

2.1作者推荐文本编辑器

  TeraPad:
  NotePad++:http://notepad-plus-plus.org/

2.2相关指令介绍

  helloos.nas节选

点击查看代码
; hello-os:
; TAB=4
 ORG 0x7c00 ; 指明程序的装载
地址
; 以下的记述用于标准FAT12格式的软盘
 JMP entry
 DB 0x90---(中略)---
; 程序核心
entry:
 MOV AX,0 ; 初始化寄存器
 MOV SS,AX
 MOV SP,0x7c00
 MOV DS,AX
 MOV ES,AX
 MOV SI,msg
putloop:
 MOV AL,[SI]
 ADD SI,1 ; 给SI加1
 CMP AL,0
 JE fin
 MOV AH,0x0e ; 显示一个文字
 MOV BX,15 ; 指定字符颜色
 INT 0x10 ; 调用显卡BIOS
 JMP putloop
fin:
 HLT ; 让CPU停止,等待指令
 JMP fin ; 无限循环msg:
 DB 0x0a, 0x0a ; 换行2次
 DB "hello, world"
 DB 0x0a ; 换行
 DB 0

  MOV WORD [678],123:表示将123用16位二进制数表示,若机器按字节编址,则存入以678为首地址的相邻两个存储单元。
  HLT:CPU停止动作,处于休眠状态,外部发生变化之后CPU就会继续执行程序。
  ORG:指定把程序装载入内存的具体地址,使用ORG指令时要注意,不是所有的内存地址都可以使用,有一部分是BIOS程序和中断向量表,ORG的目的操作数不能在这些部分的范围内。内存中无法使用的部分具体取决于我们电脑的出厂设置。
  内存:CPU的存储能力很差,内存看作CPU的外部存储器。

2.3制作启动区

  启动区仅需要最初的512字节,故只保留helloos.nas最初的512字节,并将其文件名改为ipl.nas
  ipl.nas内容如下:

点击查看代码
; hello-os
; TAB=4

		ORG		0x7c00			; 程序载入内存的地址

; 以下是标准FAT12格式软盘的记述

		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		; 引导扇区的名称,可更改(8字节)
		DW		512				; 规定一个扇区的大小(512字节)
		DB		1				; 群集(又称“簇”)大小,必须为一个扇区
		DW		1				; FAT从哪里开始(一般从第一个扇区开始)
		DB		2				; FAT个数(必须为2)
		DW		224				; 根目录区域的大小(通常为224个条目)
		DW		2880			; 此驱动器的大小(必须为2880个扇区)
		DB		0xf0			; 介质类型(?)(必须为0xf0)
		DW		9				; FAT长度(必须为9个扇区)
		DW		18				; 一个磁道有多少个扇区(必须是18)
		DW		2				; 头数(是磁盘头吗?)(必须为2)
		DD		0				; 因为没有使用分区,所以这里一定是0
		DD		2880			; 再写一次这个驱动器的大小
		DB		0,0,0x29		; 价格(?
		DD		0xffffffff		; 卷序列号
		DB		"HELLO-OS   "	; 磁盘名(共11字节)
		DB		"FAT12   "		; 磁盘格式是FAT12(共8字节)
		RESB	18				; 连续18个字节的0

; 程序主体

entry:
		MOV		AX,0			; 通用寄存器AX初始化
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX
		MOV		ES,AX

		MOV		SI,msg
putloop:
		MOV		AL,[SI]
		ADD		SI,1			
		CMP		AL,0
		JE		fin
		MOV		AH,0x0e			; 单字显示功能
		MOV		BX,15			; 彩色编码
		INT		0x10			; 视频BIOS调用
		JMP		putloop
fin:
		HLT						; CPU休眠
		JMP		fin				; 无限循环

msg:
		DB		0x0a, 0x0a		; 两个换行符
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x7dfe-$		; 从当前地址到地址0x7dfe用0x00填充

		DB		0x55, 0xaa
  FAT12文件系统:每个FAT项占12bit。
  FAT:文件记录表,记录每个文件的各个数据块存放在磁盘的哪个位置。
  簇:文件系统用来组织和管理磁盘空间的基本分配单位。一个群集由若干连续的扇区组成。
  卷序列号:为每个卷提供一个唯一的标识符,使得操作系统能够区分不同的存储设备和分区。

2.4makefile入门

  首先新建一个文本文件,并输入以下内容:

点击查看代码
#文件生成规则
ipl.bin : ipl.nas Makefile                      #目标:依赖
 ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst    #需要执行的命令
helloos.img : ipl.bin Makefile                  #最终生成的镜像文件名为helloos.img,依赖是ipl.bin和Makefile
 ../z_tools/edimg.exe                           #使用工具edimg.exe,加载fdimg0at.tek文件作为基础镜像
imgin:../z_tools/fdimg0at.tek \                 #将ipl.bin文件的前512个字节读入fdimg0at.tek中,写入fggimg0at.tek时从字符偏移量0开始,即文件开头开始写
 wbinimg src:ipl.bin len:512 from:0 to:0 
imgout:helloos.img                              #将得到的镜像文件保存为helloos.img
  然后修改文件名为makefile或Makefile(大小写敏感)(另注:mekefile文件名一般就是这两个)
  makefile文件相当于将需要的gcc指令集成到一个脚本中。   每个mekefile规则一般由三部分组成:
  目标:本规则最后得到的文件。
  依赖:实现目标需要的前提文件或目标。Makefile的执行过程不是基于语句顺序的,而是基于依赖链的顺序的。
  命令:实现目标需要执行的一系列命令,通过这一系列命令,可以使依赖形成目标。
  作者给出的完整makefile如下,:
点击查看代码

# 默认动作

default :
	../z_tools/make.exe img

# 镜像文件生成

ipl.bin : ipl.nas Makefile
	../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img : ipl.bin Makefile
	../z_tools/edimg.exe   imgin:../z_tools/fdimg0at.tek \
		wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

# 其他指令

asm :
	../z_tools/make.exe -r ipl.bin

img :
	../z_tools/make.exe -r helloos.img

run :
	../z_tools/make.exe img
	cp helloos.img ..\z_tools\qemu\fdimage0.bin
	../z_tools/make.exe -C ../z_tools/qemu

install :
	../z_tools/make.exe img
	../z_tools/imgtol.com w a: helloos.img

#删除掉最终成果以外的所有中间生成文件
clean :
	-rm -f ipl.bin
	-rm -f ipl.lst

src_only :
	../z_tools/make.exe clean
	-rm -f helloos.img

posted on   abcdsxz  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示