《作業系統真象還原》 閱讀筆記(中)

2021-09-24 19:20:17 字數 2786 閱讀 7474

作業系統是由中斷驅動的。

中斷分為外部中斷和內部中斷。

外部中斷分為可遮蔽中斷和不可遮蔽中斷,內部中斷分為軟中斷和異常。

外部中斷

來自cpu外部的中斷。

可遮蔽中斷:通過intr引腳進入cpu,外部裝置如硬碟、網絡卡、印表機等發出的中斷

cpu可以不理會,因為不會宕機。

linux把中斷分為上半部和下半部分開處理,把中斷立即需要執行的部分劃分到上半部,不緊急的部分劃分到下半部。上半部是在關中斷的情況下執行的。

不可遮蔽中斷:通過nmi引腳進入cpu,它表示系統發生了致命的錯誤。

三種常見原因:1.記憶體讀寫錯誤 2電源掉電 3匯流排奇偶校驗錯誤

內部中斷

軟中斷:軟體主動發起的中斷

異常:指令執行期間cpu內部產生的錯誤引起的。

中斷描述符表(idt)

idt中有中斷描述符,還有任務門描述符和陷阱門描述符。

這些描述符都是門,門是通往另一段程式的入口。門描述符中新增了各種屬性,就是進門的條件。

中斷處理過程:

cpu外:

cpu內:

1.處理器根據中斷向量號定位中斷描述符

2.處理器進行特權級檢查

3執行中斷處理程式

如下圖:

這裡我突然想起個問題,訪問核心位址空間不需要經過頁表嗎?因為核心位址空間一般是連續的。

答案是也需要,不過是核心頁表。一旦cpu進入了保護模式,開啟分頁機制,不管在核心空間,還是使用者空間,都是使用虛擬位址進行定址了。

在32位的系統,核心頁表記錄核心對高階記憶體訪問而進行的對映關係。因為現代 cpu 的定址不能繞過 mmu。不過核心空間和使用者空間不同,它一般不做 swap,也就沒有 page fault,而且它一般不會把連續的虛擬位址空間對映成不連續的物理空間,一般只是做乙個 offset。

8259a程式設計

乙個中斷控制器

8253程式設計

乙個定時器,打節拍,最重要功能:定時向處理器發時間中斷

makefile編寫

實現assert

因為要列印螢幕,所以最好關中斷

開中斷:原理是執行sti指令把eflags中的if位置1

關中斷:原理是執行cli指令把eflags中的if位置0

實現字串操作函式

包括memset、memcpy、strcpy、strlen、strcmp、strcat、strchr(從左到右查詢字串str中首次出現字元ch的位址)、strchrs(查詢在字串str中ch出現的次數)

位圖實現

記憶體管理

每個任務(核心和使用者)都要維護自己的虛擬位址池。

宣告了乙個叫virtual_addr的結構體用來表示虛擬記憶體池,儲存乙個位圖結構和虛擬位址起始位址。

實現了malloc_page函式,2個引數,乙個是pf,用來指明記憶體池(核心還是使用者),乙個是pg_cnt,用來指明頁數,此函式的功能是在pf指向的記憶體池中分配pg_cnt個頁,成功則返回虛擬位址,失敗則返回null。

此函式幹了三件事:

1.通過vaddr_get在虛擬記憶體池中申請虛擬位址

2.通過palloc在物理記憶體池中申請物理頁

3.通過page_table_add將上兩步得到的虛擬位址和實體地址在頁表中完成對映

tips

在ubuntu下用gcc編譯鏈結,出現錯誤

undefined reference to `__stack_chk_fail』

解決方法:

add -fno-stack-protector to your cflags.

pcb每個程序都有自己的pcb,所有pcb放到一張**中維護,這就是程序表。排程器可以根據這張表選擇處理器執行的程序。

這裡寫描述

暫存器映像用來儲存程序的現場,用於程序切換。

pcb最頂端為執行緒在0特權級下所用的棧。

實現執行緒執行緒pcb由雙向鍊錶串聯

任務排程

在 schedule 中要判斷當前執行緒是出於什麼原因才「淪落到」要被換下處理器

的地步 。 是執行緒的時間片到期了?還是執行緒時間片未到,但它被阻塞了,以至於不得不換下處理器?其實這就是檢視執行緒的狀態,如果執行緒的狀態為task running ,這說明時間片到期了,將其 ticks 重新賦值為它的優先順序 prio ,將其狀態由 task_running 置為 task_ready ,並將其加入到就緒佇列的末尾。如果狀態為其他,這不需要任何操作,因為排程器是從就緒佇列中取出下乙個執行緒,而當前執行的錢程並不在就緒佇列中。

完整的排程需要三部分的配合:

1.時鐘中斷函式

2.排程器schedule

3.任務切換函式switch_to

《作業系統真象還原》 閱讀筆記(上)

配置bochs,進入bochs simulator後一直是黑屏,原來預設是除錯模式,需要輸入c continue 來讓除錯繼續。主講mbr及進入mbr前的步驟 1.實模式只能訪問1mb的記憶體空間。2.bios在rom中。3.開機上電後cs ip指向記憶體0xfff0,這裡有個跳轉語句,轉到fe05...

《作業系統真象還原》閱讀筆記 第1章

安裝一系列的包。首先,linux 系統需要安裝了x window系統才能使用bochs。因bochs是由c 寫的,需先安裝gnu gcc g 編譯器。安裝命令如下 sudo apt get install build essential sudo apt get install xorg dev s...

《作業系統 真象還原》書評

首先我對這本書的評價是正面的,這是一本還算不錯的書。請以這個基調閱讀本文。我也從來沒寫過書評,只不過這本書實在是讓人忍不住要寫一下,因為各種各樣的原因。這本書大致就是在bochs虛擬機器上面,實現乙個簡單的作業系統,實現的內容包括 mbr,loader,記憶體管理,中斷管理,檔案管理,系統呼叫,多程...