一个操作系统的实现 笔记 CH1

一个操作系统的实现 CH1

环境为Archlinux!!!

如果想要安装arch请移步:

2021 Archlinux双系统安装教程

或者

Arch Wiki 安装指南

友情提示:没有完全的把握最好不要实机安装喔

可以移步 Manjaro or Garuda Linux或者其他基于Arch的发行版

也可以直接移步其他非Arch发行版诸如UbuntuDebian等等

推荐最好是实机安装

书本制作的os是针对x86平台的,所以所有的汇编都是x86平台的汇编

首先下载nasm(Intel 语法汇编) 以及 cgasm(AT&T 语法汇编, 一般称为gas?)

sudo pacman -S nasm cgasm

然后使用一个用着爽的编辑器,打开一个文件:

vim boot.asm

输入以下内容:

	org 07c00h										; 将程序加载到7c00处
	mov ax, cs										; 对ax进行清零
	mov ds, ax										; 对ds进行清零
	mov es, ax										; 对es进行清零
	call DispStr									; 调用DispStr代码段
	jmp $											; 从DispStr代码段返回之后进行无限循环
DispStr:
	mov ax, BootMessage								; 将BootMessage地址赋给ax
	mov bp, ax										; ES:BP = 串地址
	mov cx, 16										; CX = 串长度
	mov ax, 01301h									; AH = 13 用于显示字符串,AL = 01 用于光标跟随打印的字符串移动
	mov bx, 000ch									; BH = 页号,BL = 背景及字体色,此处为黑底红字高亮
	mov dl, 0										; DL = 起始行列
	int 10h											; 10h 号中断,打印字符串调用以上参数包括从ES:BP开始的到DL的行
	ret												; 返回到call DispStr的下一行
BootMessage:			db		"Hello, OS world!"	; 要打印的字符串
times	510 - ($ - $$)	db		0					; 用 0 填充剩余的空间,使生成的代码刚好为512字节
dw 		0xaa55										; 结束标志,0xaa55 用于告诉bios这是一个可启动扇区

然后在终端编译:

nasm boot.asm -p boot.bin

接着是安装qemu-full:

sudo pacman -S qemu-full

然后尝试用qemu将这个程序启动:

qemu-system-x86_64 -fda ./boot.bin

因为是 x86 架构的,并且程序实际上是由 bios 进行执行,而 bios 是一个基于16位环境的程序,所以也可以用如下命令:

qemu-system-i386 -fda ./boot.bin

其中 -fda 参数用于指定软盘启动,当然在这里有没有都可以正常执行

然后就可以看到如下的效果图了:

在这里插入图片描述

然后,将这个程序烧录到U盘,尝试在一台支持bios启动的电脑上启动这个程序,

将U盘插入到电脑后(注意U盘内容的备份!!!)

lsblk

终端会有如下输出:

在这里插入图片描述

可以看到,sda是我插入的U盘

注意自己辨别是不是你的U盘,可以先拔出来,然后lsblk一下,然后再插进去,再lsblk一下,根据变化来判断!要是后续dd误操作可能会导致系统数据丢失!!!!!

然后就是将程序刻录到U盘

sudo dd if=boot.bin of=/dev/sda bs=512 count=1 conv=notrunc

注意U盘先插好了再刻录,否则没插好就输入这条命令将会在/dev下创建一个sda文件,之后无论U盘插拔都只会对这个文件进行读写,不会对U盘产生作用,此时就得先删除/dev/sda这个文件(U盘拔出时),然后再插入U盘刻录

然后因为上面的代码不知道为什么在qemu中可以启动,在我的实机上不行,经过热心网友的指导,将其中一行

mov ax, cs

更改为

xor ax, ax

一样是将 ax 清零,第一条无法跑的具体原因留到后续再看看

所以程序就变为:

	org 07c00h										; 将程序加载到7c00处
	xor ax, ax										; 对ax进行清零
	mov ds, ax										; 对ds进行清零
	mov es, ax										; 对es进行清零
	call DispStr									; 调用DispStr代码段
	jmp $											; 从DispStr代码段返回之后进行无限循环
DispStr:
	mov ax, BootMessage								; 将BootMessage地址赋给ax
	mov bp, ax										; ES:BP = 串地址
	mov cx, 16										; CX = 串长度
	mov ax, 01301h									; AH = 13 用于显示字符串,AL = 01 用于光标跟随打印的字符串移动
	mov bx, 000ch									; BH = 页号,BL = 背景及字体色,此处为黑底红字高亮
	mov dl, 0										; DL = 起始行列
	int 10h											; 10h 号中断,打印字符串调用以上参数包括从ES:BP开始的到DL的行
	ret												; 返回到call DispStr的下一行
BootMessage:			db		"Hello, OS world!"	; 要打印的字符串
times	510 - ($ - $$)	db		0					; 用 0 填充剩余的空间,使生成的代码刚好为512字节
dw 		0xaa55										; 结束标志,0xaa55 用于告诉bios这是一个可启动扇区

然后重新进行编译

nasm boot.asm -o boot.bin

再按上述步骤烧录到U盘内

插到电脑上,bios设置为U盘启动

重启

闪亮登场:

请添加图片描述

这台电脑的配置为:
Intel I7-680um(一代酷睿)所以只支持BIOS启动
8G 800Mhz
256G SSD
目前来说用于实机测试刚刚好

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值