成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

程序員的自我修養(yǎng)—精華(elf文件、虛擬內(nèi)存)

qpwoeiru96 / 3628人閱讀

摘要:即注意,局部變量屬于的是指令而對(duì)于全局變量局部,這些都是數(shù)據(jù)即這些,在程序的運(yùn)行,自始至終都是占著內(nèi)存的其中,已經(jīng)初始化的且不為的變量是在段,即段的大小是。

catalog

程序

我們寫(xiě)的程序,需要經(jīng)過(guò)(編譯,鏈接)得到 最終的exe/elf(產(chǎn)生到 磁盤(pán)上)。

如果我們要運(yùn)行他,必須要把他加載到 內(nèi)存里! 因?yàn)閏pu訪(fǎng)問(wèn)內(nèi)存的速度 要比訪(fǎng)問(wèn)磁盤(pán),速度快千萬(wàn)倍

cpu的位數(shù),是指: 他一次性能夠進(jìn)行運(yùn)算的 整數(shù)的寬度,因?yàn)閏pu是在ALU里運(yùn)算數(shù)據(jù)
所以, cpu的位數(shù) 其實(shí)是 ALU的寬度(即,數(shù)據(jù)總線(xiàn)的 條數(shù))
但是, cpu的位數(shù) 不一定等于 地址總線(xiàn)的 條數(shù),他等于的是 數(shù)據(jù)總線(xiàn)的條數(shù)


比如虛擬地址是4GB,(物理內(nèi)存不一定是4GB!?。牟季指袷绞牵?/p>

  • [0 - 3GB]這個(gè)地址區(qū)域,稱(chēng)為 用戶(hù)空間

    • [0 - 128MB] 是forbidden禁止的! 他是禁止訪(fǎng)問(wèn)的,連訪(fǎng)問(wèn)都不能,更不能寫(xiě)!!

    • [128MB - 3GB],這是我們程序可以使用的 虛擬地址區(qū)域
      第一個(gè)區(qū)域,他劃分為有: [.text] [.data] [.bss]
      我們知道,一個(gè)程序無(wú)非是:(指令) + (數(shù)據(jù))
      指令是在:.text段, 數(shù)據(jù)是在:.data段 和 .bss段

      緊接著 第二個(gè)區(qū)域: heap 堆空間

      第三個(gè)區(qū)域:用來(lái)放到dll共享庫(kù)的!
      比如,你用了很多scanf這種函數(shù),他在頭文件里 只有聲明,并沒(méi)有定義。 但是,等到鏈接時(shí),程序會(huì)自動(dòng)的 鏈接一些系統(tǒng)的庫(kù)。

      第四個(gè)區(qū)域: [.stack]
      因?yàn)?,我們程序的運(yùn)行 就是從入口函數(shù)開(kāi)始遞歸,這個(gè)段就是供我們函數(shù)運(yùn)行的;比如,你的局部變量 就會(huì)在這個(gè).stack段里。

      第五個(gè)區(qū)域: 放命令行參數(shù)、環(huán)境變量。main函數(shù)的參數(shù) argv這些

  • [3 - 4GB]這個(gè)地址區(qū)域,稱(chēng)為 內(nèi)核空間,即OS運(yùn)行的空間
    第一個(gè)區(qū)域是: ZONE_DMA DMA: direct memory access,加速 磁盤(pán)和內(nèi)存 交換數(shù)據(jù)用的
    在沒(méi)有DMA技術(shù)前,磁盤(pán)和內(nèi)存交換數(shù)據(jù)時(shí): 磁盤(pán)數(shù)據(jù) 必須經(jīng)過(guò)總線(xiàn),流經(jīng) cpu的寄存器,最終才能到達(dá)內(nèi)存
    這是對(duì)cpu的 極大浪費(fèi)。
    有了DMA,比如加載一個(gè)文件 從磁盤(pán) 通過(guò)總線(xiàn) 到內(nèi)存中時(shí),不需要使用cpu的寄存器?。?!
    cpu遇到這種情況,他就會(huì)空閑下來(lái),來(lái)調(diào)度其他的進(jìn)程??!

      第二區(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;}

這個(gè)程序中,屬于 指令的是: int main(){ int g = 1; int h = 0; int i; return 0; },即他們是在 .text段。
因?yàn)檫@些,要么是函數(shù),要么是局部變量,可以多次調(diào)用 是屬于指令。 即注意,局部變量 屬于的是 指令!

而對(duì)于: 全局變量 + 局部static,這些都是 數(shù)據(jù)(即這些,在程序的運(yùn)行,自始至終 都是占著內(nèi)存的)
其中,已經(jīng)初始化的 且不為0 的變量 a,d,j 是在 .data段,即.data段的大小 是12。

常量(比如"hello"),他是在 .rodata段

沒(méi)有初始的 或 初始為0的,是在.bss段。
關(guān)于.bss段,有幾個(gè)信息:

  • 在.obj文件里, [elf header] [.text] [.data] [.bss] [.comment] [section table]
    但其實(shí)你會(huì)發(fā)現(xiàn),.comment段 和 .bss段 在文件里的地址,其實(shí)是一樣的!!
    而這兩個(gè)段 大小都不是0,為什么是一樣的呢?
    其實(shí),.bss段 他在obj文件里 其實(shí)是不占空間的?。。?其實(shí)就沒(méi)有這個(gè)段,.data后面就是.comment
    .bss段 只會(huì)占的是: 虛擬空間里的內(nèi)存??! 而不占.obj文件里的空間

    而,這個(gè).bss段 在.obj文件 是不存在的,那他怎么知道 這個(gè)段里的那些全局/static變量呢?
    通過(guò)讀section table段表,他里面會(huì)記錄 每個(gè)段的詳細(xì)信息,bss的信息 可以通過(guò)他來(lái)獲取

    .bss段,沒(méi)必要在文件中存儲(chǔ)。這是因?yàn)椋?.data段里存的 都是初始值,即程序一運(yùn)行 這些值就必須初始化為(用戶(hù)指定的值)
    但是,.bss段里的 他的值 都是0,就不用在文件里存儲(chǔ)他了,這樣減少文件的大小

  • 按理說(shuō),該有6個(gè)變量 是在.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; }

    這個(gè)項(xiàng)目,在c++里 肯定是錯(cuò)誤的。因?yàn)橛?個(gè)x,c++里 所有的符號(hào)變量/函數(shù),都不能重名。
    而在c里,他存在 強(qiáng)符號(hào)(初始化了的) 和 弱符號(hào)(未初始化的)的區(qū)別,這里:short x是強(qiáng)符號(hào),int x是弱符號(hào)
    (強(qiáng)符號(hào):只能有1個(gè),即初始化的 只能有1個(gè))(弱符號(hào):可以有多個(gè),即未初始的 可以有多個(gè),不管是什么類(lèi)型)
    (在鏈接后,優(yōu)先使用強(qiáng)符號(hào); 沒(méi)有強(qiáng)符號(hào),則優(yōu)先使用內(nèi)存最大的弱符號(hào))

    即,在項(xiàng)目進(jìn)行鏈接完后,func()函數(shù)里 所使用的x,其實(shí)是:short x這個(gè)
    func函數(shù)里 他的匯編是: 往x 寫(xiě)4個(gè)字節(jié)的內(nèi)存,這是在多帶帶編譯test.c 就確定下來(lái)的匯編指令。
    而最終鏈接后,這個(gè)匯編指令 肯定是不變的,但這個(gè)x 并不是int,而是short
    所以,20的4字節(jié)是: 14 00 00 00,前面的14 00 給short x,后面的00 00 給short y,所以,最終:x = 20, y = 0 {x是指的short這個(gè)}

    int c;這個(gè)全局變量,他是不在.bss段的。
    因?yàn)椋?int b = 0;初始了,他是強(qiáng)符號(hào) 雖然c++沒(méi)有強(qiáng)弱符號(hào),但這個(gè)程序 也可能是c的?。?/code>
    int c;未初始,弱符號(hào)。 他會(huì)在另外一個(gè)COM段,不是在bss段。因?yàn)樗赡鼙黄渌鹢bj里的強(qiáng)符號(hào)所頂替
    其他的,都是static。static,是本文件可見(jiàn)?。?!他是強(qiáng)制性的?。〖?,即使是一個(gè)static的弱符號(hào),在本文件里 也不會(huì)被其他強(qiáng)符號(hào)替代!
    static還有個(gè)名字,是local,即本地的 本文件的。其他文件,也看不到這個(gè)文件里的static變量。


os會(huì) 運(yùn)行很多的進(jìn)程,這些進(jìn)程 所使用的虛擬空間,其中他們的內(nèi)核區(qū)域[3 - 4GB]區(qū)域 都是共享的,因?yàn)橹挥?個(gè)操作系統(tǒng)
但用戶(hù)空間,他是 獨(dú)立的,每個(gè)進(jìn)程的 用戶(hù)空間,肯定都是不同的。


當(dāng)程序要運(yùn)行時(shí),即變成進(jìn)程,要進(jìn)行下面幾個(gè)步驟:

  • 虛擬地址物理內(nèi)存映射,創(chuàng)建 頁(yè)目錄 和 頁(yè)表
  • 加載 .text段 和 .data段
  • 把該exe的入口地址,寫(xiě)到 pc寄存器里。
    ELF header里,有個(gè)entry point address。到時(shí)候這個(gè)進(jìn)程運(yùn)行時(shí),這個(gè)地址 就會(huì)放到cpu的 pc寄存器里,即為該程序的入口地址

== 2:00 https://www.bilibili.com/video/BV1xf4y127AJ ==

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121119.html

相關(guān)文章

  • 重學(xué)計(jì)算機(jī)組成原理(七)- 程序無(wú)法同時(shí)在Linux和Windows下運(yùn)行?

    摘要:鏈接器會(huì)掃描所有輸入的目標(biāo)文件,然后把所有符號(hào)表里的信息收集起來(lái),構(gòu)成一個(gè)全局的符號(hào)表。這是一本難得的講解程序的鏈接裝載和運(yùn)行的好書(shū)。 showImg(https://image-static.segmentfault.com/396/693/396693929-5d558865c3a7e_articlex); 既然程序最終都被變成了一條條機(jī)器碼去執(zhí)行,那為什么同一個(gè)程序,在同一臺(tái)計(jì)算...

    ShowerSun 評(píng)論0 收藏0
  • 重學(xué)計(jì)算機(jī)組成原理(八)- 程序裝載

    摘要:這個(gè)辦法,在現(xiàn)在計(jì)算機(jī)的內(nèi)存管理里面,就叫作內(nèi)存分頁(yè)和分段這樣分配一整段連續(xù)的空間給到程序相比分頁(yè)則是把整個(gè)物理內(nèi)存空間切成一段段固定尺寸的大小而對(duì)應(yīng)的程序所需要占用的虛擬內(nèi)存空間,也會(huì)同樣切成一段段固定尺寸的大小。 showImg(https://image-static.segmentfault.com/290/765/2907653835-5d580caf245fd_articl...

    Developer 評(píng)論0 收藏0
  • APP漏洞掃描用地址空間隨機(jī)化

    摘要:同時(shí),阿里聚漏洞掃描器有一個(gè)檢測(cè)項(xiàng)叫未使用地址空間隨機(jī)化技術(shù)該檢測(cè)項(xiàng)會(huì)分析中包含的文件判斷它們是否使用了該項(xiàng)技術(shù)。在版本上線(xiàn)前使用阿里聚安全漏洞掃描系統(tǒng)進(jìn)行安全掃描,將安全隱患阻擋在發(fā)布之前。 前言 我們?cè)谇拔摹禔PP漏洞掃描器之本地拒絕服務(wù)檢測(cè)詳解》了解到阿里聚安全漏洞掃描器有一項(xiàng)靜態(tài)分析加動(dòng)態(tài)模糊測(cè)試的方法來(lái)檢測(cè)的功能,并詳細(xì)的介紹了它在針對(duì)本地拒絕服務(wù)的檢測(cè)方法。 同時(shí),阿里聚漏...

    LinkedME2016 評(píng)論0 收藏0
  • 震驚!這個(gè)操作系統(tǒng)應(yīng)用加載只需要“毫秒級(jí)”耗時(shí)

    摘要:本文主要介紹應(yīng)用程序加載如何做到毫秒級(jí)耗時(shí)。圖不同視角看左邊是從匯編器和鏈接器的視角來(lái)看這個(gè)文件,開(kāi)頭的描述了體系結(jié)構(gòu)和操作系統(tǒng)等基本信息,并指出和在文件中的什么位置,在匯編和鏈接過(guò)程中沒(méi)有用到,所以是可有可的,中保存了所有的描述信息。 1、背景 AliOS Thing 是AliOS家族旗...

    incredible 評(píng)論0 收藏0
  • 論快捷關(guān)機(jī)自我修養(yǎng)(正經(jīng)序員多半是直接關(guān)機(jī)而不是這么花里胡哨)

    摘要:二對(duì)的修改一鍵關(guān)機(jī)寫(xiě)上后保存是調(diào)出這個(gè)程序,是關(guān)閉的意思,是時(shí)間秒的意思。這里為零是指立即關(guān)機(jī)。四主題到來(lái)快捷關(guān)機(jī)將文件右擊選擇發(fā)送到的桌面快捷方式這樣就可以在桌面有個(gè)自己的快捷方式了。 ...

    Binguner 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<