驱动源码编译
简介
发布包中提供了驱动源码包{soc version}-driver-{software version}-minios.aarch64-src.tar.gz,用户可自行根据需要进行驱动的定制或配置文件的修改。若用户对驱动源码包中的任何文件进行了定制修改,定制完成后,都需要参考本章节进行源码编译;若未对驱动源码包中的文件进行任何修改,则此章节可跳过。
源码编译依赖于HCC编译器,HCC编译器存在于toolkit安装包的toolchain目录下。
操作步骤
- 执行以下命令切换到root用户,后续操作都需要以root用户执行。
su - root
- 解压软件包获取中的驱动源码包{soc version}-driver-{software version}-minios.aarch64-src.tar.gz。
例如在/usr/local/software/目录下执行如下解压命令:
tar -zxvf {soc version}-driver-{software version}-minios.aarch64-src.tar.gz
若已执行过此操作,此步骤可跳过。
- 进入驱动源码包解压后的driver目录,例如/usr/local/software/driver。
- 关闭内核模块(KO)签名功能。
Device操作系统内核模块默认开启了签名功能,若用户自定义驱动源码,需要关闭内核模块的签名功能,操作步骤如下:
- 进入/usr/local/software/driver/kernel/linux-5.10目录。
cd /usr/local/software/driver/source/kernel/linux-5.10
- 执行如下命令生成.config文件。
make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- ascend310p_defconfig
- 修改内核配置选项。
- 执行如下命令,弹出内核配置界面。
make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- menuconfig
- ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。
- 此命令依赖ncurses-devel,可使用如下命令进行安装:yum install -y ncurses-devel 或者 apt-get install libncurses5-dev
说明:请根据实际操作系统版本选择依赖的安装命令,如果执行命令时提示缺少其他依赖,请根据提示自行安装。
- 在配置界面中输入“/”,进入搜索界面,搜索“MODULE_SIG”。
- 选择“Ok”,进入搜索结果界面,在搜索结果界面中按数字键“1”跳转到CONFIG选项。
按空格键关闭内核模块校验选项,[ ]里面存在“*”表示打开,[ ]空白表示关闭,关闭后示例如下所示:
- 选择“Save”保存,进入配置文件名称界面,如下所示。
请注意,需要保持默认文件名“.config”,然后选择“Ok”。
- 连续选择“Exit”,退出内核配置界面。
- 执行如下命令,弹出内核配置界面。
- 替换“.config”文件。
- 执行如下命令重新编译生成内核镜像。
make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- Image
${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。
在弹出的回显信息中默认输入“y”,命令执行完成后,会在“kernel/linux-5.10/arch/arm64/boot”目录下生成内核镜像文件“Image”。
提升编译内核镜像效率的方法如下:
内核镜像编译支持-j[N]参数指定编译CPU核数,N表示使用N个CPU并发编译,不指定则使用1个cpu编译内核。N参数应根据实际编译环境CPU个数配置(可执行“cat /proc/cpuinfo | grep processor | wc -l”命令查看),比如编译环境有32个CPU,则可以使用20个CPU编译,命令示例如下所示:
make ARCH=arm64 CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- Image -j20
- 为重新生成的内核镜像增加签名头。
- 进入内核镜像文件所在目录。
- 执行如下两条命令为内核镜像文件增加签名头:
python3.7 /usr/local/software/driver/source/vendor/hisi/tools/signtool/image_pack/esbc_header.py -raw_img Image -out_img header-Ascend310P.image -version 1.1.1.1.1 -nvcnt 0 -tag uimage -platform hi1910p
- 执行如下命令,生成文件系统的摘要信息文件“uimage.ini”。
digest=`sha256sum header-Ascend310P.image | awk '{print $1}'`
echo "uimage, ${digest};" > ./uimage.ini
- 对摘要信息文件“uimage.ini”进行签名,详细操作请参见CMS签名。
- 将上述步骤生成的CMS签名文件uimage.ini.p7s和uimage.ini.crl拷贝到/usr/local/software/driver/source/kernel/linux-5.10/arch/arm64/boot/目录。
- 执行如下命令将内核镜像文件和签名文件打包并增加签名头。
python3 /usr/local/software/driver/source/vendor/hisi/tools/signtool/image_pack/image_pack.py -raw_img header-Ascend310P.image -out_img Ascend310P.image -D -platform hi1910p -cms ./uimage.ini.p7s -ini ./uimage.ini -crl ./uimage.ini.crl --addcms -version 1.1.1.1.1 --pss
- /usr/local/software/为2中{soc version}-driver-{software version}-minios.aarch64-src.tar.gz解压目录。
- -raw_img:原始镜像文件路径,保持与示例一致即可。
- -out_img:重新打包后的镜像文件输出路径,保持与示例一致即可。
- -version:镜像版本号,格式为x.x.x.x.x用户可自定义。
- -cms:CMS签名文件。
- -ini:签名文件的摘要信息。
- -crl:签名机构的吊销列表证书。
- -addcms:增加CMS签名的标志。
- -version:镜像版本号,格式为x.x.x.x.x用户可自定义。
- 其他参数请保持默认值即可。
命令执行完成后,会在“kernel/linux-5.10/arch/arm64/boot”目录下生成增加签名头后的文件系统镜像文件Ascend310P.image。
- 替换Driver安装目录下device文件夹下的Ascend310P.image。
替换前请先备份 /usr/local/Ascend/driver/device/目录下的Ascend310P.image文件到其他目录,防止内核镜像编译出错。
- 删除编译生成文件,为后续编译驱动源码做准备。
cd /usr/local/software/driver/source/kernel/linux-5.10
make ARCH=arm64 mrproper
- 进入/usr/local/software/driver/kernel/linux-5.10目录。
- 在解压后的/usr/local/software/driver下的source目录,安装相关依赖并进行源码编译。
- 进入驱动源码目录。
- 编译驱动。
make driver_device product=mini CROSS_COMPILE=${INSTALL_DIR}/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu- KERNEL_DIR=/usr/local/software/driver/source/kernel/linux-5.10 KERNEL_DEFCONFIG=/usr/local/software/driver/source/kernel/linux-5.10/arch/arm64/configs/ascend310p_defconfig build_device=true
- CROSS_COMPILE:为HCC交叉编译器所在目录,需要配置为绝对路径,其中${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际路径替换。
- KERNEL_DIR:驱动源码文件存储路径,需要配置为绝对路径,/usr/local/software/请更换为驱动源码包所在目录。
- KERNEL_DEFCONFIG:驱动源码配置文件存储路径,需要配置为绝对路径,/usr/local/software/请更换为驱动源码包所在目录。
- 其他请保持不变。
若进行源码编译时,一直循环提示类似如下信息:
请检查当前系统时间是否早于source/kernel/linux-5.10/scripts下的文件创建时间,若是,则请更改当前系统时间,然后重新进行编译操作。
命令执行成功后,会在source目录的out/device/文件夹下生成内核对象文件。
说明:
内核对象的源码都在driver/source/目录下。在driver/source/目录下通过grep -r xx.ko命令,通过对应的module.mk文件,找到源码所在的文件夹,示例如下:
则drv_pcie.ko对应的源码文件夹为drivers/ai_sdk/arc/linux/kernel_space/src/drv_pcie_device/pcie_slave。
- 替换文件系统中的相关内核对象文件。
拷贝编译生成的*.ko到解压后的文件系统的var目录下。
cd /usr/local/software/driver/source/out/device
cp -rf *.ko /usr/local/filesys_modify/tempdir/var/