從零實現乙個作業系統 day1

2021-10-05 03:45:19 字數 3064 閱讀 7832

我的部落格: 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

作業系統 抽象是管理複雜性的關鍵 資訊科技中,微電子是基礎,計算機和通訊設施是載體,而軟體是核心,是計算機的靈魂,而軟體中的作業系統就更是核心了,它為豐富的應用環境奠定了最堅實的基礎。第一次把微電子,通訊,軟體三個相近的專業領域的分工搞清楚誒,一直覺得這些專業都學差不太多的專業課,做差不提多的專案 ...