一、準(zhǔn)備工具- bochs
- Virtual Machine
- nasm
- gcc
- ld
等。更多需要的工具已經(jīng)放在碼云開源倉庫。 二、操作步驟1. 實(shí)現(xiàn)步驟- 完成引導(dǎo)程序開發(fā)
- 使用匯編語言兩段子程序
- 使用C語言開發(fā)調(diào)用匯編子程序
- 編譯程序,制作軟盤鏡像
- BIOS加載并運(yùn)行匯編語言的引導(dǎo)程序
- 匯編語言程序從軟盤讀取10扇區(qū),當(dāng)中包含C語言程序
- 程序跳轉(zhuǎn)到C語言的程序
- C調(diào)用匯編,實(shí)現(xiàn)清屏操作。
2. 重點(diǎn)(1) 匯編語言子程序?qū)崿F(xiàn)[BITS 16]global io_hltglobal clear_screenclear_screen: ; 清屏 mov ax, 03h int 10h ;pop ecx ; jmp cxRETio_hlt:HLTRET
這段子程序?qū)崿F(xiàn)了清屏、空循環(huán)功能。 為方便C的調(diào)用,再寫一個頭文件: #ifndef __UTILITIES_H_#define __UTILITIES_H_// 此處只提供函數(shù)聲明// 函數(shù)實(shí)現(xiàn)在utilities.svoid io_hlt(void);void clear_screen(void);#endif
(2) 在C中調(diào)用匯編的方法#include 'utilities.h'void main(void){ clear_screen(); // clear screen fin: io_hlt(); /* call io_hlt */ goto fin;}
三、編譯的重點(diǎn)TOOLPATH = ./tools/TARGET = ./target/SRC = ./src/LD=./env/bin/i686-elf-ld.exeCC=./env/bin/i686-elf-gcc.exeNASM=$(TOOLPATH)nasm.exeDD=$(TOOLPATH)dd.exeBOCHSPATH=$(TOOLPATH)bochs/MAKE =$(TOOLPATH)make.exe -rCOPY = copyDEL = del# LD編譯選項(xiàng)LDFLAGS=-m elf_i386# GCC編譯選項(xiàng)CCFLAGS=-march=i386 -m16 -mpreferred-stack-boundary=2 -ffreestandingASFLAGS=# 默認(rèn)動作default : kernel.bin loader.bin kernel.o utilities.o loader.o# 匯編的函數(shù) 用來給C調(diào)用utilities.o: $(SRC)kernel/utilities.s$(NASM) $(ASFLAGS) -f elf32 -o $(TARGET)$@ $^kernel.o : $(SRC)kernel/kernel.c $(SRC)kernel/utilities.h$(CC) $(CCFLAGS) -o $(TARGET)kernel.o -c $(SRC)kernel/kernel.ckernel.bin : kernel.o utilities.o$(LD) $(LDFLAGS) -Ttext 0xC200 --oformat binary -o $(TARGET)$@ $(TARGET)kernel.o $(TARGET)utilities.oloader.o: $(SRC)boot/loader.s$(NASM) $(ASFLAGS) -f elf32 -o $(TARGET)$@ $^loader.bin : loader.o$(LD) $(LDFLAGS) -Ttext 0x7c00 --oformat binary -o $(TARGET)$@ $(TARGET)$^install :$(DD) if=$(TARGET)kernel.bin of=$(TARGET)os.img conv=notrunc bs=512 seek=1$(DD) if=$(TARGET)loader.bin of=$(TARGET)os.img conv=notrunc run : Makefilecd $(TOOLPATH) && bochs.bat && cd ..debug:cd $(TOOLPATH) && bochsdebug.bat && cd ..clean :cd $(TARGET) && del -f *
匯編編譯器nasm生成 .o 文件, C編譯器 gcc也生成 .o 文件, 通過LD進(jìn)行鏈接,生成二進(jìn)制文件。 3. 編譯運(yùn)行makemake install
這里還有點(diǎn)問題,生成的kernel.bin后進(jìn)行下面操作: - 使用Virtual Box 加載 os.img 軟盤鏡像
- 把kernel.bin 拷貝到os.img
- 彈出虛擬軟盤
make run
可以看到最后屏幕被清屏了。 也可以使用 make debug 調(diào)試,看一下內(nèi)存情況: 在0xc200處設(shè)置斷點(diǎn): b 0xc200c
下圖可以看到程序在0xc205處調(diào)用了 0xc220, 然后在0xc20b處進(jìn)入空循環(huán)。 清屏效果:
|