Linux內核分析(二)

Linux內核分析 —— 【實驗二:計算機工作機制 】

計算機作爲二十世紀以來最重要的發明之一,它已經完全融入到我們的生活,成爲我們工作、娛樂、學習等過程中必不可少的一部分。我們可以用它來瀏覽網頁、查詢資料、看電影、聽音樂、玩遊戲、聊天等等,更重要的是計算機可以同時滿足我們的這些要求。到底計算機是如何做到的呢?下面做一個簡單的實驗並分析。

首先,我們要模擬一個Linux內核平臺,步驟如下:

~$ sudo apt-get install qemu   # 安裝QEMU
~$ sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
~$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz    # 下載Linux內核代碼
~$ wget https://raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch # 下載補丁
~$ xz -d linux-3.9.4.tar.xz      # 解壓縮
~$ tar -xvf linux-3.9.4.tar      # 解開包裹
~$ cd linux-3.9.4                # 切換目錄
~$ patch -p1 < ../mykernel_for_linux3.9.4sc.patch   #打補丁
~$ make allnoconfig               
~$ make        #編譯鏈接
~$ qemu -kernel arch/x86/boot/bzImage  #運行

運行結果:
2-1
從圖中可知,程序會一直死循環,這相當於我們的cpu在不停的運轉;字符串“my_start_kernel here”相當於執行的進程,而每隔一段時間就有一個“my_timer_handler”,這個相當於是調度程序。通過不斷地調度、中斷、執行,確保每個進程都得以運行。

接着,分析代碼。

cd mykernel

打開mymain.c和myinterrupt.c文件
2-2
先看mymain.c文件,圖片上之所以顯示mymain0.c是因爲我自己修改了名字。
這裏只有一個my_start_kernel函數,裏面是一個死循環,它就不停的執行。

2-3
這是一個時間調度函數,每過一段時間就會執行,代表着中斷和調度。
運行結果
2-1
從圖中我們可以看到,程序在執行過程中,會產生一箇中斷,打印一串字符。這就是計算機的基本運行過程,系統內核不停的執行,等待任務的降臨(產生中斷),然後做出響應,只不過這裏的響應過程沒有體現出來。

上面例子比較簡單,下面將模擬四個任務的執行過程。CPU都是從調度隊列中獲取任務的,調度隊列中保存了每個將要執行的進程的相關信息——進程控制塊。如下圖
2-6
它包括:進程號、進程狀態、棧空間大小、執行線程等。
下面看代碼執行過程
2-4
初始化,將各個任務分配進程號,設置進程狀態,分配棧空間,設置線程,設置下一個任務。這裏沒有使用調度算法,直接按照順序循環執行各個任務。my_process函數是進程實際執行的任務,這裏每個進程都一樣。在my_process中有一個判斷是否需要調度的標記符my_need_sched,當他的值爲1時,則表示需要調度,調用函數如下:
2-5
首先是一個my_timer_handler函數,它用於控制調度的時間,每當運行了一段時間後,就會更改my_need_sched的值爲1。這就相當於一個時間片輪轉機制,每個進程每次只能執行這麼多時間,然後跳轉到另一個進程。
my_schedule函數用於實現進程之間的更替,根據調度隊列裏的順利依次調度。最爲重要的是保存當前進程現場,修改進程上下文環境,以便能正常恢復及順利運行。
運行結果
2-7
以上就是模擬四個進程的運行結果。綜上所述,我們知道計算機並不能同時執行多個進程,而是快速地交替執行,讓我們察覺不到它們的停頓。計算機就是用這種時間片輪轉的方法,不停地執行各種進程,完成各項工作。

=========== 王傑 原創作品轉載請註明出處==============
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章