0 11之路(五) 啟用程序0

2021-07-01 21:42:33 字數 1035 閱讀 5490

linux的第乙個程序——程序0。

linux 0.11 是乙個支援多程序的現代作業系統,所以我們需要程序管理資訊資料結構:task_struct、task[64]、gdt等的支撐。

我們需要設定物理記憶體的分布:主記憶體區、緩衝區和虛擬盤。

memory_end —— 系統有效記憶體末端位置

main_memory_start —— 主記憶體區起始位置

buffer_memory_end —— 緩衝區末端位置

main_memory_start = buffer_memory_end —— 緩衝區之後就是主記憶體

如果要設定虛擬盤,將其放在緩衝區和主記憶體之間

1mb以內是核心**和只有由核心管控的大部分資料所在記憶體空間,是絕對不允許使用者程序訪問的。1mb以上,特別是主記憶體區主要是使用者程序的**、資料所在的空間,所以採用專用用來管理使用者程序的分頁管理機制。這部分工作由mem_init()函式完成。

接下來執行trap_init()函式將中斷、異常處理的服務程式與idt進行掛接,逐步重建中斷服務體系。

程序要想與塊裝置進行溝通,必須經過主機記憶體中的緩衝區,這是就要借助請求項來進行控制,根據請求項中的記錄來決定當前需要處理哪個裝置的哪個邏輯塊。

接下來對序列口、顯示器和鍵盤進行設定,以及開機啟動時間。

tss_struct和task_struct是對乙個程序很重要的資料結構,前者儲存的是各種暫存器的資訊,後者包含程序優先順序、使用者組、tss、ldt等程序基本執行資訊。

我們通過sched_init()函式來初始化程序0,設定時鐘中斷,設定系統呼叫總入口(system_call),初始化緩衝區管理結構,初始化硬碟和軟盤,之後開啟中斷。

最後一步,通過move_to_user_mode()將程序0由0特權級翻轉到3特權級。cpu執行iret指令會將棧中的值自動按反序恢復給ss、esp、eflags、cs、eip這5個暫存器。system_call對應的int 0x80中斷會將3特權級翻轉到0特權級,iret又會將0特權級翻轉回3特權級,因此move_to_user_mode()利用iret的這個特性將程序0的由0特權級成功翻轉為3特權級。

linux0 11程序排程分析

10ms時鐘中斷 時鐘中斷函式timer interrupt,將jiffier加1 呼叫do timer函式,將當前程序counter計數減1,如果 counter大於0,則返回繼續執行該任務,否則 呼叫schedule函式,如下 void schedule void if p signal blo...

Linux程序排程0 11原始碼

void schedule void 排程函式if p signal blockable p blocked p state task interruptible 看訊號是否遮蔽掉,且是否處於task interruptible狀態 p state task running task running...

linux 0 11 原始碼學習(五)

head.s head.s 是系統模組的入口,其編譯器已經是gnu彙編,但從功能上將仍然屬於核心啟動階段,主要的功能是對386 cpu的初始化,如使用者堆疊 idt gdt和頁表。因此從資料夾的歸屬看,它仍然放在boot資料夾中,與bootsect和setup一塊。head.s的核心功能 簡單的暫存...