Linux内核驱动开发(一)

这篇具有很好参考价值的文章主要介绍了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:
        Linux内核驱动开发(一)
    • 页表:虚拟 -》物理;内存管理最小单位为页(大小为4k);页表大小=所有物理地址/4k。

      • 页表初始化:start_kernel->mm_init->mm_alloc_pgd(划出一段内存,页表初始化)
        Linux内核驱动开发(一)
      • 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(核心结构):包括进程的优先级、堆栈信息、打开文件句柄信息
      Linux内核驱动开发(一)
      Linux内核驱动开发(一)

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

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

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

    • 同步通信方式

      • 自旋锁(spin_lock)
        Linux内核驱动开发(一)

      • 信号量(up:释放 和 down:)
        Linux内核驱动开发(一)
        Linux内核驱动开发(一)

    • 异步通信方式

      • 信号 – signal :处理信号的函数在task_struct中指明。
        Linux内核驱动开发(一)
  • 中断

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

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

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

Linux驱动程序开发基础

  • 内核模块编程

    • 驱动模块化编程的好处

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

      • 实例验证hello.ko模块
        Linux内核驱动开发(一)
        Linux内核驱动开发(一)
    • Makefile的写法

Linux内核驱动开发(一)

- 其他

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

    • DMA

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

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

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

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

    • kobject

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

      • koject会有一个一个kobj_type属性。
        Linux内核驱动开发(一)

          - 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结构:
        Linux内核驱动开发(一)
    • 块设备:一般以扇区、块为单位进行读写访问,例如硬盘,cdrom,flash等
      Linux内核驱动开发(一)

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

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

  • Linux内核的基本调试方法

    • printk

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

    • kprobe

    • kcore文章来源地址https://www.toymoban.com/news/detail-410868.html

到了这里,关于Linux内核驱动开发(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux驱动开发(十五)---如何使用内核现有驱动(显示屏)

    《Linux驱动开发(一)—环境搭建与hello world》 《Linux驱动开发(二)—驱动与设备的分离设计》 《Linux驱动开发(三)—设备树》 《Linux驱动开发(四)—树莓派内核编译》 《Linux驱动开发(五)—树莓派设备树配合驱动开发》 《Linux驱动开发(六)—树莓派配合硬件进行字

    2024年02月15日
    浏览(36)
  • <Linux开发>驱动开发 -之-内核定时器与中断

    <Linux开发>驱动开发 -之-内核定时器与中断 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分) <Linux开

    2024年02月08日
    浏览(44)
  • linux驱动开发 - 08_内核定时器

    链接: C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 1.1 内核时间管理简介 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于驱动编写者来说最常用的定时器。 硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以

    2024年02月02日
    浏览(28)
  • 【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

    开发环境: windows + ubuntu18.04 + 迅为rk3568开发板 相较于字符设备,杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10,在系统中注册多个 misc 设备驱动时,只需使用子设备号进行区分即可。 使用简单:相比如普通的字符设备驱动, misc驱动只需要将基本信

    2024年01月21日
    浏览(46)
  • 嵌入式Linux驱动开发 02:将驱动程序添加到内核中

    在上一篇文章 《嵌入式Linux驱动开发 01:基础开发与使用》 中我们已经实现了最基础的驱动功能。在那篇文章中我们的驱动代码是独立于内核代码存放的,并且我们的驱动编译后也是一个独立的模块。在实际使用中将驱动代码放在内核代码中,并将驱动编译到内核中也是比较

    2023年04月09日
    浏览(70)
  • Linux学习第21天:Linux内核定时器驱动开发: 流淌的时间长河

    Linux版本号4.1.15   芯片I.MX6ULL                                    大叔学Linux    品人间百味  思文短情长           在人类的发展进化中,时间是一个非常重要神秘的物质量。任何事物都是在时间的长河中流淌发生、发展、变化。我们进行驱动开发中对时间的定义和使

    2024年02月07日
    浏览(40)
  • [驱动开发]Linux内核定时器与中断的简单应用

    首先介绍一下定时器原理。 在linux系统中定时器有分为软定时和硬件定时器。 以海思某款芯片为例,定时器模块又称为Timer模块,主要实现定时、计数功能。 Timer 具有以下特点: 带可编程 8 位预分频器的 32bit/16bit 减法定时器/计数器。 Timer 的计数时钟为 3MHz 时钟。 支持 3 种

    2024年02月20日
    浏览(37)
  • 在windows通过VS Code开发Linux内核驱动程序

    最近在看Linux设备驱动程序第三版,为了在windows系统上练手操作,先是下载VMware Workstation安装了Linux系统虚拟机。然后在vscode上编写简单的示例程序,通过ftp把源文件发送到Linux虚拟机后,再在虚拟机上make编译测试内核驱动程序。这样即使是在内核日志中打印个简单的hello w

    2024年02月06日
    浏览(51)
  • i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

    Linux 内核编译流程如下: 1、配置 Linux 内核。 2、编译 Linux 内核。 说明:进入 Linux 内核源码,使用 make help 参看相关配置。 1、 menuconfig 它本身是一个软件,只提供图形界面配置的一些逻辑,并不负责提供内容。 2、 menuconfig 是内核源码树的各目录下的 kconfig 提供的。 3、 m

    2023年04月10日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包