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

Linux内核驱动开发(一)

Linux内核初探

  • linux操作系统历史

  • 开发模式

    • git

      • 分布式管理
      • git clone 获取
      • git push 提交
      • git pull 更新
    • 邮件组 mailing list

    • patch

  • 内核代码组成

    • Makfile

    • arch 体系系统架构相关

    • block 块设备

    • crypto 加密算法

    • drivers 驱动(85%)

      • atm 通信
      • bluetooth 蓝牙
    • firmware:外设

    • fs 文件系统

    • include 头文件

    • init 启动代码

    • ipc 进程通信代码

    • kernel 内核

    • lib 库

    • mm 内存管理

    • net 网络相关

    • scripts 脚本

    • security 安全相关

    • sound 音频相关

    • tools 工具(perf 测试工具)

    • usr 生成打包等

    • virt 虚拟化

  • 内核配置和编译

    • 工具链(编译器 arm-linux-gcc、链接工具 ld、查看 objdump、调试)
    • 配置内核(决定需要编译的代码模块)
    • 编译内核(生成可执行文件)
  • vmlinux(原始,未压缩的可执行文件)、zImage(压缩的可执行文件=压缩vmlinux+解压程序头)和uImage(用于给uboot引导的zImage)

花里胡哨:

ls -a 显示隐藏文件,即.***
Y 编译内核 N 不编译内核 M 模块编译
make -j4 zImage
CC 一个.o ;LD 一个目标下的.o

Linux内核的基本概念

  • 物理地址&虚拟地址

    • 地址转换:内核使用的地址一定是内核地址,但是cpu使用的是物理地址,中间存在一个转换过程。

      • phys_to_virt:
      • virt_to_phys:
        在这里插入图片描述
    • 页表:虚拟 -》物理;内存管理最小单位为页(大小为4k);页表大小=所有物理地址/4k。

      • 页表初始化:start_kernel->mm_init->mm_alloc_pgd(划出一段内存,页表初始化)
        在这里插入图片描述
      • ioremap(cookie,size):最后调用 分配pgd
    • 内存属性:可读、可写、可执行。

  • Linux内核中的内存管理

    • 页(4k byte)为单位进行管理

    • 分配内存举例

      • alloc_pages(gfp_mask,order):分配内存的底层调用,可以分配整页的内存;gfp_mask是不同选项的组合(GFP_NOWAIT:分配不允许等待;GFP_ATOMIC;GFP_NOFS:不能进行文件操作;GFP_KERNEL:给内核用;GFP_USER;GFP_IOFS:分配内存可以IO操作);order分配2的次方的页
      • kmalloc:分配内存的函数(以字节为单位),分配内存必定是连续的。
      • vmalloc:分配内存物理上不连续,虚拟地址连续。
  • 系统调用(Linux特用):用户调用内核函数(API)的媒介,具体实现(通过一个 异常 ,使得应用程序陷入内核中执行)

  • 内核进程、线程

    • 内核只有线程,没有进程

    • 线程的task_struct(核心结构):包括进程的优先级、堆栈信息、打开文件句柄信息
      在这里插入图片描述
      在这里插入图片描述

    • 线程的调度(3种优先级:SCHED_RR、SCHED_PRI、SCHED_RT);调度的时机:时钟中断发生;Linux发生内核态和用户态相互切换;Liunx执行完信号

  • 内核中同步和线程间通信方式

    • 原子操作:不可能被打断的基本操作

    • 同步通信方式

      • 自旋锁(spin_lock)
        在这里插入图片描述

      • 信号量(up:释放 和 down:)
        在这里插入图片描述
        在这里插入图片描述

    • 异步通信方式

      • 信号 – signal :处理信号的函数在task_struct中指明。
        在这里插入图片描述
  • 中断

    • 中断的硬件概念:就是一个外部的电平信号
    • 中断处理的上半部:需要linux内核关闭其他硬件信号
    • 中断处理的下半部:上半部中来不及处理、比较冗长的程序段;需要等待其他程序结果,或者需要等待获取其他资源的程序段。
  • 时钟和定时器管理

    • 时钟硬件概念:能够产生一种定时中断的电路
    • RTC(实时时钟或实时计数器)和system timer(很多情况就是用来作为延迟和计算相对时间)
    • tick(时钟中断的周期,HZ)& jiffies(全局变量,如果是64位系统,就是64位的变量,记录了从上电开始,所经历的tick数)
  • 文件系统

    • 虚拟文件系统(VFS):是linux内核为了屏蔽物理文件系统的差异所产生的一个中间层。
    • 物理文件系统(ext4:最大特点是具有完善的日志系统,yaffs2:比较适合在nand flash部署的文件系统,ubifs和btfs)

Linux驱动程序开发基础

  • 内核模块编程

    • 驱动模块化编程的好处

      • 驱动编译进内核,导致内核非常大
      • 很多驱动都只是在特定机器上使用
      • 实现热插拔提供基础
    • 模块编程的代码实例

      • 实例验证hello.ko模块
        在这里插入图片描述
        在这里插入图片描述
    • Makefile的写法

在这里插入图片描述

- 其他- 模块位置可以随意放置- 内核代码更新,模块代码也要更新
  • 驱动程序访问硬件的特殊性

    • DMA

      • dma的基本硬件概念:是存在外设设备中的一个硬件控制器,作用是不需要cpu协助,就可以搬移内存数据到外设的存储设备中。

      • dma的基本配置过程:通过程序配置dma控制器,告诉dma控制器它可以访问的内存地址。然后cpu将要传给外设的数据写到事前约定好的地址。

    • IO子系统:在嵌入式系统中,实现对外围附属设备进行控制的有效手段。通过IO端口进行0和1操作,可以发指令或者传递信息给附属设备。

  • Linux设备模型:最初目的是实现只能电源管理

    • kobject

      • 一个设备驱动会建立一个kobject,偶尔也有因为功能复杂的原因而建立多个kobject。

      • koject会有一个一个kobj_type属性。
        在这里插入图片描述

          - entry :本人所在目录- parent:父节点- kset:一组类似性质的kobject集合- ktype:类型- kref:这个对象的引用计数
        
      • kobject一般都是sysfs中的一个目录,从而形成对用户空间的交互。

      • 引用计数kref。

    • kset:一组类似性质的kobject集合;一个kset也就是一个子系统,它是sysfs的一个顶层目录的表征。比如block子系统,各种总线子系统。

    • sysfs:虚拟文件系统(管理内核的设备而非磁盘,它是kobject对象的完整视图)

      • 主要api(sysfs_create_file; sysfs_create_link; sysfs_remove_file; sysfs_remove_link)

      • 提供丰富的内核和用户空间交互的手段

      • sysfs主要目录结构

          - block:块设备,独立于所链接的总线。- devices:被所有内核识别的硬件设备,依照链接他们的总线对其进行组织。- bus:系统中用于连接设备的总线- drivers:在内核中注册的设备驱动程序- class:系统中设备的类型(声卡,网卡,显卡等);同一类可能包含由不同总线连接的设备,于是由不同的驱动程序驱动。- power:处理一些硬件设备电源状态的文件。- firmware:处理一些硬件设备固件的文件。
        
    • udev:处理热插拔机制,通过设备驱动加载时,注册kobject后,向用户空间发送uevent实现的。

  • Linux驱动的分类

    • 字符设备:一般都是以串行顺序依次进行访问,典型的包括触摸屏,鼠标,按键等。

      • cdev结构:
        在这里插入图片描述
    • 块设备:一般以扇区、块为单位进行读写访问,例如硬盘,cdrom,flash等
      在这里插入图片描述

    • 网络设备:以太网的设备。

    • 杂项设备:没法归类或复合设备。

  • Linux内核的基本调试方法

    • printk

      • 级别
      • dmesg
      • 打开和关闭调试信息
    • oops

    • kprobe

    • kcore

相关文章:

Linux内核驱动开发(一)

Linux内核初探 linux操作系统历史 开发模式 git 分布式管理git clone 获取git push 提交git pull 更新 邮件组 mailing list patch 内核代码组成 Makfile arch 体系系统架构相关 block 块设备 crypto 加密算法 drivers 驱动(85%) atm 通信bluet…...

TCP/IP协议二十问

TCP/IP协议二十问 1. 什么是TCP网络分层? TCP网络分层一般分为五层: 应用层(HTTP):组装数据包传输层(TCP):增加TCP头部,包含端口号等信息网络互联层(IP&am…...

常用Array数组操作方法

定义一个测试数组constplayers[{name:科比,num:24},{name:詹姆斯,num:23},{name:保罗,num:3},{name:威少,num:0},{name:杜兰特,num:35}]复制代码1、forEach参数代表含义item:遍历项index:遍历项的索引arr:数组本身Array.prototype.sx_forEach…...

【C++】set/multiset、map/multimap的使用

目录 一、关联式容器 二、set的介绍 1、接口count与容器multiset 2、接口lower_bound和upper_bound 三、map的介绍 1、接口insert 2、接口insert和operator[]和at 3、容器multimap 四、map和set相关OJ 1、前K个高频单词 2、两个数组的交集 一、关联式容器 vector、…...

vue3语法

vue3教程 //ps 这里是基本写法 一般项目不需要ref 因为需要一直return 这里是根据在不使用ts后缀 来在.vue里面写setup 如下图所示:setup setup是启动页面会自动执行的一个函数 项目里定义的所有变量,都要在setup当中 在setup定义的变量和方法,都需要r…...

对象之间的关系

目录1. 依赖2. 关联3. 聚合4. 组合Java的对象/类之间有四种关系:依赖、关联、组合、聚合。 1. 依赖 依赖(Dependency): 一个对象的功能依赖于另一个对象。 类比:人类生存依赖食物和空气 体现:被依赖者体…...

云原生时代顶流消息中间件Apache Pulsar部署实操-上

文章目录安装运行时Java版本推荐Locally Standalone集群启动验证部署分布式集群部署说明初始化集群元数据部署BookKeeper部署BrokerAdmin客户端和验证Tiered Storage(层级存储)概述支持分级存储何时使用工作原理安装 运行时Java版本推荐 Locally Standalone集群 启动 # 下载…...

Python实现基于openCV+百度智能云平台实现《1:N人脸考勤机》文章最后附带源码!

目录 一、 项目介绍 1.1 项目名称 1.2 项目简介 1.3 项目物料 1.4 技术栈 二、 项目架构 三、项目细节 3.1 环境搭建 3.2 利用opencv实现摄像头调取及相关图像的采集 3.3 利用aips上传图像和结果返回 3.4 结果优化和处理 3.5 可扩展性 3.6 遗留问题和…...

因为锁的问题,我们被扣了1万

前言 春节放假期间,一个项目上的积分接口被刷,而且不止一个人在刷,并且东西也被兑走,放假晚上被人叫起来排查问题,通过这个人的积分明细观察,基本一秒就能获取一次,远远超过了积分规则限定的次…...

【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录…...

浏览器渲染中的相关概念

渲染 渲染流水线 构建 DOM 树 输入:HTML 文档;处理:HTML 解析器解析;输出:DOM 数据解构。 样式计算 输入:CSS 文本;处理:属性值标准化,每个节点具体样式&#xff08…...

【MySQL】数据类型

1、数据类型描述 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚举类…...

L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品&#x…...

MySQL -查询日志、二进制日志、错误日志、慢查询日志

文章目录1.错误日志2.二进制日志3.查询日志4.慢查询日志1.错误日志 错误日志是 MySOL中最重要的日志之一,它记录了当 mvsald 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时,建议…...

TCP实现可靠传输的实现

TCP实现可靠传输的实现 目录TCP实现可靠传输的实现ARQ协议停止等待协议(古老)连续ARQ协议累计重传(回退N帧的ARQ协议)缓存确认(选择重传ARQ协议)超时重传的时间选择TCP的流量控制零窗口探测报文段Nagle算法…...

2/14考试总结

时间安排 7:30–7:50 看题,T1可能是个数据结构之类的东西,T2是 dp ,T3 构造。 7:50–8:20 T3,仿照样例的构造,可以通过一部分测试点。 8:20–9:20 T1,发现题目实际上要求子树内各儿子的深度信息,可以 dsu ,对于不能暴…...

程序环境和预处理详解

文章目录一、程序环境1.1 - 翻译环境1.1.1 - 编译1.1.1.1 - 预编译(预处理)1.1.1.2 - 编译1.1.1.3 - 汇编1.1.2 - 链接1.2 - 执行环境二、预处理详解2.1 - 预定义符号2.2 - #define2.2.1 - #define 定义标识符2.2.1.1 - 语法2.2.1.2 - 建议2.2.2 - #defi…...

The Social-Engineer Toolkit(社会工程学工具包)互联网第一篇全模块讲解

一、工具介绍 Social-Engineer Toolkit 是一个专为社会工程设计的开源渗透测试框架,可以帮助或辅助你完成二维码攻击、可插拔介质攻击、鱼叉攻击和水坑攻击等。SET 本身提供了大量攻击选项,可让您快速进行信任型攻击,也是一款高度自定义工具…...

Windows11去掉不满足系统要求的提示水印

我的电脑是LEGION的拯救者R70002021,预装的是Windows 11 家庭中文版,没有折腾重装过系统,今天突然注意到右下角出现了这个提示:“不满足系统要求。转到’设置"了解详细信息”。 在进入设置 - 系统 面板中也提示不满足系统要…...

JavaScript 计时事件

JavaScript 计时事件 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。 在 JavaScript 中使用计时事件是很容易的,两个关键方法是: setInterval() - 间隔指定的…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...