mykernel的執行與初步分析

2021-07-27 20:03:04 字數 1421 閱讀 6336

黃二玉+《linux核心分析》mooc課程

預備知識

內嵌彙編

內嵌彙編語法:

_asm_(

彙編語句模板:

輸出部分:

輸入部分:

破壞描述部分);

同時」asm」也可以由「asm」來代替,「asm」是」asm「的別名。在」asm」後面有時也會加上」volatile「表示編譯器不要優化**,後面的指令保留原樣,「volatile」是它的別名,在這裡值得注意的是無論「asm「還是「volatile」中的每個下劃線都不是乙個單獨的下劃線拼成的,在括號裡面的便是彙編指令。

例如,有如下一段程式:

int main(void)

這段會輸出什麼?標號6中的$0表示立即數0,把輸出部分,輸入部分中的變數進行編號依次為0,1,2,…,因此%0表示標號9的output,%1表示temp,%2表示input。

指令的跳轉

cup中的ip暫存器總是存放了下一條要執行的指令,更重要的是ip暫存器的內容無法直接修改,但是可以間接的被修改,比如使用jmp,ret指令,如果要在c語言中實現跳轉到指定的位置,可以借助棧和ret指令來實現,先看ret指令的作用:

為了實現跳轉到指定位置(i.e 位址a),可以把a壓棧,然後利用ret指令,push a; ret,在ret指令執行完後ip暫存器指向的位置就是a了。

儲存和恢復

當乙個函式切換到另乙個函式時需要儲存前乙個函式的資訊,比如說臨時變數,全域性變數,因此需要在另乙個函式開始執行的時候儲存前乙個函式的sp,bp中的數值,需要注意的是為什麼不是程序而是函式?因為乙個程序可以分為**段,資料段,堆疊段等,而每個程序分配的堆疊段是不同的,因此程序切換時不僅僅儲存sp,bp,還需要儲存ss,cs,flag等等狀態的資訊,而在乙個程式的函式間進行切換,**段,資料段,和堆疊段都是一樣的,只是從堆疊區分配給函式的棧不同,因此要保留每個函式自己的棧基址。

儲存:

push bp; //bp入棧

mov sp,bp; //開始乙個新的棧

恢復:

mov bp,sp; //使sp指向儲存了前乙個bp的單元

pop bp; // 把前乙個基址恢復 例子

這個例子是借助linux核心部分源**模擬儲存程式計算機工作模型及時鐘中斷,裡面的彙編**如下:

執行程式輸出如下:

Openshift原始碼與運作方式初步分析

大致看了一下原始碼,然後參考redhat給的livecd,分析出一些openshift的大致運作方式。首先 openshift是通過打包成rpm來安裝的,redhat上面的就是再說如何將源程式build成為rpm檔案。rpm大致介紹可以看每個rpm都有乙個以spec結尾的描述檔案,build的時候這...

如何初步搭建Spring的執行環境

筆者最近也是才開始學習spring。下面就告訴像筆者一樣的初學者如何快速搭建乙個最簡單的spring開發環境。spring 3.2.7 2 在eclipse裡新建乙個dynamic web project,名稱叫testspring 此過程如果不會,請自己查閱相關資料。3 在工程中新增依賴的spri...

PostGIS的安裝與初步使用

的圖形化管理工具,此外像qgis等gis客戶端軟體也提供了管理外掛程式。這裡介紹如何使用pgadmin 4 來完成建立空間資料庫以及在資料庫中匯入空間資料。projcs nad 1983 utm zone 10n geogcs gcs north american 1983 datum d nort...