1、源程式如.c/.cpp
2、經過預處理器,得到被修改後的源程式.i:
預處理器可以刪除注釋、包含其他檔案以及執行巨集(巨集macro是一段重複文字的簡短描寫)替代。
3、經過編譯器,得到彙編文字.s
4、經過彙編器,得到可重定位目標程式,二進位制檔案.o
5、經過鏈結器,如printf.o加入,得到可執行目標程式
6、程式存放在磁碟中或載入到記憶體中執行
乙個典型的elf可執行檔案中各類資訊:
elf頭部描述了檔案格式,包括程式的入口點等;
elf可執行檔案載入到記憶體;載入—execve函式呼叫載入器—將檔案**+資料從磁碟拷到記憶體;然後跳轉到程式入口點。
如何利用虛擬儲存器將磁碟上**+資料對映到記憶體中?
載入是一次全部載入進去還是一部分一部分載入進去?請看linux檔案系統。
程式有自己的儲存器映像,而32位linux上**段總是從0x08048000開始;資料段在4kb對齊位址上;執行時堆在讀/寫段之後接下來的第乙個4kb對齊位址處,並呼叫malloc而增長;而使用者棧自頂向下生長,是使用者程序空間中的一塊區域,用於儲存使用者程序的子程式間相互呼叫的引數、返回值、返回點以及子程式(函式)的區域性變數。
核心在建立乙個程序時首先要將其段暫存器都設定好。
具體即:cs:index=4, ti=0(使用gdt), rpl=3(使用者特權);ds-es-ss: index=5, ti=0(使用gdt), rpl=3(使用者特權);切換到核心態,則cs: index=2,ti=0, rpl=0; ds-es-ss: index=3, ti=0, rpl=0。
通過此暫存器得到gdt表(所有程序共用)的2,3,4,5項,其基位址均為0,上限4g,不同在於dpl表示特權等級,s表示型別,type表示屬性。dpl與段的rpl進行核對,cs不能訪問資料段進行核對。其實這核對意義不大,頁式對映時也要比對,無非是mmu要求而走流程。
注意:程式計數器pc即指令指標暫存器ip,或者又作為段偏移位址暫存器,它們都是儲存下一條執行指令的位址。x86上一般叫ip,arm上叫pc/r15。在x86上不能直接給ip賦值,可以通過jmp來改變它的值;在arm上可以通過ldr直接對pc賦值。
乙個程序在執行時,cpu的所有暫存器中的值、程序的狀態以及堆疊中的內容被稱為該程序的上下文。
乙個程序的上下文可以分為三個部分:使用者級上下文、暫存器上下文以及系統級上下文。
使用者級上下文: 正文、資料、使用者堆疊以及共享儲存區;
暫存器上下文: 通用暫存器、程式暫存器(ip)、處理器狀態暫存器(eflags)、棧指標(esp);
系統級上下文: 程序控制塊task_struct、記憶體管理資訊(mm_struct、vm_area_struct、pgd、pte)、核心棧
當核心需要切換到另乙個程序時,它需要儲存當前程序的所有狀態,即儲存當前程序的上下文,以便在再次執行該程序時,能夠必得到切換時的狀態執行下去。
在linux中,當前程序上下文均儲存在程序的任務資料結構中。在發生中斷時,核心就在被中斷程序的上下文中,在核心態下執行中斷服務例程。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢復被中斷程序的執行。
二 計算機基礎
首先,這是乙個很基礎的知識,本來是不打算寫的,但是考慮到這套筆記的完整性,還有一些人剛接觸計算機,所以還是記一下會好一些。計算機英文名 computer全稱 電子計算機 俗稱 電腦 無論是你玩的遊戲 qq 電腦上跑的東西統稱為程式 電腦是能夠按照程式的執行,自動 高速處理海量資料的現代化智慧型電子裝...
計算機原理 程式執行過程
本章主要介紹程式執行過程中作業系統 cpu都幹了什麼 程式在執行前,只是在硬碟上待著,此時就是一堆二進位制 而已,沒有任何作用。程式只有進入了記憶體才能執行,但是要進入記憶體,則需要服從作業系統的排程。乙個程式在執行的時候可能需要很大的空間,比如3g,但是作業系統不可能為每個程式都分配那麼大,因為同...
計算機 計算機基礎整理
大學四年浪費的代價。半夜整理東西 cpu 其功能主要是解釋計算機指令以及處理計算機軟體中的資料。cpu由運算器 控制器和暫存器及實現它們之間聯絡的資料 控制及狀態的匯流排構成。差不多所有的cpu的運作原理可分為四個階段 提取 fetch 解碼 decode 執行 execute 和寫回 writeb...