《Linux内核分析》第一周笔记 计算机是如何工作的
一、計算機是如何工作的?
1、存儲程序計算機工作模型
1)馮諾依曼體系結構
學習研究計算機的基本概念。就是指存儲程序計算機。所有的有計算功能的電子設備小到計算器,大到超級計算機核心部分都可以用這種體系結構來描述。
2)存儲程序計算機工作模型
從硬件(計算機的主板):邏輯上抽象為,CPU與內存之間通過總線連接,CPU內部有一個關鍵寄存器IP(Instruction Pointer)(在16位CPU中叫IP,在32位CPU中叫EIP,在64位CPU中叫RIP),總是指向內存的某塊區(qū)域,指向內存中的代碼段CS(Code Segment)。CPU從IP指向的內存地址取一條指令執(zhí)行,完成后IP自+1,執(zhí)行下一條指令,之后重復取指令執(zhí)行。
從程序員:內存保存指令和數據,CPU負責解釋和執(zhí)行這些指令。
3)CPU識別什么樣的指令?如何定義?
API:程序員與計算機的接口界面。
ABI:程序與CPU接口界面
- 匯編指令
- 約定使用什么樣的寄存器
- 對X86來講,多數指令可直接訪問內存
EIP:在X86計算機中EIP指向內存的一條指令,EIP自動加到下一條指令,每條指令的長度不同,也可被CALL、RET、JMP、condition JMP指令修改。
2、X86匯編基礎
1)?X86 CPU的寄存器
1.通用寄存器:
32位的寄存器中,低16位作為16位的寄存器:AX、BX、CX、DX。
開頭為E的寄存器是32位。累加器EAX、基地址寄存器EBX、計數寄存器ECX、數據寄存器EDX、堆棧基指針EBP(重要)、變址寄存器ESI和EDI、堆棧頂指針ESP(重要)。堆棧是計算機中基礎性的東 ???????????西。
開頭為R的寄存器是64位。機制上與32位差別不大。
2.段寄存器:
CS——代碼段寄存器(Code Segment Register),其值為代碼段的段值;
DS——數據段寄存器(Data Segment Register),其值為數據段的段值;
ES——附加段寄存器(Extra Segment Register),其值為附加數據段的段值;
SS——堆棧段寄存器(Stack Segment Register),其值為堆棧段的段值;
FS——附加段寄存器(Extra Segment Register),其值為附加數據段的段值;
GS——附加段寄存器(Extra Segment Register),其值為附加數據段的段值。
其中代碼段和堆棧段使用最多。CPU在實際取指令時根據cs:eip來準確定位一個指令的內存地址。
3.標志寄存器:
用于標識當前狀態(tài)。
2)常見匯編指令
1.mov指令及幾種內存尋址方式
b,w,l,q分別代表8位,16位,32位和64位
- 寄存器尋址,以%開頭的寄存器標示符,操作寄存器,與內存無關。
- 立即尋址,立即數是以$開頭的數值,與內存無關。
- 直接尋址,直接訪問一個指定的內存地址的數據。沒有$則表示地址,將內存地址0x123指向的內存數據放入edx寄存器。
- 間接尋址,將寄存器的值作為一個內存地址來訪問內存,寄存器ebx存的值作為內存地址,將內存地址存儲的數據放入edx。
- 變址尋址,在間接尋址之時改變寄存器的數值。
- Linux使用的A&T匯編格式與Intel匯編略有不同。
2.幾個重要匯編指令push pop call ret
- 壓棧:把eax這個寄存器壓棧到堆棧的棧底,ebp指向棧底,將eax放到esp所在的內存位置。棧的位置在增長。
- 出棧:棧的位置在收縮。
- 函數調用:把地址0x12345地址放到eip里,eip存儲著當前cpu要讀取指令的地址(指令指針),表示CPU下條指令從0x1234開始執(zhí)行。
- return:ret是把之前保存的eip還原,ret后會繼續(xù)執(zhí)行函數調用完的下一條指令。
*表示是偽指令,不能被程序員直接使用。因為eip寄存器不能被直接修改,只能通過指令間接修改。
3)練習
例1
??????????????
??????????????
?例2
??????????????
???????????????
例3
???????????????
???????????????
3、匯編一個簡單的C程序
實驗過程
實驗代碼
匯編代碼
分析匯編代碼
函數的返回值默認使用eax存儲返回給上一級函數
?
?
4、總結
通過第一次學習《Linux內核分析》這門課程,我收獲了許多知識。首先復習了馮諾依曼體系結構的知識,對存儲程序計算機工作模型從兩個方面進行了了解。之后有了解了CPU可以識別的口令。第二部分學習了X86的匯編基礎知識,了解了CPU的三種寄存器,以及幾種重要的尋址方式寄存器尋址,以%開頭的寄存器標示符,操作寄存器,與內存無關。立即尋址,立即數是以$開頭的數值,與內存無關。直接尋址,直接訪問一個指定的內存地址的數據。間接尋址,將寄存器的值作為一個內存地址來訪問內存,寄存器ebx存的值作為內存地址,將內存地址存儲的數據放入edx。變址尋址,在間接尋址之時改變寄存器的數值。之后學習并應用了幾個重要匯編指令push pop call ret,通過習題更加了解這些指令的具體含義。
?
轉載于:https://www.cnblogs.com/20135132yoggie/p/5220003.html
總結
以上是生活随笔為你收集整理的《Linux内核分析》第一周笔记 计算机是如何工作的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高尔夫属于一汽大众还是上海大众
- 下一篇: linux 其他常用命令