乐于分享
好东西不私藏

Linux内核驱动源码走读之编译内核及外部驱动实操指南

Linux内核驱动源码走读之编译内核及外部驱动实操指南

Hello,大家好,我是程序媛MM。

本文约900字,本文主要介绍编译内核和外部驱动的实操说明,这是后续自己编写驱动调试必须要准备的工作环节。

关注公众号, 即可获得与Linux相关的电子书籍(含《深入理解计算机系统》)以及常用开发工具,文末有文档清单。


编译环境:

基于Ubutun18.04  内核版本为6.1.161

环境依赖库安装:

sudo apt-get update

sudo apt-get install -y build-essential flex bison libssl-dev libelf-dev \

ncurses-dev bc ca-certificates wget git gcc make dpkg-dev fakeroot \

rsync kmod cpio libncurses5-dev

一 下载内核源码


wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.161.tar.xz

tar -xf linux-6.1.161.tar.xz

cd linux-6.1.161

二 配置内核


[1].配置内核基础配置

cp /boot/config-$(uname -r) .config

或者make defconfig

[2].编辑内核配置(打开调试及相关驱动模块等)

make menuconfig

Kernel hacking→ 勾选所有调试选项

确保以下关键选项开启:

CONFIG_DEBUG_INFO=y # 包含调试信息CONFIG_DEBUG_INFO_DWARF5=y # DWARF5格式(GDB支持更好)CONFIG_GDB_SCRIPTS=y # GDB脚本支持CONFIG_KGDB=y # KGDB内核调试CONFIG_FRAME_POINTER=y # 帧指针(backtrace)CONFIG_DEBUG_KERNEL=yCONFIG_DEBUG_DRIVER=yCONFIG_DYNAMIC_DEBUG=y # 动态调试

如果需要编译null驱动,则需要打开如下配置:

保存配置(保存为 .config文件)。

三 编译内核


[1]. 编译内核镜像 

make V=1 -j$(nproc) //详细输出,首次编译时推荐查看编译过程

说明:编译中会提示证书的问题,通过创建空证书规避报错。

mkdir -p debiantouch debian/canonical-certs.pemecho "" > debian/canonical-certs.pem# 告诉系统使用空证书scripts/config --set-str CONFIG_SYSTEM_TRUSTED_KEYS ""

[2]. 编译内核模块(驱动) 

make modules -j$(nproc)

[3]. 安装内核模块 

sudo make modules_install

[4]. 安装内核 

# 安装内核到/bootsudo make install

我们主要是为了走读内核的驱动源码,然后自己写写驱动调试一下。第4步可以不做。

四 编译外部驱动模块


[1]. 创建hello.ko驱动示例 

// hello.c#include<linux/init.h>#include<linux/module.h>#include<linux/kernel.h>MODULE_LICENSE("GPL");MODULE_AUTHOR("My Name");MODULE_DESCRIPTION("Hello World driver");staticint __init hello_init(void){    printk(KERN_INFO "Hello world, kernel 6.1.161!\n");    return 0;}staticvoid __exit hello_exit(void){    printk(KERN_INFO "Goodbye, kernel!\n");}module_init(hello_init);module_exit(hello_exit);

[2]. 创建Makefile 

#MakefileKDIR ?= linux-6.1.161PWD := $(shell pwd)# 或者指向你的内核源码目录# KDIR ?= /path/to/linux-6.1.161obj-m += hello.oall:$(MAKE) -C $(KDIR) M=$(PWD) modulesclean:$(MAKE) -C $(KDIR) M=$(PWD) clean

[3]. 编译驱动 

执行make

因打开了详细输出查看内核编译过程, 需要好久才编译完,刚编译完驱动公司外网网络就断开了,来不及安装驱动调试了。有兴趣的可以继续往下调试。

以上为全文内容。

往期文章(欢迎订阅技术分享栏目全部文章):

【项目实战】嵌入式软件系统中Flash进入硬件写保护的问题定位以及用软件操作解除写锁定的实现方法
【项目实战】保姆级教程: PWM控制白光灯及亮度调节
【项目实战】Linux下开通虚拟网桥功能的方法和遇到的问题及解决方案
【项目实战】Linux下音频对讲功能延时卡顿障故排查与解决
【项目实战】SPI Nor Flash下OTA升级概率失败导致系统成砖问题的排查和解决方法

谢谢你看到这里

这里是女程序员的笔记本

 15年+嵌入式软件工程师兼二胎宝妈

分享读书心得、工作经验,自我成长和生活方式。

希望我的文字能对你有所帮助

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Linux内核驱动源码走读之编译内核及外部驱动实操指南

评论 抢沙发

1 + 8 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮