新聞中心
Linux作為一種廣泛應(yīng)用于嵌入式系統(tǒng)和服務(wù)器系統(tǒng)的開(kāi)源操作系統(tǒng),在計(jì)算機(jī)科學(xué)的領(lǐng)域中扮演著非常重要的角色。其中,Linux內(nèi)存管理是Linux操作系統(tǒng)中的一個(gè)重要而復(fù)雜的部分,因?yàn)樗婕暗絃inux的內(nèi)存分配、內(nèi)存保護(hù)、地址轉(zhuǎn)換等諸多方面。而本文將深入了解Linux內(nèi)存地址0x0,探討它的作用與限制。

10多年的南潯網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整南潯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“南潯網(wǎng)站設(shè)計(jì)”,“南潯網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
一、Linux內(nèi)存地址0x0的概念
在Linux操作系統(tǒng)中,內(nèi)存地址0x0被稱(chēng)為“空指針”,它是一個(gè)特殊的內(nèi)存地址,表示空指針常量。當(dāng)程序中指針變量被初始化為NULL時(shí),實(shí)際上就是將該指針變量的值設(shè)置為0x0,表示這個(gè)指針指向了內(nèi)存中的一個(gè)無(wú)效地址,也就是說(shuō)這個(gè)指針沒(méi)有指向任何有效的內(nèi)存地址。
Linux內(nèi)存地址空間從0x0000 0000到0xFFFF FFFF,其中0x0是其中一個(gè)特殊的內(nèi)存地址。這個(gè)地址上的內(nèi)存是被保留的,不能被使用或分配。
二、Linux內(nèi)存地址0x0的作用
1.初始化指針變量
當(dāng)我們定義一個(gè)指針變量時(shí),如果不進(jìn)行初始化,那么這個(gè)指針變量指向的就是隨機(jī)的內(nèi)存地址。因此,在程序中初始化指針變量時(shí),一般采用將指針變量的值設(shè)置為0x0的方式進(jìn)行初始化,這樣能夠保證指針變量指向一個(gè)無(wú)效的內(nèi)存地址。
2.判斷指針變量是否為空指針
在程序中,我們需要判斷一個(gè)指針變量是否為空指針,以避免運(yùn)行時(shí)出現(xiàn)崩潰或錯(cuò)誤。此時(shí)我們可以將指針變量和空指針0x0進(jìn)行比較,如果兩者相等,則說(shuō)明這個(gè)指針變量為空指針。
3.操作系統(tǒng)初始化
在Linux操作系統(tǒng)的初始化過(guò)程中,內(nèi)核會(huì)將系統(tǒng)底層的一些資源映射到空閑物理內(nèi)存地址的下方,這樣可以方便地管理和使用這些資源。而內(nèi)存地址0x0則被保留為空指針,不會(huì)被分配給任何資源,從而保證這個(gè)地址處的內(nèi)存總是無(wú)效的。
三、Linux內(nèi)存地址0x0存在的限制
雖然Linux內(nèi)存地址0x0有著很多作用,但是它同時(shí)也存在著一定的限制,這些限制包括以下幾個(gè)方面。
1.空指針不是NULL
在C語(yǔ)言中,空指針常量被定義為NULL,而不是內(nèi)存地址0x0。因此,在程序中比較指針變量和NULL時(shí),應(yīng)該使用NULL而不是0x0,否則可能會(huì)導(dǎo)致程序運(yùn)行出錯(cuò)。
2.空指針并不指向一個(gè)可訪問(wèn)的內(nèi)存地址
雖然Linux內(nèi)存地址0x0被保留為空指針,但是實(shí)際上這個(gè)地址并不指向一個(gè)可訪問(wèn)的內(nèi)存地址。因此,在程序中不能訪問(wèn)空指針指向的內(nèi)存,否則會(huì)導(dǎo)致程序出錯(cuò)或崩潰。
3.空指針不能被用作函數(shù)參數(shù)
在函數(shù)中,我們需要傳遞指針變量作為參數(shù),來(lái)實(shí)現(xiàn)函數(shù)間的數(shù)據(jù)交換。但是,當(dāng)我們將空指針作為函數(shù)參數(shù)時(shí),會(huì)導(dǎo)致程序出錯(cuò)或崩潰。因此,在編寫(xiě)程序時(shí),應(yīng)該避免將空指針作為函數(shù)參數(shù)。
4.空指針不能進(jìn)行解引用操作
在C語(yǔ)言中,我們可以通過(guò)指針變量訪問(wèn)指針?biāo)赶虻膬?nèi)存。但是,當(dāng)我們對(duì)空指針進(jìn)行解引用操作時(shí),會(huì)導(dǎo)致程序出錯(cuò)或崩潰。因此,在編寫(xiě)程序時(shí),應(yīng)該避免對(duì)空指針進(jìn)行解引用操作。
四、
Linux內(nèi)存地址0x0是一個(gè)特殊的內(nèi)存地址,因?yàn)樗强罩羔槼A克淼膬?nèi)存地址。在Linux操作系統(tǒng)的內(nèi)存管理過(guò)程中,空指針常量扮演著非常重要的角色,不僅可以初始化指針變量、判斷是否為空指針,還可以在操作系統(tǒng)初始化時(shí)保證系統(tǒng)底層的資源可以被安全地映射到物理內(nèi)存地址的下方。但是,空指針也存在一些限制,不能被用作函數(shù)參數(shù)或進(jìn)行解引用操作。因此,在編寫(xiě)程序時(shí),應(yīng)該遵循相應(yīng)的規(guī)定,充分利用空指針常量的作用,避免程序出現(xiàn)崩潰或錯(cuò)誤。
相關(guān)問(wèn)題拓展閱讀:
- Linux下怎樣在進(jìn)程中獲取虛擬地址對(duì)應(yīng)的物理地址
- 求大神,小弟代碼能力很弱,linux中cpu訪問(wèn)非法地址程序該怎么寫(xiě)?
Linux下怎樣在進(jìn)程中獲取虛擬地址對(duì)應(yīng)的物理地址
Linux文件目錄中的/proc記錄著當(dāng)前進(jìn)程的信息,稱(chēng)其為虛擬文件系統(tǒng)。在/proc下有一個(gè)鏈接目錄名為self,這意味著哪一個(gè)進(jìn)程打開(kāi)了它,self中存儲(chǔ)的信息就是所鏈接進(jìn)程的。self中有一個(gè)名為page_map的文件,專(zhuān)門(mén)用來(lái)記錄所鏈接進(jìn)程的物理頁(yè)號(hào)信息。這樣通過(guò)/proc/pid/page_map文件,允許一個(gè)用戶態(tài)的進(jìn)程御舉查看到每個(gè)虛擬頁(yè)映射到的物理頁(yè)
/proc/pid/page_map中的每一項(xiàng)都包含了一個(gè)64位的值,這個(gè)值內(nèi)容如下所示。每一項(xiàng)的映射方式不同于真正的虛擬地址映射,其文件中遵循獨(dú)立的對(duì)應(yīng)關(guān)系,即虛擬地址相對(duì)于0x0經(jīng)過(guò)的頁(yè)面數(shù)是對(duì)應(yīng)項(xiàng)在文件中的偏移量
* /proc/pid/pagemap. This file lets a userspace process find out which
physical frame each virtual page is mapped to. It contains one 64-bit
value for each virtual page, containing the following data (from
fs/proc/task_mmu.c, above pagemap_read):
* Bitspage frame number (PFN) if present//present為1時(shí),bit0-54表示物理頁(yè)號(hào)
* Bitsswap type if swapped
* Bitsswap offset if swapped
* Bitpte is soft-dirty (see Documentation/vm/soft-dirty.txt)
* Bitpage exclusively mapped (since 4.2)
* Bitszero
* Bitpage is file-page or shared-anon (since 3.5)
* Bitpage swapped
* Bitpage present//如果為1,表示當(dāng)前物理頁(yè)在內(nèi)存中;為0,表示當(dāng)前物理頁(yè)不在內(nèi)存中
在計(jì)算物理地址時(shí),只需要找到虛擬地址的對(duì)應(yīng)項(xiàng),再通過(guò)對(duì)應(yīng)項(xiàng)中的bit63判斷此物理頁(yè)是否在內(nèi)存中,若在內(nèi)存中則對(duì)應(yīng)項(xiàng)中的物理頁(yè)號(hào)加上偏移地址,就能得到物理地址
通過(guò)程序獲或拆行取物理地址并驗(yàn)證寫(xiě)時(shí)拷貝技術(shù)
#include
#include
#include
#include
#include
#include
#include
//計(jì)算虛擬地址對(duì)應(yīng)的地址,傳入虛擬地址vaddr,通過(guò)paddr傳出物理地址
void mem_addr(unsigned long vaddr, unsigned long *paddr)
{
int pageSize = getpagesize();//調(diào)用此函數(shù)獲取系衫嘩統(tǒng)設(shè)定的頁(yè)面大小
unsigned long v_pageIndex = vaddr / pageSize;//計(jì)算此虛擬地址相對(duì)于0x0的經(jīng)過(guò)的頁(yè)面數(shù)
unsigned long v_offset = v_pageIndex * sizeof(uint64_t);//計(jì)算在/proc/pid/page_map文件中的偏移量
unsigned long page_offset = vaddr % pageSize;//計(jì)算虛擬地址在頁(yè)面中的偏移量
uint64_t item = 0;//存儲(chǔ)對(duì)應(yīng)項(xiàng)的值
int fd = open(“/proc/self/pagemap”, O_RDON);。。以只讀方式打開(kāi)/proc/pid/page_map
if(fd == -1)//判斷是否打開(kāi)失敗
{
printf(“open /proc/self/pagemap error\n”);
return;
}
if(lseek(fd, v_offset, SEEK_SET) == -1)//將游標(biāo)移動(dòng)到相應(yīng)位置,即對(duì)應(yīng)項(xiàng)的起始地址且判斷是否移動(dòng)失敗
{
printf(“sleek error\n”);
return;
}
if(read(fd, &item, sizeof(uint64_t)) != sizeof(uint64_t))//讀取對(duì)應(yīng)項(xiàng)的值,并存入item中,且判斷讀取數(shù)據(jù)位數(shù)是否正確
{
printf(“read item error\n”);
return;
}
if((((uint64_t)1
{
printf(“page present is 0\n”);
return ;
}
uint64_t phy_pageIndex = (((uint64_t)1
*paddr = (phy_pageIndex * pageSize) + page_offset;//再加上頁(yè)內(nèi)偏移量就得到了物理地址
}
const int a = 100;//全局常量
int main()
{
int b = 100;//局部變量
static c = 100;//局部靜態(tài)變量
const int d = 100;//局部常量
char *str = “Hello World!”;
unsigned long phy = 0;//物理地址
char *p = (char*)malloc(100);//動(dòng)態(tài)內(nèi)存
int pid = fork();//創(chuàng)建子進(jìn)程
if(pid == 0)
{
//p = ‘1’;//子進(jìn)程中修改動(dòng)態(tài)內(nèi)存
mem_addr((unsigned long)&a, &phy);
printf(“pid = %d, virtual addr = %x , physical addr = %x\n”, getpid(), &a, phy);
}
else
{
mem_addr((unsigned long)&a, &phy);
printf(“pid = %d, virtual addr = %x , physical addr = %x\n”, getpid(), &a, phy);
}
sleep(100);
free(p);
waitpid();
return 0;
}
測(cè)試結(jié)果如下:
全局常量:符合寫(xiě)時(shí)拷貝技術(shù)
局部變量:不符合寫(xiě)時(shí)拷貝技術(shù)。原因分析,有可能是物理頁(yè)上的其他數(shù)據(jù)被改動(dòng),導(dǎo)致拷貝出一個(gè)新物理頁(yè)面
局部靜態(tài)變量:不符合寫(xiě)時(shí)拷貝技術(shù)。原因分析,有可能是物理頁(yè)上的其他數(shù)據(jù)被改動(dòng),導(dǎo)致拷貝出一個(gè)新物理頁(yè)面
局部常量:不符合寫(xiě)時(shí)拷貝技術(shù)。原因分析,有可能是物理頁(yè)上的其他數(shù)據(jù)被改動(dòng),導(dǎo)致拷貝出一個(gè)新物理頁(yè)面
字符串:符合寫(xiě)時(shí)拷貝技術(shù)
動(dòng)態(tài)內(nèi)存:符合寫(xiě)時(shí)拷貝技術(shù)
子進(jìn)程不修改動(dòng)態(tài)內(nèi)存
子進(jìn)程修改動(dòng)態(tài)內(nèi)存
*其實(shí)想要知道虛擬地址對(duì)應(yīng)的物理地址,通過(guò)這樣的方式也可以得到物理地址而不用操作MMU。。。*
求大神,小弟代碼能力很弱,linux中cpu訪問(wèn)非法地址程序該怎么寫(xiě)?
*((char *)0x0) = 0;
向0地址寫(xiě)入一個(gè)0,這就是非法的。
關(guān)于linux內(nèi)存地址 0x0的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專(zhuān)注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專(zhuān)注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。
網(wǎng)站欄目:深入了解Linux內(nèi)存地址0x0:它的作用與限制(linux內(nèi)存地址0x0)
網(wǎng)站網(wǎng)址:http://www.fisionsoft.com.cn/article/dpcdssc.html


咨詢(xún)
建站咨詢(xún)
