Sep 17
     《Orange's一个操作系统的实现》书中选择的汇编器为NASM。用过MASM和GAS,发现NASM的语法是最简洁的,而且有强大的宏。通过man可以知道nasm的使用方法及它与其它汇编器语法上的区别。
 
主要值得注意的区别,也是我们常用的如下:

0.注释用分号‘;'
    ;这是注释
    这是代码

 
1.与gas不同,寄存器名字前面不用加'%'
  与gas操作数的顺序不同,mov ax,dx表示ax=dx而不是dx=ax

2.浮点寄存器名字为st0,st1等

3.与masm的dup不同,nasm重复数据用times,如:
    message:times 3 ‘abc’
    times 64-$+message db 0
  定义了字符串“abcabcabc”,加上后面跟着的0,长度总共为64

4.$表示当前行被汇编后的地址

5.$$表示一个节的开始处被汇编后的地址

6.符号都是立即数,标号和变量是一样的,都表示地址:
    foo dw 1 等价与 foo:dw 1
 
7.[addr]表示取地址的值,可以带word,byte等前缀指定大小:
    foo dw 1
    mov ax,foo
    mov dx,[foo]
  ax中为1的地址,dx为1

8.简单宏定义:
    %macro add 2 ;定义名为add,2个参数
         mov ax, %1;第一个参数给ax
         add ax, %2;加上第二个参数
    %endmacro
    add 1,3;调用宏

9.条件预编译宏
    %ifdef _BOOT_DEBUG
         org 0100h
    %else
         org 07c00h
    %endif

 
nasm的文档下载:http://www.nasm.us/docs.php
网上有翻译的中文文档下载,这里有一份。
Sep 17

      俱乐部的新学期又开始了,OS组的同学又要开始看《Orang‘s一个操作系统的实现》和做操作系统实验了。在这里把做的过程中的收获和体会写下来。

本篇是关于书中的第一,二章的开发环境搭建。这里讲的是完全在linux下的环境搭建

用到的工具及作用:

一台安装有linux操作系统的计算机:这是其它一切的前提。

nasm,gcc,make:编译链接的基本工具

bochs:运行调试工具

qemu:运行工具,比bochs更快

dd:绝对扇区读写工具,用来写引导扇区和查看映像内容

bximage:用来生成虚拟映像

objdump,readelf:查看目标文件结构,查看elf文件

vim:用来编译代码,也可以是其它的文本编辑器。

freedos映像:在第三章中,因为程序可能超过512字节,不能写入引导扇区,
                      于是编译成com文件在dos中运行,这个在bochs官网可以下到。

bochs编译选项及说明:
       --enable-vbe
       --enable-debugger:开启调试功能,默认不开
       --enable-debugger-gui:调试时有运行窗口
       --enable-smp
       --enable-new-pit
       --enable-all-optimizations
       --enable-4meg-pages
       --enable-reset-on-triple-fault
       --with-all-libs
       --with-x
       --with-x11
       --with-nogui:使可以不显示运行窗口

需要了解的:

2.引导扇区:硬盘或者软盘某个分区的第一个扇区,如果以0xAA55结束,则BIOS认为它是一个可引导扇区。
   计算机启动时,先进行加电自检(POST),然后按顺序寻找启动盘,也就是检查所有磁盘的第一个扇区,一旦发现以0xAA55结束,则将这512字节装载到内存地址0000:7c00处,然后跳转到0000:7c00,运行引导扇区的代码。
更准确定义见这里:
http://en.wikipedia.org/wiki/Boot_sector
Mar 20

以下内容以GNU GRUB 0.97为标准,并且是从U盘引导。

1.     安装grubU盘。

安装grubU盘最方便的方法就是在linux系统下使用grub安装程序。

具体步骤如下:

a)        首先找到U盘所在设备(这里假设为/dev/sdb1),然后挂载:

mkdir /mnt/sdb1
mount /dev/sdb1 /mnt/sdb1

b)       创建相关目录

mkdir /mnt/sdb1/boot
mkdir /mnt/sdb1/boot/grub

c)        找到文件stage1, stage2, *_stage1_5的位置

find /usr/ -name statge

d)       复制以上文件到grub 目录(假设上面的文件在/usr/share/grub/ 目录下):

cp /usr/share/grub /mnt/sdb1/boot/grub
cp /usr/share/grub /mnt/sdb1/boot/grub

如果U盘是用FAT文件格式格式化的则复制fat_stage1_5,这里用的是FAT32

cp /usr/share/grub /mnt/sdb1/boot/grub

e)        运行grub安装程序:

sudo grub

接着如下操作:(其中设备号要具体确定)

好了现在U盘上已经装好了grub,引导配置写在grub.conf中。

2.     grub引导 内核

grub有两种不同的引导机制,一种是直接 载入系统内核,另一种是通过chainloader载入另一个bootloader来引导自己的系统。可以被bootloader原生支持的内核一般要符合多重引导规范(Multiboot Specification)。当然为了方便grub也支持直接引导linuxFreeBSD等。

我们要用grub来引导自己的内核,当然我们不希望自己写一个bootloader再让grubchainload,所以我们得支持多重引导规范。

 

  一个简单的内核实例(grub0.97源文件/docs/下面有三个文件multiboot.hloader.skernel.c,下面作了简化):