【日拱一卒行而不辍20220916】自制操作系统

 Windows下利用QEMU实现HelloOS

参照《ORANGE’S:一个操作系统的实现》

汇编源码如下:boot.asm

	org	07c00h			; where the code will be running
	mov	ax, cs
	mov	ds, ax
	mov	es, ax
	call	DispStr			; let's display a string
	jmp	$			; and loop forever
DispStr:
	mov	ax, BootMessage
	mov	bp, ax			; ES:BP = string address
	mov	cx, 16			; CX = string length
	mov	ax, 01301h		; AH = 13,  AL = 01h
	mov	bx, 000ch		; RED/BLACK
	mov	dl, 0
	int	10h
	ret
BootMessage:		db	"Hello, OS world!"
times 	510-($-$$)	db	0	; fill zeros to make it exactly 512 bytes
dw 	0xaa55				; boot record signature

批处理命令行如下,生成boot.bin

nasm boot.asm -f bin -o boot.bin
pause

boot.bin文件二进制内容如下:

在qemu下执行命令行如下: 

c:\qemu>qemu-system-i386.exe boot.bin

执行结果如下,显示了书中一致的Hello,OS world!

实模式与保护模式下的段与偏移

参照《ORANGE’S:一个操作系统的实现》

在实模式下,16位的寄存器需要用“段:偏移”这种方法才能达到1MB的寻址能力,如今我们有了32位寄存器,一个寄存器就 可以寻址4GB的空间,是不是从此段值就被抛弃了呢?实际上并没有,新政策下的地址仍然用“段:偏移”这样的形式来表示,只不 过保护模式下“段”的概念发生了根本性的变化。实模式下,段值还是可以看做是地址的一部分的,段值为XXXXh表示以XXXX0h开 始的一段内存。而保护模式下,虽然段值仍然由原来16位的cs、ds等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向一 个数据结构的一个表项,表项中详细定义了段的起始地址、界限、属性等内容。这个数据结构,就是GDT(实际上还可能是LDT,这 个以后再介绍)。GDT中的表项也有一个专门的名字,叫做描述符(Descriptor)。

内核是在实模式还是保护模式下开始执行的?

参照《ORANGE’S:一个操作系统的实现》

现在我们假设已经有了一个内核,Loader肯定要加载它入内存,而且内核开始执行的时候肯定已经在保护模式下了,所 以,Loader要做的事情至少有两件:

在实模式下把内核加载加载进入内存;

跳入保护模式。

然后在保护模式下运行内核。

Loader应该走多远?

参照《ORANGE’S:一个操作系统的实现》

完成从实模式到保护模式跳转这一任务的应该是Loader,那么Loader应该走多远呢?只完成跳转,还是应该把 GDT、IDT、8259A等内容准备完备?实际上,从逻辑上讲,Loader不是操作系统的一部分,所以不应该越俎代庖。而且,你一定也 希望早早结束Loader的工作进入正题,所以,我们还是要让Loader尽量简单,其余的工作留给内核来做。

asm与c之间的跳转

参照《ORANGE’S:一个操作系统的实现》

我猜你一定已经发现了其中的诀窍,不外乎就是关键字global和extern。是的,有了这两个关 键字,就可以方便地在汇编和C代码之间自由来去。

Ubuntu下利用QEMU实现HelloOS

touch boot.S
nano boot.S

输入如下内容

 利用nasm进行编译

nasm -o boot boot.S

创建虚拟磁盘映像

bximage -mode=create -hd=60 -q os.raw

填充第一扇区

dd if=boot of=os.raw bs=512 count=1

采用qemu运行

qemu-system-i386 os.raw

如下所示

对x86架构的处理器,业界一向是褒贬不一。但是毫无疑问的是,x86架构的处理器是迄今为止在市场上最成功的处理器。它既催生了Intel、微软这样的业界巨头,也改变了普通人们的生活。到今天,虽然有arm的异军突起,但是大部分程序员所编写的程序依然在运在x86架构上。 虽然很多上层的程序员绕过了对CPU架构本身的理解,而直接使用高级语言编程,但是对CPU本身的熟悉,其实依然是所有想被称为优秀的程序员所难以绕过的一道坎。对CPU的不熟悉,实际上限制了程序员的思维方式、对程序的理解和实际解决问题的能力。 对于普通的芯片,阅读几页的说明书就可以大致理解如何让它工作。CPU是比较复杂的一种,对于比较简单的CPU架构,阅读几十页的文档也能大致熟悉。然而 x86架构的CPU的说明可不是这么简单,其手册估计有一共有四、五千页之巨。不要说理解透彻,就是从头到尾翻一遍也不是一件简单的事情。并非Intel 有意将它做得复杂,这里有历史的原因。因为这个架构的应用实在太广了,全世界有无数的软件都在它的基础之上工作。为此它自身的升级也就变得举步维艰。每次升级都不得不要兼容之前的特性。这也就导致了新旧指令层层堆积,种种特性互相兼顾,最终变成如今的一团乱麻了。 对于入门级的选手,读完那些手册可不是一件容易的事情。但是于渊的这本《orange's:一个操作系统的实现》却是一条难得的终南捷径。因为要理解如何让一个芯片正常工作,最简单的办法就是从头开始去写程序让它运起来,然后操作它做自己想做的事情。如果是平时的编程,这些下层的工作都已经有操作系统帮你做了,对理解x86架构的帮助就大为有限。如果去读那几千页的文档,不但读起来很痛苦,中间又没有多少可以实际操作的工作来帮助你温故而知新,这其中的枯燥乏味,绝对不是一般人可以忍受的了。而且更重要的手册中虽然包含了x86所有的特性,然而其中有些特性是现代操作系统根本就没有用到的。努力的去理解的话,又是吃力不讨好了。如果每个读者都可以随着这本书的介绍,去逐步的实现一个操作系统,不但这中间其乐无穷,而且实现到最后,对x86架构的理解也就不在话下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值