博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux C/C++适配malloc申请按页对齐的内存,方便使用mprotect
阅读量:4207 次
发布时间:2019-05-26

本文共 2597 字,大约阅读时间需要 8 分钟。

之前的一篇文章: 。里面没有用malloc来申请按页对齐的内存,其实也可以适配malloc,多申请2页,取中间按照页对齐的内存使用。使用malloc,可以使得进程的地址空间布局不会相对原来发生太大变化。代码如下:

#include 
#include
#include
#include
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;}

一组运行结果如下:

root@ubuntu:/media/psf/Home/iLearn/learn_c/mprotect# ./a.outmalloc mem: 0xbab010 - 0xbad410align page: 0xbac000 - 0xbad000root@ubuntu:~# ps -ef|grep a.outroot      1429 32072  0 00:24 pts/11   00:00:00 ./a.outroot      1718  1153  0 00:25 pts/17   00:00:00 grep --color=auto a.outroot@ubuntu:~# grep bac00 /proc/1429/maps -C 300400000-00401000 r-xp 00000000 00:18 53150451                           /media/psf/Home/iLearn/learn_c/mprotect/a.out00600000-00601000 r--p 00000000 00:18 53150451                           /media/psf/Home/iLearn/learn_c/mprotect/a.out00601000-00602000 rw-p 00001000 00:18 53150451                           /media/psf/Home/iLearn/learn_c/mprotect/a.out00bab000-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.so7f657e86f000-7f657ea6e000 ---p 001bc000 08:01 397412                     /lib/x86_64-linux-gnu/libc-2.19.so

转载地址:http://bbqli.baihongyu.com/

你可能感兴趣的文章
反病毒专家谈虚拟机技术 面临两大技术难题
查看>>
几种典型的反病毒技术:特征码技术、覆盖法技术等
查看>>
性能测试一般过程与LR性能测试过程
查看>>
Software Security Testing软件安全测试
查看>>
SQL注入漏洞全接触--进阶篇
查看>>
SQL注入漏洞全接触--高级篇
查看>>
SQL注入法攻击一日通
查看>>
论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取
查看>>
论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取
查看>>
论文浅尝 | GMNN: Graph Markov Neural Networks
查看>>
廖雪峰Python教程 学习笔记3 hello.py
查看>>
从内核看epoll的实现(基于5.9.9)
查看>>
python与正则表达式
查看>>
安装.Net Framework 4.7.2时出现“不受信任提供程序信任的根证书中终止”的解决方法
查看>>
input type=“button“与input type=“submit“的区别
查看>>
解决Github代码下载慢问题!
查看>>
1.idea中Maven创建项目及2.对idea中生命周期的理解3.pom文件夹下groupId、artifactId含义
查看>>
LeetCode-栈|双指针-42. 接雨水
查看>>
stdin,stdout,stderr详解
查看>>
Linux文件和设备编程
查看>>