兩個層面:1.硬體: cpu(ip暫存器:指標,指向記憶體的某塊區域)——匯流排——記憶體(**與資料)
2.程式設計師: 記憶體儲存指令與資料,
cpu解釋執行指令
計算機在執行程式時須先將要執行的相關程式和資料放入記憶體儲器中,
在執行程式時cpu根據當前程式指標暫存器的內容取出指令並執行指令,
然後再取出下一條指令並執行,如此迴圈下去直到程式結束指令時才停
止執行。其工作過程就是不斷地取指令和執行指令的過程,最後將計算
的結果放入指令指定的儲存器位址中。
通過核心源**了解,從環境搭建起來,mystartkernerl開始初始化至完成,啟動0號程序,利用時間片,每個程序每隔1000萬次,判斷是否需要排程,排程使用myshedule()進行排程.
設定時間片的大小,時間片用完時,設定一下排程標識。
if(timecount%1000==0&&myneedsched!=1) 當程序執行到的時候,發現
needsched==1,就執行myschedule,排程分兩種情況,一種是下乙個程序正在進行的,
另一種是從未排程過的,程序從未執行過,執行起來特殊點,將狀態轉成執行時狀態,作為當
前執行的程序,esp,ebp指向同一位置兩種彙編**略有不同,是關鍵
linux的啟動過程:核心啟動相關的**基本在init目錄下,init/main.c核心啟動起點start_kernel函式相當於普通c程式中的main函式,搭建環境,啟動核心。
start_kernel的最後一句rest_init建立0號程序裡的kernel_init建立1號程序,
run_init_process建立1號程序,是第1個使用者態程序。pid_kernel_thread(kthreadd,..)用核心執行緒管理系統資源(建立其他核心服務執行緒)。
rest_init啟動完後,call .. cpu_idl , call_startup_entry,cpu_idle_loop裡面while(1)0號程序,當系統無程序須執行時就排程到idle程序
課本第一章:linux的發展過程
與unix的關係
課本第二章:linux核心源**的獲取、解壓、配置、編譯與安裝
c**中嵌入彙編**的寫法使用嵌入式彙編**觸發同乙個系統呼叫
系統呼叫在核心**中的處理過程
應用程式應該以某種方式(庫函式或彙編**)通知系統告訴核心自己需要執行乙個系統呼叫,希望系統切換到核心態。
核心就可以代表應用程式在核心空間執行系統呼叫。
通知核心的機制是靠軟中斷實現的:
通過引發異常將系統切換核心態執行異常處理程式(系統呼叫處理程式)。
自學課本第五章 系統呼叫 系統呼叫與api的異同 系統呼叫觸發過程、引數傳遞
自學課本第十八章 除錯
自學課本第三章 程序管理
程序提供兩種虛擬機制:虛擬處理器和虛擬記憶體
ps:執行緒之間可以共享虛擬記憶體,但每個都擁有各自的虛擬處理器1.fork()建立新程序,父程序用fork建立子程序。fork系統呼叫從核心返回兩次:一次回到父程序,一次回到子程序。
2.exec()可以建立新的位址空間,把新的程式載入其中
3.在linux核心中,fork()實際有clone()系統呼叫實現的。
4.程式通過exit()系統呼叫退出執行。最終中介程序並將其占用的資源釋放掉。
5.父程序通過wait4()系統呼叫查詢子程序是否終結,這使得程序擁有了等待特定程序執行
完畢的能力。
作業系統:1.程序管理 2.記憶體管理 3 檔案系統
1.複製當前程序(建立新程序通過複製當前程序來實現)2.給新程序分配新的核心堆疊
3.修改複製過來的程序資料(如pid,狀態鍊錶,核心堆疊,ip,sp)
1.fork()建立新程序,父程序用fork建立子程序。fork系統呼叫從核心返回兩次:一次回到父程序,一次回到子程序。2.在linux核心中,fork()實際有clone()系統呼叫實現的。
3.程式通過exit()系統呼叫退出執行。最終中介程序並將其占用的資源釋放掉。
程序上下文
一般程式在使用者空間執行。當乙個程式調執行了系統呼叫或者觸發了某個異常,就陷入了核心空間。成核心「代表程序執行」,並處於程序上下文中。
1.fork實際開銷是複製父程序的頁表以及給子程序建立唯一的程序描述符**2.linux通過clone()系統呼叫實現fork()**
3.fork(),vfork(),和clone()庫函式都是根據各自需要的引數標誌去呼叫clone(),然後由clone()呼叫do_fork**
do_fork函式呼叫了copy_process()函式,然後讓程序執行
linux通過複製父程序建立新程序,fork、vfork、clone都是通過do_exit實現程序的建立。
-a.複製乙個pcb
-b.給新程序分配乙個新的核心堆疊(複製了thread_info,不是複製了核心堆疊)
-c.修改複製的資料,即子程序初始化。
從使用者態**看父程序和子程序各返回一次,而子程序從ret_from_fork函式開始執行,從函式中跳轉到syscall_exit,即system_call中的語句。
自學 《深入理解計算機系統》第七章 鏈結
核心是各種中斷處理過程和核心執行緒的集合(1)中斷處理過程(包括時鐘中斷、i/o中斷、系統呼叫和異常)中,直接呼叫schedule(),或者返回使用者態時根據need_resched標記呼叫schedule();
(2)核心執行緒可以直接呼叫schedule()進行程序切換,也可以在中斷處理過程中進行排程,也就是說核心執行緒作為一類的特殊的程序可以主動排程,也可以被動排程;
(3)使用者態程序無法實現主動排程,僅能通過陷入核心態後的某個時機點進行排程,即在中斷處理過程中進行排程。
中斷和中斷返回:有乙個cpu上下文的切換
程序排程過程中:有乙個程序上下文的切換,從乙個程序的核心態堆疊切換到另乙個程序的核心態堆疊。
自學課本第四章 程序排程
1.linux通過引導區,啟動相應的核心,使用qemu指令,啟動相應核心。2.現在的計算機系統使用的是馮諾依曼結構,通過cs:ip指向記憶體相應指令的**。
3.當核心啟動完成之後,我們開始手工建立0號程序。0號程序建立了1號程序和2號程序。
1號程序是所有使用者態的祖先,2號程序是所有核心執行緒的祖先。
4.在建立程序的過程中,涉及到了新程序的複製,新程序堆疊的初始化,
以及一些相應的cs,ip值得修改。
還有建立的子程序從哪句**開始執行,從核心態返回使用者態是否會發生程序排程。
5.在了解了程序的建立過程後,我們又對程序的排程時機以及排程的過程,
相應的上下文切換進行了學習。
並對上下文切換的彙編**,分析了隨每一步**的執行,
兩個程序的堆疊之間的變化。
這裡的重點需要注意的是,
哪部分**是對當前程序執行的,哪部分**是為下乙個新程序切換做準備的。
在變化的過程中ebp,esp分別指向**,cs,ip的值又如何變化。
此外,還要區分切換程序的時候,切換成普通程序和切換成乙個新的程序的起點**在**。
6.然後是對可執行檔案格式的分析,以及可執行程式的裝載等問題
1.在這為數不長的幾周學習裡,對linux系統的工作,有了一些初步的了解(不能說太過深入,好像是心中有了乙個框架),在學習的過程中,還在課下看了一些相應書籍幫助自己理解linux核心,如《linux核心設計與分析》(第三版)和《深入理解計算機系統》。
這樣可以在補充一下自己知識儲備不足的地方。如了解了一些排程策略等。
2.最大的遺憾就是覺得課程突然結束了,還有種沒有反應過來,不敢說對linux核心有很深的了解吧,
但是我覺得可以通過在這幾周網課的學習裡,可以進一步去了解linux核心。而且感覺各種作業系統都有相應類似的地方。
就像孟老師說的,要舉一反三。
3.在源**的分析上,主要通過除錯源**進行分析,我覺得在今後的學習裡,
我將在linux核心的分析裡,進行一些更深入的學習,如進行一些實踐,編乙個系統呼叫以便更好地了解linux核心,並加深知識點對自己的印象。
4.最後,謝謝孟老師這幾周來的辛勤教導,老師辛苦了!
Linux核心學習總結
通過這一段時間對linux核心的學習,我不僅將作業系統課中所講述的那套理論的東西和實際的 結合了起來,加深了對整個linux的執行機理的了解,更是深刻體會到了整個linux系統設計的哲學美感,而且現在linux的整個設計體系已經相當穩定,化繁為簡,這也是大部分伺服器使用linux的重要原因吧。函式呼...
Linux核心學習總結
總結 這一周教會了我計算機的工作原理就是cpu中的暫存器讀取記憶體中的指令,並執行讀取到的指令的工作過程,過程中cpu中的暫存器不斷地變化數值就是計算的過程。這一周教會了我作業系統的執行過程就是不斷地進行程序切換的過程,切換過程主要就是發生中斷,儲存現場再恢復現場的過程。這一周教會了我乙個簡單的li...
Linux核心學習總結
linux核心學習總結 20122137 沙雨濟 轉眼間已經過了九周了,通過這段時間對linux的學習,我對linux已經有了乙個比較系統的認識,並且收穫良多。從一開始還不能將彙編知識和資料結構知識很好地結合起來,到現在能夠熟練地使用實驗樓虛擬機器進行實驗並分析實驗結果。在這段時間裡,無論是將c 反...