当前位置: 首页 > news >正文

Liunx内核驱动

一、相关概念

1、概念

驱动程序:帮助操作系统认识具体的硬件设备,并为应用层提供该硬件设备的操作方法

norflash:可线性寻址(访问方式和内存相同)

nandflash:不可线性寻址,访问需要专用的程序控制

2、操作系统启动流程:

bootloader:一个裸机程序,为操作系统启动准备环境,引导操作系统启动

kernel:一个复杂的程序,操作系统核心

rooots:根文件系统,一堆文件的集合

bootloader:uboot(.bin)

初始化CPU----工作模式

初始化异常向量表

初始化栈

关看门狗

初始化时钟

初始化内存

关闭Cache---D-Cache必须关,I-Cache随意

关闭MMU

初始化相关外设(flash/串口)

搬移内核到内存,向内核传参(根文件系统类型/位置/控制台/init进程)

引导内核启动

完成以上过程后bootloader不再控制CPU,CPU的控制权彻底移交给内核

kernel

进程管理、内存管理、文件管理、网络管理、设备管理

kernel启动到最后阶段,加载根文件系统

启动init进程-->shell-->userapp

(内核中的init退化为用户可视的init进程(1号进程))

rooots

内核启动后第一个挂载的文件系统【通过挂载的方式(获取访问该文件集合的方式)】

init程序

配置文件
系统命令
库文件
普通文件(文本、图片、mp3等等

3、两种启动模式:

3.1 从nandflash启动,bootloader,kernel,rootfs均存储在nandflash上

  • 1.系统上电后CPU自动搬移nandflash的前4KB程序到IRAM中,此时0地址被映射到0x40000000地址处(IRAM的起始地址),直接执行IRAI中的程序,bootloader必须在前4KB代码中初始化好内存,并搬移自己剩余的部分到内存运行,bootloader向内核传参,从nandflash中搬移内核到内存的0x30008000地址处,启动内核
  • 2.内核启动后,挂载nandflash中的根文件系统(mnt)
  • 3.根文件系统被挂载完成后,内核会启动根文件系统中的init进程进一步启动shell及用户程序

3.2  从norflash启动bootloader使用norflash中的,kernel和rootfs存放于ubuntu主机上

  • 1.系统上电后,直接执行norfilash中(norflash被接在0地址处)的bootloader程序, bootloader向内核传参,通过tftp服务下载内核到内存0x30008000地址处,启动内核
  • 2.内核启动到最后阶段通过nfs服务挂载ubuntu中的rootfs
  • 3.根文件系统被挂载完成后,内核会启动根文件系统中的init进程进一步启动shell及用户程序

3.2.1 tfcp

3.2.2 nfc

4、环境准备

1.在ubutun中安装tftp服务,并配置tftp服务目录
2.安装nfs服务,并配置nfs服务目录
3.下载uboot.bin到norflash的0地址处
4.拷贝ulmage(一个具体的内核)到tftp服务目录下
5.拷贝rootfs到nfs目录下(拷贝rootfs.tar.gz到nfs服务目录下并解压,使用命令+sudo)sudo tar-xvfrootfs.tar.gz

5、内核启动

  • 设置serverip(ubuntu有限网卡的ip)及ipaddr(开发板)在同一网段
  • tftp 0x30008000 uImage 通过tftp服务将serverip中的uImage下载到内存的0x30008000地址处
  • bootm 0x30008000 启动0x30008000地址处的内核

6、开发模式

开发模式是交叉开发

交叉编译工具: arm-linux-gcc 编译arm(2440)运行的程序

7、嵌入式系统:嵌入式系统是软硬件可剪裁的专用计算机系统

8、编译内核

1、拷贝默认配置到.config(官方配置都在arch/arm/configs目录下)

2、make menuconfig

3、make uImage(静态编译内核)、make modules(编译内核模块)、make(内核及模块都编译)

1. 需要修改kernel/timeconst.pl文件

2. 需要修改arch/arm//boot/Makefile文件

9、相关文件解释

Image:可以直接使用的内核映像(镜像)

zImage:一段解压程序(代码)+Image压缩包

uImage:64字节的头信息+zlmage

10、向内核新加文件:(例:向driver/char目录下新加hello.c)

1、在driver/char目录下创建并编辑hello.c文件

2、修改driver/char下的Makefile新加一行 ---(obj-$(CONFIG_HELLO)+=hello.o)

3、在同层目录下修改Kconfig,添加一个hello的配置(只有Kconfig定义的配置才会出现在make menuconfig中)

config DEMObool "this is demo"                                                                                                                                                              default y---help---this is a test driver.

4、make menuconfig,修改关于hello的配置

5、make uImage

11、设备驱动程序

11.1 设备驱动分类

字符设备:一般以数据(字节)流的形式操作,数据访问有严格的顺序

块设备:数据可以随机访问(存储设备),以块的形式访问数据

网络设备:集成复杂的协议栈(网卡),按名字维护,没有设备号

11.2 设备号

设备号:内核维护设备驱动程序的数字(每个设备都有唯一的设备号)
设备号有32位,其中:
高12位 主设备号区分不同类别的设备(LCD.KEY.LED)
低20位 次设备号同类的不同设备

11.3

...

1. 实现供应用程序调用的接口(open、read、write等等)
----操作硬件的代码
2. 向内核注册该驱动程序(以设备号的形式)

3. 创建设备节点(一组绑定的设备名和设备号)

11.4、手动创建设备节点

mknod /dev/demo c 255 0

/dev/demo 设备节点名
c-字符设备
255 主设备号
次设备号

12、动态加载驱动

静态编译进内核:驱动存在于umage中,内核启动时加载驱动

动态加载驱动:驱动独立存在(xxx.ko),内核启动后动态加载

1、make menuconfig 对应配置选项为M

2、make modules

3、复制ko文件到根文件系统

4、在roots文件系统里面:

insmod led.ko(动态加载驱动模块)

lsmod (查看动态加载的驱动模块)

rmmod led (卸载动态加载的驱动模块)

13、节点

14、杂项设备驱动(字符设备)

misc

15、ioctl

实现设置和属性获取方面的功能

cmd数字(vim Documentation/ioctl/ioctl-number.txt)

http://www.dtcms.com/a/354108.html

相关文章:

  • Java中StringBuilder原理以及使用
  • D4145低功耗GFCI接地故障控制芯片介绍
  • 题目—移除元素
  • 作业帮,途虎养车,得物,途游游戏,三七互娱,汤臣倍健,游卡,快手26届秋招内推
  • JUC多线程个人笔记
  • 【DC工具GUI入门】
  • APP测试全流程以及测试点
  • 【开题答辩全过程】以 基于SpringBoot的流浪动物领养系统的设计与实现 为例,包含答辩的问题和答案
  • 从Java到Go:初遇Go语言的震撼体验
  • 力扣 30 天 JavaScript 挑战 第41天 (第十二题)对异步操作,promise,async/await有了更深理解
  • 【Linux实时内核机制】ww_rt_mutex 的contending_lock异常问题
  • android/java中主线程和子线程的详解
  • Nano Banana揭秘:Google Gemini 2.5 Flash Image正式发布 | AI图像编辑新时代
  • 内网应用如何实现外网访问?外地通过公网地址访问内网服务器的设置方法
  • 动态规划:青蛙跳台阶实践
  • H20 性能表现之 Kimi-K2
  • 【git】:gitee项目管理vs2019
  • 装饰器进阶与设计模式
  • Linux入门教程 第十五章 Linux 系统调优工具
  • 【工具篇】github/huggingface 镜像源总结
  • 嵌入式系统学习Day24(线程)
  • Custom SRP - Shadow Masks
  • Axure:如何将SVG转换为形状
  • leetcode 155 官方golang标准答案错误
  • Java Lambda 处理日期时间 根据区间找出区间内集合
  • Linux程序与进程:核心概念与管理全解析
  • Class45循环神经网络RNN
  • “互联网 +”时代下开源 AI 大模型 AI 智能名片 S2B2C 商城小程序:行业变革与未来展望
  • 基于 Ultralytics YOLO11与 TrackZone 的驱动的高效区域目标跟踪方案实践
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-Python图像处理实战