平坦尋址:
堆、棧:棧內(nèi)存由高地址向低地址增長,堆內(nèi)存由低地址向高地址增長
棧幀:棧基地址ebp,棧頂?shù)刂積sp
壓棧、彈棧:
數(shù)據(jù)總線寬度:
地址總線寬度:
寄存器位數(shù):一般和數(shù)據(jù)線寬度一致
8086 : 16位CPU,數(shù)據(jù)總線16位,地址總線20位(4位基地址+16位偏移地址)
80386: 32位CPU,數(shù)據(jù)總線和地址總線都是32位
實模式:
保護模式:
段式內(nèi)存管理:
頁式內(nèi)存管理:
虛擬地址(邏輯地址)->線性地址->物理地址:前面說到在線性地址轉(zhuǎn)換為物理地址之前,要先由邏輯地址轉(zhuǎn)換為線性地址。系統(tǒng)采用段式管理機制來實現(xiàn)邏輯地址到線性地址的轉(zhuǎn)換。保護模式下,通過”段選擇符+段內(nèi)偏移”尋址最終的線性地址。
CPU的段機制提供一種手段可以將系統(tǒng)的內(nèi)存空間劃分為一個個較小的受保護的區(qū)域,每個區(qū)域為一個段。相對32位系統(tǒng),也就是把4G的邏輯地址空間換分成不同的段。每個段都有自己的起始地址(基地址),邊界和訪問權(quán)限等屬性。實現(xiàn)段機制的一個重要數(shù)據(jù)結(jié)構(gòu)就是段描述符
段選擇符:段選擇符占兩個字節(jié),其中高13位是段描述在段描述表中的索引,低3位是一些其他的屬性
段描述符:8字節(jié)的數(shù)據(jù)結(jié)構(gòu)(段基地址4字節(jié),段邊界2.5字節(jié),和其他的一些12位)
段描述符表:表的基地址(起始地址)和一些表的信息(如邊界)存放在GDTR寄存器
BSS段(.bbs):未初始化全局變量,靜態(tài)內(nèi)存分配(由操作系統(tǒng)初始化)
數(shù)據(jù)段(.data):初始化全局變量,靜態(tài)內(nèi)存分配(由程序初始化)
代碼段(.text):程序代碼,通常只讀
堆:動態(tài)分配
棧:局部變量,形參
可執(zhí)行文件:Linux下為ELF(Executable Linkable Format),其中ELF頭中存放各個段的起始地址和長度以及其他的信息,各個段中存放不同屬性內(nèi)容,其中c程序中的變量在ELF文件中的存儲區(qū)域如下圖所示:
.bss段的大小可以通過ELF頭中的信息得到,但是這只是一個“大小”數(shù)據(jù),告訴程序中的非初始化的全局和靜態(tài)變量會共占用多少內(nèi)存,在文件中并不會有它的空間,只有當可執(zhí)行文件裝載運行時,才會被分配內(nèi)存(并且位于data段內(nèi)存塊之后),并且初始化為0.
描述進程的結(jié)構(gòu)體(linux中為task_struct):task_struct中包含了進程的相關(guān)信息,比如進程狀態(tài),寄存器,內(nèi)核棧,狀態(tài)字,內(nèi)存分配mm_struct。在進程切換的時候,系統(tǒng)將原進程的相關(guān)信息保存到它對應(yīng)的task_struct中;然后選擇另一個進程,將task_struct中的信息裝載到機器的寄存器中去,然后新的進程就按照它的task_struct來指導(dǎo)運行....
指令類:mov,add,sub,imul,xor,or,and,sal, shl,sar,shr,inc,dec,neg,not,leal,push,pop,jump
加減乘,與,或,異或,加一,減一,取負,取補,左移,算術(shù)右移,邏輯右移,加載有效地址,壓棧,彈棧,跳轉(zhuǎn)等等