get_random_u32_inclusive(floor, ceil)是 Linux 内核随机数子系统的一个辅助函数用于生成一个在闭区间[floor, ceil]内均匀分布的 32 位无符号随机整数即结果可能等于floor或ceil。核心定义与实现它定义在include/linux/random.h中是一个静态内联函数static inline u32 get_random_u32_inclusive(u32 floor, u32 ceil) { BUILD_BUG_ON_MSG(__builtin_constant_p(floor) __builtin_constant_p(ceil) (floor ceil || ceil - floor U32_MAX), get_random_u32_inclusive() must take floor ceil); return floor get_random_u32_below(ceil - floor 1); }它的核心逻辑非常简洁先计算区间内整数的个数ceil - floor 1然后调用get_random_u32_below()生成一个[0, ceil - floor]范围内的随机数最后加上floor偏移到目标区间。问题关联execmem_arch_setup()中x86 架构使用它来随机化模块区域的起始地址if (kaslr_enabled()) offset get_random_u32_inclusive(1, 1024) * PAGE_SIZE;这行代码在 KASLR 启用时生成一个1到1024之间的随机页数偏移即 4KB 到 4MB 范围用于增加模块区域地址的不可预测性。设计细节编译时检查BUILD_BUG_ON_MSG在编译期确保当floor和ceil都是常量时floor ceil且区间大小不超过U32_MAX防止误用。均匀分布依赖get_random_u32_below()的拒绝采样算法来保证无偏的均匀分布而非简单的取模运算。闭区间语义函数名中的 inclusive 明确表示结果包含边界值这是它相对于get_random_u32_below()生成[0, ceil)范围内的值的关键区别。get_random_u32_below实现get_random_u32_below(u32 ceil)是 Linux 内核随机数子系统中的一个核心函数用于生成一个在[0, ceil)区间内均匀分布的 32 位无符号随机整数。它取代了旧式的取模运算以提供无偏的随机数。核心算法乘法与拒绝采样该函数实现基于 Daniel Lemire 的算法通过乘法代替除法并在必要时进行拒绝采样以确保输出均匀分布。非恒定值实现 (__get_random_u32_below)当ceil不是编译时常量时调用此函数u32 __get_random_u32_below(u32 ceil) { u32 rand get_random_u32(); u64 mult; /* ceil 0 时返回全范围随机数便于 get_random_u32_inclusive 使用 */ if (unlikely(!ceil)) return rand; mult (u64)ceil * rand; /* 检查低32位结果是否小于 ceil若是则可能产生偏差需进一步检查 */ if (unlikely((u32)mult ceil)) { /* 计算拒绝边界-ceil % ceil 等价于 2^32 % ceil但可在32位内计算 */ u32 bound -ceil % ceil; /* 拒绝采样循环直到结果落在无偏区间内 */ while (unlikely((u32)mult bound)) mult (u64)ceil * get_random_u32(); } return mult 32; }恒定值优化 (头文件中的内联版本)当ceil是编译时常量时get_random_u32_below会尝试更高效的路径利用常量折叠完全避免除法并根据ceil的大小选择从 RNG 请求的字节数8 位、16 位或 32 位。设计目标无偏分布通过拒绝采样消除取模运算可能引入的偏差。性能利用乘法替代昂贵的除法并对常量ceil进行编译期优化。全范围支持特殊处理ceil 0的情况返回完整的 32 位随机数使得get_random_u32_inclusive(0, U32_MAX)等辅助函数能正常工作。上下文安全注意它并非 NMI 安全因为它内部使用了 per-CPU 锁。