............
extern void swtch(struct context *old, struct context *new);
struct context kmaincontext; // 核心任務
struct context testcontext0; // 任務0
struct context testcontext1; // 任務1
// 任務0堆疊
uchar stack0[4096];
// 任務1堆疊
uchar stack1[4096];
void test0();
void test1();
/** * 核心入口
*/int kmain()
void test0()
}void test1()
}
# void swtch(struct context *old, struct context *new);
# 切換程序上下文
.globl swtch
swtch:
# 舊的暫存器位址
movl 4(%esp), %eax
popl 0(%eax) # 儲存舊的eip(返回位址)
movl %esp, 4(%eax) # 儲存esp
movl %ebx, 8(%eax) # 儲存ebx
movl %ecx, 12(%eax) # 儲存ecx
movl %edx, 16(%eax) # 儲存edx
movl %esi, 20(%eax) # 儲存esi
movl %edi, 24(%eax) # 儲存edi
movl %ebp, 28(%eax) # 儲存ebp
# 新的暫存器位址
movl 4(%esp), %eax
movl 28(%eax), %ebp # 載入ebp
movl 24(%eax), %edi # 載入edi
movl 20(%eax), %esi # 載入esi
movl 16(%eax), %edx # 載入edx
movl 12(%eax), %ecx # 載入ecx
movl 8(%eax), %ebx # 載入ebx
movl 4(%eax), %esp # 載入esp
pushl 0(%eax) # 載入新的eip(返回位址)
一步一步實現乙個簡單的OS 載入核心
這一塊更新的 比較多,所以就不方便全部貼出來了。具體的 大家直接到群裡面找就可以了 os0.3 另外,我配置了bochs虛擬機器,這樣大家載下來就可以使用bochs虛擬機器直接除錯了。下面我就直接貼一下主要的 吧,setupasm.s 這裡,跳轉到c函式直接call就可以了 start32 初始化保...
一步一步實現乙個簡單的OS 異常處理
簡單的對idt進行初始化,實現系統異常顯示 mmu裡面有大部分巨集定義是抄 自己動手寫作業系統裡面的pm.inc檔案中的 main.c 核心入口 int kmain traps.c 初始化,異常處理 void init traps 裝載idt lidt sys traps,sizeof struct...
一步一步實現乙個簡單的OS HelloWorld
先弄個helloworld吧,雖然這個網上一大堆,不過不知道的人還是不少,就簡單的弄乙個吧。系統啟動時,第一步是bios自檢 這個不管 然後從cmos中設定的預設引導介質中載入第乙個扇區 512位元組 到記憶體的0x07c00處 0x0000 0x7c00 之後,跳轉執行。所以,引導啟動系統的第一部...