C语言中关于页对齐的总结

2015/01/13 技术
关于C语言中得页对齐的总结

关于C语言中得页对齐的总结

问题就是系统中得mask和我们自己定义的不一样.所以会产生问题,下面对Android中得页对齐进行分析,该对齐方式,也可以用在别的系统上.所以可以总结一下.

#difine PAGESIZE = 4096;             // 0X0000 1000
#difine PAGEMASK = (~(PAGESIZE - 1));//0FFFF F000
// 对一个地址进行对齐
address_aligened =  address & PAGEMASK;

还有一个地方需要注意就是下面的情况:

mprotect(void *addr, size_t len, int prot);

上面的函数功能是改变[add , addr+size-1]的内存区域的"读写执行"的状态 , addr必须是要叶对齐的,所以我们在将一个地址address和一定size的内存进行操作的时候,就需要注意该函数参数的构造. aligned_page.png

address 是原来的地址,aligned address是对齐后的地址,size是我们需要改变状态的内存区域的大小.所以当我们将address的地址对齐之后,我们也必须该拜年len的大小, 现在的len的大小如下所示:

length = ( (~ PAGEMASK) + size);

所以现在我们要执行的状态就是如下所示;

unsigned int address = addr & PAGEMASK;
unsigned int length = size + (address & (~PAGEMASK)); 
mprotect( address, length, prot);

Author: Tiankai

Created: 2015-01-09 Fri 22:52

Emacs 24.4.1 (Org mode 8.2.10)

Validate

Search

    Table of Contents