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

2021-07-10 09:12:20 字數 2338 閱讀 6644

簡單的對idt進行初始化,實現系統異常顯示(mmu裡面有大部分巨集定義是抄「自己動手寫作業系統裡面的pm.inc檔案中的」)

main.c

/** * 核心入口

*/int kmain()

traps.c

// 初始化,異常處理

void init_traps()

// 裝載idt

lidt(sys_traps, sizeof(struct trapdesc) * traps_num - 1);

}/**

* 異常和中斷處理函式

* 所有的異常和中斷都會跳轉到這裡

*/void trap(struct trapframe *trapframe)

trapsasm.s

.text

.set seg_kdata_sel, 0x10 # 核心**段選擇符

# 所有中斷及異常的一級處理函式

.globl alltraps

alltraps:

# 構建異常幀結構

pushl %ds

pushl %es

pushal

# 切換到系統資料段

movl $seg_kdata_sel, %eax

movw %ax, %ds

movw %ax, %es

# 呼叫c語言異常處理函式

# void trap(struct trapframe *trapframe);

pushl %esp

call trap

addl $0x04, %esp

# 異常返回

.globl trapret

trapret:

popal

popl %es

popl %ds

addl $0x08, %esp

iret

trapimport.s

# 中斷及異常入口,這樣寫是為了簡單

.text

# 00 #de: 除法錯誤(div/idiv指令)

.globl trap0

trap0:

pushl $0

pushl $0

jmp alltraps

# 01 #db: 單步異常(除錯異常) [任何**或資料引用,或是int 1指令]

.globl trap1

trap1:

pushl $0

pushl $1

jmp alltraps

# 02 --: nmi中斷

.globl trap2

trap2:

pushl $0

pushl $2

jmp alltraps

# 03 #bp: 單步異常(除錯異常) [int 3指令]

.globl trap3

trap3:

pushl $0

pushl $3

jmp alltraps

***********

.data

# 這裡建立了乙個陣列,用來儲存異常和中斷的入口點

.globl traps

traps:

.long trap0

.long trap1

.long trap2

.long trap3

.long trap4

.long trap5

.long trap6

.long trap7

.long trap8

.long trap9

.long trap10

.long trap11

.long trap12

.long trap13

.long trap14

.long trap15

.long trap16

.long trap17

.long trap18

.long trap19

.long trap20

.long trap21

.long trap22

.long trap23

.long trap24

.long trap25

詳細**到群裡面找。。。。。。。。。

下面上圖:

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

這一塊更新的 比較多,所以就不方便全部貼出來了。具體的 大家直接到群裡面找就可以了 os0.3 另外,我配置了bochs虛擬機器,這樣大家載下來就可以使用bochs虛擬機器直接除錯了。下面我就直接貼一下主要的 吧,setupasm.s 這裡,跳轉到c函式直接call就可以了 start32 初始化保...

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