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

2021-07-10 10:56:32 字數 1495 閱讀 1697

............

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 之後,跳轉執行。所以,引導啟動系統的第一部...