Linux中mprotect 函式的用法

2021-09-30 11:18:48 字數 1012 閱讀 5035

在linux中,mprotect()函式可以用來修改一段指定記憶體區域的保護屬性。

函式原型如下:

#include #include int mprotect(const void *start, size_t len, int prot);

mprotect()函式把自start開始的、長度為len的記憶體區的保護屬性修改為prot指定的值。

prot可以取以下幾個值,並且可以用「|」將幾個屬性合起來使用:

1)prot_read:表示記憶體段內的內容可寫;

2)prot_write:表示記憶體段內的內容可讀;

3)prot_exec:表示記憶體段中的內容可執行;

4)prot_none:表示記憶體段中的內容根本沒法訪問。

需要指出的是,指定的記憶體區間必須包含整個記憶體頁(4k)。區間開始的位址start必須是乙個記憶體頁的起始位址,並且區間長度len必須是頁大小的整數倍。

如果執行成功,則返回0;如果執行失敗,則返回-1,並且設定errno變數,說明具體因為什麼原因造成呼叫失敗。錯誤的原因主要有以下幾個:

1)eacces

該記憶體不能設定為相應許可權。這是可能發生的,比如,如果你 mmap(2) 對映乙個檔案為唯讀的,接著使用 mprotect() 標誌為 prot_write。

2)einval

start 不是乙個有效的指標,指向的不是某個記憶體頁的開頭。

3)enomem

核心內部的結構體無法分配。

4)enomem

程序的位址空間在區間 [start, start+len] 範圍內是無效,或者有乙個或多個記憶體頁沒有對映。 

如果呼叫程序記憶體訪問行為侵犯了這些設定的保護屬性,核心會為該程序產生 sigse** (segmentation fault,段錯誤)訊號,並且終止該程序。

linux程式設計之mprotect

mmap 的第三個引數指定對記憶體區域的保護,由標記讀 寫 執行許可權的 prot read prot write 和 prot exec 按位與操作獲得,或者是限制沒有訪問許可權的 prot none。如果程式嘗試在不允許這些許可權的本地記憶體上操作,它將被 sigsegv 訊號 segmenta...

MATLAB中fopen fprintf函式的用法

matlab中fopen函式在指定檔案開啟的例項如下 1 fopen 開啟檔案,賦予檔案代號。語法1 fid fopen filename,permission 用指定的方式開啟檔案 fid n n是正整數 表示檔案開啟成功,檔案代號是n.fid 1 表示檔案開啟不成功。fid在此次檔案關閉前總是有...

postgresql中COALESCE 函式技巧

場景 存在乙個使用者白名單表,提供了此使用者的使用者名稱和地區資訊,判斷此使用者是否在此白名單表中。如 姓名 白名單地區 張三 中國,美國 則可使用如下語句 select id,user,area list from t white user where user and coalesce area...