Linux內(nèi)存保護(hù)機(jī)制

mprotect機(jī)制

Linux系統(tǒng)提供了一個(gè)系統(tǒng)調(diào)用接口mprotect接口,通過(guò)該接口可以在編寫(xiě)Linux程序時(shí)給mmap申請(qǐng)到的內(nèi)存設(shè)置權(quán)限,從而允許或限制對(duì)該部分內(nèi)存的讀寫(xiě),執(zhí)行。

函數(shù)原型:

int mprotect(constvoid*start,size_tlen,int prot);

說(shuō)明:自地址start開(kāi)始,保護(hù)長(zhǎng)度為len的內(nèi)存空間。其中prot參數(shù)可以有如下取值:

函數(shù)返回取值:

成功返回0,失敗返回-1,并且設(shè)置errno,errno可能有如下取值:

Pkeys保護(hù)機(jī)制

Pkeys 的工作原理是:在每個(gè)頁(yè)表中,將 4 個(gè)先前保留的位專門(mén)用于一個(gè)“保護(hù)鍵”,從而提供 16 個(gè)可能的鍵。

每個(gè)鍵的保護(hù)由一個(gè) per-CPU 用戶可訪問(wèn)寄存器(PKRU) 定義。每個(gè) PKRU 都是一個(gè) 32 位寄存器,為 16 個(gè)鍵中的每個(gè)鍵存儲(chǔ)兩位(訪問(wèn)禁用和寫(xiě)入禁用)。

作為 CPU 寄存器,PKRU 本質(zhì)上是線程局部的,可能使每個(gè)線程擁有與其他所有線程不同的保護(hù)集。

Linux提供了3個(gè)對(duì)應(yīng)的系統(tǒng)調(diào)用用于pkeys內(nèi)存保護(hù)機(jī)制

基本用法:

1:在使用之前先調(diào)用pkey_alloc分配一個(gè)key。

2:然后調(diào)用pkey_mprotect

3:要修改該部分內(nèi)存訪問(wèn)權(quán)限時(shí),調(diào)用pkey_set

如下是一樣例代碼:

內(nèi)存保護(hù)生效后,使用過(guò)程中違反了對(duì)應(yīng)權(quán)限后,對(duì)于通過(guò)mprotect做保護(hù)的應(yīng)用,程序會(huì)報(bào)SEGV_ACCERR錯(cuò)誤,對(duì)于使用pkeys做保護(hù)的應(yīng)用,程序報(bào)錯(cuò)SEGV_PKERR。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 如果你看完書(shū)中的所有例子,你很可能已經(jīng)做完你的實(shí)驗(yàn)和在已經(jīng)越獄的iPhone上的研究。因?yàn)楹驮S多人一樣,幾乎所有的...
    fishmai0閱讀 17,342評(píng)論 2 42
  • 一、前言 在 Linux設(shè)備驅(qū)動(dòng) 中,內(nèi)存使用 是一個(gè)逃不掉的話題。Linux內(nèi)核 的內(nèi)存管理龐大且復(fù)雜,要想理解...
    wipping的技術(shù)小棧閱讀 4,762評(píng)論 0 3
  • 前言 最近在學(xué)習(xí)Linux內(nèi)核,讀到《深入理解Linux內(nèi)核》的內(nèi)存尋址一章。原本以為自己對(duì)分段分頁(yè)機(jī)制已經(jīng)理解了...
    Yonah瀟閱讀 1,408評(píng)論 0 3
  • 參考:https://www.anquanke.com/post/id/208364%5C[https://www...
    that_is_this閱讀 1,143評(píng)論 0 1
  • 概述 現(xiàn)代操作系統(tǒng)了提供了一種對(duì)主存的抽象概念,叫做虛擬內(nèi)存。它為每個(gè)進(jìn)程提供了一個(gè)非常大的,一致的和私有的地址空...
    要上班的斌哥閱讀 16,607評(píng)論 2 55

友情鏈接更多精彩內(nèi)容