1个人开发操作系统-初篇

Posted zsl6658

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1个人开发操作系统-初篇相关的知识,希望对你有一定的参考价值。

 
开发操作系统一直被认为是高不可攀的事,的确,开发一个安全的,完整的,健全的OS是非常复杂的工作,不是一两个人能完成的。但是一个简易的操作系统是可以由一个人在很短的时间开发出来的。我将陆续发表开发简易操作系统的全过程,尽力提供完整的源代码,参考资料和文字说明,我也是OS开发的初学者,希望能得到各位读者的技术支持。该简易操作系统我称为Colimas Simple OS,它包括引导程序,图形界面,鼠标和键盘驱动,内存管理,计时器,多任务处理,控制台,Shell命令,API。
 
1. 开发环境
本文使用Qemu虚拟机,可以在Windows XP内虚拟软盘镜像文件。Qemu是开源软件,可以在http://fabrice.bellard.free.fr/qemu/下载。C编译器使用Cygwin下的GCC,汇编编译器使用Nasm,可以在http://sources.redhat.com/cygwin/下载。
操作系统开发在FAT12文件系统的软盘里,FAT12文件系统格式参考http://en.wikipedia.org/wiki/FAT32#FAT12的Design部分。
 
2. 引导程序1
;boot.s
;Colimas Simple OS
       org 0x7c00    ; 程序 始位置
;Fat12 文件系 格式参考 http://en.wikipedia.org/wiki/FAT32#FAT12
;                  |offset|Length|Descripton
       jmp entry       
       db 0x90         ; 0x00   3     Jump instruction(to skip over header on boot)
       db     "COLIMAS " ; 0X03   8     OEM Name
       db 512          ; 0x0b     2       Bytes per sector. The Bios Parmeter Block starts here.
       db     1                ; 0x0d   1     Sectors per cluster
       db     1                ; 0x0e     2       Reserved sector count(including boot sector)
       db 2            ; 0x10   1     Number of file allocation tables
       db 224          ; 0x11   2     Maximum number o root directory entries
       db 2880       ; 0x13   2     Total sector:80 tracks * 18 sectors * 2 sides=2880
       db 0xf0       ; 0x15   1     Media descriptor
       db 9          ; 0x16   2     Sectors per File Allocation Table
       db 18         ; 0x18   2     Sectors per track
       db 2            ; 0x1a   2     Number of heads
       db 0          ; 0x1c   4     Hidden sectors
       db 2880       ; 0x20   4     Total sectors again
       db 0          ; 0x24   1     Physical drive number
       db 0          ; 0x25   1     Reserved("current head")
       db 0x29       ; 0x26   1     Signature
       db 0xffffffff ; 0x27   4     ID(serial number)
       db "Colimas OS "; 0x2b 11    Volume Label
       db "FAT12   " ; 0x36   8     FAT file system type, FAT12
       resb 18       ; 了安全添加 18 bytes 0
 
entry:
       mov  ax,0    ; 寄存器初始化
       mov ss,ax
       mov sp,0x7c00 ; 针赋为 0x7c00, 既引 程序初始地址
       mov ds,ax
       mov es,ax
       mov  si,msg    ;source index msg 第一个字符地址
 
putloop:
       mov  al,[si]   ; 第一个字符 ->al
       add si,1      ;si+1
       cmp al,0      ; 0 找最后一个字符, msg 之后的 byte 0
       je   fin       ; 如果等于 0 fin
;video bios 参考 http://en.wikipedia.org/wiki/BIOS_interrupt_call
       mov ah,0x0e   ; 示字符
       mov bx,15     ; 黑色
       int 0x10      ; video bios 中断
       jmp putloop
fin:
       hlt             ;cpu 停止
       jmp   fin      ; 死循
      
msg:
       db   0x0a,0x0a ;
       db   "Colimas Simple OS Initialize..."
       db   0x0a      ;
       db   0
      
       resb 0x1fe-($-$$) ;510 bytes 1 止均 设为 0
       db   0x55,0xaa ;sector
  编译与运行:
$ nasm boot.s -o boot.bin
$ cp boot.bin ../qemu
$ ./qemu-win.bat
其中 qemu-win.bat 的内容是
@set SDL_VIDEODRIVER=windib
@set QEMU_AUDIO_DRV=none
@set QEMU_AUDIO_LOG_TO_MONITOR=0
qemu.exe -L . -m 32 -localtime -std-vga -fda boot.bin
运行结果
3 引导程序 2
       上文已经作了简单的引导程序,引导程序利用了软盘的第一个 Sector 作为引导 sector ,下面开始读取软盘第 2 Sector
       读取磁盘需要使用 Disk Bios int 13 中断,参考 http://en.wikipedia.org/wiki/BIOS_interrupt_call#INT_13h_AH.3D02h:_Read_Sectors_From_Drive
 
;boot.s
;Colimas Simple OS
       org 0x7c00    ; 程序 始位置
;Fat12 文件系 格式参考 http://en.wikipedia.org/wiki/FAT32#FAT12
;                  |offset|Length|Descripton
       jmp entry       
       db 0x90         ; 0x00   3     Jump instruction(to skip over header on boot)
       db     "COLIMAS " ; 0X03   8     OEM Name
       db 512          ; 0x0b     2       Bytes per sector. The BIOS Parmeter Block starts here.
       db     1                ; 0x0d   1     Sectors per cluster
       db     1                ; 0x0e     2       Reserved sector count(including boot sector)
       db 2            ; 0x10   1     Number of file allocation tables
       db 224          ; 0x11   2     Maximum number o root directory entries
       db 2880       ; 0x13   2     Total sector:80 tracks * 18 sectors * 2 sides=2880
       db 0xf0       ; 0x15   1     Media descriptor
       db 9          ; 0x16   2     Sectors per File Allocation Table
       db 18         ; 0x18   2     Sectors per track
       db 2            ; 0x1a   2     Number of heads
       db 0          ; 0x1c   4     Hidden sectors
       db 2880       ; 0x20   4     Total sectors again
       db 0          ; 0x24   1     Physical drive number
       db 0          ; 0x25   1     Reserved("current head")
       db 0x29       ; 0x26   1     Signature
       db 0xffffffff ; 0x27   4     ID(serial number)
       db "Colimas OS "; 0x2b 11    Volume Label
       db "FAT12   " ; 0x36   8     FAT file system type, FAT12
       resb 18       ; 了安全添加 18 bytes 0
 
entry:
       mov    ax,0    ; 寄存器初始化
       mov ss,ax
       mov sp,0x7c00 ; 针赋为 0x7c00, 既引 程序初始地址
       mov ds,ax
       mov es,ax
       mov    si,msg   ;source index msg 第一个字符地址
 
putloop:
       mov    al,[si]   ; 第一个字符 ->al
       add si,1      ;si+1
       cmp al,0      ; 0 找最后一个字符, msg 之后的 byte 0
       je   fin       ; 如果等于 0 fin
;video bios 参考 http://en.wikipedia.org/wiki/BIOS_interrupt_call
       mov ah,0x0e   ; 示字符
       mov bx,15     ; 灰色
       int 0x10      ; video bios 中断
       jmp putloop
; 取磁 2 Sector 数据
reading:
       mov ax,0x0820
       mov es,ax     ;0x0820(es) * 16=0x8200
       mov ch,0      ;track/cylinder number
       mov dh,0      ;head number
       mov cl,2      ;sector number
       mov ah,0x02   ;status of reading disk sector
       mov al,1      ;number of sectors read
       mov bx,0      ;0x0820(es) * 16 + 0(bx)=0x8200, 0x7e00~0x9fbff
       mov dl,0x00   ;A drive
       int 0x13        ;Read
       jc   error     ;on error goto label error
      
       mov    si,msg2    ;source index msg2 第一个字符地址
putloop2:
       mov    al,[si]   ; 第一个字符 ->al
       add si,1      ;si+1
       cmp al,0      ; 0 找最后一个字符, msg 之后的 byte 0
       je   fin       ;
       mov ah,0x0e   ; 示字符
       mov bx,15     ; 灰色
       int 0x10      ; video bios 中断
       jmp putloop2
error:
       mov    ax,0
       mov    es,ax
       mov    si,errmsg
putloop3:
       mov    al,[si]  
       add si,1    
       cmp al,0     
       je   fin      
       mov ah,0x0e 
       mov bx,15   
       int 0x10    
       jmp putloop3
; 完后,休眠
fin:
       hlt                     ;cpu 停止
       jmp   fin      ; 死循
msg:
       db     0x0a,0x0a ;
       db   "Colimas Simple OS Initialize..."
       db   0x0a      ;
       db   "Reading disk..."
       db   0x0a      ;
       db   0
      
msg2:
       db   "1 sector was read."
       db   0x0a
       db   0
errmsg:
       db   "load error"
       db   0x0a
       db   0
      
       resb 0x1fe-($-$$)
       db   0x55,0xaa ;
编译与运行:
$ nasm boot.s -o boot.bin
$ cp boot.bin ../qemu
$ ./qemu-win.bat
(未完) -C 语言的开始,编写图形显示程序。
 
 

以上是关于1个人开发操作系统-初篇的主要内容,如果未能解决你的问题,请参考以下文章

初篇:我与Linux

初篇——感悟&资料共享

FastAPI(六十八)实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发

VC++开发个人事务管理信息系统

关于web程序快速开发个人见解以及经历

企业仿站 个人仿站 定制网站制作 phpcms插件开发 网站二次开发 phpcms二次开发