黃二玉+《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...