SetPageReserved的定义
2.6内核的低版本中,SetPageReserved是直接用宏定义的:
#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)
而在2.6的高版本中,SetPageReserved的定义变成了:
#define SETPAGEFLAG(uname, lname) \
static inline void SetPage##uname(struct page *page) \
{ set_bit(PG_##lname, &page->flags); }
#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)
PAGEFLAG(Reserved, reserved)
为什么要搞的这么复杂,又宏又内联的。
求解~~~~~~~~~~~~~~~ 原因可能有多种, 不妄猜. 给你个建议
如果是跟踪着某个开发者的git代码库,
git blame <文件名>
然后, 找出感兴趣行上的commit ID, 用
git show<commit ID>
查看这次改动是由哪次提交引入的.一般可能会附加提交说明,
解释这次提交的初衷, 作用等.
还可以记下作者的名字
然后放狗(google)搜: lkml +作者名字+关于这个修改或主题的一两个重要关键词,
这样可能可以直接搜到当时提交时作者发在内核列表的邮件, 可能有更详细的
讨论.
一般我看到过时的书上讲到的过时的实现或做法, 与现在代码差异巨大时,
都会这么做去找找引入这些重要变化的源由.
希望你学习后来和大家分享吧 :) 回复 1# juruqiang
而在2.6的高版本中,SetPageReserved的定义变成了:
#define SETPAGEFLAG(uname, lname) \
static inline void SetPage##uname(struct page *page) \
{ set_bit(PG_##lname, &page->flags); }
#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)
PAGEFLAG(Reserved, reserved)
为了重用。这样就不需要重复定义SetPageDirty、SetPageActive、SetPageLocked等等。。。
看了之後,我也沒有搞懂。 就是为了图省事(少敲点代码),3个操作set/test/clear,加上N个bit,原来需要定义3*N个宏,现在只需要N个宏。
如果cpp预处理能力再强大一些,支持用宏来生成宏,估计会简化成一个宏…… (还好没有)
页:
[1]