硬件平台: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,我们不希望改动,我们更希望修改驱动程序以适配目标系统。但是我们查看了驱动源码并没有找到对应的位置,希望得到社区的帮助。