orange‘s 一个操作系统的实现学习笔记1

最近想知道计算机内核是怎么实现功能的,于是试着去看了关于操作系统的设计与实现的书,像是《深入理解Linux内核》,结果呢?当然是一头雾水,完全看不懂,仿佛进入了一座密密麻麻的森林,经过网上反复的查询,终于找到一本适合有一点基础的入门书——于渊先生的《一个操作系统的实现》,主要是从0开始一点点讲解,并且有简单的实验,比起那种一上来就各种fork(),exec()的书来说,对于新手了解森林的全貌要好很多。

首先是关于环境的问题,本来想用mac上原生的软件vim,gcc,bochs结果,结果bochs转头就打了我的脸,各种报错。

 

 算了,虚拟机ubuntu吧,直接Parallels Desktop 安装最新版本的ubuntu,然后开始装vim,将书上的代码抄一下,生成boot.asm文件。

学过汇编的都能看懂大部分,nasm中$表示当前位置的地址,jump $ 表示停在当前,如果不写jump $,程序计数器会继续往下执行,这样就出错了。

$$表示代码“开始位置的地址”,这里指的是从org开始的位置7c00h,$-$$就是说这段代码到目前的长度,times后面加数字表示进行填充,db表示byte,也就是说代码结束后就开始用0进行填充,直到一共有510个字节,dw表示word,最后填充0xaa55,加起来一共512B。

0xaa55是一个固定的格式,计算机加点自检查后会扫描512字节的文件末尾,如果有0xaa55就认定为引导文件,开始加载。

org 07c00h表示实模式下的用户可以用来写的地址,此时加载到7c00h处,此时cs=7c00h,由于其他寄存器ds,es都没有被初始化,所以必须需要通过ax对其进行赋值,作为段寄存器cs并不能直接和ds,es进行赋值操作,因此需要借助ax这个寄存器。

call指令先将当前位置的地址push stack中,然后跳转到DispStr的位置开始执行,接下来就是将以对参数传递到寄存器中,bp中放ES:BP,cx中放长度,ax和bx放颜色的属性,然后调用10h中断,显示器收到信号,根据寄存器中的参数输出信号,最后ret弹出stack中的值,跳转到jmp中停止。

分析:程序结构很简单,但是一开始就吃了组成原理、汇编语言、实模式、中断的知识,想进一步学习的人推荐先把这几块稍微复习一下。

接下来安装nasm,生成boot.bin文件。

nasm boot.asm -o boot.bin

先安装bochs和相关其他软件,然后开始使用bochs

按书上的打开终端

 

 生成了一个a.img文件

将a.img和boot.bin放到一个文件下,使用dd命令将它写进去

dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

创建一个bochsrc.text的文件,复制下面的代码

 其中romimage:中的BIOS-bochs-latest是你ubuntu中的地址,我就写错了折腾了半天,后面的地址也要反复确认

最后,打开终端

bochs -f bochsrc

出来了,然后输入c,按下继续键

 

 好的出现了,红色的字符hello出现了

总结:

看书简单,调试折腾死人,我就调试了2天,一个bochs就折腾了一整天。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值