-
Notifications
You must be signed in to change notification settings - Fork 68
6. Linux Kernel & Driver Development
在学习NVDLA的UMD和KMD代码的时候,特别是在进行系统级调试的时候,发现对于Linux内核和驱动的相关知识相对欠缺,很多过程和原理都不熟悉,需要进行补充;本章节有对NVDLA代码的学习,也有对Linux内核和驱动开发本身的学习。
当系统首次启动或复位时,处理器会从默认位置处开始执行代码。在个人电脑(PC)中,该位置位于基本输入/输出系统(BIOS)中,该系统存储在主板上的闪存中。嵌入式系统中的中央处理单元(CPU)调用复位向量以在闪存/ ROM中的默认地址处启动程序。无论哪种情况,结果都是一样的。由于PC提供了很大的灵活性,因此BIOS必须确定哪些设备可以启动。

当找到引导设备时,第一阶段引导加载程序被加载到RAM中并执行。该引导加载程序的长度小于512个字节(单个扇区),其任务是加载第二阶段引导加载程序。
当第二阶段引导加载程序在RAM中并且正在执行时,通常会显示启动画面,并将Linux和可选的初始RAM磁盘(临时根文件系统)加载到内存中。加载镜像时,第二阶段引导加载程序将控制权交给内核映像,并对内核进行解压缩和初始化。在此阶段,第二阶段引导加载程序检查系统硬件,枚举附加的硬件设备,安装根设备,然后加载必要的内核模块。完成后,将启动第一个用户空间程序(init),并执行高级系统初始化。
具体的细节,可以参考IBM的技术博客:Inside the Linux boot process
在VP的仿真中,需要Aarch64访问Ubuntu的文件系统,加载编译好的nvdla_runtime可执行文件,这就需要借助于VIRT FS功能。
- add QEMU command line:
-fsdev local,id=r,path=.,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r
- run following command on the guest
mount -t 9p -o trans=virtio r /mnt
目前公开的KMD是针对AArch64架构处理器的,使用的Linux Kernel是4.13.3。针对DMA传输,使用的协议是DRM和GEM PRIME。
在进行KMD编译的时候,需要准备好Linux Kernel源码和交叉编译器。在这里就是
- 交叉编译器:https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/gcc-linaro-7.2.1-2017.11-i686_aarch64-linux-gnu.tar.xz
- Linux Kernel源码:4.13.3
cp arch/arm64/configs/defconfig .config
make ARCH=arm64 CROSS_COMPILE=~/Downloads/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- oldconfig
make ARCH=arm64 CROSS_COMPILE=~/Downloads/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -k
在kmd目录下,编译KMD的命令如下:
make KDIR=<path_to_Linux_source> ARCH=arm64 CROSS_COMPILE=<path_to_toolchain>
示例:
make KDIR=your path/linux-4.13.3 ARCH=arm64 CROSS_COMPILE=your path/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin/
编译之后,将会得到kmd/port/linux/opendla.ko文件
而编译UMD就方便很多,命令如下:
export TOP=<path_to_umd>
export TOOL_CHAIN_PREFIX=$(CROSS_COMPILE)/aarch64-linux-gnu-
make
编译之后,将会得到umd/out/runtime/nvdla_runtime/nvdla_runtime和umd/out/runtime/libnvdla_runtime/libnvdla_runtime.so。
当进行NV_SMALL编译的时候,需要在脚本中添加CFLAG_MODULE='-DDLA_SMALL_CONFIG'的选项.