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

在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 即代码段的结束地址,那么则该地址在代码段内,否则在代码段外面。



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











  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值