在 Linux 内核中,处理寄存器字段时经常需要进行位移和掩码操作。传统方式虽然有效,但可读性差、容易出错。为此,内核提供了两个宏:
FIELD_GET(mask, val):从val中提取字段FIELD_PREP(mask, val):将字段值准备好,放入对应位置
传统的方式:手动位移 + 掩码
1 |
|
也可能是结合GENMASK生成 mask:
1 |
|
虽然 GENMASK()
提高了掩码的可读性,但仍需手动处理位移,容易出错。
使用 FIELD_GET() 和
FIELD_PREP()
为了统一风格并减少错误,Linux 内核推荐使用:
FIELD_PREP(mask, val):将字段值val放入对应位置FIELD_GET(mask, reg):从寄存器中提取字段值
1 |
|
这种方式完全避免了手动位移,使代码更简洁、易读。