惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
腾讯CDC
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Martin Fowler
Martin Fowler
A
About on SuperTechFans
博客园 - 叶小钗

博客园 - jinzhenshui

自己编译mysql5.7的源代码:mysql-test 报错问题的解决 Mysql:实用工具:解密【.mylogin.cnf】的python小工具 Mysql:rm -rf etc usr var ; rpm2cpio mysql-community-server-5.7.【x】-1.el7.x86_64.rpm |cpio -idmv ; offset-extract.sh ./usr/sbin/mysqld Mysql:在华为CodeArts的帮助下:开发全功能、高性能 审计插件(AI的力量)! Oracle:nomount 状态的数据库 只能通过静态监听,并且必须使用sysdba角色去连接!!! mount -t overlay overlay -o lowerdir=oracle_lower,upperdir=upper,workdir=worker oracle Oracle:如何彻底删除备份软件系统所使用的 虚拟tape设备的备份信息?! 阿里oceanbase-ce:纯纯手工创建实例、初始化 ... 以自己的水平:Centos7.9 最大支持Virtualbox的版本为7.1[.16],得使用.run格式的包去安装 完整GCC版本与libstdc++.so对照表:数据统计来自腾讯元宝@2026-02-13日 当前可用的centos7的 elrepo地址【可升级kernel】 当前可用的centos7的 epel地址【来自fedora相关仓库】 截止当前:还可用的Centos7内核 kernel 的升级仓库地址:elrepo ssh 端口转发经典使用场景 开局第一篇:直接运行observer二进制主服务程序,启动根服务 简单的运行 hive Minikube Dashboard 因无法访问 Docker Hub(docker.io)仓库而启动失败的问题,以下是腾讯hunyuan给出的综合解决方案 Mysql:通用mysql备份脚本:纯shell实现:支持自动包含用户数据库、支持压缩、支持自动清理 Windows 上简单的iscsi-target服务程序:ISCSIConsole Mysqld:不合理的general_log_file会自动关闭通用日志的记录 ceph:如何更新public_network网段或ip地址?。 ceph:麒麟v10仓库版本的ceph-12.2.8-24.p02.ky10.x86_64,代号:luminous,基本的配置ceph.conf Mysql:记录一次 【systemctl start mysqld】启动超级慢、且启动有可能有问题的问题
linux:kylinV10sp3:安装virtualbox 7.1.16 报错解决
jinzhenshui · 2026-02-11 · via 博客园 - jinzhenshui


##################################################################################
错误原因分析
这个编译错误是由于内核版本升级导致 access_ok()函数的接口发生了变化。错误信息明确指出:代码试图向 access_ok宏传递3个参数,但新版本的内核只接受2个参数。
在较旧的内核版本(例如你正在编译的驱动代码所基于的版本)中,access_ok()函数的原型通常是:

access_ok(int type, const void __user *addr, unsigned long size);

type:用于指定访问类型,例如 VERIFY_READ或 VERIFY_WRITE

addr:要检查的用户空间地址指针。
size:要检查的字节数。

然而,在较新的Linux内核中(具体变更时间点因内核版本而异),这个函数被简化为只接受两个参数
: access_ok(const void __user *addr, unsigned long size);

第一个参数 type被移除了。

====================================================================================
vi /opt/VirtualBox/src/vboxhost/vboxdrv/r0drv/linux/memuserkernel-r0drv-linux.c
====================================================================================

定位错误代码:
找到文件中的第82行附近的代码,它应该类似于:

bool fRc = access_ok(VERIFY_READ, (void *)R3Ptr, 1);

修改代码:
删除第一个参数(VERIFY_READ),将调用改为:

bool fRc = access_ok((void *)R3Ptr, 1);

根据

的解决方案,直接移除第一个参数即可。在某些架构或内核版本中,可能需要确保地址参数的类型是 void __user *,你的代码中已经做了强制转换,所以通常是正确的。


##################################################################################
错误分析
从错误信息可以看出,问题出现在/tmp/vbox.0/linux/VBoxNetFlt-linux.c文件的第970-987行。代码试图访问skb_frag_t结构体的size和page_offset成员,但新版本内核中这些成员名已经发生了变化

内核API变更详情
在新版本Linux内核中(特别是5.5以后),skb_frag_t的定义发生了变化:
旧版本内核(修改前):

typedef struct skb_frag_struct skb_frag_t;
struct skb_frag_struct {
struct page *page;
__u16 page_offset; // 现在已改名
__u16 size; // 现在已改名
};

新版本内核(修改后):

typedef struct bio_vec skb_frag_t;
struct bio_vec {
struct page *bv_page;
unsigned int bv_len; // 对应原来的size
unsigned int bv_offset; // 对应原来的page_offset
};
====================================================================================
vi /opt/VirtualBox/src/vboxhost/vboxnetflt/linux/VBoxNetFlt-linux.c
====================================================================================

定位到第180行附近的宏定义,应该能看到类似这样的代码:

#define VBOX_SKB_FRAG_LEN(_pFrag) ((_pFrag)->size)
#define VBOX_SKB_FRAG_OFFSET(_pFrag) ((_pFrag)->page_offset)

修改这两个宏定义,将成员名更新为新版本:

#define VBOX_SKB_FRAG_LEN(_pFrag) ((_pFrag)->bv_len)
#define VBOX_SKB_FRAG_OFFSET(_pFrag) ((_pFrag)->bv_offset)