WZ55k 2022-08-30 16:24 采纳率: 50%
浏览 52
已结题

编译RTL8111/8168网卡驱动虚拟地址和目标系统不匹配问题

硬件平台:RK3568J(arm64)
目标系统:Ubuntu20.04
内核版本:4.19

问题描述:
RT,现在3568板子上有PCI-e接口,想通过该接口扩展一路网口出来,于是买了一块PCI-e转千兆网的转接板,芯片为瑞昱的RTL8111/8168。从瑞昱官网获取了该芯片的驱动,使用4.19的内核源码进行交叉编译得到ko文件,放到目标系统iinsmod时报了如下错误:

Unable to handle kernel paging request at virtual address 000002c00000014b
……
[000002c00000014b] address between user and kernel address ranges

显然驱动程序访问了arm64用户空间和内核空间之间的非法区域,这部分虚拟地址是不允许访问的。从内核源码中可以查看到:

CONFIG_ARM64_VA_BITS=39

即目标系统的虚拟地址位宽为39,显然上述地址已经越界。我们换了一块其他平台的板子,kernel版本为5.4.70,CONFIG_ARM64_VA_BITS默认为48,即虚拟地址位宽为48,用相同的方式编译驱动并加载,发现外接网卡可以使用了。

于是我们将4.19版本的内核源码中CONFIG_ARM64_VA_BITS也设置为48,重新编译kernel和驱动,将新的kernel镜像烧写到目标板中并加载驱动,外接网卡可以正常使用了,基本可以确定是虚拟地址位宽的问题。但是我们不了解为什么网卡的驱动源码中默认虚拟地址为48位宽。官方SDK中的kernel默认虚拟地址位宽就是39,我们不希望改动,我们更希望修改驱动程序以适配目标系统。但是我们查看了驱动源码并没有找到对应的位置,希望得到社区的帮助。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月7日
    • 修改了问题 9月1日
    • 创建了问题 8月30日

    悬赏问题

    • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
    • ¥30 c#打开word开启修订并实时显示批注
    • ¥15 如何解决ldsc的这条报错/index error
    • ¥15 VS2022+WDK驱动开发环境
    • ¥30 关于#java#的问题,请各位专家解答!
    • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
    • ¥20 pcf8563时钟芯片不启振
    • ¥20 pip2.40更新pip2.43时报错
    • ¥15 换yum源但仍然用不了httpd
    • ¥50 C# 使用DEVMOD设置打印机首选项