You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:36:08