操作系统编写研究心得 (1.最初引导篇)

晤…… 如果你的开发工具都已经准备好了,那么我们来开始干活吧!

IA-32体系下的 i386 及以后的处理器,为了同当年的8086相兼容,在系统启动的时候都是将处理器置于实模式。这个时候你可以将系统看做是 "高速的8086"   因此这决定了我们启动部分的代码,是必须用16bit代码去编写的。 IBM PC在引导的时候,是从有效引导设备的第0磁头0面1扇区开始的,BIOS读取这个扇区的所有数据,并将它们加载到0x0:0x7c00地址处,然后BIOS会跳到这个地址,开始执行这个扇区的内容,也就是开始引导PC了。

基于以上2点,我给出如下的代码:

;      MyOS Ver 0.0   Boot.asm
;         Play!Zone 2002-2005  kakashi.r
;      
;   从磁盘上加载0磁道  0磁头 第2扇区的 detect检测程序并跳转执行.
;
;
;
;
;
;
.8086
.model small
.code                               ;一些程序中使用的常量的定义
 INIT_SEG = 07c0h
 INIT_STACK = INIT_SEG
 RUN_SEG = 9000h
 CORE_SEG = 9020h
 org 0
.startup  

entry:
 mov  ax,  INIT_SEG
 mov  ds,  ax
 mov  cx,  256
 mov  ax,  RUN_SEG
 mov  es,  ax
 mov  si,  0 
 mov  di,  0
 rep  movsw  ;移动7c00:0的代码到90000:0处并跳转过去执行
 mov  ax,  INIT_STACK
 mov  ss,  ax
 mov  sp,  0200h
 mov  ax,  RUN_SEG
 mov  bx,  offset Start
 push  ax
 push  bx
 retf
Start:     ;以下部分使用的是int10h  不熟悉的话参考BIOS手册
DisplayText:
 mov ax,  cs
 mov ds,  ax
 mov si,  offset MSG
 sub cx,  cx
ShowText:   ;循环显示字符串
 mov al,[si]
 inc si
 inc cx
 mov ah,   0eh
        mov bx,   0007h
        int 10h
 cmp cx,  1dh
 jle ShowText


Load_Kernel: ; 下面的部分使用的是int13中断,不熟悉的话请参考BIOS中断手册。
 mov ax,  CORE_SEG
 mov es,  ax
 mov bx,  0
 mov cl,  2
 mov ch,  0
 mov al,  2     ;读取1个扇区
 mov dx,  0
 mov ah,  2
 int 13h
 cmp ah,  0
 jne Load_Kernel  ;读取失败,死循环
 mov ax,  CORE_SEG
 mov bx,  0
 push ax
 push bx
 retf              ;成功则跳到90200:0开始执行

Data: 
 org  200h-21h
 MSG  db  "Loading Kaka's Opeart System",0dh,0ah
 
 org  01feh
 Boot  dw   0aa55h  ;启动扇区正常结束标志
  
end

 这段代码使用masm611编译连接,并使用exe2bin工具转换。总长度为512字节,其中最后的2个字节 0xaa 0x55 是有效引导扇区的标志字节。BIOS通过这2个字节来判断是否是有效引导扇区。

代码的作用很简单,在屏幕上显示一行Loading Kaka's Opeart System 然后将加载引导设备上的0头0面2扇区的数据到 0x90200:0,加载成功的话则会跳到这个位置去执行。这样就完成了最初期的引导工作,0x90200:0处的代码会接着完成其他的工作。至于0x90200:0处的程序就是是什么,这个可以按你的要求去做。我自己的则是将处理器设置为保护模式,下次放出给大家看。

大家在用Bochs调试的时候,推荐使用软盘进行引导,使用Uedit将编译好的代码,保存到软盘映象文件的前512个字节上就可以了。注意不要写错了位置啊 - -b 然后启动Bochs开始看你写的启动代码是如何一句一句执行的吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写一个操作系统是一个庞大的工程,需要深入了解计算机系统操作系统的原理。以下是一个简单的操作系统的基本框架,可以作为参考: 1. 编写引导程序 操作系统引导程序是放在计算机硬盘的第一个扇区里的,它负责将操作系统的核心代码加载到内存中并启动操作系统引导程序需要使用汇编语言编写,因为此时还没有操作系统提供的C库函数可用。 2. 编写操作系统的核心代码 操作系统的核心代码是放在内存中的,它负责管理计算机的硬件资源,提供各种系统调用供应用程序使用。操作系统的核心代码可以使用C语言编写,但是需要使用汇编语言编写一些关键部分的代码,比如中断处理程序和启动代码等。 3. 编写设备驱动程序 设备驱动程序是操作系统的一个重要组成部分,它负责管理计算机的各种硬件设备,如硬盘、键盘、显示器等。设备驱动程序需要使用汇编语言编写,因为它需要直接访问硬件设备的I/O端口。 4. 编写用户程序 用户程序是运行在操作系统上的应用程序,它们可以通过系统调用来访问操作系统提供的各种服务。用户程序可以使用C语言编写,但是需要使用操作系统提供的C库函数来访问系统调用。 以上是一个简单的操作系统的基本框架,具体实现需要深入了解计算机系统操作系统的原理,以及汇编语言和C语言的编程技巧。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值