Linux驱动学习前置知识(了解)及基本框架

分层思想

在学习驱动开发你必须要知道的 Linux 下的系统的知识
我们之前做 Linux 的系统开发的时候 我们开发的代码是 以 main 作为 C 语言的框架
开发多进程 多线程的这种应用级开发
大家再开发种应该都遇到一种情况 : 野指针 -> 程序跑飞 -> 死掉!
大家都知道一件事:
指针指向是地址,野指针指向也是地址 -> 地址是随机!
寄存器本身是地址
STM32 的库函数底层 寄存器 -> 地址!
有没有可能发生这种事:
野指针指向了寄存器 -> CPU 的 LCD 的接口时钟地址
为什么众多开发者在学习 C 语言
出现野指针的时候为什么没有把系统搞死机
为什么没有出现开发 C 语言或者系统的时候突然关机呢!

虚拟内存

所有你在系统看到的得到的地址都是假的,都是虚拟,都是映射而来的!
你只要得到的地址,你只要在系统映射后的地址
都是由 -> DDRAM 这个运存所占用的物理地址 ( 真实地址 ) 映射而来的!
我们的程序运行在 RAM 里面,
程序的虚拟地址映射于 RAM 的真实的物理地址
程序无论如何都无法访问真实地址,更加不要想要访问硬件了!
既然是虚拟地址,你随意写入关闭你能访问的地址
都是虚假的,都不可能访问到硬件 ( 真实的地址 )
为什么系统需要这样做?
在牛掰的黑客,只能黑掉你的系统,但从不能黑掉硬件!
保护硬件!
因为系统的虚拟的地址映射
所有的程序跑的地址都是虚假的
无法访问真实物理地址!
也在保护你!
那这个东西成为我们开发驱动的一个阻碍
访问硬件更加的麻烦和复杂
实际上:
真实的系统分为两大层:
系统层:
你们之前所学所有的知识
你们之前所写的所有的代码
都是在系统层
内核层 :
运行在内核内部
的程序。他有特权,同时很危险

系统层和内核层

系统层
指的是我们之前一直正常运行在系统的程序
内核层
运行在内核里面,程序比较特殊,权限较大
内核层有访问真实物理地址的权限
有了这个基础 内核层就可以访问硬件
内核层就可以开发硬件->开发驱动

驱动的理论基础

前言

内核层 运行的程序不同于以往, 不在 C 语言+ main 框架 ,而是 内核层:入口函数 出口函数

内核层入口和出口

cpp 复制代码
#include <linux/kernel.h>
#include <linux/module.h>


//内核层代码错误有可能直接造成内核死亡 + 系统死亡
/*入口函数:
 *内核层加载的时候入口函数会自动调用
 */
 int __init myled_init(void)
 {
 return 0;
 }
/*出口函数
 *内核卸载的时候,出口函数会自动调用
 */
  void __exit myled_exit(void)
  {
 
  }
 //往往入口函数用于注册驱动/初始化驱动的
 //往往出口函数 取消注册,清理驱动,释放空间

内核层的声明

cpp 复制代码
/* 
 *声明一般放到 函数下面
 *内核层代码。其中入口函数和出口函数必须声明!
 *内核层入口声明和出口声明有专门的函数声明
 */
// 声明入口函数的函数:
   module_init(声明入口函数名);
 //声明出口函数的函数:
 module_exit(声明出口函数名);
// 声明你的代码遵循 GPL 协议的
 MODULE_LICENSE("GPL");

驱动的编译

创建一个 Makefile
Makefile 注意点:
Makefile 命名是大写
Makefile 的目标和命令隔开 Tab
Makefile 不允许所在路径中间任意一个路径有 英文

obj-m += led.o
#obj-m:代表模块 module (驱动) 目标-> led.o->led.c
KDIR:=/home/***/RK3588S/kernel
#代表你的编译的所用的内核的位置
CROSS_COMPILE_FLAG=/home/***/RK3588S/prebuilts/gcc/linux-x86/aarch64/gcc-arm-
10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
#这是你的交叉编译器路径
all:
make -C (KDIR) M=(PWD) modules ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE_FLAG)
#调用内核层 Makefile 编译目标为 modules->模块 文件在当前路径

架构 ARCH=arm64

clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.markers *.order

调用内核Makefile编译时,内核的需要之前编译过。

终端输入make直接编译,编译后生成一个led.ko,这个就是驱动文件,然后用adb,终端输入adb push led.ko ,将adb推到开发板。

驱动的加载与卸载

ADB进入调试模式

终端输入adb shell 进入开发板,

加载驱动

bash 复制代码
insmod led.ko

卸载驱动

bash 复制代码
rmmod led.ko

串口调试

windows使用超级终端进行串口连接

linux 上使用 screen命令连接

没有screen 的先下载screen

bash 复制代码
sudo apt install screen
bash 复制代码
sudo screen /dev/ttyUSB0  波特率

当然用minicom也行,这个串口工具使用前得先配置,它支持传输文件,可以说非常好用,有兴趣可以搜一搜,这里就不在多做说明

相关推荐
Haoea!8 分钟前
Flink-01学习 介绍Flink及上手小项目之词频统计
大数据·学习·flink
大佛拈花2 小时前
Godot学习-创建简单动画
学习·游戏引擎·godot
-曾牛6 小时前
Git完全指南:从入门到精通版本控制 ------- Git仓库创建 (5)
大数据·网络·git·学习·elasticsearch·个人开发
笺上山河梦6 小时前
文件操作(二进制文件)
开发语言·c++·学习·算法
虾球xz8 小时前
游戏引擎学习第221天:(实现多层次过场动画)
c++·学习·游戏引擎
Willliam_william9 小时前
QEMU学习之路(8)— ARM32通过u-boot 启动Linux
linux·学习·elasticsearch
踢足球的程序员·9 小时前
OpenGL学习笔记(几何着色器、实例化、抗锯齿)
笔记·学习·图形渲染
梦幻精灵_cq10 小时前
子函数嵌套的意义——以“颜色排序”为例(Python)
学习
jackson凌11 小时前
【Java学习笔记】运算符
java·笔记·学习
Always_away11 小时前
数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记4
数据库·笔记·sql·学习