包含linux设备驱动开发的基础知识及统信UOS设备驱动的总体架构,常用的设备驱动开发调试优化手段及在环境搭建和代码编写过程中常见问题处理等。
文章目录
-
- 环境搭建
- 如何编译驱动
- 代码编写
- 如何实现同源异构
环境搭建
如何编译内核
下载并解压内核源码包,进入源码根目录,内核的编译过程由当前路径下的Makefile指导完成。要利用该Makefile,首先需要安装make(构建工具)、gcc(编译器)等依赖。如果在Debian/Ubuntu/UOS系统上,这些依赖可以由build-essential软件包统一提供,其他系统单独安装make工具和gcc编译器即可。
在Makefile编写的规则中需要读取依赖文件.config,这个文件定义了Makefile需要使用的CONFIG_XXX变量,直接运行make命令会导致Makefile因为缺少依赖报错。所以在运行make前先运行make xxx_defconfig以生成.config,目标参数xxx_defconfig是存放在源码树中arch//configs/目录下的配置文件,记录了与默认配置不同的选项,该命令用文件中的内容覆盖默认配置形成.config配置文件。默认配置由各子目录下的Kconfig生成。
在make工具构建 xxx_defconfig目标时,需要运行LEX和YACC脚本,在Linux系统上安装flex和bison软件包以满足前置依赖。正确地生成.config文件后,使用make命令就可以进行内核编译流程了。留意过程中的提示信息,可能需要根据开启的配置安装特定的软件包,比如libelf-dev、libssl-dev等。
若需要采用自定义的配置进行编译,建议在生成.config文件之后对其进行修改——可以通过文件编辑器对.config进行修改,也可以使用终端图形界面修改配置(更推荐的方式)。采用图形界面修改配置需要安装依赖包libncurses-dev,然后运行make menuconfig。图形界面的选项来自.config文件,在其中搜索并修改相关配置后,退出时选择保存即可更新对应.config文件。通常建议对用于调试的内核,修改CONFIG_BUILD_SALT的值,以区别已经安装在机器上的内核,若不修改该选项可能导致调试内核在安装时覆盖原有同名内核。
将内核制作成软件包格式能够更加方便存储传输和安装,Makefile也帮我们定义了软件包制作目标,只需要运行make bindeb-pkg即可。为了加快编译速度,在运行命令时添加参数-j 以实现n核并行编译。编译结束后,内核源码树中会保留单个模块的目标*.o文件、由目标文件链接而成的可执行镜像文件vmlinux,如果选择了bindeb-pkg作为编译目标,根目录同级路径下会生成*.deb文件和buildinfo等版本信息文件。根据机器性能不同编译过程耗时可能在几十分钟到几小时不等。
$ sudo apt install build-essential flex bison libncurses-dev
$ git clone https://github.com/deepin-community/kernel.git
$ cd kernel
$ make x86_desktop_defconfig
$ make menuconfig
$ make bindeb-pkg -j8 #根据实际核心数设置
以上是本地编译同架构内核的步骤,要实现交叉编译,请下载目标架构提供的交叉编译工具链,设置好环境变量后同样按照以上步骤进行即可。
如何编译驱动
Linux内核驱动以ko文件即内核模块的形式存放和被加载。因此,编译一个驱动就是要编译一份ko文件。无需内核源码树,我们可以在已有系统上编译出符合该系统接口的内核模块文件,这样编译出的模块可以直接在当前正在运行的系统上被加载和进行验证。
以一个命名为UosDemo的模块为例,在准备好源码后将其命名为uosdemo.c,准备一份Makefile指导该模块的编译。该Makefile内容如下。
obj-m += uosdemo.o
all:
make -C /lib/modules/