30天自制操作系统——第一天到第二天

第一天

光盘地址用的这个:30天自制操作系统光盘 - 夕雨714 - 博客园 (cnblogs.com)

Bz162下载地址:Bz - c.mos (vcraft.jp)

效果图

启动方式:D:\文档\学习科目\计算机基础\操作系统\操作系统实验\30dayMakeOS\1_day\tolset\helloos0 目录下打开!cons_nt.bat cmd中输入run

后面发现版本更换太快了,加个名字没啥用

2C 逗号,20 空格,0A 换行

OS made by BUPT LanYi

4F 53 20 6D 61 64 65 20 62 79 20 42 55 50 54 20 4C 61 6E 59 69 0A

共22组

在这里插入图片描述

经过简化,可以在helloos2中的helloos.nas文本中更改

再用一下命令生成img文件,再run

…\z_tools\nask.exe helloos.nas helloos.img

效果图跟上图一样

目前helloos2中为os


第二天

helloos.nas

; hello-os
; TAB=4

		ORG		0x7c00			; 装载地址,也就是程序的开头,引导扇区被读取的地址,IBM规定的

		JMP		entry			; 跳转
		DB		0x90
		DB		"HELLOIPL"		; 僽乕僩僙僋僞偺柤慜傪帺桼偵彂偄偰傛偄乮8僶僀僩乯
		DW		512				; 1僙僋僞偺戝偒偝乮512偵偟側偗傟偽偄偗側偄乯
		DB		1				; 僋儔僗僞偺戝偒偝乮1僙僋僞偵偟側偗傟偽偄偗側偄乯
		DW		1				; FAT偑偳偙偐傜巒傑傞偐乮晛捠偼1僙僋僞栚偐傜偵偡傞乯
		DB		2				; FAT偺屄悢乮2偵偟側偗傟偽偄偗側偄乯
		DW		224				; 儖乕僩僨傿儗僋僩儕椞堟偺戝偒偝乮晛捠偼224僄儞僩儕偵偡傞乯
		DW		2880			; 偙偺僪儔僀僽偺戝偒偝乮2880僙僋僞偵偟側偗傟偽偄偗側偄乯
		DB		0xf0			; 儊僨傿傾偺僞僀僾乮0xf0偵偟側偗傟偽偄偗側偄乯
		DW		9				; FAT椞堟偺挿偝乮9僙僋僞偵偟側偗傟偽偄偗側偄乯
		DW		18				; 1僩儔僢僋偵偄偔偮偺僙僋僞偑偁傞偐乮18偵偟側偗傟偽偄偗側偄乯
		DW		2				; 僿僢僪偺悢乮2偵偟側偗傟偽偄偗側偄乯
		DD		0				; 僷乕僥傿僔儑儞傪巊偭偰側偄偺偱偙偙偼昁偢0
		DD		2880			; 偙偺僪儔僀僽戝偒偝傪傕偆堦搙彂偔
		DB		0,0,0x29		; 傛偔傢偐傜側偄偗偳偙偺抣偵偟偰偍偔偲偄偄傜偟偄
		DD		0xffffffff		; 偨傇傫儃儕儏乕儉僔儕傾儖斣崋
		DB		"HELLO-OS   "	; 僨傿僗僋偺柤慜乮11僶僀僩乯
		DB		"FAT12   "		; 僼僅乕儅僢僩偺柤慜乮8僶僀僩乯
		RESB	18				; 偲傝偁偊偢18僶僀僩偁偗偰偍偔

; 僾儘僌儔儉杮懱

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加一
		CMP		AL,0
		JE		fin
		MOV		AH,0x0e			; 显示一个文字
		MOV		BX,15			; 指定字符颜色
		INT		0x10			; 软件中断指令,调用显卡BIOS,使用16号函数
		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

; 埲壓偼僽乕僩僙僋僞埲奜偺晹暘偺婰弎

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

bios网页:(AT) BIOS - os-wiki (osask.jp)

内存分布图(AT)memorymap - os-wiki (osask.jp)

nask:汇编编译器的一种

文件更改:ipl.nas用来作为启动区

asm
makeimg
run

在这里插入图片描述


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
	copy 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 : # 删除掉中间文件
	-del ipl.bin
	-del ipl.lst

src_only : # 调用clean命令的同时删除img
	../z_tools/make.exe clean
	-del helloos.img


第三天

IPL: initial program loader 启动区,启动程序装载器

BIOS的0x13函数

  • AH = 0x02; (読み込み時)
  • AH = 0x03; (書き込み時)
  • AH = 0x04; (ベリファイ時)
  • AH = 0x0c; (シーク時)
  • AL = 処理するセクタ数; (連続したセクタを処理できる)
  • CH = シリンダ番号 & 0xff;
  • CL = セクタ番号(bit0-5) | (シリンダ番号 & 0x300) >> 2;
  • DH = ヘッド番号;
  • DL = ドライブ番号;
  • ES:BX = バッファアドレス; (ベリファイ時、シーク時にはこれは参照しない)
  • 返回值,即进位标志:
  • FLAGS.CF == 0 : エラーなし、AH == 0
  • FLAGS.CF == 1 : エラーあり、AHにエラーコード(リセットファンクションと同じ)
; harib00b/ipl.nas与昨天不同的部分

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 柱面0
		MOV		DH,0			; 磁头0
		MOV		CL,2			; 扇区2

		MOV		AH,0x02			; AH=0x02 : 读盘
		MOV		AL,1			; 1个山区
		MOV		BX,0
		MOV		DL,0x00			; 驱动器号
		INT		0x13			; 调用BIOS19号函数
		JC		error			; 进位标志如果是1的话,就跳转
		

与光盘不同,软盘磁盘两面都能记录数据

软式磁盘驱动器则称FDD,软盘片是覆盖磁性涂料的塑料片,用来储存数据文件,磁盘片的容量有5.25”的1.2MB,3.5”的1.44MB。

以3.5”的磁盘片为例,其容量的计算如下:
80(磁道)x18(扇区)x512 bytes(扇区的大小)x2(双面) = 1440 x1024 bytes = 1440 KB = 1.44MB
3.5英寸软盘片,其上、下两面各被划分为80个磁道,每个磁道被划分为18个扇区,每个扇区的存储容量固定为512字节。

段寄存器:

不管要指定内存的什么地址都必须同时指定段寄存器,默认为段寄存器DS,故DS必须预先指定为0,否则地址会加上这个数的16倍

make run
没啥好说的


; 03_day/harib00b
entry:
		MOV		AX,0			; 儗僕僗僞弶婜壔
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX

; 僨傿僗僋傪撉傓

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 僔儕儞僟0
		MOV		DH,0			; 僿僢僪0
		MOV		CL,2			; 僙僋僞2

		MOV		SI,0			; 记录失败次数的寄存器
retry:
		MOV		AH,0x02			; AH=0x02 : 僨傿僗僋撉傒崬傒
		MOV		AL,1			; 1僙僋僞
		MOV		BX,0
		MOV		DL,0x00			; A僪儔僀僽
		INT		0x13			; 僨傿僗僋BIOS屇傃弌偟
		JNC		fin				; 没出错的话跳转到fin
		ADD		SI,1			; 往SI加1
		CMP		SI,5			; 比较SI和5
		JAE		error			; SI >= 5 跳转error
		MOV		AH,0x00
		MOV		DL,0x00			; A僪儔僀僽
		INT		0x13			; 重置驱动器
		JMP		retry

到目前还挺简单的,但是得补编译原理、数据库作业去了,感觉第三天内容好像挺多

欢迎关注B站账号,会发一些深度强化学习的学习资料
B站账号:哔哩哔哩 无名-易
Gitee账号:gitee账号
GitHub账号:GitHub

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值