1. 程式人生 > >Linux核心分析——作業系統的工作原理

Linux核心分析——作業系統的工作原理

一、實驗過程:

實驗內容為完成一個簡單的時間片輪轉多道程式核心程式碼

1.根據老師指導按照實驗步驟,在實驗樓環境下開啟shell:

cd LinuxKernel/linux-3.9.4

rm -rf mykernel

patch -p1 < ../mykernel_for_linux3.9.4sc.patch

make allnoconfig

make

qemu -kernel arch/x86/boot/bzImage

然後 cd mykernel

看到mymain.c和myinterrupt.c.

2.將老師github的mypcb.h/mymain.c/myinterrupt.c拷貝到實驗樓環境的mykernel下,再按照實驗步驟進行,即可看到實驗的排程過程.修改這三個檔案:

mypcb.h:
這裡寫圖片描述

mymain.c:

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

myinterrupt.c:

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

3.重新make編譯一下,然後執行會看到結果:

這裡寫圖片描述

二、分析該精簡核心的原始碼。

1.mypcb.h對結構體和函式進行了定義.定義了執行緒的ip與sp 執行緒的結構,其中SP暫存器指向當前執行緒棧的棧頂,這樣通過SP就能完成出入棧的操作;IP指向當前操作指令,一開始指向執行緒啟動函式,後面按照程式碼的一層層呼叫,執行相應指令,接下來定義了程序控制塊PCB的初始資訊。

2.mymain.c中__init my_start_kernel 函式是核心的入口,它完成了初始化程序並啟動程序的工作。 程序建立完畢後,將my_current_task指標指向0號程序,通過嵌入式彙編程式碼,開始執行。這個嵌入式程式碼實際上是開闢了新的棧幀空間,類似於上一課,也與myinterrupt.c的程序切換類似。 每個程序都執行my_process(void),i%10000000 == 0,列印程序號,略小於1s的時間。

3.myinterrupt.c中my_timer_handler被核心的定時器週期性呼叫,當計數到1000時執行程序切換。

4.其中的內嵌彙編程式碼為核心:

“pushl %%ebp\n\t” /* save ebp */

“movl %%esp,%0\n\t” /* save esp */

“movl %2,%%esp\n\t” /* restore esp */

“movl %2,%%ebp\n\t” /* restore ebp */

“movl $1f,%1\n\t” /* save eip */

“pushl %3\n\t”

“ret\n\t” /* restore eip */

“=m” (prev->thread.sp),”=m” (prev->thread.ip)

“m” (next->thread.sp),”m” (next->thread.ip)

“pushl %%ebp\n\t” /* save ebp */

“movl %%esp,%0\n\t” /* save esp */

“movl %2,%%esp\n\t” /* restore esp */

“movl %2,%%ebp\n\t” /* restore ebp */

“movl $1f,%1\n\t” /* save eip */

“pushl %3\n\t” “ret\n\t” /* restore eip */

“=m” (prev->thread.sp),”=m” (prev->thread.ip)

“m” (next->thread.sp),”m” (next->thread.ip)

三、理解作業系統是如何工作的。

  1. Linux作業系統的正常工作可以說有三個非常重要的部分,就是我們的儲存程式原理、堆疊以及中斷的支援。 作業系統對程序的管理主要就是程序的管理和排程,我們為每個程序維護一個程序描述和以及程序間的關係。我們的核心的工作主要有兩部分組成,首先執行有一個核心執行緒,然後就是一些中斷處理程式的集合,我們在中斷處理程式中要就行程序的排程。

2.Linux作業系統由核心來實現具體工作的,一個程序是通過系統呼叫fork()函式來建立的,先是將先前CPU正在執行的程序的程序上下文儲存在核心態堆疊中,包括有eip,esp,ebp,cs等暫存器的資料;然後載入建立的程序的上下文資訊到相應的暫存器中,運行當前新建程序;執行完畢後根據系統的排程繼續執行相應的程序。Linux作業系統是多程序的作業系統,不同的程序就是基於以上的方式有作業系統實現排程執行的。同時,作業系統以一種中斷的機制實現與使用者的互動。作業系統中的IDT描述好各個中斷對應的處理程式,當發生相對應的中斷時,由硬體來實現中斷訊號的傳遞,CPU接收到相應的IRQ訊號後,由作業系統如排程程序那樣排程相應的處理程式,來完成相應的中斷請求,實現與使用者的互動。