Skip to content

6. Linux Kernel & Driver Development

Junning Wu edited this page Jun 13, 2018 · 14 revisions

6. Linux Kernel & Driver Development

在学习NVDLA的UMD和KMD代码的时候,特别是在进行系统级调试的时候,发现对于Linux内核和驱动的相关知识相对欠缺,很多过程和原理都不熟悉,需要进行补充;本章节有对NVDLA代码的学习,也有对Linux内核和驱动开发本身的学习。

Some Useful Links

6.1 Linux kernel Related

6.1.1 Linux Startup Process

当系统首次启动或复位时,处理器会从默认位置处开始执行代码。在个人电脑(PC)中,该位置位于基本输入/输出系统(BIOS)中,该系统存储在主板上的闪存中。嵌入式系统中的中央处理单元(CPU)调用复位向量以在闪存/ ROM中的默认地址处启动程序。无论哪种情况,结果都是一样的。由于PC提供了很大的灵活性,因此BIOS必须确定哪些设备可以启动。

Linux Kernel Startup Process

当找到引导设备时,第一阶段引导加载程序被加载到RAM中并执行。该引导加载程序的长度小于512个字节(单个扇区),其任务是加载第二阶段引导加载程序。

当第二阶段引导加载程序在RAM中并且正在执行时,通常会显示启动画面,并将Linux和可选的初始RAM磁盘(临时根文件系统)加载到内存中。加载镜像时,第二阶段引导加载程序将控制权交给内核映像,并对内核进行解压缩和初始化。在此阶段,第二阶段引导加载程序检查系统硬件,枚举附加的硬件设备,安装根设备,然后加载必要的内核模块。完成后,将启动第一个用户空间程序(init),并执行高级系统初始化。

具体的细节,可以参考IBM的技术博客:Inside the Linux boot process

6.2 Driver Development Related

6.3 Virtual Prototype

6.3.1 VIRT FS

在VP的仿真中,需要Aarch64访问Ubuntu的文件系统,加载编译好的nvdla_runtime可执行文件,这就需要借助于VIRT FS功能。

  1. add QEMU command line:

-fsdev local,id=r,path=.,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r

  1. run following command on the guest

mount -t 9p -o trans=virtio r /mnt

6.4 Building KMD and UMD for NVDLA on AArch64

目前公开的KMD是针对AArch64架构处理器的,使用的Linux Kernel是4.13.3。针对DMA传输,使用的协议是DRM和GEM PRIME。

6.4.1 准备工作

在进行KMD编译的时候,需要准备好Linux Kernel源码和交叉编译器。在这里就是

6.4.2 Compile Linux Kernel for arm64

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'的选项.

6.5 Building KMD and UMD for NVDLA on RISC-V

Clone this wiki locally