驱动
以来内核编译,依赖内核执行
驱动可以同时执行多份代码
没main
驱动是依赖内核的框架和操作硬件的过程
一,Linux系统组成
app: [0-3G]
---------------------------------系统调用(软中断)---------------------
kernel: 【3-4G】
5种功能:
进程管理:进程的创建、销毁、调度等功能
文件管理:通过文件系统ext2/ext3/ext4 yaff jiffs等来组织管理文件
网络管理 :通过网络协议栈对数据进程封装和拆解的过程
内存管理 :通过内存管理器对用户空间和内核空间内存的申请和释放
设备管理:设备驱动的管理
字符设备驱动:
- 按照字节为单位进行访问,顺序访问
- 会创建设备文件,open read write close来访问
块设备驱动:
- 按照块(512字节)(扇区)来访问,可以顺序访问,可以无序访问
- 会创建设备文件,open read write close来访问
网卡设备驱动:按照网络数据包来收发的
二,宏内核、微内核
宏内核:将进程、网络、文件、设备、内存等功能集成到内核中
优点:代码运行效率高 缺点:如果一个部分出错整个内核就崩溃了
eg: ubuntu Android
微内核:只将进程、内存机制集成到内核中,文件设备驱动等在操作系统之外运行
优点:稳定性强 缺点:效率低
eg:鸿蒙 window QNX
三,驱动模块
入口(安装):资源的申请
出口(卸载):资源的释放
许可证:GPL
#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init(void)
//__init将hello_in it放到.init.text段中
{
return 0;
}
static void __exit hello_exit(void)
//__exit将hello_exit放到.exit.text段中
{
}
module_init(hello_init);
//告诉内核驱动的入口地址
module_exit(hello_exit);
//告诉内核驱动的出口地址
MODULE_LICENSE("GPL");
//许可证
Makefile:
KERNELDIR:= /lib/modules/$(shell uname -r)/build/
//内核的路径
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)
//驱动文件的路径
all: //目标
make -C $(KERNELDIR) M=$(PWD) modules
//进入内核目录下执行make modules这条命令
//如果不指定 M=$(PWD) 会把内核目录中的.c文件编译生成.ko
//M=$(PWD) 向编译模块的路径
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o //指定编译模块的名字
KERNELDIR:= /lib/modules/$(shell uname -r)/build/
#KERNELDIR:= /home/linux/kernel/kernel-3.4.39/
PWD:=$(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
obj-m:=hello.o
总结:
1、首先写个程序-》C语言程序-》.c
2、编译-》依靠内核编译( 开发板内核 和Ubuntu内核 (uname -r))
3、写Makefile-》找内核路径
4、当前文件的路径
5、all-》编译 make modules
- obj-m:=hello.o
四,内核的打印函数
printk(打印级别 “内容”)->和printf用法类似-》区别多了个打印级别
printk(KERN_ERR "yxc")
include/linux/printk.h
打印等级:
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
0 ------ ------ 7
最高的 最低的
cat /proc/sys/kernel/printk(查看打印等级)
4 4 1 7
终端的级别 消息的默认级别 终端的最大级别 终端的最小级别
使用到的命令:
进入虚拟控制台 ctrl+alt+[F1-F6]
退出虚拟控制台 ctrl+alt+[F7]
sudo insmod hello.ko 安装驱动模块
sudo rmmod hello 卸载驱动模块
lsmod 查看模块 -》暂时没有使用
dmesg 查看消息
sudo dmesg -C 直接清空消息不回显
sudo dmesg -c 回显后清空
驱动安装完成以后更改变量方法:
lsmod查看驱动
找到路径:
/sys/module/驱动模块的名字/parameters$
/sys/module/hello/parameters$
进入su修改
su root
echo 123 > a
echo 10 > b文章来源:https://www.toymoban.com/news/detail-674618.html
查看: cat a文章来源地址https://www.toymoban.com/news/detail-674618.html
到了这里,关于ARM驱动开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!