1. 程式人生 > >Linux C/C++適配malloc申請按頁對齊的記憶體,方便使用mprotect

Linux C/C++適配malloc申請按頁對齊的記憶體,方便使用mprotect

之前的一篇文章: Linux C/C++記憶體越界定位: 利用mprotect使程式在crash在第一現場。裡面沒有用malloc來申請按頁對齊的記憶體,其實也可以適配malloc,多申請2頁,取中間按照頁對齊的記憶體使用。使用malloc,可以使得程序的地址空間佈局不會相對原來發生太大變化。程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

struct mem_align {
    void *origin_start;  // for free
void *start; // data addr start, align page size void *end; // data addr end, align page size void *origin_end; }; int malloc_align_page(size_t memsize, struct mem_align *mem) { if (memsize == 0 || mem == NULL) return -1; memset(mem, 0, sizeof(*mem)); long
pagesize = sysconf(_SC_PAGE_SIZE); if (pagesize == -1) { perror("sysconf err"); return -1; } size_t datasize = memsize + pagesize * 2; mem->origin_start = malloc(datasize); if(mem->origin_start == NULL) return -1; mem->origin_end = mem->origin_start + datasize; long
mask = pagesize - 1; mem->start = (void *)((long)(mem->origin_start + pagesize) & ~mask); long pagenum = memsize / pagesize + 1; mem->end = mem->start + pagesize * pagenum; return 0; } int main() { int ret; struct mem_align mem; ret = malloc_align_page(1024, &mem); if (ret != 0) { return ret; } ret = mprotect(mem.start, (size_t)(mem.end - mem.start), PROT_READ); if (ret == -1) { perror("mportect"); return ret; } sleep(600); // 讓程序先掛起不退出,看/proc/[pid]/maps裡的地址空間對應頁的許可權 // free(mem.origin_start); return 0; }

一組執行結果如下:

[email protected]:/media/psf/Home/iLearn/learn_c/mprotect# ./a.out
malloc mem: 0xbab010 - 0xbad410
align page: 0xbac000 - 0xbad000

[email protected]:~# ps -ef|grep a.out
root      1429 32072  0 00:24 pts/11   00:00:00 ./a.out
root      1718  1153  0 00:25 pts/17   00:00:00 grep --color=auto a.out
[email protected]:~# grep bac00 /proc/1429/maps -C 3
00400000-00401000 r-xp 00000000 00:18 53150451                           /media/psf/Home/iLearn/learn_c/mprotect/a.out
00600000-00601000 r--p 00000000 00:18 53150451                           /media/psf/Home/iLearn/learn_c/mprotect/a.out
00601000-00602000 rw-p 00001000 00:18 53150451                           /media/psf/Home/iLearn/learn_c/mprotect/a.out
00bab000-00bac000 rw-p 00000000 00:00 0                                  [heap]
00bac000-00bad000 r--p 00000000 00:00 0                                  [heap]  # 這塊對記憶體頁已經被改成了只讀許可權
00bad000-00bce000 rw-p 00000000 00:00 0                                  [heap]
7f657e6b3000-7f657e86f000 r-xp 00000000 08:01 397412                     /lib/x86_64-linux-gnu/libc-2.19.so
7f657e86f000-7f657ea6e000 ---p 001bc000 08:01 397412                     /lib/x86_64-linux-gnu/libc-2.19.so

相關推薦

Linux C/C++malloc申請記憶體方便使用mprotect

之前的一篇文章: Linux C/C++記憶體越界定位: 利用mprotect使程式在crash在第一現場。裡面沒有用malloc來申請按頁對齊的記憶體,其實也可以適配malloc,多申請2頁,取中間按

C語言精要總結-內存地址與struct大小判斷篇

超過 等於 合規 占用 編譯 約定 long 並發 分享 在筆試時,經常會遇到結構體大小的問題,實際就是在考內存地址對齊。在實際開發中,如果一個結構體會在內存中高頻地分配創建,那麽掌握內存地址對齊規則,通過簡單地自定義對齊方式,或者調整結構體成員的順序,可以有效地減少內存使

C語言結構體(記憶體問題)

C語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出一個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?     開始學的時候,

C#中使用DrawString繪製文字時的方式

void 繪製文字(Graphics 畫家) { StringFormat 格式 = new StringFormat(); 格式.Alignment = StringAlignment.Center; //居中 格式.Alignment = StringA

C語言讀取配置檔案以及128位元組.bin配置檔案

配置檔案: #begin build properties factory=四川九州電子科技股份有限公司 oui=03 product_type=71 stbid=0371419916190000129 hw_version=00000473 sw_version=2016

c語言-----用迴圈語句實現金字塔,左

c語言中的迴圈語句有三種,while迴圈,do,while迴圈,和for迴圈.    1. while語句    2.for語句    3.do ...while語句 例項:          

C++ 位元組分析struct成員指定位大小

閱讀C++ Concurrency In Action 第5章遇到這個問題,記錄下來,方便以後回頭看 主要涉及 位域和位元組對齊問題,位域一般不常見,屬於C/C++高階特性 位域指的是針對struct成員指定位大小,位域的作用主要是節省記憶體資源,使資料結構更緊湊 原

C語言中結構體內部成員的

說明: ******不同的編譯器和處理器,其結構體內部的成員有不同的對齊方式。 ******使用sizeof()運算子計算結構體的長度。 ###結構體中每個成員相對於結構首地址的偏移量都是成員大小的整數倍,如果有需要編譯器會在成員之間加上填充字。 ###結構體的總大小是結構

:解決IE9以下H5不支援的方法

html5shiv:         解決ie9以下瀏覽器對html5新增標籤的不識別,並導致CSS不起作用的問題。 respond.min:       讓不支援css3 Media Query

[C#] StringFormat詳解之文字方向、

在使用GDI方式處理文字時,往往會用到StringFormat。裡面的某些點有點反直覺,不夠直觀,所以本篇就通過圖文的方式去講解一下。 本篇內容僅涉及到文字方向、對齊的相關內容。 如有錯誤、不妥之處,歡迎大家指正。 一、相關屬性 與文字方向、對齊相關的屬性,主要與三個屬性有關: Alignment、LineA

Reporting Service 分組問題--分組顯示資料每組資料新起一

新增一張報表之後,新建資料集 報表空白處右擊選擇插入矩陣 得到插入的矩陣  新增一個行組,注意看行組那個大括號哦,要新增在大括號內 預設合併單元格了,拆分 可以把多餘的行組外的行刪掉  在新增的行組中插入表 給

ARM Linux中的非記憶體訪問(Alignment trap警告的原因)

ARMv5指令集的CPU(一般是arm9架構)預設不支援非對齊記憶體訪問,ARMv6及以上的CPU預設支援處理大部分的非對齊記憶體地址訪問。對齊指的是起始地址是一個word長度的整數倍,通常是4位元組對齊。 通過設定/proc/cpu/alignment檔案內容可修改核心中

linux c/c++規則獲取網絡卡ip

linux c/c++按規則獲取網絡卡ip 輸出專案到雲或者輸出給外部客戶,會遇到伺服器多網絡卡多ip的情形,如果有多個應用都需要這個主機ip,而且多應用需要獲取相同的ip,此時可以約定一種規則來獲取相同的ip,比如: 獲得所有網絡卡名,然後對網絡卡名按從小到大排序,查詢最小

Android音訊系統C++功能層》

繼上一篇Android音訊系統適配《java邏輯層》之後,我們需要知道整個功能介面的實現路由,其實相對而言要簡單很多。上一篇有提到AudioManager.java所呼叫的介面的最終實現是在AudioSystem.java。本篇我們就從AudioSystem.java開始。  

cmalloc申請堆空間使用及案例

c中malloc申請堆空間void test22() { int *pr; pr = (int *)malloc(sizeof(int)*128);//申請128個int4位元組空間 if (

LinuxC結構體初始化

直觀 tro 擴展性 方式 建議 struct 初始化方式 www 寫到 原文地址在這裏: http://www.cnblogs.com/Anker/p/3545146.html 我 只把裏面的主要介紹和代碼寫到這裏了. 順序初始化   教科書上講C語言結構體初始化

C/C++遍歷目錄下的所有文件(Windows/Linux超詳細)

檢查 msd 字符 size tro 也會 結構 () alt 前面的一篇文章我們講了用Windows API遍歷一個目錄下的所有文件,這次我們講用一種Windows/Linux通用的方法遍歷一個目錄下的所有文件。 Windows/Linux的IDE都會提供一個頭文件—

linux ctrl+cctrl+zctrl+d

get http ont detail ctrl+c 繼續 後臺進程 知識庫 當前 轉自:http://blog.csdn.net/u012787436/article/details/39722583 ctrl+c(中斷)、ctrl+z(掛起)和ctrl+d(EO

LinuxC語言的幾道經典面試題

ref 使用 linu 學習資源 chan ima 什麽 img c語言 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程序,輸出結果是什麽? 答

notepad++ 查找引用(Find Reference)(用於c c++及各類腳本比如lua、python等)

onf 後綴名 ces ram 找不到 進行 align ins studio 在程序開發過程中,程序員經常用到的一個功能就是查找引用(Find Reference),Visual Studio裏面的對應功能是“查找所有引用”(Find All Re