支持uffdio_writeprotect的Linux内核版本、编译方法及报错解决
问题原因与解决方法
编译报错根因
你遇到的编译错误本质是:Ubuntu 18.04 系统默认提供的<linux/userfaultfd.h>头文件版本过低,即使你安装了5.14版本内核,系统头文件里也没有包含userfaultfd写保护相关的结构定义和宏,因此编译阶段无法识别struct uffdio_writeprotect和UFFDIO_WRITEPROTECT。
问题1:uffdio_writeprotect支持的内核版本
userfaultfd写保护功能(包含uffdio_writeprotect结构、UFFDIO_WRITEPROTECTioctl命令)是在Linux 5.7版本正式合入主线内核的,所有>=5.7版本的内核,只要开启了CONFIG_USERFAULTFD_WP编译配置(主流发行版的通用内核默认已开启该配置),都支持该功能。
编译报错快速修复
你可以用以下两种方式解决编译问题:
- 安装对应内核的头文件:执行
apt install linux-headers-5.14.0-xxx(替换为你实际安装的内核版本号),安装完成后重新编译即可 - 手动替换头文件:从你使用的5.14内核源码中提取
include/uapi/linux/userfaultfd.h文件放到当前工程目录,将代码中的#include <linux/userfaultfd.h>改为#include "userfaultfd.h"即可
另外编译时需要添加-pthread参数链接线程库,完整编译命令如下:
gcc -o with_userfault -I. with_userfault.c -pthread
问题2:编译安装对应版本Linux内核的步骤
以下是Ubuntu系统下编译安装内核的标准流程,我们以安装5.14版本内核为例:
步骤1:安装编译依赖
sudo apt update sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
步骤2:下载并解压内核源码
下载5.14版本内核源码压缩包,解压到本地目录:
tar -xJf linux-5.14.tar.xz cd linux-5.14
步骤3:配置内核
复用当前系统的内核配置,自动适配新内核的配置项:
cp /boot/config-$(uname -r) .config make olddefconfig
执行以下命令确认配置正确,确保两个配置项的值为y:
grep CONFIG_USERFAULTFD .config grep CONFIG_USERFAULTFD_WP .config
步骤4:编译内核
根据你的CPU核心数并行编译,耗时约30分钟到2小时不等:
make -j$(nproc)
步骤5:安装内核
sudo make modules_install sudo make install
步骤6:更新引导并重启
sudo update-grub sudo reboot
重启时按住Shift键调出Grub菜单,选择你刚安装的5.14版本内核启动即可。
代码额外问题提示
你现有代码中posix_memalign的用法有误,第一个参数需要传入指针变量的地址,而不是mmap返回的指针本身,否则会引发内存访问错误,建议调整为:
void *aligned_region; if (posix_memalign(&aligned_region, PAGE_SIZE, PAGE_SIZE * n_pages)) { fprintf(stderr, "cannot align by PAGE_SIZE %ld\n", PAGE_SIZE); exit(1); } region = (unsigned long *)aligned_region;
内容的提问来源于stack exchange,提问作者Nguetoum
相关产品推荐
相关产品推荐

