linux虚拟内存api,Linux虚拟内存空间分布-Go语言中文社区
平常總說cpu的位數,其實說的是cpu一次能運算的最長整數的寬度,既ALU(算術邏輯單元)的寬度。
cpu的位數也是數據總線的條數
數據總線:數據線的總和,數據線就是cpu與內存進行數據傳遞的通道,一條數據線,一次可以傳送1位二進制數,8條數據線一次就可以傳8位(1個字節)
地址總線:CPU是通過地址總線來指定存儲單元的,地址總線決定了cpu能訪問的最大內存大小,比如,10位的地址線能訪問的內存為1024位(1B)二進制數據
操作系統為了屏蔽I/O底層的差異,創建了VFS(虛擬文件系統),為了屏蔽I/O層與內存之間的差異,產生了虛擬內存。為了屏蔽cpu與內存之間的差異,創建了進程。每個程序運行起來都會擁有一個自己的虛擬地址空間,32位cpu的操作系統,其地址線也為32位,所以虛擬地址空間為2^32 -1= 4G
一個進程在運行時不可能會用如此大的虛擬地址空間,它們只會用到其中的一部分,而且并不一定連成一片,可能會被分割成幾塊,每一塊連續的虛擬內存塊被稱為虛擬內存段。
Linux虛擬內存空間布局如下:
.reserve(預留)段
一共占用128M,屬于預留空間,進程是禁止訪問的
.text(代碼段)
可執行文件加載到內存中的只有數據和指令之分,而指令被存放在.text段中,一般是共享的,編譯時確定,只讀,不允許修改
.data
存放在編譯階段(而非運行時)就能確定的數據,可讀可寫。也就是通常所說的靜態存儲區,賦了初值的全局變量和賦初值的靜態變量存放在這個區域,常量也存放在這個區域
.bss段
通常用來存放程序中未初始化以及初始化為0的全局/靜態變量的一塊內存區域,在程序載入時由內核清0
.heap(堆)
用于存放進程運行時動態分配的內存,可動態擴張或縮減,這塊內存由程序員自己管理,通過malloc/new可以申請內存,free/delete用來釋放內存,heap的地址從低向高擴展,是不連續的空間
.stack(棧)
記錄函數調用過程相關的維護性信息,棧的地址從高地址向低地址擴展,是連續的內存區域
共享庫(libc.so)
靜態庫和動態庫的區別:
(1)、不同操作系統下后綴不一樣
windows linux
靜態庫 .lib .a
動態/共享庫 .dll .so
(2)、加載方法的時間點不同
*.a 在程序生成鏈接的時候已經包含(拷貝)進來了
*.so 程序在運行的時候才加載使用
(3)靜態庫把包含調用函數的庫是一次性全部加載進去的,動態庫是在運行的時候,把用到的函數的定義加載進去,所以包含靜態庫的程序所以用靜態庫編譯的文件比較大,如果靜態庫改變了,程序得重新編譯,相反的,動態庫編譯的可執行文件較小,但.so改變了,不影響程序,動態庫的開發很方便
(4)程序對靜態庫沒有依賴性,對動態庫有依賴性。
cat命令可以查看進程的虛擬地址空間布局
cat /proc/pid/maps
該輸出命令一共有六列,分別為:
虛擬內存開始地址-結束地址、訪問權限(r讀-w寫-x可執行-s共享-p私有) 、偏移量 、主設備號:次設備號、映像文件i節點 、映像文件路徑
總結
以上是生活随笔為你收集整理的linux虚拟内存api,Linux虚拟内存空间分布-Go语言中文社区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在微型计算机中1 mb准确等于几个字,2
- 下一篇: 电脑怎么打出冒号符号_Mac小技巧:教你