實驗過程是到實驗樓上面老師提供的環境上面切換到linux3.9.4核心下面的mykernel資料夾下面,然後將裡面的mymain.c和myinterrupt.c檔案中的內容替換然後新建mypcb.h並將上面鏈結檔案中的內容複製到新建的檔案中,切換到linux3.9.4目錄下執行make指令,重新編譯**,然後執行
qemu -kernel arch/x86/boot/bzimage命令就可以觀察實驗結果了,為了便於觀察,可以將mymain.c中64行處
if(i%
10000000
== 0
)的模數後面加上乙個0,這樣的話輸出就沒有那麼雜亂了,寫部落格前將截圖用qq截了,但是沒有及時 儲存,所以部落格上面就不放圖了,各位手下留情。
下面分析程序切換的過程:
其實在這個試驗中,所謂的程序切換實際上就是同乙個函式在執行的過程中通過切換使用的資料結構來實現程序排程的模擬(這個說法有點強調函式的作用,實際上程序控制塊的資料結構才是關鍵,函式只是他的乙個成員變數)。而這裡切換的結構就是程序控制塊(在作業系統課上應該接觸過)。在這裡這個程序控制塊的定義在mypcb.h中,這個程序控制塊相對於現代作業系統的超級大的程序控制塊來說簡直是小的不能再小了。
本實驗中程序的定義如下:
typedef
struct pcbtpcb;
相關欄位的含義已經在上面的**中進行了注釋。
本實驗程式執行的概述為:首先進行核心初始化函式,此函式會進行程序的初始化,程序的初始化就是建立n個程序,然後將程序的各個字段進行賦值,包括程序的入口函式,這樣程序進行切換的時候就是在程序的入口樓函式之間進行切換了。
下面先看一下程序初始化函式(在mymain.c中):
首先將當前執行的程序標記為0號程序,然後將0號程序的pcb塊中的各個字段進行賦值,這裡不再贅述。
下面是建立max_task_num-1個程序,這裡建立這些程序主要是為了演示程序排程,程序並沒有什麼特定的用途,這裡建立程序的時候偷懶,首先將0號程序的pcb塊複製過來然後將裡面要改變的字段改一下。
接著將始終指向當前執行的程序的pcb塊指向0號程序,然後下面是一段彙編**,這段彙編**很關鍵,如下:
asm volatile(
"movl %1,%%esp\n\t"
/* set task[pid].thread.sp to esp */
"pushl %1\n\t"
/* push ebp */
"pushl %0\n\t"
/* push task[pid].thread.ip */
"ret\n\t"
/* pop task[pid].thread.ip to eip */
"popl %%ebp\n\t"
:: "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) /* input c or d mean %ecx/%edx*/);
這段**的作用是將cs:ip設定為當前要執行的pcb塊中的cs:ip,由於此處將當前要執行的程序設定為0(mymain.c的46行),所以這段**沒用,如果要是將當前程序設定為其他程序,那麼這段**之後就將cpu的控制權指向了對應的程序。
由於我們將所有的程序的入口函式都指向void
my_process
(void
)這個函式,所以在初始化完成之後就是這個程式的天下了。
函式如下:
void
my_process(void)
printk(kern_notice "this is process %d +\n",my_current_task->pid);}}
}執行這個函式之後,程式進入死迴圈,每隔固定的時間(可以更改,此處的設定有點小,試驗的時候輸出太多)進行一次列印,,然後判斷是否需要程序排程,如果需要的話就執行排程函式。然後將需要排程的引數設定為不需要排程,這個後面在排程函式中進行更改。
下面分析my_schedule
();這個函式就是對程序進行排程的函式了,首先看一下系統是否需要排程,如果需要排程的話就將pcb塊鏈上的下乙個pcb設定為執行的程序。詳細**在myinterrupt.c檔案中。
總結:這個實驗的**雖然簡短,但是對於理解計算機的執行緒排程來說是超級好的。 通過此實驗可以認識到計算機的執行核心是:馮諾依曼的程式儲存執行思想,最低層就是cpu始終指向eip指向的指令,雖然eip有時候亂跳,但是這個亂跳要到上層**處才看明白。 上層**的核心是邏輯,首先設計好邏輯,然後通過相關的結構體定義和函式實現來實現程式要實現的功能,這上層和下層之間的對應就要靠編譯技術來實現了。
Materials Studio教程 中科大
第0章 緒論 10.1 計算機材料設計的概念 10.2 計算機材料設計的發展 10.3 計算機材料設計的途徑 2第1章 快速啟動教程 11.1 建立專案 creating a project 11.2 開啟 瀏覽3d文件 21.3 繪製苯甲醯胺 benzamide 分子 41.4 用學習表文件進行瀏...
anaconda中科大映象
清華的anaconda映象掛了,用中科大的映象吧 conda config add channels conda config set show channel urls yes 加個小tip 要刪除.condarc檔案。condarc以點開頭,一般表示 conda 應用程式的配置檔案,在使用者的根...
Ubuntu 換中科大源
換源對於教育網使用者還有有很大好處的,一是提高了速度,二是免費獲取資源 sudo gedit etc apt sources.list一般情況下可以備份,針對於新手,就是把裡面的內容全部複製到另乙個檔案,命名為txt也行,然後就是準備新源。中科大最新源 deb edu cn ubuntu trust...