《Orange's 一个操作系统的实现》读书手记 1 --- [马上动手写一个最小的“操作系统”]

本文介绍如何使用NASM汇编语言编写一个最简单的操作系统。通过编写引导扇区代码,并将其烧录到软盘,实现开机显示“Hello, OS world!”。文章详细解析了引导扇区的作用及代码的具体含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

                                                  

     说在前面

      做了一个" 艰难的" 决定。本书是在20091122 日买的,到现在已经一年多了,大多数时间它都是在睡大觉。毕竟是"x86 汇编"" 操作系统" 的,听上去感觉相当的古老和神秘!以前上80x86 汇编语言课时,我就体验过它的云里雾里了,要学好它,一定要有打持久战和攻坚战的心理准备。

     现在我来到华清远见嵌入式长期班培训,难得有这份闲情逸致来研究一下操作系统。(课程很多,忙里偷闲)

     本章的操作系统麻雀虽小五脏甚至连胚胎都还不是,但我相信,在作者的 步步为营是我们的战术,成就感是我们的宗旨 的引领下,麻雀终有长成大雕的一天。

就让我们摘掉酒瓶底,换上哈勃望远镜,一起窥视OS 的那些事吧!( 最近把眼镜给戒了^^)

 

      马上动手写一个最小的 操作系统

      

      虽说万事开头难,但有时也未必。比如说,写一个有实用价值的操作系统是一项艰巨的工作,但一个最小的操作系统或许很容易就实现了。现在我们就来实现一个小得无法再小的 操作系统” ......

     1.1 准备工作

     对于写程序,准备工作无非就是硬件和软件两方面:

     1. 硬件

             一台计算机(linux 操作系统或windows 操作系统)  ( 我的环境是window xp + vmware6 + ubuntu8.10 )

             一张空白软盘 ( 现在这东东可不好找! )

     2. 软件

             汇编编译器NASM  ( 为什么要选它? )

             软盘绝对扇区读写工具, linux 下可用dd 命令

 

     1.2 十分钟完成的操作系统

            org    07c00h                                    ; 告诉编译器程序加载到7c00

            mov   ax, cs

            mov   ds, ax

            mov   es, ax

            call     DispStr                                   ; 调用显示字符串例程

            jmp    $                                             ; 无限循环

DispStr:

            mov   ax, BootMessage

            mov   bp, ax                                     ;ES:BP = 串地址

            mov   cx, 16                                     ;CX = 串长度

            mov   ax, 01301h                             ;AH = 13, AL = 01h

            mov   bx, 000ch                                ; 页号为 0(BH = 0) 黑底红字 (BL = 0ch , 高亮 )

            mov   dl, 0

            int      10h                                         ;10h 号中断

            ret

BootMessage:            db             "Hello, OS world!"

times 510-($-$$)        db               0              ; 填充剩下的空间,使生成的二进制代码恰好为512 字节

dw       0xaa55                                              ; 结束标志

 

     保存为boot.asm

     编译一下:nasm boot.asm -o boot.bin

      别急,NASM 都还没装呢!

1.3 引导扇区

如果选择从软盘启动,计算机会检查软盘的0 0 磁道1 扇区 ,若发现它以0xAA55 结束 ,则BIOS 认为它是一个引导扇区 。一旦BIOS 发现了引导扇区,就会将512 字节的内容装载到内存0000:7c00, 然后跳转到0000:7c00 处将控制权交给这段引导代码。

    1.4 代码解释

     1. 方括号[]

    NASM任何 不被方括号[] 括起来的标签或变量名都被认为是地址

    2.$ $$

    $ 表示当前行被汇编后的地址;$$ 表示一个节(section )的开始处被汇编后的地址, 在本程序中$$ 实际就是0x7c00times 510-($-$$) db 0 表示将这个字节重复510-$-$$ )遍,把剩下的空间不停地填0 ,直到510 字节为止,加结束标志0xaa55 占用的2 字节,恰好是512 字节。

    3.网友Hector解释得非常详细,直接引用过来:

table.MsoNormalTable { font-size: 10pt; font-family: "Times New Roman"; }

这个代码段是存于磁盘引导扇区的系统引导(自举)程序。若存于硬盘第一个扇区,则这段代码称为:硬盘主引导记录;若存于硬盘某个分区的第一个扇区,则称为:分区引导记录;若存于软盘的第一个扇区,则称为:软盘引导记录。称为磁盘引导记录的重要标志是:

dw 0xaa55

磁盘的一个扇区是512 字节,标志0xaa55 存于这个扇区的最后一个字(两字节,偏移地址为:1FEH ),其余空间用于存储指令代码和一些参数、 提示信息等。磁盘引导记录由ROM BIOSINT 19H( 引导加载程序,相当于热启动系统,对应的快捷键为:Ctrl+Alt+Del) ,固定装入内存的0000:7C00H ,然后将控制权交给磁盘引导 程序,相当于开始执行下面的程序段。下面详细解答一下这个程序段的功能:

org 07c00h ; 调整偏移量伪指令ORG ,指定下面的指令从7c00h 处开始,因为BIOS 一旦发现引导扇区,就会将这512 字节装载到内存00007c00
mov ax, cs ;
数据传送指令,将代码段寄存器cs 的内容赋给通用寄存器ax
mov ds, ax ;ax→ds
,使数据段与代码段在同一个段
mov es, ax ;ax→es
,使附加段与代码段在同一个段
call DispStr ;
调用子程序DispStr ,显示字符串信息:Hello, OS world!
jmp $ ;$
表示当前地址,实现死循环
DispStr: ;
子程序:显示字符串
mov ax, BootMessage ;BootMessage
的首地址给ax
mov bp, ax ;BootMessage
首地址给堆栈指针BP
mov cx, 16 ;
要显示的字符数
mov ax, 01301h ;AH=13h
int 10h ,即视频中断13h 号功能:写字符串;AL=01H ,表示写完字符串后,更新光标位置
mov bx, 000ch ;BH=0
,页号(视频缓冲区是分页的),初学者暂时不必理会;BL=0CH ,字符显示属性,以黑底亮红显示字符
mov dl, 0 ;DH
DL= 写串的光标位置,DH= 行号,DL= 列号
int 10h ;
调用视频中断
ret ;
子程序返回指令,返回调用者
BootMessage: db “Hello, OS world!” ;
要显示的字符串信息
times 510-($-$$) db 0 ;$
是当前地址,$$ 是首地址,总体意思就是从此处一直到510 都用0 填充
dw 0xaa55 ;
磁盘引导记录重要标志 ,最后2 个字节代表这是引导扇区。

 

    1.5 水面下的冰山

      每一个问题都是一把锁,你要相信,世界上一定存在在把钥匙 可以打开这把锁。你也一定能找到这把钥匙。

            

 

    

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值