自制操作系统(一) 第一个操作系统

    科技2022-07-11  110

    在操作系统这一块,以前我曾尝试的去读那些大作,结果发现看不太懂,后来又读了《30天自制操作系统》,觉得简单,就有自己的想法,但实现起来又是磕磕跘跘,然后就没坚持下去,这次,我下定决心,要把《30…》和《orange,s一个操作系统的实现》一起看,然后慢慢探索,所以,开始吧。。。

    开发环境:ubuntu20.0.4

    因为我们的系统是从软盘启动的,所以有必要了解一下软盘 软盘:(1.44MB型) 0 启动区(第一个扇区) 512 . . . (共2880个扇区,所以软盘容量=512B*2880=1.44MB) 启动区: 电脑上电自检后,从几个存储设备中寻找操作系统,当软盘的启动区的最后两个字节为0x55,0xaa时,则认为这是一个可启动的软盘,于是从开头开始执行. 不过我手头没有软盘,也没有软驱,所以要借助虚拟软盘 ctrl+alt+t打开终端,输入

    dd if=/dev/zero of=cm.img bs=512 count=2880

    dd是一个工具,if参数是写入的源,这里的/dev/zero可以无限的提供0, of参数是输出的源,cm.img就是我们要的虚拟磁盘,(顺便说一下,我们的操作系统名字叫cm),bs参数是一次写入的大小,count是写入的次数,当然bs和count的设定不是最快的,但是是最清晰的(512*2880). 执行它,我们就得到了一个1.44MB的软盘映像文件 接着,我们就要写软盘的启动区,所以要用一个文件来写入到启动区,假如有文件boot.bin,那么

    dd if=boot.bin of=cm.img bs=512 count=1

    就能完成制作一个带启动区的软盘,那boot.bin怎么来呢? 这就要借助程序的力量,汇编语言是面向机器的低级语言,不受系统限制,所以用它来写OS底层. 这里用开源的编译器nasm来开发 ubuntu上安装:

    sudo apt-get install nasm

    接着我们写一个源文件,boot.asm

    org 0x7c00 call begin begin: mov ax,cs mov ds,ax mov es,ax mov ss,ax mov sp,0x7c00 mov al,0x13 mov ah,0x00 int 0x10 times 510-($-$$) db 0 dw 0xaa55

    编译:

    nasm boot.asm -o boot.bin

    这样boot.bin就有了 那怎么让这个操作系统运行呢?这里要借助虚拟机的力量,这里用qemu模拟电脑. 运行:

    qemu-system-i386 -m 32 -fda cm.img

    -m 32是指定内存为32MB,-fda就是虚拟的软盘. 运行: 没什么,就一个黑屏而已.

    Processed: 0.038, SQL: 8