Orange's一个操作系统的实现:马上动手写一个最小的操作系统

源代码

	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) 黑底红字(bl=0ch,高亮)
    mov dl, 0
    int 10h                            ;10h号中断
    ret
BootMessage: db "hello, OS world!"
    times 510-($-$$) db 0           ;填充剩下的空间,使生成的二进制代码恰好为512字节
    dw 0xaa55                           ;结束标记

操作系统启动流程

  1. 启动电源后,BIOS加电自检(POST),并且BIOS会在启动盘(硬盘,软盘,U盘等)0面0磁道1扇区中寻找启动程序(操作系统的BootLoader),该启动程序的特征是:
    • 以0xAA55结束(最后一个字节是AA,倒数第二个字节是55)
    • 该启动程序少于512字节
  2. BIOS发现启动程序后,会把该程序加载到内存的0000:7C00处,然后跳转到0000:7c00处执行,即控制权转到操作系统的BootLoader
  • 注释1:在系统加电最初的1M内存空间(16位寻址,80386的实模式)是BIOS准备好的,分布情况为:
    Orange's一个操作系统的实现:马上动手写一个最小的操作系统_第1张图片

代码解释

  1. org 07c00h 表示后面的代码从07c00h这个地址开始放置;
  2. $表示当前指令的地址,$$表示一个节(section)的开始处被汇编后的地址,在这个程序中只有1个节,所以就是程序的开始地址07c00h; $-$$ 就等于本条指令之前的所有字节数。510-($-$$) 的效果就是,填充了这些0之后,从程序开始到最后一个0,一共是510个字节。再加上最后的dw两个字节(0xaa55是结束标志),整段程序的大小就是512个字节,刚好占满一个扇区。
  3. 在使用NASM对汇编文件进行编译时,任何不被方括号[]扩起来的标签或变量名都被认为是地址
    • mov ax, BootMessage 会把字符串的首地址放到ax寄存器中
    • 如果foo dw 1,则mov ax, foo表示把foo的地址传送给ax,但是mov ax, [foo] 是把foo的值1传送给ax。
    • 在nasm中,变量和标签是一样的,即foo dw 1等价于foo: dw 1

一些命令

  1. 使用nasm编译
    编译:nasm -f elf64 hello.asm
    链接:ld -s -o hello hello.o
    编译成.bin文件:nasm boot.asm -o boot.bin
  2. .bin文件—>.img文件
    dd if=boot.bin of=boot.img bs=512 count=1
    dd if=输入文件 of=输出文件 bs=字节数 count=个数
  3. 反汇编
    ndisasm -o 0x7c00 boot.bin >> disboot.asm

让代码运行在虚拟机上

  1. 使用nasm对汇编源文件进行编译
    nasm boot.asm -o boot.bin
  2. 使用bximage制作img映像
  3. 把.bin文件写入.img映像中
    dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
    conv=notrunc表示软盘映像文件a.img不会被截断(因为.bin和.img的大小不同)
  4. 在a.img的同文件夹下,添加bochs的配置文件
# how much memory the emulated machine will have
megs: 32

# filename of ROM images
# BIOS已经修改,地址可以不加,可以根据文件大小进行推断,如里加地址要与文件大小相匹配
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest

# what disk images will be used 
# 配置镜像名
floppya: 1_44=a.img, status=inserted

# choose the boot disk.
boot: floppy

# where do we send log messages?
log: bochsout.txt

# disable the mouse, since Finix is text only
mouse: enabled=0

# enable key mapping, using US layout as default.
# 键盘的映射方式也改变了
keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
  1. 运行
    bochs -f bochsrc
    Orange's一个操作系统的实现:马上动手写一个最小的操作系统_第2张图片
    选择2,读取配置文件bochsrc
    选择完了之后,返回此菜单,选择6
    如果bochsrc黑屏,则可能是进入了debug模式,可以在终端按c,直接开始运行

bochs调试

Orange's一个操作系统的实现:马上动手写一个最小的操作系统_第3张图片

你可能感兴趣的:(操作系统)