程式源**被編譯後主要分成兩種段:程式指令和程式資料,**屬於程式指令,而資料段和.bss屬於程式資料。
為什麼程式指令和資料不混在在一起而是分開放?
1.因為程式被裝載後,資料和指令分別被對映到兩個虛存區域。由於資料區域對於程序來說是可讀寫的。
而指令區域對於程序來說是可讀的。所以這兩個虛存區域的許可權可以分別被設定成可讀寫可唯讀,可以防止程式的指令被有意或無意地改寫。
2.對於現在的cpu來說,有極為強大的快取,由於快取對於現在計算機中地位非常重要。程式必須盡量提高快取的命中率,指令區和資料區的分離有利於提高程式的區域性性。
現代cpu的快取一般都被設計成資料快取和指令快取分離,所以指令和資料分開存放對cpu的快取命中率提高有好處。
3.最重要的原因:當系統中執行著多個該程式的副本時,它們的指令都是一樣的。記憶體中只需要儲存乙份改程式的指令部分。
目標檔案裡有什麼
1.text段是 段,比如main程式就存放在這裡 data段存放已初始化的資料而且初始化不為0 bss段存放未初始化或初始化為0的資料 英文含義 以符號開始的塊 在這裡我們引發出幾個問題 1 我們都知道.bss段不佔空間,它到底不佔 的空間?虛擬位址空間還是檔案空間?答案是檔案空間,因為對於.bs...
目標檔案裡有什麼?
目標檔案從結構上講,它是已編譯後的可執行檔案格式 windows的.obj或linux的.o 只是還沒有經過鏈結的過程。它跟可執行檔案的內容和結構很類似,所以一般跟可執行檔案格式一起採用一種格式儲存。無論是linux下的elf executable linkable format 或windows下...
目標檔案裡有什麼 揭秘目標檔案
程式源 被編譯後生成的機器指令被放在 段 text 全域性變數和區域性靜態變數被放在資料段 data 除此之外還有程式裡邊的唯讀變數 如const修飾的變數 和字串常量被分配在唯讀資料段 rodata 注釋資訊段 comment 堆疊提示段 nute.gnu stack 未初始化的全域性變數和靜態區...