Linux内核驱动开发(一)

news2024/11/27 9:56:12

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MAC文件误删怎么办?mac数据恢复,亲测很好用的方法

电脑文件误删,应该很多人都经历过。之前分享了很多关于Windows电脑文件误删如何恢复的方法,那么MAC电脑文件误删该怎么办?有什么好方法可以使得mac数据恢复回来吗?下面就给大家分享一些亲测好用的方法! 一、MAC电脑的文…

使用Proxifier+burp抓包总结

一、微信小程序&网页抓包 1. Proxifier简介 Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。 2. 使用Proxifier代理抓包 原理:让微信相关流量先走127.0.0.1:80到burp。具体…

Final Cut Pro 10.6.5

软件介绍Final Cut Pro 10.6.5 已通过小编安装运行测试 100%可以使用。Final Cut Pro 10.6.5 破解版启用了全新的矩形图标,与最新的macOS Ventura设计风格统一,支持最新的macOS 13 文图拉系统,支持Apple M1/M2芯片。经过完整而彻底的重新设计…

数据结构之单链表

一、链表的组成 链表是由一个一个的节点组成的,节点又是一个一个的对象, 相邻的节点之间产生联系,形成一条链表。 例子:假如现在有两个人,A和B,A保存了B的联系方式,这俩人之间就有了联系。 A和…

HashMap底层实现原理概述

原文https://blog.csdn.net/fedorafrog/article/details/115478407 hashMap结构 常见问题 在理解了HashMap的整体架构的基础上,我们可以试着回答一下下面的几个问题,如果对其中的某几个问题还有疑惑,那就说明我们还需要深入代码&#xff0c…

ubuntu 20.04 安装 flameshot截图工具

ubuntu 20.04 安装 flameshot截图工具安装命令使用命令设置快捷键效果图安装命令 sudo apt-get install flameshot安装日志 $ sudo apt-get install flameshot [sudo] password for huifeimao: Reading package lists… Done Building dependency tree Reading state informat…

【零基础入门前端系列】—表格(五)

【零基础入门前端系列】—表格(五) 一、表格 表格在数据展示方面非常简单,并且表现优秀,通过与CSS的结合,可以让数据变得更加美观和整齐。 单元格的特点:同行等高、同列等宽。 表格的基本语法&#xff1…

性能测试之tomcat+nginx负载均衡

nginx tomcat 配置准备工作:两个tomcat 执行命令 cp -r apache-tomcat-8.5.56 apache-tomcat-8.5.56_2修改被复制的tomcat2下conf的server.xml 的端口号,不能与tomcat1的端口号重复,不然会启动报错 ,一台电脑上想要启动多个tomcat&#xff0c…

自定义bean 加载到spring IOC容器中

自定义bean加载到spring容器中的两种方式: 1.在类上添加注解Controller、RestController(本质是Controller)、Service、Repository、Component2.使用Configuration和Bean 这篇文章主要介绍第二种方式原理(因为在实际使用中&#…

SteaLinG:一款针对社工的开源安全渗透测试框架

关于SteaLinG SteaLinG是一款功能强大的开源渗透测试框架,该框架专为社会工程学研究人员设计,可以帮助广大研究人员或组织内的安全专家测试目标设备的安全性。该工具基于Python开发,因此具备良好的跨平台特性。在使用时,我们只需…

2023软考纸质证书领取通知来了!

不少同学都在关注2022下半年软考证书领取时间,截止至目前,上海、湖北、江苏、南京、安徽、山东、浙江、宁波、江西、贵州、云南、辽宁、大连、吉林、广西地区的纸质证书可以领取了。将持续更新2022下半年软考纸质证书领取时间,请同学们在证书…

信息安全保障

信息安全保障信息安全保障基础信息安全保障背景信息安全保障概念与模型基于时间的PDR模型PPDR模型(时间)IATF模型--深度防御保障模型(空间)信息安全保障实践我国信息安全保障实践各国信息安全保障我国信息安全保障体系信息安全保障…

SpringColud第四讲 Nacos的Windows安装方式和Linux的安装方式

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: 目录 1.Windows安装Nacos 1.1.下载 1.2.解压 1.3.修改相关配置: 1.4.启动: 1.5.登录: 2.Linux的安装方式Nacos 2.1.…

python cartopy手动导入地图数据绘制底图/python地图上绘制散点图:Downloading:warnings/散点图添加图里标签

……开学回所,打开电脑spyder一看一脸懵逼,简直不敢相信这些都是我自己用过的代码,想把以前的自己喊过来科研了() 废话少说,最近写小综述论文,需要绘制一个地图底图+散点图&#xff…

Cortex-M0存储器系统

目录1.概述2.存储器映射3.程序存储器、Boot Loader和存储器重映射4.数据存储器5.支持小端和大端数据类型数据对齐访问非法地址多寄存器加载和存储指令的使用6.存储器属性1.概述 Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间&…

TongWeb8数据源相关问题

问题一:数据源连接不足当TongWeb数据源连接用完时,除了监控中看到连接占用高以外,日志中会有如下提示信息。2023-02-14 10:24:43 [WARN] - com.tongweb.web.jdbc.pool.PoolExhaustedException: [TW-0.0.0.0-8088-3] Timeout: Pool empty. Una…

Hadoop高可用搭建(一)

目录 创建多台虚拟机 修改计算机名称 快速生效 修改网络信息 重启网络服务 关闭和禁用每台机的防火墙 同步时间 安装ntpdate 定时更新时间 启动定时任务 设置集群中每台机器的/etc/hosts 把hosts拷贝发送到每一台虚拟机 配置免密登陆 将本机的公钥拷贝到要免密登…

二三层网络设备封装与解封装原理

1、寻址转发(寻址指的是寻找IP地址) 路由表放在一个公共的地方,比如主控板上,由主控板 的CPU运行路由协议,计算路由,生成和维护路由表。 转发表与路由表: 转发表是根据路由表生成的。路由表中…

17- 梯度提升回归树GBDT (集成算法) (算法)

单一KNN算法: # knn近邻算法: K-近邻算法(KNN) from sklearn.neighbors import KNeighborsClassifier knn KNeighborsClassifier() knn.fit(X_train,y_train)KNN集成算法: from sklearn.neighbors import KNeighborsClassifier from sklearn.ensemble i…

在浏览器输入URL后发生了什么?

在浏览器输入URL并获取响应的过程,其实就是浏览器和该url对应的服务器的网络通信过程。从封装的角度来讲,浏览器和web服务器执行以下动作:(简单流程)1、浏览器先分析超链接中的URL:分析域名是否规范2、浏览器向DNS请求…