邏輯地址,就是指機(jī)器語言指令中用來指定一個(gè)操作數(shù)或一條指令的地址,由一個(gè)段(segment)和偏移量(offset)組成,說地直白點(diǎn)就是CPU拿到的地址岸裙。
線性地址,也叫虛擬地址速缆,就是進(jìn)程使用的地址降允。值得注意的是這個(gè)地址就是一個(gè)32位無符號(hào)的整型數(shù),所以虛擬地址空間總共就是4 GB大小艺糜。
MMU有兩個(gè)硬件電路單元剧董,一個(gè)稱之為分段單元(segmentation unit)、一個(gè)稱之為分頁單元(paging unit)破停,下面是它的工作原理:
邏輯地址 -> [分段單元] -> 虛擬地址 -> [分頁單元] -> 物理地址
所以MMU的存在使64位系統(tǒng)的內(nèi)存大于4G時(shí), 仍可以進(jìn)行尋址, 實(shí)際訪問到的物理地址是由MMU進(jìn)行分配映射的.
add eax, ebx
流程: 預(yù)取器從cache中獲取一條二進(jìn)制指令, 交給譯碼器判斷指令內(nèi)容, 從而調(diào)用對(duì)應(yīng)的加法器和寄存器, 交給ALU做算術(shù)操作(只能加法和左移), 之后再賦值給寄存器, 然后再返回到內(nèi)存里, 交給主線.
linux下CPU權(quán)限只使用0級(jí)和3級(jí), 由MMU修改內(nèi)存訪問級(jí)別. MMU映射到物理內(nèi)存的最小單位是頁, 一頁4k.
兩個(gè)進(jìn)程的用戶區(qū)分別由MMU映射到物理內(nèi)存的不同部分, 但kernel區(qū)指向物理內(nèi)存的同一塊, 因?yàn)閗ernel只有一份. 雖然兩個(gè)進(jìn)程的PCB表不同, 但共存于同一塊物理內(nèi)存中.
進(jìn)程四種狀態(tài)
進(jìn)程有5種狀態(tài), 其中初始化和就緒態(tài)常合二為一. 掛起是一種阻塞態(tài), 一般是等待I/O, 暫停運(yùn)行, 等得到需要的資源后再就緒等待時(shí)間片. 各個(gè)狀態(tài)均可以在任意時(shí)刻被停止(kill).
環(huán)境變量
環(huán)境變量表是一個(gè)char*數(shù)組, 結(jié)尾是NULL, 類似于命令行參數(shù), 導(dǎo)入環(huán)境變量需要聲明extern char** environ
. 需要注意區(qū)分shell和程序是不同的進(jìn)程, 其環(huán)境變量也不同, 只是值可以一樣.
getenv("PATH")
返回對(duì)應(yīng)環(huán)境變量的值, setenv("ABC", "aabbcc", 1)
設(shè)置新的環(huán)境變量, 1表示覆蓋已有的, 0表示創(chuàng)建新的或不覆蓋原有的(此時(shí)前兩個(gè)參數(shù)作廢).
unsetenv("ABC")
刪除環(huán)境變量, 刪除不存在的環(huán)境變量時(shí)返回0也視作成功, 只有unsetenv("ABC=")
這種情況才會(huì)返回-1看作失敗.