摘要:即注意,局部變量屬于的是指令而對于全局變量局部,這些都是數(shù)據(jù)即這些,在程序的運行,自始至終都是占著內存的其中,已經初始化的且不為的變量是在段,即段的大小是。
我們寫的程序,需要經過(編譯,鏈接)得到 最終的exe/elf(產生到 磁盤上)。
如果我們要運行他,必須要把他加載到 內存里! 因為cpu訪問內存的速度 要比訪問磁盤,速度快千萬倍
cpu的位數(shù),是指: 他一次性能夠進行運算的 整數(shù)的寬度,因為cpu是在ALU里運算數(shù)據(jù)
所以, cpu的位數(shù) 其實是 ALU的寬度(即,數(shù)據(jù)總線的 條數(shù))
但是, cpu的位數(shù) 不一定等于 地址總線的 條數(shù),他等于的是 數(shù)據(jù)總線的條數(shù)
比如虛擬地址是4GB,(物理內存不一定是4GB?。。牟季指袷绞牵?/p>
[0 - 3GB]
這個地址區(qū)域,稱為 用戶空間
[0 - 128MB]
是forbidden禁止的! 他是禁止訪問的,連訪問都不能,更不能寫!!
[128MB - 3GB]
,這是我們程序可以使用的 虛擬地址區(qū)域
第一個區(qū)域,他劃分為有: [.text] [.data] [.bss]
我們知道,一個程序無非是:(指令) + (數(shù)據(jù))
指令是在:.text段, 數(shù)據(jù)是在:.data段 和 .bss段
緊接著 第二個區(qū)域: heap 堆空間
第三個區(qū)域:用來放到dll共享庫的!
比如,你用了很多scanf
這種函數(shù),他在頭文件里 只有聲明,并沒有定義。 但是,等到鏈接時,程序會自動的 鏈接一些系統(tǒng)的庫。
第四個區(qū)域: [.stack]
段
因為,我們程序的運行 就是從入口函數(shù)開始遞歸,這個段就是供我們函數(shù)運行的;比如,你的局部變量 就會在這個.stack
段里。
第五個區(qū)域: 放命令行參數(shù)、環(huán)境變量。main函數(shù)的參數(shù) argv這些
[3 - 4GB]
這個地址區(qū)域,稱為 內核空間,即OS運行的空間
第一個區(qū)域是: ZONE_DMA
DMA: direct memory access
,加速 磁盤和內存 交換數(shù)據(jù)用的
在沒有DMA技術前,磁盤和內存交換數(shù)據(jù)時: 磁盤數(shù)據(jù) 必須經過總線,流經 cpu的寄存器,最終才能到達內存
這是對cpu的 極大浪費。
有了DMA,比如加載一個文件 從磁盤 通過總線 到內存中時,不需要使用cpu的寄存器!??!
cpu遇到這種情況,他就會空閑下來,來調度其他的進程?。?/p>
第二區(qū)域: `ZONE_NORMAL` 第三區(qū)域: `ZONE_HIGHMEM`
int a = 1;int b = 0;int c;static int d = 1;static int e = 0;static int f;int main(){ int g = 1; int h = 0; int i; static int j = 1; static int k = 0; static int l; return 0;}
這個程序中,屬于 指令的是: int main(){ int g = 1; int h = 0; int i; return 0; }
,即他們是在 .text段。
因為這些,要么是函數(shù),要么是局部變量,可以多次調用 是屬于指令。 即注意,局部變量 屬于的是 指令!
而對于: 全局變量 + 局部static,這些都是 數(shù)據(jù)(即這些,在程序的運行,自始至終 都是占著內存的)
其中,已經初始化的 且不為0 的變量 a,d,j
是在 .data
段,即.data段
的大小 是12。
常量(比如"hello"
),他是在 .rodata段
沒有初始的 或 初始為0的,是在.bss
段。
關于.bss段
,有幾個信息:
在.obj文件里, [elf header] [.text] [.data] [.bss] [.comment] [section table]
但其實你會發(fā)現(xiàn),.comment段 和 .bss段
在文件里的地址,其實是一樣的??!
而這兩個段 大小都不是0,為什么是一樣的呢?
其實,.bss
段 他在obj文件里 其實是不占空間的!?。?其實就沒有這個段,.data
后面就是.comment
.bss
段 只會占的是: 虛擬空間里的內存??! 而不占.obj文件里的空間
而,這個.bss
段 在.obj文件 是不存在的,那他怎么知道 這個段里的那些全局/static變量呢?
通過讀section table
段表,他里面會記錄 每個段的詳細信息,bss的信息 可以通過他來獲取
.bss段,沒必要在文件中存儲。這是因為: .data段里存的 都是初始值,即程序一運行 這些值就必須初始化為(用戶指定的值)
但是,.bss段里的 他的值 都是0,就不用在文件里存儲他了,這樣減少文件的大小
按理說,該有6個變量 是在.bss段。 但是,為什么1
不是在.bss段呢?
main.c short x = 10; short y = 10; extern void func(); int main(){ func(); }test.c int x; void func(){ x = 20; }
這個項目,在c++里 肯定是錯誤的。因為有2個x,c++里 所有的符號變量/函數(shù)
,都不能重名。
而在c里,他存在 強符號(初始化了的) 和 弱符號(未初始化的)
的區(qū)別,這里:short x是強符號,int x是弱符號
(強符號:只能有1個,即初始化的 只能有1個)(弱符號:可以有多個,即未初始的 可以有多個,不管是什么類型)
(在鏈接后,優(yōu)先使用強符號; 沒有強符號,則優(yōu)先使用內存最大的弱符號)
即,在項目進行鏈接完后,func()函數(shù)里 所使用的x,其實是:short x這個
func函數(shù)里 他的匯編是: 往x 寫4個字節(jié)的內存
,這是在多帶帶編譯test.c 就確定下來的匯編指令。
而最終鏈接后,這個匯編指令 肯定是不變的,但這個x 并不是int,而是short
所以,20的4字節(jié)是: 14 00 00 00
,前面的14 00 給short x,后面的00 00 給short y
,所以,最終:x = 20, y = 0 {x是指的short這個}
int c;
這個全局變量,他是不在.bss段的。
因為: int b = 0;
初始了,他是強符號 雖然c++沒有強弱符號,但這個程序 也可能是c的!!
int c;
未初始,弱符號。 他會在另外一個COM
段,不是在bss
段。因為他可能被其他obj里的強符號所頂替
其他的,都是static。static,是本文件可見?。?!他是強制性的!!即,即使是一個static的弱符號,在本文件里 也不會被其他強符號替代!
static還有個名字,是local
,即本地的 本文件的。其他文件,也看不到這個文件里的static變量。
os會 運行很多的進程,這些進程 所使用的虛擬空間,其中他們的內核區(qū)域[3 - 4GB]
區(qū)域 都是共享的,因為只有1個操作系統(tǒng)
但用戶空間,他是 獨立的,每個進程的 用戶空間,肯定都是不同的。
當程序要運行時,即變成進程,要進行下面幾個步驟:
ELF header
里,有個entry point address
。到時候這個進程運行時,這個地址 就會放到cpu的 pc寄存器里
,即為該程序的入口地址== 2:00
https://www.bilibili.com/video/BV1xf4y127AJ
==
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/121119.html
摘要:鏈接器會掃描所有輸入的目標文件,然后把所有符號表里的信息收集起來,構成一個全局的符號表。這是一本難得的講解程序的鏈接裝載和運行的好書。 showImg(https://image-static.segmentfault.com/396/693/396693929-5d558865c3a7e_articlex); 既然程序最終都被變成了一條條機器碼去執(zhí)行,那為什么同一個程序,在同一臺計算...
摘要:這個辦法,在現(xiàn)在計算機的內存管理里面,就叫作內存分頁和分段這樣分配一整段連續(xù)的空間給到程序相比分頁則是把整個物理內存空間切成一段段固定尺寸的大小而對應的程序所需要占用的虛擬內存空間,也會同樣切成一段段固定尺寸的大小。 showImg(https://image-static.segmentfault.com/290/765/2907653835-5d580caf245fd_articl...
摘要:同時,阿里聚漏洞掃描器有一個檢測項叫未使用地址空間隨機化技術該檢測項會分析中包含的文件判斷它們是否使用了該項技術。在版本上線前使用阿里聚安全漏洞掃描系統(tǒng)進行安全掃描,將安全隱患阻擋在發(fā)布之前。 前言 我們在前文《APP漏洞掃描器之本地拒絕服務檢測詳解》了解到阿里聚安全漏洞掃描器有一項靜態(tài)分析加動態(tài)模糊測試的方法來檢測的功能,并詳細的介紹了它在針對本地拒絕服務的檢測方法。 同時,阿里聚漏...
摘要:本文主要介紹應用程序加載如何做到毫秒級耗時。圖不同視角看左邊是從匯編器和鏈接器的視角來看這個文件,開頭的描述了體系結構和操作系統(tǒng)等基本信息,并指出和在文件中的什么位置,在匯編和鏈接過程中沒有用到,所以是可有可的,中保存了所有的描述信息。 1、背景 AliOS Thing 是AliOS家族旗...
摘要:二對的修改一鍵關機寫上后保存是調出這個程序,是關閉的意思,是時間秒的意思。這里為零是指立即關機。四主題到來快捷關機將文件右擊選擇發(fā)送到的桌面快捷方式這樣就可以在桌面有個自己的快捷方式了。 ...
閱讀 1120·2021-10-11 10:59
閱讀 3711·2021-09-26 09:55
閱讀 1016·2019-08-30 15:55
閱讀 2738·2019-08-30 15:44
閱讀 502·2019-08-30 14:06
閱讀 814·2019-08-30 11:26
閱讀 3420·2019-08-30 10:49
閱讀 2736·2019-08-29 12:53