1,爲何內存須要分段和分頁機制?linux
早起的計算機中,程序都是直接運行在物理內存上的。這樣作有幾個問題:windows
1)地址空間不隔離,計算機的安全性和穩定性沒有辦法保證,因爲全部的程序均可以訪問物理內存,惡意的程序能夠很容易修改其餘程序的內容,達到破壞的目的。緩存
2)內存使用效率低,當前執行的程序(列入進程A)必須被整個裝載到內存中執行,若是須要執行另外一個程序時,發現內存空間不足,則須要將進程A的數據總體換出到磁盤。安全
3)程序運行的地址不肯定函數
爲了解決上述的三個問題,引入了虛擬地址、分段和分頁的概念。操作系統
有了虛擬地址,每一個進程都擁有本身獨立的虛擬地址空間,而且結合分段技術,不一樣進程的虛擬地址唄映射到不一樣的物理地址,彼此之間不重疊,地址空間不隔離的問題就被解決了。線程
分頁的基本思路是將內存分紅固定大小的頁,每一頁的大小有硬件或者操做系統來決定。目前幾乎所欲的PC機上的操做系統都是4KB大小的頁。分頁機制至關於增長了內存使用的的顆粒度,在內存換進換出的時候效率更高。調試
2,不一樣的進程共享哪些資源?一個進程內的不一樣線程之間共享哪些資源?進程
1)內存
2)線程私有:棧(局部變量、函數參數),TLS數據、寄存器。線程共享:全局變量、堆、靜態變量、程序代碼、打開的文件及信號。
3,線程安全機制
1)原子操做
2)信號量
3)互斥量
4)臨界區
5)讀寫鎖
6)條件變量
7)可重入函數
8*)CPU的亂序執行,barrier
4,編譯和連接
1)預編譯:gcc -E hello.c -o hello.i
2)編譯:產生彙編代碼文件。gcc -S hello.i -o hello.s
3)彙編:將彙編指令轉變爲二進制的機器指令。gcc -c hello.s -o hello.o或者as hello.s -o hello.o
4)連接:ld命令
5,目標文件
目標文件就是源代碼編譯後但未進行連接的那些中間文件(windows下的.obj和linux下的.o),它和可執行文件的內容與結構很類似,因此通常跟可執行文件採用相同的格式存儲(windows PE-COFF和linux下的ELF)
目標文件中的內容包括編譯後代碼、數據、符號表、調試信息等。
*程序和指令分開存放有什麼好處?1)指令區域只讀,安全。2)cache的使用有助於提升CPU的緩存命中率。3)程序共享,運行同一個程序的多個副本時,只需一份代碼
.bss段:不佔用磁盤空間,存放靜態變量和未初始化的全局變量.
.data段:初始化的全局變量
.text:代碼段
.rodata:const變量和字符串常量
自定義段:
__attribute__ ((section("FOO"))) int global = 42;
__attribute__ ((section("BAR"))) void foo() {}
6,靜態連接
1)ld命令
2)連接時空間和地址如何分配?不一樣目標文件的.text、.data、.bss等段如何合併?
連接以前,虛擬地址尚未被分配,目標文件代碼段的起始地址以0x00000000開始,等到連接中的空間分配完成後,各個函數纔會肯定本身在虛擬地址空間中的位置。linux中的ELF可執行文件默認從地址0x08048000開始分配。
第十章、內存
1.用以維護函數調用的上下文,一般在用戶空間的最高地址處分配,經過有數兆字節的大小。