我的部落格: startcraft.cn
從這次春招中的碰壁和各種感悟,深刻體會到自己基礎知識的不足,從零實現乙個作業系統可以幫助自己更好得了解作業系統的知識。自己很早之前就開始有寫乙個微型作業系統的想法,之前也實踐過,但弄了幾天就放棄了,發現自己的毅力太差了,其實就是太懶了,寫blog的目的也有敦促自己,不要懈怠。
感謝前輩們無私提供的各種教程,這系列blog(希望是系列)跟著hurlex-doc教程來學習,當作自己的學習筆記和敦促自己努力不要偷懶
那就開始吧
sudo apt-get install qemu
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
教程中用到的各種指令碼檔案
#!makefile
c_sources = $(shell find . -name "*.c")
c_objects = $(patsubst %.c, %.o, $(c_sources))
s_sources = $(shell find . -name "*.s")
s_objects = $(patsubst %.s, %.o, $(s_sources))
cc = gcc
ld = ld
asm = nasm
c_flags = -c -wall -m32 -ggdb -gstabs+ -nostdinc -fno-builtin -fno-stack-protector -i include
ld_flags = -t scripts/kernel.ld -m elf_i386 --nostdlib
asm_flags = -f elf -g -f stabs
all: $(s_objects) $(c_objects) link update_image
.c.o:
@echo 編譯**檔案 $< ...
$(cc) $(c_flags) $< -o $@
.s.o:
@echo 編譯彙編檔案 $< ...
$(asm) $(asm_flags) $<
link:
@echo 鏈結核心檔案...
$(ld) $(ld_flags) $(s_objects) $(c_objects) -o time_kernel
.phony:clean
clean:
$(rm) $(s_objects) $(c_objects) time_kernel
.phony:update_image
update_image:
sudo mount floppy.img /mnt/kernel
sudo cp time_kernel /mnt/kernel/time_kernel
sleep 1
sudo umount /mnt/kernel
.phony:mount_image
mount_image:
sudo mount floppy.img /mnt/kernel
.phony:umount_image
umount_image:
sudo umount /mnt/kernel
.phony:qemu
qemu:
qemu -fda floppy.img -boot a
.phony:bochs
bochs:
bochs -f tools/bochsrc.txt
.phony:debug
debug:
qemu -s -s -fda floppy.img -boot a &
sleep 1
cgdb -x tools/gdbinit
makefile檔案是構建大型工程所必需的,我們來看看這個makefile檔案幹了什麼
第1-4行定義了一些變數 這些變數是什麼 首先我們要知道編譯的過程
首先要把原始檔編譯成中間**檔案,在windows下也就是 .obj 檔案,unix下是 .o 檔案,即 object file,這個動作叫做編譯(compile)。然後再把大量的object file合成執行檔案,這個動作叫作鏈結(link)
c_sources和s_sources定義的是c和彙編的原始檔,採用shell命令對所有以.c和.s的檔案進行查詢
c_objects和s_objects使用了patsubst將所有的.c和.s的檔名替換為.o也就是目標檔案
後面3行就是定義了一些工具的名稱gcc是c語言的編譯器,ld是鏈結器,nasm是彙編器
再後面三個變數就是編譯連線的一些選項
gcc ld
標籤的功能
再往下是目標all,它後面的是這個makefile在預設條件下的目標,即生成所有的c和彙編的目標檔案(.o)
並且完成鏈結和更新映象
.c.o表示的是%.o:%.c 即對所有xx.o的目標檔案它的依賴是xx.c .s.o同理
$《表示第乙個依賴檔案 $@表示目標檔案
link標籤是將c的目標檔案和彙編的目標檔案鏈結在一起輸出為time_kernel檔案
update_image標籤顧名思義就是更新映象檔案,qemu載入的就是作業系統的映象,更新過程是先掛載映象,然後用time_kernel覆蓋,然後解除安裝映象
clean標籤就是刪除所有生成的檔案僅僅保留源**
剩下的標籤像 mount_image umount_image就是掛載和解除安裝映象 qemu就是啟動qemu虛擬機器
bochs是另乙個虛擬機器可以忽略 debug就是以debug模式啟動qemu來除錯程式
專案使用的鏈結器的指令碼
/*
* kernel.ld -- 針對 kernel 格式所寫的鏈結指令碼
*/entry(start)
sections
.data :
.bss :
.stab :
.stabstr :
/discard/ :
}
這個指令碼暫時看不懂2333,隨著專案繼續進行應該可以看懂吧(大概)
今天也很晚了,先到這吧
從零實現乙個作業系統 day2
我的部落格 startcraft.cn 今天主要是對作業系統的啟動進行學習,因為都是理論的部分,這篇部落格就當學習的筆記了 首先在按下電源鍵後計算機首先讀取寫在rom中的bios basic input output system 基本輸入輸出系統 然後bios程式會進行硬體自檢,若硬體出問題發出相...
從零實現乙個作業系統 day7
我的部落格startcraft 因為在核心中,大部分的c標準庫函式無法使用,字串操作的函式又比較常用,所有自己實現一些 ifndef include string h define include string h include types.h void memcpy uint8 t dest,c...
作業系統day1
作業系統 抽象是管理複雜性的關鍵 資訊科技中,微電子是基礎,計算機和通訊設施是載體,而軟體是核心,是計算機的靈魂,而軟體中的作業系統就更是核心了,它為豐富的應用環境奠定了最堅實的基礎。第一次把微電子,通訊,軟體三個相近的專業領域的分工搞清楚誒,一直覺得這些專業都學差不太多的專業課,做差不提多的專案 ...