欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Linux進(jìn)程地址空間FAQ

1.  內核與普通進(jìn)程獲取內存時(shí)有何不同?

內核是操作系統中優(yōu)先級最高的成分,如果某個(gè)內核函數請求動(dòng)態(tài)內存,則其必定有正當的理由發(fā)出那個(gè)請求,內核的內存請求應該立即被滿(mǎn)足;內核信任自己,所有的內核函數都被假定是沒(méi)有錯誤的,內核函數不必考慮編程錯誤的保護措施。

而當用戶(hù)態(tài)進(jìn)程請求分配內存時(shí),進(jìn)程對動(dòng)態(tài)內存的請求被認為是不緊迫的,當進(jìn)程的可執行文件被裝入時(shí),進(jìn)程并不一定立即對所有的代碼頁(yè)進(jìn)行訪(fǎng)問(wèn),同樣的,當進(jìn)程調用malloc獲得動(dòng)態(tài)內存時(shí),也不意味著(zhù)進(jìn)程很快就會(huì )訪(fǎng)問(wèn)所有所獲得的內存,故內核總是盡量推遲給用戶(hù)態(tài)進(jìn)程分配動(dòng)態(tài)內存;由于用戶(hù)進(jìn)程是不可信任的,故內核必須隨時(shí)準備捕獲用戶(hù)態(tài)進(jìn)程所引起的所有尋址錯誤。

 

2. 什么是進(jìn)程的地址空間?

    進(jìn)程的地址空間由允許進(jìn)程使用的全部線(xiàn)性地址組成,每個(gè)進(jìn)程所看到的線(xiàn)性地址集合是不同的。訪(fǎng)問(wèn)權限相同的連續線(xiàn)性地址構成一個(gè)線(xiàn)性區,進(jìn)程的地址空間通常包含多個(gè)線(xiàn)性區,由于效率原因,線(xiàn)性區的起始地址和長(cháng)度都必須是4096的倍數,以便每個(gè)線(xiàn)性區所識別的數據完全填滿(mǎn)分配給它的頁(yè)框。

    用戶(hù)進(jìn)程可訪(fǎng)問(wèn)的地址空間為0-3G,為何不將整個(gè)空間交給進(jìn)程直接使用,而要將其以線(xiàn)性區的形式組織起來(lái),個(gè)人覺(jué)得主要是考慮安全因素,進(jìn)程使用的區域必須向內核報告,內核知道所有用戶(hù)態(tài)進(jìn)程的內存使用情況,從而對其行為進(jìn)行有效的控制,如大片內存的malloc導致失敗,如果0-3G的所有內存都能不加申請的使用,則用戶(hù)程序中的漏洞經(jīng)常會(huì )導致物理內存的耗盡。

 

3. 進(jìn)程何時(shí)會(huì )獲得新的線(xiàn)性區?

(1)  當創(chuàng )建一個(gè)新的進(jìn)程時(shí),一個(gè)全新的地址空間被分配給了新的進(jìn)程。

(2)  正在運行的進(jìn)程裝入新的程序(exec)時(shí),舊的線(xiàn)性區被釋放,新的線(xiàn)性區被分配給進(jìn)程。

(3)  進(jìn)程持續向用戶(hù)態(tài)堆棧增加數據。

(4)  進(jìn)程通過(guò)malloc擴展動(dòng)態(tài)區。

(5)  進(jìn)程創(chuàng )建一個(gè)IPC共享線(xiàn)性區與其他合作進(jìn)程共享數據。

與創(chuàng )建、刪除線(xiàn)性區相關(guān)的系統調用主要包括brk(), execve(), _exit(), fork(), mmap(), mmap2(), mremap(), munmap(), shmat(), shmdt()等。

 

4. 內核如何描述線(xiàn)性區?

    內核使用struct vm_area_struct描述符表示線(xiàn)性區,其主要包括:

(1)  線(xiàn)性區的起始地址與結束地址

(2)  線(xiàn)性區的訪(fǎng)問(wèn)權限

(3)  線(xiàn)性區的的鏈接信息(鏈表與紅黑樹(shù))

 

5. 內核如何描述進(jìn)程的地址空間?

    內核使用struct mm_struct描述符描述進(jìn)程的地址空間,其主要包括:

(1)  指向線(xiàn)性區的鏈表頭

(2)  指向線(xiàn)性區對象的紅黑樹(shù)

(3)  指向進(jìn)程頁(yè)全局目錄的指針

(4)  線(xiàn)性區的個(gè)數

(5)  線(xiàn)性空間大?。?yè)數)

(6)  分配給進(jìn)程的頁(yè)框數

(7)  可執行代碼的起始與結束地址

(8)  已初始化數據的起始與結束地址

(9)  堆的起始與結束地址

(10)用戶(hù)態(tài)堆棧的起始地址

(11)命令行參數的起始與結束地址

(12)環(huán)境變量的起始與結束地址

 

6. 線(xiàn)性區如何組織?

    進(jìn)程所擁有的所有線(xiàn)性區是通過(guò)鏈表按內存地址升序鏈接起來(lái),內核通過(guò)遍歷鏈表能方便的掃描整個(gè)線(xiàn)性區集合;同時(shí),由于內核頻繁執行查找包含指定線(xiàn)性地址的線(xiàn)性區的操作,故為了提高查找效率,線(xiàn)性區被組織成一棵紅黑樹(shù),以提供對數級的查找效率。

 

7. 何時(shí)為進(jìn)程分配頁(yè)框?

    只有當進(jìn)程訪(fǎng)問(wèn)實(shí)際實(shí)際數據時(shí),才為線(xiàn)性區分配實(shí)際頁(yè)框,為此,進(jìn)程會(huì )產(chǎn)生一個(gè)缺頁(yè)異常。linux的缺頁(yè)異??赡苡删幊体e誤或是引用屬于進(jìn)程地址空間但尚未分配物理頁(yè)框的頁(yè)引起,內核通過(guò)將引起缺頁(yè)異常的線(xiàn)性地址與當前進(jìn)程的線(xiàn)性區進(jìn)行比較,如果訪(fǎng)問(wèn)權限與進(jìn)程線(xiàn)性區相匹配,則屬于合法訪(fǎng)問(wèn),應該給該線(xiàn)性地址所在的線(xiàn)性區分配一個(gè)新的頁(yè)框(alloc_page),并更新內核頁(yè)表。對于其它情況,則屬于非法訪(fǎng)問(wèn),內核需進(jìn)行相應的錯誤處理。

 

8. 棧向下增長(cháng),如何映射到線(xiàn)性區?

    棧所在的線(xiàn)性區,其VM_GROWSDOWN標志被設置,vm_end字段保持不變,vm_start的值可能被減小。線(xiàn)性區的邊界包括但不嚴格限定用戶(hù)態(tài)堆棧的當前大小,棧所在的線(xiàn)性區的vm_start字段只可能減小,永遠不可能增加(即使進(jìn)程執行一系列pop指令時(shí))。當進(jìn)程填滿(mǎn)了給它的堆棧分配的最后一個(gè)頁(yè)框后,push會(huì )導致堆棧線(xiàn)性區的擴展,expand_stack會(huì )被調用,vm_start被減?。ㄍ瑫r(shí)必須為頁(yè)面大小4096的倍數)。

 

9. 寫(xiě)時(shí)賦值與進(jìn)程地址空間的聯(lián)系?

    最初的linux系統實(shí)現了傻瓜式的進(jìn)程創(chuàng )建,當發(fā)出fork系統調用時(shí),內核原樣復制父進(jìn)程的整個(gè)地址空間并把賦值的那一份分配給子進(jìn)程,這就需要為子進(jìn)程的頁(yè)表分配頁(yè)框,為子進(jìn)程的頁(yè)分配頁(yè)框,初始化子進(jìn)程的頁(yè)表,把父進(jìn)程的頁(yè)復制到子進(jìn)程相應的頁(yè)中。  現在的linux采用更為高效的方法,即寫(xiě)時(shí)復制。父進(jìn)程與新創(chuàng )建的子進(jìn)程共享頁(yè)框而不是賦值頁(yè)框,父進(jìn)程或子進(jìn)程需要對頁(yè)框的數據進(jìn)行修改時(shí),內核就賦值一個(gè)新的頁(yè)框。

    copy_mm函數把父進(jìn)程的地址空間給子進(jìn)程,如果帶有CLONE_VM標志,則子進(jìn)程共享父進(jìn)程的mm_struct;如果該標志沒(méi)有被設置,copy_mm函數必須創(chuàng )建一個(gè)新的地址空間(申請并初始化新的mm_struct結構,并賦值給子進(jìn)程的mm字段)。

 

10. 如何管理進(jìn)程的堆?

    內存描述符的start_brkbrk字段分別限定了進(jìn)程堆區的開(kāi)始地址與結束地址。

    與進(jìn)程對相關(guān)的庫函數或系統調用包括:

    malloc(size)  從堆中請求size個(gè)字節的動(dòng)態(tài)內存

    calloc(n, size) 請求n個(gè)大小為size的元素的數組空間,并將數組元素清0

    realloc(ptr, size) 改變由前面malloccalloc分配的內存區的大小

    free(ptr) 釋放有malloccalloc分配的內存區

    brk(addr) 直接修改堆的大小,brk字段會(huì )被調整為頁(yè)面大小的整數倍,根據當前堆的大小調用do_mmapdo_munmap擴展或縮小線(xiàn)性區(在不超過(guò)限制范圍的前提下)

    sbrk(increment) 增加或減少堆大小

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
linux內核分析之進(jìn)程地址空間
關(guān)于Linux內存管理的一些資料 .
共享內存實(shí)例及文件映射編程及實(shí)現原理
別再說(shuō)你不懂 Linux 內存管理了,10 張圖給你安排的明明白白
對內存管理的思考
Linux內核--內核地址空間分布和進(jìn)程地址空間
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久