一、為什么要有虛擬內(nèi)存
虛擬內(nèi)存的提出,是為了禁止用戶直接訪問(wèn)物理存儲(chǔ)設(shè)備,有助于系統(tǒng)穩(wěn)定。
?
二、為什么一個(gè)程序不能訪問(wèn)另外一個(gè)程序的地址指向的空間
1:每個(gè)程序的開(kāi)始地址0x80084000
2:程序中使用的地址不是物理地址,而是邏輯地址(虛擬內(nèi)存).
?????? 邏輯地址僅僅是編號(hào).編號(hào)使用int 4字節(jié)整數(shù)表示.
?????? 2^32=4294967296=4G
????? ?每個(gè)程序提供了4G的訪問(wèn)能力
?
三、內(nèi)存映射
邏輯地址與物理地址關(guān)聯(lián)的過(guò)程是內(nèi)存映射。
虛擬地址與物理地址映射的時(shí)候有一個(gè)基本單位:至少會(huì)映射4K。
段錯(cuò)誤:無(wú)效訪問(wèn). 那段內(nèi)存沒(méi)有映射,訪問(wèn)的內(nèi)存超出了系統(tǒng)所給這個(gè)程序的內(nèi)存空間。
合法訪問(wèn):比如malloc分配的空間之外的空間可以訪問(wèn),但訪問(wèn)非法。因是越界訪問(wèn)
?
四、虛擬內(nèi)存的分配
分配釋放內(nèi)存:???int brk(void *end); //分配空間,釋放空間
?void *sbrk(int size); //返回空間地址
應(yīng)用:1.使用sbrk分配空間
? ??????2.使用sbrk得到?jīng)]有映射的虛擬地址.
? 第一次調(diào)用sbrk,sbrk(0)得到的是沒(méi)有映射的虛擬首地址。
? ??????3.使用brk分配空間
? ??????4.使用brk釋放空間
?
sbrk(int? size):如果是第一次運(yùn)行,則返回沒(méi)有映射的空閑空間首地址,同時(shí)產(chǎn)生一個(gè)數(shù)據(jù):指向地址
???? ?sbrk與brk后臺(tái)系統(tǒng)維護(hù)一個(gè)指針,指針默認(rèn)是null。
???? ?調(diào)用sbrk,判定指針是否是0,是:得到大塊空閑空間的首地址初始化指針.同時(shí)把指針+size????
?????? ???????????????????????????????? 否:返回指針,并且把指針位置+size
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
