最简略操作系统(orange os样例)

最简单操作系统(orange os样例).

于渊的《自己动手写操作系统》告诉我们如何自己写一个操作系统,当然写操作系统是个很难的事情,所以我们要慢慢来,先看看如何展示在裸机上写一个最小最小的“操作系统”,也许根本称不上操作系统。

 

操作系统的初步概念。

 

操作系统就是用CPU指令控制硬件,发声,发光,读写等等。CPU不同也会导致指令集合不同,CPU有通用CPU,arm芯片等等,还有专用的芯片等等。我们这里考虑的是80*86,intel通用CPU。

 

在我们在电脑城购买了一台裸机,拼装好之后,实际上已经附带了一个操作系统,BIOS系统。这里面已经集合了一些功能和“函数”。

最简略操作系统(orange os样例)

如果我们进入这个操作系统,我们还是能获得很多能力的,一个图形化的界面,呵呵。还有一些看不到的内容,终端向量的设置,就是一些函数。(当我们需要调用的时候,发个终端,CPU执行终端功能代码,就好比,我们叫“我要吃饭”(12号中断),找到12号中断的入口地址(12号服务给你炒菜做饭),然后返回。

 

   我们要自己写一个操作系统,写入硬盘,然后从这个影片启动。

   首先创造一个虚拟硬盘。

   最简略操作系统(orange os样例)

 

 

   调整这些硬盘的端口数,就可以调整这些硬盘的启动顺序,我们先让ubuntu.vdi在上面,进入系统,我们还要做一些事情。

   创造好虚拟硬盘后,但是这个硬盘还没有格式化,就是CPU无法对其进行读写,硬盘的mbr都没有建立。mbr大概好比沃尔玛建立了一个大超市,但是没有柜子,格子,货架。大米放哪个货架,白砂糖要放哪个格子,都是有规矩的。mbr就好比硬盘的格子,柜子,方便CPU定位物理存储位置。

 

    我们需要用fdisk这个工具格式化/dev/sdb下面这个盘。具体细节以后补充。

 

   首先,我们要切换到用户root

    su root,输入root 用户密码。

    键入命令 fdisk -l可以看到硬盘的分区情况,如图。

最简略操作系统(orange os样例)

    键入help,可以看到fdisk命令的用处。

 

首先,我们要n

    创建一个primary partion, 分区都是默认值,最后w,写入磁盘。

    这样分区就创建好了。

    操作系统用NASM编译好后,放到共享文件夹里面,用dd写到格式化好的硬盘中去。

   代码直接从一个哥们的网站上copy过来。

 

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) 黑底红字(b1 = 0Ch,高亮)  
 mov dl,0  
 int 10h  
 ret  
BootMessage: db "Hello, OS world!"  
times 510-($-$$) db 0 ;填充剩下的空间,使生成的二进制代码  
     ;为512字节  
dw 0xaa55    ;结束标志  
 
    格式化好了,再用dd工具把“操作系统"写到这个磁盘中。

   如果你想确认一下里面的数据是否正确 用命令 hexdump /dev/sdb看看和你的“操作系统”的二进制是否一致。

 

    但是我后来又摸索了一下,好像分区不是必要条件,只需要用dd写入到这个磁盘,然后从这个磁盘启动就OK了。

 

    但是写orange OS,和bochs 2.4.6里面的oldlinux的Image好像是OK的,用linux0.00(交替产生“aaaa","bbbb"那个版本的)好像不OK,还有dd这个工具写入,有时好像会写错,反正就是和我用UE看到的16进制不同。

    启动之后的效果图如下:

最简略操作系统(orange os样例)