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

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 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)