這周主要講解的是程序。首先老師就講解了pcb程序結構塊的資料結構,pcb程序控制塊的**包含了很多資訊,最開始就是程序的狀態資訊
,然後是程序狀態符,程序排程相關資訊等等很多部分。然後老師講解了用fork()建立程序的過程,然後用gdb除錯,跟蹤建立程序的過程。
本週學習的內容在上個學期婁老師的課程中有涉及,所以難度不是非常大,但是老師的講解更加詳細,更加細緻,也更加深入。對於我們理解作業系統中的程序有著非常重要的作用。
作業系統的三大管理功能
struct task_struct資料結構很龐大
程序借助建立原語實現建立乙個新程序。首先為被建立程序在程序表集中區建立乙個pcb--unix系統還要為程序建立u區和記憶體映像,從程序表索取乙個空白pcb表目,記錄它的下標;然後,把呼叫者提供的所有引數(見pcb塊的內容),作業系統分配給新程序的pid和呼叫者的pid,就緒狀態和cpu記賬資料填入該pcb塊;最後,把此pcb塊分別列置到就緒佇列rq和程序隸屬關係族群中。
unix系統使用fork()函式建立新程序時,為子程序複製ep程序的記憶體映像並不是主要目標。這時,若用exec()執行乙個新程式,則子程序的正文段將全部更換,而資料段也將更新。
建立原語可描述如下:
procedurecreate(n,s0,k0,m0,r0,acc)
begin
i:=getinternalname(n);//程序表下標
i.id:=n;i.priority:=k0;//程序pid,程序優先順序
i.cpustate=s0;i.mainstore:=m0;//初始cpu狀態,記憶體位址
i.resources:=r0;i.status:=readys;//資源清單,就緒狀態
j:=ep;i.parent:=j;i.progeny:=φ;//父程序是ep程序,子程序空
j.progeny:=i;//程序隸屬關係
i.sdata=rq;insert(rq,i);//到就緒程序佇列排隊
continue
end
1、啟動menuoscd linuxkernel
2、2. gdb除錯fork命令
qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img -s -s
在新視窗中啟動除錯:
$ gdb
$ file linux-3.18.6/vmlinux
$ target remote:1234
並設定斷點
在menu系統中輸入fork指令,可以看到只輸出了fork功能的描述,在斷點處sys_clone處停止了。繼續執行,觀察每個斷點出的結果。
建立乙個新程序的執行過程
1.通過呼叫do_fork來實現程序的建立;
2.複製父程序pcb--task_struct來建立乙個新程序,要給新程序分配乙個新的核心堆疊;
3.修改複製過來的程序資料,比如pid、程序鍊錶等等執行copy_process和copy_thread
4、成功建立新程序
20135320趙瀚青LINUX期中總結
本學期的linux核心這門課程已經進行了一半,這門課的學習方法和上個學期深入理解計算機系統的方式差不多,所以也沒有特別多不適應,linux核心在我看來,就是理解乙個作業系統是如何實現各個功能的,先從巨集觀上讓我們理解一下,linux作業系統,然後再讓我們看看各個功能實現的 和過程,包括程序的建立,程...
20135320趙瀚青LINUX第四章讀書筆記
文字編輯程式顯然是 1 0 消耗型的,因為它大部分時間都在等待使用者的鍵盤輸入 無論使用者的輸入速度有多快,都不可能趕上處理的速度 使用者總是希望按下鍵系統就能馬上響應。以模組方式提供的,這樣做的目的是允許不同型別的程序可以有針對性地選 擇排程算哉。cfs的做怯是允許每個程序執行一段時間 迴圈輪轉 ...
20135320趙瀚青LINUX第三章讀書筆記
是處於執行期的程式以及它所包含的資源的總稱。執行緒的定義 是在程序中活動的物件。每個執行緒都擁有乙個獨立的程式計數器 程序棧和一組程序暫存器。核心排程的物件是執行緒,而不是程序。3.2 程序描述符及任務結構 程序描述符的結構 task struct,定義在中,包含乙個具體程序的所有資訊。task s...