一步一步實現乙個簡單的OS 載入核心

2021-07-10 08:41:56 字數 1580 閱讀 9443

這一塊更新的**比較多,所以就不方便全部貼出來了。。。具體的**大家直接到群裡面找就可以了(os0.3)

另外,我配置了bochs虛擬機器,這樣大家載下來就可以使用bochs虛擬機器直接除錯了。

下面我就直接貼一下主要的**吧,,,,,,

setupasm.s ( 這裡,跳轉到c函式直接call就可以了)

start32:

# 初始化保護模式下的各個段的段暫存器

movw $prot_mode_dseg, %ax

movw %ax, %ds

movw %ax, %es

movw %ax, %fs

movw %ax, %gs

movw %ax, %ss

movl $start, %esp # 之前的**沒用了,讓堆疊覆蓋了吧

# 這裡跳轉到c語言編寫的程式中

call setupmain

# 好了,到這裡死迴圈吧,下節,弄c語言的,這樣看起來就簡單多了

# 其實,我覺得,還是這個簡單

1: hlt

jmp 1b

setupmain.c (這裡就直接貼重定向elf檔案的**,之前是想用pe格式的了,然後看了下,pe的重定向篇幅比較大,所以就直接用elf的了。)

// 初始化核心載入位址

elf = (struct elfhdr*)0x10000;

// 載入核心

readseg((uint)elf, sectsize*8, kernel_disk_offset);

// 判斷核心是否為elf檔案格式

if(elf->magic != elf_magic)

goto bad;

// 對elf檔案重定向

ph = (struct proghdr*)((uchar*)elf + elf->phoff);

eph = ph + elf->phnum;

for(; ph < eph; ph++)

readseg(ph->va & 0xffffff, ph->memsz, ph->offset + kernel_disk_offset); // 這裡是要加入偏移的,用winhex看elf頭格式,可以具體分析出來

// 獲取核心入口點,並跳入核心

entry = (void(*)(void))(elf->entry & 0xffffff);

entry(); // 跳入核心入口

main.c (這裡,直接就簡單的寫一下,用來測試setup載入核心是否正確, 實現了printf函式,這樣以後寫起來就方便多了)

/**

* 核心入口

*/int kmain()

下面就貼乙個執行的截圖吧。。。。。。感覺貼張圖,看的人就多了,好奇怪

ok, 就這些了,不懂的群裡問吧[qq qun: 545250960]。

一步一步實現乙個簡單的OS 異常處理

簡單的對idt進行初始化,實現系統異常顯示 mmu裡面有大部分巨集定義是抄 自己動手寫作業系統裡面的pm.inc檔案中的 main.c 核心入口 int kmain traps.c 初始化,異常處理 void init traps 裝載idt lidt sys traps,sizeof struct...

一步一步實現乙個簡單的OS 試驗任務切換

extern void swtch struct context old,struct context new struct context kmaincontext 核心任務 struct context testcontext0 任務0 struct context testcontext1 任...

一步一步實現乙個簡單的OS HelloWorld

先弄個helloworld吧,雖然這個網上一大堆,不過不知道的人還是不少,就簡單的弄乙個吧。系統啟動時,第一步是bios自檢 這個不管 然後從cmos中設定的預設引導介質中載入第乙個扇區 512位元組 到記憶體的0x07c00處 0x0000 0x7c00 之後,跳轉執行。所以,引導啟動系統的第一部...