新聞中心
隨著現(xiàn)代計算機系統(tǒng)的復(fù)雜性增加,其中的重要資源——內(nèi)存正在成為黑客們瞄準的目標。黑客們利用各種漏洞和攻擊手段來竊取內(nèi)存中的數(shù)據(jù),并進行惡意操作。為了保護內(nèi)存安全,Linux內(nèi)核提供了一種叫做“頁面掩碼”的自我保護機制。本篇文章就將詳細介紹Linux頁面掩碼的技術(shù)原理、實現(xiàn)方式以及使用方法。

我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、臨泉ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的臨泉網(wǎng)站制作公司
一、什么是頁面掩碼?
在Linux內(nèi)核中,頁面掩碼有時也被稱為頁面保護位(Page Attribute Table,PAT),是一種硬件提供的內(nèi)存訪問權(quán)限控制技術(shù)。其主要作用是通過修改內(nèi)存頁面的訪問屬性,限制用戶或程序?qū)?nèi)存頁面的讀寫操作,從而保護內(nèi)存的安全性。頁面掩碼技術(shù)被廣泛應(yīng)用于操作系統(tǒng)、虛擬化技術(shù)以及軟件安全等領(lǐng)域。
二、頁面掩碼的技術(shù)原理
在Linux內(nèi)核中,每個物理頁面都有一個相關(guān)的頁面框架結(jié)構(gòu)(Page Frame Structure,PFS)。頁面掩碼技術(shù)就是通過修改PFS中的訪問屬性位來管理內(nèi)存頁面的權(quán)限。PFS中保存了許多內(nèi)存頁面的屬性信息,包括頁面是否被映射到進程的地址空間、頁面是否緩存、頁面是否是可交換的等。通過修改PFS中的一個標志位——頁面保護位,可以實現(xiàn)對內(nèi)存頁面的訪問控制。
具體來說,頁面掩碼技術(shù)包括以下三個步驟:
1.獲取頁面的PFS結(jié)構(gòu)體。在Linux內(nèi)核中,每個頁面都有一個相關(guān)的PFS結(jié)構(gòu)體,其中包含了許多內(nèi)存頁面的屬性信息。我們可以使用以下宏定義獲取頁面的PFS結(jié)構(gòu)體:
#define PADDR(page) ((unsigned long long)(page_to_phys(page)))
#define PFN(page) (unsigned long long)(page_to_pfn(page))
#define PFLAGS(page) (page->flags)
2.設(shè)置頁面保護位。Linux內(nèi)核提供了許多宏定義來設(shè)置頁面保護位。其中,PAGE_READON宏定義用于表示頁面只能進行讀操作,PAGE_WRITEON宏定義用于表示頁面只能進行寫操作,PAGE_NOACCESS宏定義用于表示頁面不可訪問。我們可以使用以下宏定義設(shè)置頁面的保護位:
#define set_page_prot(page, prot) do {PFLAGS(page) |= pgprot_val(prot);} while (0)
#define set_page_readonly(page) set_page_prot(page, PAGE_READON)
#define set_page_writeonly(page) set_page_prot(page, PAGE_WRITEON)
#define set_page_noaccess(page) set_page_prot(page, PAGE_NOACCESS)
3.訪問內(nèi)存頁面。經(jīng)過以上兩步的操作,我們已經(jīng)成功地修改了內(nèi)存頁面的訪問權(quán)限?,F(xiàn)在,我們可以正常地訪問內(nèi)存頁面了。如果我們嘗試訪問一個被設(shè)置為PAGE_NOACCESS的頁面,系統(tǒng)會立即發(fā)出一個異常,停止當前進程的運行。
三、頁面掩碼的實現(xiàn)方式
在Linux內(nèi)核中,頁面掩碼技術(shù)有兩種實現(xiàn)方式:PSE-36和PAE。其中,PSE-36(合并頁表擴展-36位)是一種舊的32位內(nèi)存地址擴展技術(shù),可以支持更大64GB的內(nèi)存。PSE-36使用了一種名為“物理頁面擴展”的技術(shù),允許操作系統(tǒng)將內(nèi)存物理地址的高4位存儲在頁目錄表項的高4位中。通過這種方式,可以使32位架構(gòu)的計算機最多支持64GB的內(nèi)存。但是,PSE-36技術(shù)的缺陷也十分明顯,它只能支持32位內(nèi)存地址空間,無法覆蓋64位操作系統(tǒng)的需要。
為了克服PSE-36技術(shù)的限制,Linux內(nèi)核引入了PAE(物理地址擴展)技術(shù)。PAE技術(shù)可以支持更大64TB的內(nèi)存,可以滿足64位操作系統(tǒng)對大內(nèi)存的需求。PAE技術(shù)是通過增加一個PDPTE(二級頁目錄表項)來實現(xiàn)的。PDPTE中保存著PDE(一級頁目錄表項)的地址,同時還包含一個TAG字段,用于標識該PDPTE的屬性信息。PAE技術(shù)將操作系統(tǒng)的地址空間從32位擴展到了36位,可以支持最多64TB的內(nèi)存空間。
四、如何使用頁面掩碼技術(shù)
在Linux內(nèi)核中,我們可以使用以下系統(tǒng)調(diào)用來設(shè)置內(nèi)存頁面的訪問權(quán)限:
int mprotect(void *addr, size_t len, int prot);
其中,addr表示欲設(shè)置的內(nèi)存區(qū)域的虛擬地址,len表示內(nèi)存區(qū)域的大小,prot表示頁面的訪問屬性,可以使用以下常量進行設(shè)置:
PROT_READ:表示頁面可讀取。
PROT_WRITE:表示頁面可寫入。
PROT_EXEC:表示頁面可執(zhí)行。
PROT_NONE:表示頁面不可訪問。
我們可以使用以下代碼來進行測試:
#include
#include
#include
int mn()
{
char *buf;
buf = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (buf == MAP_FLED) {
printf(“mmap error.\n”);
return -1;
}
printf(“buf=%p\n”, buf);
strcpy(buf, “hello, world!\n”);
printf(“%s”, buf);
if (mprotect(buf, 4096, PROT_READ) != 0) {
printf(“mprotect error.\n”);
return -1;
}
printf(“%s”, buf);
return 0;
}
以上代碼中,我們先使用系統(tǒng)調(diào)用mmap()來映射一個4KB的匿名內(nèi)存區(qū)域,并將頁面的訪問屬性設(shè)置為PROT_READ | PROT_WRITE。然后,我們向內(nèi)存區(qū)域中寫入一些數(shù)據(jù),并將頁面的訪問屬性修改為PROT_READ。我們再次輸出內(nèi)存區(qū)域的內(nèi)容,可以看到程序被異常終止,表示頁面訪問被限制。這樣,我們就成功地使用了mprotect()系統(tǒng)調(diào)用來保護內(nèi)存頁面的安全。
相關(guān)問題拓展閱讀:
- linux create mask是什么
linux create mask是什么
你好!
猛燃linux系統(tǒng)里:
#create mask是用戶創(chuàng)建文嘩逗件時的權(quán)限
掩碼
;對用戶來可讀可寫,對用戶組可讀可寫枝蘆虛,對其它用戶可讀;
umask,談乎是一個掩碼,可以自行設(shè)置缺省凳沒屬性。
運行umask,假設(shè)返回002,則生成的目錄缺省權(quán)限是棗侍納 rwxrwxr-x(775=),生成文件缺省權(quán)限是 rw-rw-r–(664=)
關(guān)于linux page mask的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
當前文章:Linux頁面掩碼:保護你的內(nèi)存安全(linuxpagemask)
網(wǎng)站網(wǎng)址:http://fisionsoft.com.cn/article/dpejoed.html


咨詢
建站咨詢
