Linux内核驱动开发(一)

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核驱动开发(一) 的相关文章

  • Ubuntu中代理设置

    当我们没有梯子的时候 xff0c 我们不需要任何代理 xff0c 直接在网络配置中选择禁止或者自动 xff0c 火狐浏览器也选择自动就好 xff0c 当我们使用梯子以后 xff0c 我们得看梯子的代理端口 xff0c 让电脑代理选择手动 x
  • CentOS8 图形界面和命令行切换

    1 查看目前默认的启动默认 systemctl get default 命令行模式 multi user target 图形界面模式 graphical target 2 设置为图形界面模式 systemctl set default gr
  • Java实现微信(主、子商户模式)及支付宝支付

    一 业务需求 实现APP微信 支付宝支付 xff0c 后端需要做生成预支付单 xff0c 响应支付结果 xff1b 微信商户采用子商户模式 二 参考官方文档 微信普通商户 xff1a https pay weixin qq com wiki
  • Java判断整数是否为回文数

    回文数 xff0c 是指一个数的正序 xff08 从左到右 xff09 与其倒序 xff08 从右到左 xff09 相等的数 核心思想是把这个整数倒过来 xff0c 再与这个数进行比较 xff0c 若相等 xff0c 则此数为回文数 xff
  • geoserver集群部署

    geoserver集群部署 环境准备系统准备软件准备插件准备配置jdk安装tomcat部署geoserver安装mqgeoserver配置jms修改tomcat 启动文件新建broker xml放入cluster文件内容如下 三个节点均要新
  • Mathtype闪退、未嵌入office系统问题解决方法

    由于操作系统的设置和之前安装过的东西的不同 xff0c 每个人在安装mathtype时遇到的问题可能也不同 xff0c 本篇文章解决了mathtype的闪退 没有自动嵌入office的问题 安装过后出现的问题 xff1a 一 安装破解版后打
  • 在树莓派上搭建MQTT服务器

    一 MQTT协议 实现MQTT协议需要客户端和服务器端通讯完成 xff0c 在通讯过程中 xff0c MQTT协议中有三种身份 xff1a 发布者 xff08 Publish xff09 代理 xff08 Broker xff09 xff0
  • 树莓派和arduino的串口通信

    一 树莓派环境安装 1 安装GPIO模块 wget https span class token punctuation span span class token operator span sourceforge span class
  • Wifi模块ESP8266-01的初始化和编程环境的搭建

    ESP8266 01引脚图 xff1a Vcc接的是3 3V xff01 一 烧写AT固件 使用烧录工具插进电脑 xff0c 打开固件烧写程序 xff0c 烧入厂家提供的固件 测试 xff1a 打开串口助手XCOM xff0c 插拔TTL转
  • 阿里云平台+NodeMCU(arduino编程)实现MQTT收发【二】烧录NodeMCU

    这里首先要设置好阿里云平台 xff0c 参见上一篇文章 代码可以从这里下载 1 添加esp8266板子 文件 首选项 附加开发板管理器网址 xff0c 输入 xff1a http arduino esp8266 com stable pac
  • 阿里云平台+NodeMCU(arduino编程)实现MQTT收发【三】利用阿里云进行可视化开发

    应用开发 aliyun com 新建 输入应用名称 如果没有项目就新建一个项目 然后就是像PPT一样制作网页 xff0c 其中数据源配置需要关联产品和设备 xff0c 如下图所示 制作好之后发布即可 xff0c 如果不绑定自己的域名则需要登
  • windows10 iis自带的ftp 在使用filezilla的时候提示 550

    windows10 iis自带的ftp 在使用filezilla的时候提示 550 检查防火墙检查IIS的授权规则设置 检查防火墙 检查防火墙对FTP的支持 点击左侧允许应用和功能通过防火墙 在FTP服务器右侧打勾 检查IIS的授权规则设置
  • 【linux】debian安装apache2并创建虚拟站点

    前言 教程将会讲解如何在debian系统上安装apache2并且在80端口部署多个网站 环境准备 1 本次使用的服务器为debian10 2 睿智头脑和一双手 教程步骤 1 更新apt 这里我就不放设置更新源头的了 xff0c 网上一搜一大
  • Springboot整合富文本编辑器wangEditor(上传文件到七牛云)

    背景 最近项目上要用到富文本编辑器 xff0c 开始想用Ueditor 发现需要配置的东西比较多 xff0c 折腾了好久没弄好 xff0c 后来发现wangEditor比较好整合 xff0c 又轻又好用 xff0c 能满足大多需求 xff0
  • Debian10 设置允许root登录

    root登录 因为Bebian默认不允许 root登录 xff0c 修改文件配置 修改gmd3的登录文件 编辑文件 span class token function nano span etc gdm3 daemon conf 修改内容
  • 1487:【例 2】北极通讯网络

    1487 xff1a 例 2 北极通讯网络 时间限制 1000 ms 内存限制 65536 KB 提交数 701 通过数 321 题目描述 原题来自 xff1a Waterloo University 2002 北极的某区域共有 n 座村庄
  • 虚拟机ubuntu18.04突然无法上网了(问题解决)

    问题描述 xff1a VMware虚拟机下Ubuntu18 04突然上不了网的问题 xff1a 如下图所示 xff1a 更改这里的三种连接方式都是这样 分析 xff1a IP冲突或者配置出了问题 xff0c 需重新更新设置 解决 xff1a
  • 视频转GIF动图MATLAB源码

    闲来无事 xff0c 做一个视频转GIF的代码 xff0c 整点花活 xff0c 感觉自己做会很有意思 可以对原视频进行矩形截取 当然 xff0c 实现的方式不唯一 xff0c 此处的供借鉴使用 话不多说 xff0c 直接上代码 注释很详细
  • mybatis-plus 自定义分页

    mybatis plus 自定义分页 实现层Impl span class token annotation punctuation 64 Service span span class token keyword public span
  • 达梦数据库SQL日志分析工具Dmlog的使用

    1 使用条件 运行环境预先安装Java环境 xff1b 支持liunx和windows系统运行 说明 xff1a 推荐使用java1 8版本 xff0c linux最小化安装最少要安装打印服务组件 xff0c windows下不支持java

随机推荐