本文小編為大家詳細介紹“Linux的底層體系結(jié)構(gòu)是怎樣的”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Linux的底層體系結(jié)構(gòu)是怎樣的”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
資中網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、自適應網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選成都創(chuàng)新互聯(lián)公司。
計算機的工作模式
對于一個計算機來說,最核心的是CPU,CPU是計算機的大腦,所有設備都圍繞其展開
CPU通過總線(Bus)與其他設備連接,在這些設備中,最為重要的是內(nèi)存(Memory)
單靠CPU是無法完成計算任務的,很多復雜的計算任務都需要將中間結(jié)果保存下來,然后基于中間結(jié)果進行下一步的計算
CPU和內(nèi)存是完成計算的核心組件
CPU本身無法保存這么多的中間結(jié)果,因此需要依賴于內(nèi)存
CPU
CPU包含三部分:運算單元、數(shù)據(jù)單元和控制單元
運算單元只管計算,但它不知道應該算哪些數(shù)據(jù),運算結(jié)果應該放在哪里
運算單元計算的數(shù)據(jù)如果每次都要經(jīng)過總線,直接到內(nèi)存里面現(xiàn)拿,速度會很慢,因此出現(xiàn)了數(shù)據(jù)單元
數(shù)據(jù)單元包括CPU內(nèi)部的緩存和寄存器組,空間很小,但速度很快
控制單元是一個統(tǒng)一的指揮中心,可以獲得下一條指令,然后執(zhí)行這條指令
這個指令會指導運算單元取出數(shù)據(jù)單元中的某幾個數(shù)據(jù),計算出結(jié)果,然后放在數(shù)據(jù)單元的某個地方
計算過程
1. 每個進程都有一個程序放在硬盤上,是二進制的,在里面存儲的是一行一行的指令,這些指令會操作一些數(shù)據(jù)
2. 進程開始運行,會有獨立的內(nèi)存空間,相互隔離但不連續(xù) - 程序會分別加載到進程A和進程B的內(nèi)存空間里面,形成各自的代碼段
3. 程序在運行過程中要操作的數(shù)據(jù)和產(chǎn)生的計算結(jié)果,都會放在數(shù)據(jù)段(內(nèi)存)里
4. 在CPU的控制單元里面,有一個指令指針寄存器,記錄的是下一條指令在內(nèi)存中的地址 - 控制單元會不停地將代碼段的指令拿進來,先放入指令寄存器
5. 指令的組成部分:做什么操作 + 操作哪些數(shù)據(jù) - 要執(zhí)行指令,需要將***部分交給運算單元,將第二部分交給數(shù)據(jù)單元
6. 數(shù)據(jù)單元根據(jù)數(shù)據(jù)的地址,從數(shù)據(jù)段里讀取數(shù)據(jù)到數(shù)據(jù)寄存器,最終會有指令將數(shù)據(jù)寫回到內(nèi)存中的數(shù)據(jù)段
7. CPU里有兩個寄存器,專門保存當前處理進程的代碼段起始地址和數(shù)據(jù)段起始地址,圖中的當前進程為進程A
8. CPU和內(nèi)存通過總線傳輸數(shù)據(jù),總線上有兩類數(shù)據(jù) - 地址總線(Address Bus):地址數(shù)據(jù),位數(shù)決定了能訪問的地址有多廣 - 數(shù)據(jù)總線(Data Bus):真正的數(shù)據(jù),位數(shù)決定了一次性能拿多少數(shù)據(jù)
x86架構(gòu)
型號
8086的原理
通用寄存器
為了暫存數(shù)據(jù),8086處理器內(nèi)部有8個16位的通用寄存器,屬于CPU內(nèi)部的數(shù)據(jù)單元
分別是AX、BX、CX、DX、SP、BP、SI和DI
其中AX、BX、CX和DX可以分成兩個8位的寄存器來使用,其中H就是High,L就是Low
這樣,比較長的數(shù)據(jù)也能暫存,比較短的數(shù)據(jù)也能暫存
控制單元
IP寄存器(Instruction Pointer Register)即指令指針寄存器
- 指向代碼段中下一條指令的位置
- CPU會根據(jù)IP寄存器不斷地將指令從內(nèi)存的代碼段中,加載到CPU的指令隊列中,然后交給運算單元去執(zhí)行
切換進程
- 每個進程都分為代碼段和數(shù)據(jù)段
- 為了指向不同進程的地址空間,有4個16位的段寄存器,分別是CS、DS、SS和ES
CS(Code Segment Register)是代碼段寄存器,通過它可以找到代碼在內(nèi)存中的位置
DS(Data Segment Register)是數(shù)據(jù)段寄存器,通過它可以找到數(shù)據(jù)在內(nèi)存中的位置
SS(Stack Segment Register)是棧寄存器,但凡與函數(shù)調(diào)用相關(guān)的操作,都與棧緊密相關(guān)
- A調(diào)用B,B調(diào)用C
- 當A調(diào)用B的時候,要執(zhí)行B函數(shù)的邏輯,因而A運行的相關(guān)信息會被push到棧里
- 當B調(diào)用C的時候,同理,B運行的相關(guān)信息會被push到棧里,然后才運行C函數(shù)的邏輯
- 當C運行完畢后,先pop出來的是B,B接著調(diào)用C函數(shù)之后的指令運行下去
- B運行完畢后,再pop出來的是A,A接著運行,直至結(jié)束
加載內(nèi)存數(shù)據(jù)
如果需要加載內(nèi)存中的數(shù)據(jù),可以通過DS找到內(nèi)存中的數(shù)據(jù),加載到通用寄存器
對于一個段,有一個起始地址,而段內(nèi)的具體位置,稱為偏移量
CS和DS都存放著一個段的起始地址
代碼段的偏移量放在IP寄存器
數(shù)據(jù)段的偏移量放在通用寄存器
CS和DS都是16位的(起始地址),IP寄存器和通用寄存器也都是16位的(偏移量),但8086的地址總線是20位的
湊20位:起始地址 << 4 + 偏移量
無論真正的內(nèi)存有多大,對于只有20位地址總線的8086來說,能夠區(qū)分的地址也就2^20=1M(尋址單位為Byte)
如果想訪問1M+X的地方,在總線上超過20位的部分根本發(fā)不出去,***訪問的還是1M內(nèi)的X位置
偏移量只有16位的,所以一個段的***大小為2^16=64K
因此對于8086的CPU來說,最多只能訪問1M的內(nèi)存空間,還要分成多個段,每個段***為64K
32位處理器
在32位的CPU中,有32根地址總線,可以訪問2^32=4G的內(nèi)存
x86架構(gòu)是開放的,因此32位的CPU需要兼容原來的架構(gòu)
兼容
1. 通用寄存器 - 將8個16位的通用寄存器擴展到8個32位的通用寄存器,但依然保留16位和8位的使用方式 - 高16位不能分成兩個8位使用,因為這是不兼容的
2. IP寄存器 - 指向下一條指令的指令指針寄存器IP,會擴展成32位的,同樣兼容16位
3. 段寄存器(Segment Register) - CS、DS、SS和ES仍然是16位,但不再是段的起始地址,段的起始地址放在內(nèi)存的某個地方(表格)
- 表格中的一項是段描述符(Segment Descriptor),里面才是段真正的起始地址 - 而段寄存器里面保存的是這個表格中的某一項,稱為選擇子(Selector)
- 獲取段起始地址的流程:先間接地從段寄存器中找到表格中的一項,再從表格中的一項拿到段真正的起始地址
- 為了快速拿到段的起始地址,段寄存器會從內(nèi)存中拿到CPU的描述符高速緩存器中
- 這種模式與8086的模式不兼容,但非常靈活,可以保持未來的兼容性
實模式 VS 保護模式
在32位的架構(gòu)下,將前一種模式稱為實模式(Real Pattern),后一種模式稱為保護模式(Protected Pattern)
系統(tǒng)剛剛啟動的時候,CPU處于實模式,此時和原來的模式是兼容的。即32位的CPU,也支持在原來的模式下運行,速度會快一點
當需要更多內(nèi)存時,可以遵循一定的規(guī)則,進行一系列的操作,然后切換到保護模式,就能夠用到32位CPU更強大的能力
如果不能無縫兼容,但通過切換模式兼容,也是可以接受的
系統(tǒng)交互
常用匯編指令
mov, call, jmp, int, ret, add, or, xor, shl, shr, push, pop, inc, dec, sub, cmp
讀到這里,這篇“Linux的底層體系結(jié)構(gòu)是怎樣的”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。