0%

UVM中路径

1

面试常见问题

1.UVM对callback进行调用

1
2
3
4
+UVM_CB_TRACE_ON(*)
+UVM_VERBOSITY
+UVM_CONFIG_DB_TRACE
+UVM_OBJECTION_TRACE

2.UVM的callback能够完成:

1
2
3
4
修改UVM组件的操作(*)
UVM组件注入错误(*)
UVM组件间通信
UVM组件收集覆盖率(*)

NOTICE

LINUX 驱动开发必须在搭载LINUCX系统或虚拟机上进行,WIN10自带WSL不支持。

本机开发环境搭建

本机开发指宿主机和目标机是一台主机,即在本机上开发编译然后在本机 上加载运行(Linux设备驱动也可以直接编译进内核,但为了开发工作方便,一般采用动态加载的方式)
step1:查看当前主机内核版本号

1
uname -r

step2: 查看当前宿主机所有源码版本

1
apt-cache search linux-source

step3:根据宿主机内核版本号下载相应内核源码

1
sudo apt-get install linux-source-$(shell uname -r)

step4:配置内核,默认即可,也可采用原始配置单内存占用可能比较大

1
2
3
make menuconfig //图形配置

make oldconfig //原始配置

step5: 编译Modules

1
make modules

step6: 安装 modules

1
make modules_install

嵌入式开发环境搭建

这种开发中一般目标机为带有嵌入式处理器的开发板,而宿主机为PC,开发环境需要在宿主机上搭建,嵌入式Linux设备驱动开发的步骤如下(Cortex-A9架构的ARM开发板为例):
step1:
在宿主机上下载嵌入式开发板对应版本Linux的源码,并解压:https://www.kernel.org/
tips:最好用开发板或核心板附带的源码包

1
# tar xvf linux-5.4.70.tar.gz

step2:编译内核

1
2
3
4
5
# apt install gcc-arm-linux-gnueabi make libncurses-dev bison flex
# cd linux-5.4.70
# make ARCH=arm vexpress_defconfig
# make ARCH=arm menuconfig
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage LOADADDR=0x60003000

step3:编译生成设备树

1
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs

step4: 在当前源码目录编译Modules

1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules

step5: 安装 modules

1
make modules_install

概念

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。如在ARM-Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的”arch/arm/boot/dts/“目录内,比如exynos4412参考板的板级设备树文件就是”arch/arm/boot/dts/exynos4412-origen.dts”。这个文件可以通过$make dtbs命令编译成二进制的.dtb文件供内核驱动使用。基于同样的软件分层设计的思想,由于一个SoC可能对应多个machine,如果每个machine的设备树都写成一个完全独立的.dts文件,那么势必相当一些.dts文件有重复的部分,为了解决这个问题,Linux设备树目录把一个SOC公用的部分或者多个machine共同的部分提炼为相应的.dtsi文件。这样每个.dts就只有自己差异的部分,公有的部分只需要”include”相应的.dtsi文件, 这样就是整个设备树的管理更加有序。

LINUX 驱动开发之HELLO WORLD!

hello.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <linux/module.h>
#include <linux/init.h>

// 当驱动被加载的时候,执行此函数
static int __init hello_init(void)
{
printk(KERN_ALERT "welcome, hello\n");
return 0;
}

// 当驱动被卸载的时候,执行此函数
static void __exit hello_exit(void)
{
printk(KERN_ALERT "bye, hello\n");
}

// 版权声明
MODULE_LICENSE("GPL");

// 以下两个函数属于 Linux 的驱动框架,只要把驱动两个函数地址注册进去即可。
module_init(hello_init);
module_exit(hello_exit);

Makefile

1
2
3
4
5
6
7
8
9
10
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR ?= /home/workspace/linux-5.4.70
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean
endif

指定架构及编译选项(可修改Makefile, 之后补充)

1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

LINUX 驱动开发之SCULL

scull(simple character utility for loading localities,区域装载的简单字符工具)是一个操作内存区域的字符设备驱动程序,该字符设备并不是一个真实的物理设备,而是使用内存来模拟一个字符设备
设备模型:

1

源码参照: http://examples.oreilly.com/9780596005900/

由于ldd3书本是基于linuxn内核2.6,因此其大多驱动示例已经不能在最新版本内核编译。若想在最新版本内核编译驱动程序,可参照:

The example drivers should compile against latest Linus Torvalds kernel tree:

1
* git://git.kernel.org/pub/scm/linux/kernel/git/sfr/linux-next.git

To compile the drivers against a specific tree (for example Linus tree):

1
2
3
4
5
$ git clone git://github.com/martinezjavier/ldd3.git
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ export KERNELDIR=/path/to/linux
$ cd ldd3
$ make

RISC-V REGS

下图为xv6的栈的结构图,其中每一个区域都是一个Stack Frame,每执行一次函数调用就会产生一个Stack Frame,它使得我们的函数变得有组织,且能够正常返回。
stack frame
Caller Saved寄存器在函数调用的时候不会保存
Callee Saved寄存器在函数调用的时候会保存
REGS

INSTRACTIONS

1
add rd, rs1, rs2  # X[rd] = X[rs2] + X[rs2]

ins1
ins2

LINUX 常用开发工具

1.git安装配置

1
2
3
$ sudo apt-get install git
$ git config --global user.name "xxx"
$ git config --global user.email "xxx@email.com"

xxx 替换成自己用户名和绑定邮箱

2.生成SSH秘钥

1
2
$ ssh-keygen -t rsa -C "xxx@email.com" 
$ cat ~/.ssh/id_rsa.pub

在github账号添加SSH密钥GitHub.

3.some notes for hexo error

ttp://localhost:4500 本地host无法打开

原因:端口号被占用,hexo默认端口为4000

解决方案:指定hexo为其他端口

1
hexo s -p 4500

4.Miniconda软件安装教程(Linux)

wget 包下载

1
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh

软件安装(安装软件:安装过程中根据提示输入enter或yes)

1
bash Miniconda3-py38_4.8.3-Linux-x86_64.sh

验证安装:重启终端(必须),运行下方命令,显示版本号则安装成功

1
conda -V

更换国内源,在用户目录(/home/xxx)下新建.condarc文件并添加如下内容

1
touch .condarc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

执行以下命令清除索引缓存,并查看配置确认换置完成

1
2
3
conda clean -i

conda config --show