1. 程式人生 > >《linux 內核全然剖析》 筆記 CODE_SPACE 宏定義分析

《linux 內核全然剖析》 筆記 CODE_SPACE 宏定義分析

否則 內核 定義 center ace .net 代碼段 fff 當前

在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 宏定義分析