Hello OS world!

Hello OS world!  



並放在同一個目錄下,然後在此目錄下編譯:
$ make

自動編譯、連接和直接生成可啓動的軟盤鏡像文件boot.img。

加載執行boot.img,輸出" Hello OS world ! "。

 

 boot.S文件

.code16 #使用16位模式彙編
.text #代碼段開始
    mov %cs,%ax
    mov %ax,%ds
    mov %ax,%es
    call DispStr #調用顯示字符串例程
    jmp . #無限循環
DispStr:
    mov $BootMessage, %ax
    mov %ax,%bp #ES:BP = 串地址
    mov $16,%cx #CX = 串長度
    mov $0x1301,%ax #AH = 13, AL = 01h
    mov $0x00c,%bx #頁號爲0(BH = 0) 黑底紅字(BL = 0Ch,高亮)
    mov $0,%dl
    int $0x10 #10h 號中斷
    ret
BootMessage:.ascii "HelloOS world!"
.org 510 #填充到~510~字節處
.word 0xaa55 #結束標誌

 

x86.ld文件

SECTIONS
{
   . = 0x7c00;
   .text :
   {
       _ftext = .; /* Program will be loaded to 0x7c00. */
   } = 0
}

 

Makefile文件

 CC=gcc
 LD=ld
 LDFILE=x86.ld #使用上面提供的連接腳本x86.ld
 OBJCOPY=objcopy

 all: boot.img

 # Step 1: gcc 調用as 將boot.S 編譯成目標文件boot.o
 boot.o: boot.S
 $(CC) -c boot.S

 # Step 2: ld 調用連接腳本x86.ld 將boot.o 連接成可執行文件boot.elf
 boot.elf: boot.o
 $(LD) boot.o -o boot.elf -e c -T$(LDFILE)

 # Step 3: objcopy 移除boot.elf 中沒有用的section(.pdr,.comment,.note),
 # strip 掉所有符號信息,輸出爲二進制文件boot.bin 。
 boot.bin : boot.elf
 @$(OBJCOPY) -R .pdr -R .comment -R.note -S -O binary boot.elf boot.bin

 # Step 4: 生成可啓動軟盤鏡像。
 boot.img: boot.bin
 @dd if=boot.bin of=boot.img bs=512 count=1 #用boot.bin 生成鏡像文件第一個扇區
 # 在bin 生成的鏡像文件後補上空白,最後成爲合適大小的軟盤鏡像
 @dd if=/dev/zero of=boot.img skip=1 seek=1 bs=512 count=2879

 clean:
 @rm -rf boot.o boot.elf boot.bin boot.img

 

參考:《使用開源軟件自己動手寫操作系統》


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章