-
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