《Orange'S:一个操作系统的实现》学习笔记(1)—— 环境搭建与系统内核的实现

    作为一名刚上完操作系统理论课的大学萌新,真正操作系统的实现无疑是最棒的实践,这本书通过不断地向一个操作系统的基本内核中补充与完善,最终实现一个较为完整的操作系统,这将是一次非常有分量的尝试。话不多说,快快出发:

     1. 笔者的开发环境是ubuntu 14.04LTS(因为更高版本的无法安装vmware12的vmtool),而由于涉及大量的命令行和汇编,为了方便起见,linux也是本书作者较推荐的系统。

     2. 开发环境配置主要步骤:

  • 首先,安装虚拟机Bochs:
    • 安装C++的编译环境
    •  sudo apt-get install build-essential
    • 图形界面支持
    • sudo apt-get install xorg-dev
    • 安装bison  C、C++语法分析器
    • sudo apt-get install bison
    • 安装libgtk2.0-dev依赖包
    • sudo apt-get install libgtk2.0-dev
    • 最后到bochs官网http://bochs.sourceforge.net/下载bochs,解压并安装以下以2.6.1为例
      •  tar vxzf bochs-2.6.1.tar.gz
      • cd bochs-2.6.1
      • ./configure --enable-debugger --enable-disasm
      • make
      • sudo make install
  • 之后,使用bochs中的工具bximage生成虚拟软盘name.img,置于虚拟机下(命令行中输入bximage后根据提示选择即可,注意:生成的是floppy disk,大小选择为默认值)
  • 最后,由于bochs没有默认的配置文件,所以需要在与软盘相同目录下新建配置文件bochsrc, 以下为实例:       

 

###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin
##此处为指定的BIOS和VGA BIOS的真实路径,每个人的不一定相同
# 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
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
##键盘映射文件同上,需要自己确认
##(*keyboard_mapping在较高版本的bochs下被keyboard取代,改为
## keyboard: keymap=/usr/share/bochs/keymaps/x11-pc-us.map)

 

 至此,开发环境已经基本部署成功。

3. 踏出第一步:

新建汇编源代码文件boot.asm:

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                ; 结束标志

这段代码被写到软盘的第一个扇区(0柱面,0磁道,1扇区)并补足512个字节,该扇区在BIOS寻找启动盘时首先被检测为引导扇区,于是BIOS将这个扇区的数据加载到0000:7c00处,并将控制权交给其中的控制代码。而这段代码所执行的是输出一个字符串“Hello, OS world!”。

之后用NASM编译代码,输出boot.bin

nasm boot.asm -o boot.bin

至此可以在bochs中测试了,显示如下结果:

《Orange'S:一个操作系统的实现》学习笔记(1)—— 环境搭建与系统内核的实现_第1张图片

你可能感兴趣的:(操作系统,Orange's)