`
touchinsert
  • 浏览: 1349687 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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#FAT12Design部分

2. 引导程序

;boot.s

;Colimas Simple OS

org 0x<chmetcnv w:st="on" unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7c</chmetcnv>00 ;程序始位置

;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 ; 0x<chmetcnv w:st="on" unitname="a" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1a</chmetcnv> 2 Number of heads

db 0 ; 0x<chmetcnv w:st="on" unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1c</chmetcnv> 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 bytes0

entry:

movax,0 ;寄存器初始化

mov ss,ax

mov sp,0x<chmetcnv w:st="on" unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7c</chmetcnv>00 ;针赋为0x<chmetcnv w:st="on" unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7c</chmetcnv>00,既引程序初始地址

mov ds,ax

mov es,ax

movsi,msg ;source indexmsg第一个字符地址

putloop:

moval,[si] ;第一个字符->al

add si,1 ;si+1

cmp al,0 ;0找最后一个字符,msg之后的byte0

je fin ;如果等于0fin

;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:

db0x<chmetcnv w:st="on" unitname="a" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0">0a</chmetcnv>,0x<chmetcnv w:st="on" unitname="a" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0">0a</chmetcnv> ;

db "Colimas Simple OS Initialize..."

db 0x<chmetcnv w:st="on" unitname="a" sourcevalue="0" hasspace="False" negative="False" numbertype="1" tcsc="0">0a</chmetcnv> ;

db 0

resb 0x1fe-($-$$) ;510 bytes1止均设为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

运行结果

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 324pt; HEIGHT: 202.5pt" type="#_x0000_t75"><imagedata o:title="" src="file:///C:%5CDOCUME~1%5C%E8%B6%99%E7%A3%8A%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

3引导程序2

上文已经作了简单的引导程序,引导程序利用了软盘的第一个Sector作为引导sector,下面开始读取软盘第2Sector

读取磁盘需要使用Disk Biosint 13中断,参考http://en.wikipedia.org/wiki/BIOS_interrupt_call#INT_13h_AH.3D02h:_Read_Sectors_From_Drive

;boot.s

;Colimas Simple OS

org 0x<chmetcnv w:st="on" unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7c</chmetcnv>00 ;程序始位置

;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 ; 0x<chmetcnv w:st="on" unitname="a" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1a</chmetcnv> 2 Number of heads

db 0 ; 0x<chmetcnv w:st="on" unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0">1c</chmetcnv> 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 bytes0

entry:

mov ax,0 ;寄存器初始化

mov ss,ax

mov sp,0x<chmetcnv w:st="on" unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7c</chmetcnv>00 ;针赋为0x<chmetcnv w:st="on" unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7c</chmetcnv>00,既引程序初始地址

mov ds,ax

mov es,ax

mov si,msg ;source indexmsg第一个字符地址

putloop:

mov al,[si] ;第一个字符->al

add si,1 ;si+1

cmp al,0 ;0找最后一个字符,msg之后的byte0

je fin ;如果等于0fin

;video bios参考http://en.wikipedia.org/wiki/BIOS_interrupt_call

mov ah,0x0e ;示字符

mov bx,15 ;灰色

int 0x10 ;video bios中断

jmp putloop

;取磁2Sector数据

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 styl

分享到:
评论

相关推荐

    Linux操作系统-上篇课件(完整版).pptx

    Linux操作系统起源于20世纪90年代初,由芬兰赫尔辛基大学的Linus Torvalds开发。其发展历程深受UNIX的影响,UNIX自身则是由肯·汤普森和丹尼斯·里奇在AT&T贝尔实验室创造的。UNIX的早期版本使用汇编语言编写,但...

    MITSUBISHI三菱GX Developer Version 8操作手册(MELSAP-L篇).pdf

    这个用户手册旨在帮助用户理解和安全地使用这款软件进行可编程控制器(PLC)的程序开发和系统操作。 **安全注意事项**是手册的重要部分,强调在使用GX Developer Version 8之前必须阅读和遵循。安全注意事项分为两...

    自己动手写操作系统(含源代码).part1

    书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新...

    自己动手写操作系统(含源代码).part2

    书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新...

    青果校园兼职网,阿赛企业网站管理

    1、AsaiCoEV6系统由阿赛工作室促权,所有程序均由阿赛独立开发完成,分共享版(¥0)、专业版(¥150)、商业版(¥320),与其他网站和个人无关; 2、购买者不得公开、传播本程序,并禁止篡改后伪装出售,如发现将予以...

    GX Developer Version 8操作手册(安全可编程控制器篇)

    9. **系统配置**:2-1至2-23 10. **投运前的步骤**:4-1至4-2 11. **安全可编程控制器方面的新增功能**:5-1至5-38 - 安全操作 - 安全CPU操作 - 工程的损坏数据检测 - 安全软元件的强调显示 - 参数设置 #### ...

    vf程序开发的学生成绩管理系统

    VF(Visual FoxPro)是一种早期的数据库开发工具,由Microsoft公司推出,以其简洁的语法和强大的数据库管理功能,在20世纪90年代至21世纪初广泛应用于小型数据库应用系统的开发,如学生管理系统。本篇文章将深入探讨...

    我与单片机和嵌入式系统20年-单片机与嵌入式系统应用-200801.pdf

    整体来看,这篇文章不仅讲述了作者的个人经历,也描绘了单片机和嵌入式系统技术从20世纪80年代到21世纪初的演变历程,展现了Intel等公司在推动行业发展中的关键作用。同时,它还反映了技术发展如何影响工程师的工作...

    IC-USB读卡器开发包

    本篇文章将基于"IC-USB读卡器开发包"这一资源,详细解析开发过程中的关键知识点,旨在为开发者提供全面的参考。 首先,我们来看动态库。动态库是程序运行时加载的共享代码库,它包含了可以被多个程序同时调用的函数...

    DOS_Windows与UNIX_Linux版本的发展.pdf

    - 在1980年代初,IBM正在寻找适合其第一代个人计算机(PC)的操作系统,微软抓住机会,通过收购86-DOS(后来改名为MS-DOS)并进行改造,于1981年与IBM PC一起推出了MS-DOS 1.0。 - 随后的几年,MS-DOS经历了多个...

    java开发三年项目经验心得

    在这篇文章中,作者回顾了自己在Java开发领域三年的工作经历,期间参与了三个不同的项目,从中获得了丰富的实战经验和技术积累。这三个项目分别是涉密项目、政府项目以及深圳市政府的大型无纸化办公系统项目。 ####...

    D公司工资管理系统设计与开发的文献综述

    这篇文献综述主要围绕D公司的工资管理系统设计与开发展开,旨在探讨如何利用B/S架构创建一个高效、便捷的工资管理系统,以满足企业的实际需求。 【系统功能与目标】 D公司的工资管理系统主要包括以下几个核心功能...

    信息部的个人述职报告3篇.docx

    ### 信息部个人述职报告关键知识点总结 #### 一、入职初期的心态转变 - **初期迷茫**:初入职场的员工往往对岗位职能认识不清,容易感到迷茫。 - **心态调整**:通过深入了解岗位职责,逐步认识到信息部的重要性和...

    计算机教师个人工作总结.doc

    - 多篇论文获得县级或市级奖项,包括《浅析初一年级的应用题教学》、《搞好电脑教室软件系统建设,为日常教学提供称心的平台》等。 - 自编的教学辅助软件《流程图编程工具》获得县级一等奖和市级二等奖。 - 承担...

    php程序员述职报告.docx

    - Linux基础:具备一定的Linux操作系统操作能力。 2. **项目经验**: - 项目一:地球新闻网。使用Linux、Apache、MySQL和PHP开发,前端使用HTML、CSS、JavaScript和jQuery,后台采用面向对象的MV架构。程序员独立...

    计算机毕业设计学生管理系统论文

    6. **系统物理配置方案**:确定硬件和软件环境,包括服务器配置、操作系统、数据库管理系统等,以支持系统的运行。 7. **系统实现**:使用Visual Foxpro 6.0编写代码,实现各个模块的功能,构建用户界面,确保与...

    有关计算机实习日记范文九篇.docx

    - **配置要点**:服务器的配置对于系统的稳定运行至关重要,包括但不限于硬件选择、操作系统安装、安全设置等方面。 #### 5. 网站搭建与调试 - **网站架构**:网站通常由前端展示层和后端数据处理层组成。前端负责...

    莱昂氏UNIX源代码分析

    - **操作系统爱好者**:对于对操作系统感兴趣的个人而言,这本书不仅能提供深入的学习资源,还能激发探索操作系统底层技术的兴趣。 综上所述,《莱昂氏UNIX源代码分析》不仅是一本技术书籍,更是一部见证了UNIX操作...

    第一篇:图书管理系统心得 .docx

    《第一篇:图书管理系统心得》 在为期两周的cX图书管理系统实习中,我经历了从压力到释放,从恐惧到热爱的转变。这次实习不仅让我对图书管理系统有了深入的理解,更重要的是激发了我对编程的浓厚兴趣。回想起大一时...

Global site tag (gtag.js) - Google Analytics