2022-03-28 09:11:39 +08:00
|
|
|
|
# 8.3 内核开发环境的搭建
|
2022-03-29 02:18:59 +08:00
|
|
|
|
|
|
|
|
|
由于内核程序处于最高权限,一旦程序存在问题,可能导致系统宕机,所以不建议直接在裸机上验证驱动。嵌入式系统一般在目标机中验证,在学习过程中建议使用虚拟机进行验证。
|
|
|
|
|
|
|
|
|
|
## 创建虚拟机
|
|
|
|
|
|
|
|
|
|
以 VirtualBox 为例,运行程序后,点击 Machine -> New 菜单,进入创建虚拟机引导页面。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
点击 Create 按钮完成虚拟机的创建。
|
|
|
|
|
|
|
|
|
|
## 虚拟系统的安装
|
|
|
|
|
|
|
|
|
|
选中新创建的虚拟机,然后依次点击进入 Machine -> Settings... 菜单,进入虚拟机详细配置页面。
|
|
|
|
|
|
|
|
|
|
选择 Storage,为虚拟机分配系统安装盘:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
选择 Shared Folders -> Add new shared folder,在虚拟机和宿主机之间分配共享文件夹:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
点击 OK 完成配置,点击 Machine -> Start,运行刚刚配置好的虚拟机:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
进入 Ubuntu20 安装引导界面:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
点击 Install Ubuntu:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
选择安装软件包:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
点击 Install Now 开始安装。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
2022-03-29 03:11:16 +08:00
|
|
|
|
|
|
|
|
|
点击 Restart Now 结束安装:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
按 Enter 键重启系统:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
## 安装开发工具包
|
2022-03-29 04:24:34 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo apt update
|
2022-03-29 22:36:47 +08:00
|
|
|
|
sudo apt install linux-headers-$(uname -r)
|
|
|
|
|
sudo apt install build-essential git git-core libncurses-dev flex bison texinfo zip unzip zlib1g-dev gettext u-boot-tools g++ xz-utils mtd-utils gawk diffstat gcc-multilib python git make gcc g++ diffstat bzip2 gawk chrpath wget cpio texinfo lzop libssl-dev libncurses5-dev libncursesw5-dev
|
2022-03-29 04:24:34 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 安装虚拟机工具
|
|
|
|
|
|
|
|
|
|
依次点击菜单按钮 Devices -> Insert Guest Additions CD imags...,加载虚拟机工具磁盘镜像文件。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
点击 Run 按钮进行安装,如安装未出现任何错误,并出现“Press Return to close this window...”字样时,可关闭窗口:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
之后执行以下命令,这样在访问共享文件夹时可以不输入密码,然后重启:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo gpasswd -a ${USER} vboxsf
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 编译和测试 hellodrv 程序
|
|
|
|
|
|
|
|
|
|
完成以上步骤后,就可以在虚拟机中开发和验证内核驱动,以 [8.2 Linux 驱动开发概述中的 hellodrv 程序](./8.2_Linux_驱动开发概述.md) 为例,该程序的编译方法如下:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
make
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
可使用 insmod 和 rmmod 加载和卸载模块:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
sudo insmod hellodrv.ko
|
|
|
|
|
sudo rmmod hellodrv
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在 insmod 之后,可使用 lsmod 命令查看模块加载情况:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
$ lsmod
|
|
|
|
|
Module Size Used by
|
|
|
|
|
hellodrv 16384 0
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
使用 dmesg 命令可打印 printk 的输出信息,验证 hellodrv 驱动程序的执行情况。
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
$ dmesg
|
|
|
|
|
[ 803.252552] hello driver enter
|
|
|
|
|
[ 1009.245694] hello driver exit
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
除可使用 insmod 命令加载模块外,还可以使用 modprobe 命令,该命令比 insmod 命令要强大,它会根据 modules.dep 中所描述的相依关系,决定要载入哪些依赖模块(modules.dep 文件由 depmod 命令生成)。使用 modprobe 命令加载和卸载模块的命令格式如下:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 加载模块
|
|
|
|
|
modprobe <module name>
|
|
|
|
|
# 卸载模块
|
|
|
|
|
modprobe -r <module name>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
用 modprobe 卸载模块时,将同时卸载其依赖的模块。
|