有問題請一定支援,歡迎討論
今天對幾個概念進行了統一,程序,程式從編譯到執行,指令執行,cpu對記憶體相關操作
大概流程 更多細節(待補充):
首先明確幾個概念:
程序:程式動態執行的過程
多層次儲存器結構:
指令:
cpu:
程式從編譯到執行主要經過三個階段
編譯
鏈結裝入
不同文章書籍有不同劃分,大致就這幾個階段
乙個程式本質上都是由 bss段、data段、text段三個組成的
詳細:乙個源程式到可執行檔案時,其中不同變數(全域性,靜態,區域性)函式要裝入可執行檔案(.out) (目標檔案.o)的不同段
補充:.o檔案一般是通過編譯的但還未鏈結的
.out檔案一般都是經過相應的鏈結產生的可執行檔案(linux下)
可執行程式再以不同方式被裝入進記憶體,完成邏輯位址到實體地址的對映
大概流程:
先為程式中的各部分分配好虛擬位址,然後再建立虛擬位址到實體地址的對映。其實關鍵的部分就是虛擬位址到實體地址的對映過程。程式裝在完成之後,cpu的程式計數器pc就指向檔案中的**起始位置,然後程式就按順序執行。
可執行檔案到記憶體:(記憶體也分段)
程式進入記憶體執行時,建立程序(不是太確定)
在此之前程式一般在外存上
裝入記憶體分為三種方式:
絕對裝入
靜態重定位
動態重定位
這三種方式完成邏輯位址到實體地址的對映
詳見:程式進入記憶體開始運,作業系統需要對記憶體空間進行管理(以保證程式順利執行)
程序也開始相應操作,各種排程演算法,可聯絡作業系統程序相關加深理解
cpu開始對程式進行操作,取指令,執行指令,讀寫資料等
cpu將程式指令從記憶體取進暫存器,開始指令週期操作:
詳細:cpu對儲存器的讀取操作(取資訊)(需要實體地址):cpu通過三匯流排進行讀取操作:(具體可見組合語言 王爽)cpu向位址線輸出實體地址3
控制線需要選擇相應的儲存裝置,然後通知該裝置,將要從中讀取資料
該儲存裝置會將資料8送入資料線
段位址由段暫存器提供 8086cpu中有4個段暫存器(cs,ds,ss,es)
其中cs:**段暫存器(訪問**段(文字段)位址),ip為指令指標暫存器,這兩個組合,cs:ip指向內容當作指令執行(也就區別了指令與資料)。
ds:資料段暫存器,用於存放資料段位址,訪問記憶體中的資料段
棧段:用ss:sp指向棧定元素
將資訊讀取過來後通過
資料與指令都是一樣的二進位制數 cpu區分兩者:
詳細:1.時間段:取址週期取指令存入指令暫存器,執行週期從記憶體取出或往記憶體中寫入的是資料
2.位址(空間):由pc提供儲存單元位址的取出的是指令,由指令位址碼部分提供儲存單元位址的取出的是運算元。
它指定了2個暫存器(分別叫cs, ip,cs用來存段位址,ip用來存偏移位址),讓它們來表示當前需要被執行的機器碼的實體地址,在執行**的過程中,cpu會去維護cs和ip的值,比如每執行一句機器碼,ip會增加相應的數值以指向下一句指令。以此類推,我們可以用其他的暫存器去表示資料的實體地址。
程式從編譯到執行的具體思維導圖:
記憶體中rom ram
記憶體(ram+rom) 外存(rom)
簡單總結:
乙個源程式經編譯鏈結成為可執行檔案,在執行時將其裝入記憶體(建立程序)(一般在外存),裝入記憶體時要完成邏輯位址到實體地址的轉換,有三種方式。裝入記憶體後,cpu開始執行程式,將相關指令取進暫存器,涉及cpu對儲存器的讀取操作(涉及找實體地址及cpu分辨指令與資料)。然後開始指令週期的相關操作。之前可能有理解錯誤的地方,
困惑:指令三階段還需解碼,但程式被裝入記憶體已經過編譯過程(還需再解碼?這個解碼是?)程式是指令集?
如有錯誤請一定指出。
從編碼到執行 程式編譯過程詳解
程式從一堆字元怎麼變成乙個可執行的程式呢,在這我們使用最簡單的乙個hello word 程式來演示程式的乙個完整流程。在這過程中找到一些有用的除錯方法,幫助我們在debug時快速解決問題。程式編譯時的整體流程經過 執行環境 windows 10 cygwin gcc 版本 7.4.0 按照c語言語法...
C語言從編譯到執行過程詳解
目錄 最近在看csapp 深入理解計算機系統 然後以前也學過c語言,但是從來沒有深究寫好的c 是怎麼編譯再到執行的。所以現在自己學習,然後記錄下來。以最常用的hello world!程式為例 程式名 main.c include int main hel程式設計客棧lo程式的生命週期是從乙個高階c語...
一段程式從編譯到硬體再到執行的過程
以下內容還未整理好,謹慎 哈哈哈 前言知識 主儲存器 是整個儲存系統的核心,它用來存放計算機執行期間所需要的程式和資料,cpu可直接隨機地對它進行訪問。主存地讀寫操作是在控制器地控制下進行的,只有接收到來自控制器地讀寫命令或寫允許後,才能實現正確地讀寫操作 cpu 是整個計算機地核心,是對指令流和資...