一、計算機是如何工作的(總結)
1、三個法寶:
儲存程式計算機
函式呼叫堆疊
中斷機制
二、深入理解函式呼叫堆疊
1、堆疊是c語言程式執行時必須的乙個記錄呼叫路徑和引數的空間。
函式呼叫框架
傳遞引數
儲存返回位址
提供區域性變數空間
2、了解堆疊存在的目的和編譯器對堆疊使用的規則是理解作業系統一些關鍵性**的基礎
3、堆疊相關的暫存器
esp 堆疊指標
ebp 基址指標(在c語言中用作記錄當前函式呼叫基址)
4、操作
push 棧頂位址減少4個位元組(32位)
pop 棧頂位址增加4個位元組
4.其他關鍵暫存器
cs:eip 總是指向下一條的指令位址
順序執行:總是指向位址連續的下一條的指令位址;
跳轉/分支:執行這樣的指令的時候,cs:eip的值會根據程式需要被修改;
call:將當前cs:eip的值壓入棧頂,cs:eip指向被呼叫函式的入口位址。
ret:從棧頂彈出原來儲存在這裡的cs:eip的值,放入cs:eip中。
5、深入理解函式呼叫堆疊的工作機制
6、函式呼叫時堆疊的變化
三、引數傳遞與區域性變數
舉例分析函式呼叫堆疊:
首先使用gcc -g生成test.c的可執行檔案test,然後使用objdump -s獲得test的反彙編檔案。
1、內嵌彙編語法
【89行】每迴圈十萬次列印一次mykernel
每次時鐘中斷都呼叫一次printk,並輸出
六、程序分析
在mykernel基礎上構造的簡單的作業系統核心
1、mypcb.h
1、本檔案中定義了thread結構體,用於儲存當前程序中正在執行的執行緒的eip和esp。
2、pid:程序號
thread:當前正在執行的執行緒資訊
task_entry:程序入口函式
next:指向下乙個pcb(模擬系統中所有的pcb是以鍊錶的形式組織起來的)。
my_schedule:排程器。
核心初始化和0號程序啟動
1、函式my_start_kernel完成了0號程序的初始化和啟動(入口是myprocess)。
2、程序剛啟動時next指向自己。
3、建立了其它的多個程序,在初始化這些程序的時候可以直接利用0號程序的**。
4、迴圈1000萬次判斷一次是否需要排程。
1、my_timer_handler 函式每呼叫1000次,把 my_need_sched的值修改為1,通知正在執行的程序執行排程程式my_schedule。
2、作業系統「兩劍」:中斷上下文、程序上下文的切換。
七、學習總結
本週對上一周計算機是如何工作的進行了總結,並就作業系統是如何工作的進行了學習,其中有函式呼叫堆疊、引數傳遞與區域性變數、利用mykernel實驗模擬計算機硬體平台、c**中嵌入彙編**的寫法等課程。
老師通過舉例,讓我們更加清楚、深入地了解了堆疊的變化。既鞏固了舊知識,又學習了新知識。
linux核心分析 作業系統是如何工作的?
struct thread 這是乙個程序的結構體,其中的ip標記的是該程序的eip,而sp標記的是該程序的esp。typedef struct pcbtpcb 這是乙個程序控制塊的結構體,記錄著程序的的各種狀態與資訊。void my schedule void 該函式的功能為排程器,用於程序之間的排...
什麼是作業系統?作業系統和核心的關係
什麼是作業系統 精簡的說的話,作業系統就是乙個協調 管理和控制計算機硬體資源和軟體資源的控制程式。作業系統是裸機上的第乙個軟體程式,作業系統用於管理硬體,並且提供統一的硬體操作介面 用程式呼叫。硬體的介面是比較醜陋複雜的,作業系統封裝後的介面比較優雅,方便應用程式呼叫,不用去直接操作硬體,了解硬體細...
Linux作業系統核心編碼風格
第 1 章 縮排 tabs 製表符 是8個字元的大小。簡而言之,8個字元的縮排使程式更易讀,而且當你把功能隱藏的太深時,多層次的縮排還會對此很直觀的給出警告。要留心這種警告資訊。第 2 章 放置花括號 c程式中另乙個要主意的就是花括號的放置。與縮排尺寸不同的是,關於如何放置花括號沒有技術上的理由。但...