码迷,mamicode.com
首页 > 系统相关 > 详细

《linux 内核全然剖析》 笔记 CODE_SPACE 宏定义分析

时间:2017-05-29 21:41:38      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:img   log   center   大小   笔记   技术   pos   net   track   

在memory.c里面。遇到一个宏定义,例如以下:


#define CODE_SPACE(addr) ((((addr)+4095)&~4095) < current->start_code + current->end_code)


看的第一眼,不知道。第二眼。还是不知道。纠结了半天还是不知道。

睡了一晚,今天早上再看,嘿嘿,竟然看懂了。。。


这个宏定义用于推断给定的addr线性地址是否位于当前进程的代码段中。


技术分享


 4095 = 0xFFF;

addr+4095的作用是将位于0~4095产生一个进位。

比如2+4095 = 4097 = 0x1001 最左边的1就是产生的进位,接着

(addr+4095) & ~4095的作用就是把刚得到的结果的低12位置0.这样一来

0x1001就变成了0x1000这个就是addr所在页最后的地址+1,即是当前页面的下一个页面的開始地址。



如果一个代码段占领了4个页面大小的内存

addr在这四个页面的话。(addr+4095)& ~4095 得到的将是addr所在页面的下一个页面的起始地址。假设该结果小于current->start_code + current->end_code 即代码段的结束地址。那么则该地址在代码段内,否则在代码段外面。



有一句话“认真你就输了”。事实上是个人失望的表现,凡事就怕你较真,认真。死磕,终究会得到真正的答案,也许这个过程不好受。





技术分享






《linux 内核全然剖析》 笔记 CODE_SPACE 宏定义分析

标签:img   log   center   大小   笔记   技术   pos   net   track   

原文地址:http://www.cnblogs.com/jhcelue/p/6918998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!