Linux内核驱动入门 编译环境搭建、编译内核

前言

哎…有时候我都不知道自己是干啥的
说是运维吧,docker不会,k8s不会;说是驱动吧,uboot不熟,内核不熟,驱动没写过;
什么都是会点皮毛,这篇文章记录一下内核驱动学习记录。
(背景:用的正点原子的开发板)

搭建内核驱动编译环境

下载交叉编译工具

编译内核

minicom工具使用

我的i7-1260p性能真的巨差啊,windows上开了个6核12GB内存的虚拟机编译qemu的arm一项就要11分钟,(双系统)切到ubuntu后,同样的操作只需要1分多种,所以我用物理机搭环境了,win那边开虚拟机性能差的受不了。
这就需要安装一下linux上的串口工具,这里我用的是minicom

minicom -D /dev/ttyUSB0 -b 115200
alias minicom-a="minicom -D /dev/ttyUSB0 -b 115200" #下次输minicom-a就可以了
ctrl+A 然后 z进入菜单
按x或q退出

在这里插入图片描述

找不到ttyUSB设备问题

用正点原子那个板子连到电脑上的USB口,是有个啥ch340驱动转的,ubuntu自带这个玩意,设备文件应该叫ttyUSB*,但是我一开始在/dev下找不到,原因是冲突了,参考了下面这篇博客
【物联网】Ubuntu2204版本不显示USB串口设备解决办法
结论 ubuntu上需要卸载brltty,(这是个什么盲文的啥,放心apt remove brltty就行)然后重新给板子上下电

编译内核

正点原子给的linux内核源码,这个东西没法上传,上传了也要积分下载,大家自己买块板子或者网上找下吧
在这里插入图片描述

注:和普通的linux4.1.15代码不一样,可能是做了什么32位的适配
执行make help查看编译选项:
有imx_v7_defconfig和imx_v7_mfg_defconfig两项,正点的PDF教程里推荐使用mfg那个,但那个编出来的是armv6版本的,蚌
所以这里执行make imx_v7_defconfig
然后make Image -j12(i7-1260P是4P+8E 12个物理核,所以我启了12个线程)
等待内核编译完成:

编译报错解决

刚开始编译就报错:multiple definition of `yylloc’; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
百度了一下发现是gcc版本太高,降级到gcc9
这里顺便记录一下update-alternatives工具的使用

#1 创建链接
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 3
为/usr/bin/gcc-9创建一个管理的软链接
到/usr/bin/gcc
名称为gcc
优先级是3

#2 更改优先级
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 5
覆盖原先的优先级为5

#3 手动选择
update-alternatives --config gcc 弹出>>2 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

  选择       路径           优先级  状态
------------------------------------------------------------
  0            /usr/bin/gcc-9    5         自动模式
* 1            /usr/bin/gcc-11   2         手动模式
  2            /usr/bin/gcc-9    5         手动模式

输入编号选择

#4 删除链接
update-alternatives --remove gcc /usr/bin/gcc-9

小坑

这里有个小坑
正点的板子的内核似乎是编译的某个chekout的代码,但是他给的压缩包可就不是git仓了,因此编译出来版本号可能对不上:
在这里插入图片描述g3dc0a4b:这个是git的checkout的某次提交(应该…吧
更改内核Makefile
EXTRAVERSION填这个

在这里插入图片描述

编译选项说明

nnd 当初学内核编译的时候,网上的那些教程总是讲不清Image zImage uImage Image.gz vmlinux这些东西,烦死了
这里我简单说一下:
首先 执行make help,可以查看linux内核Makefile支持的编译选项
然后 就可以看到支持的选项:

在这里插入图片描述
这里支持zImage Image uImage,但其他内核源码不一定支持uImage,有的则是Image.gz,至于这些的区别大家网上查查吧,编译驱动弄个基础的Image就行

从零开始的驱动程序

arcoproc.c

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>

static int __init arcoproc_init(void) {
    printk("arcoproc init~\n");
    return 0;
}

static void __exit arcoproc_exit(void) {
    printk("arco say: bye~\n");
}

module_init(arcoproc_init);
module_exit(arcoproc_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("ARCO");
MODULE_DESCRIPTION("arco proc test");

Makefile
这里的KDIR指定的是刚才编译出的内核的位置

KDIR := /home/arco/kernel/linux-imx
obj-m=arcoproc.o
PWD=$(shell pwd)
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	make -C $(KDIR) M=$(PWD) clean

下一篇:
Linux内核驱动入门 proc文件读写
编写了一个简单的内核驱动程序

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值