设备驱动开发实验教程(1)_驱动开发基础

原文链接:https://blog.csdn.net/wangran1996/article/details/69791334

 ———————————————— 

交叉编译

      进行嵌入式开发前必须搭建一套完整的开发环境,在开发内核时,目标机运行所需的bootloader以及操作系统核心还没有建立。目标机的硬件一般有很大的局限性,如不具备一定的处理能力和存储空间,即单独在目标板无法完成程序开发,需要在宿主机上对即将在目标机上运行的程序进行编译,生成可以在目标机上运行的程序,然后移植到目标机上。

    在宿主机上安装开发工具,配置、编译目标机的linux引导程序、内核和文件系统,然后下载到目标机上运行的开发模式称作交叉编译。

 

内核概念

linux内核主要模块:存储管理、CPU和进程管理、文件系统、设备管理和驱动、通信网络以及系统初始化、系统调用等。
  
  根文件系统:linux启动时使用的第一个文件系统,没有根文件系统,linux将无法启动。
  
  bootloader:整个系统的加载任务全由bootloader完成。
  
  内核架构:最上层是系统调用接口(System call interface);之下是内核代码(kernel),这些代码是linux所支持的所有处理器通用的;最下层是依赖于体系结构的代码,即板级支持包(BSP),作用于特定平台和特定体系结构。
  
  内核主要子系统: 
  1)系统调用接口(SCI) 
  系统调用接口依赖于体系结构,SCI为内核提供了某些机制执行从用户空间到内核的函数调用。SCI实际上是一个非常有用的函数调用多路复用和多路分解服务,在./linux/kernel文件中可以找到SCI的实现。并在./linux/arch文件中找到依赖于体系结构的源代码。 
  2)进程管理(PM) 
  进程管理的重点是进程的执行,在内核中,这些进程称作线程,代表了单独的处理器虚拟化,包括线程代码、数据、堆栈和CPU寄存器等。在用户空间常使用“进程”这个术语,不过linux实现并没有区分进程和线程这两个概念。内核通过系统调用接口提供的一个应用程序编程接口(API)来创建一个新进程、停止进程,并在它们之间进行通信和同步。 
  进程管理还包括处理器处理进程之间的共享CPU的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争CPU,这种算法都可以在规定的时间内进行操作。这种算法称作O(1)调度程序,这个名字就表示它调度多个线程使用的时间和调度一个线程使用的时间是相同的。O(1)调度程序也可以支持多处理器(称为对称多处理器或SMP)。与系统调用使用接口是相同,可以在./linux/kernel文件中找到进程管理的源代码,在./linux/arch文件中找到依赖于体系结构的源代码。 
  3)内存管理(MM) 
  内核所管理的一个重要资源就是内存。由硬件管理虚拟内存可以提供管理效率,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是4KB)。linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。 
  不过内存管理要管理的不止4KB,linux提供了对4KB缓冲区的抽象,如slab分配器。这种内存管理模式使用4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些完全没有使用,哪些为空。这就允许该模式根据系统需要来动态调整内存使用。 
  内存管理的源代码可以在./linux/mm文件中找到。 
  4)虚拟文件系统(VFS) 
  它为文件系统提供了一个通用的接口抽象。VFS在SCI和内核所支持的文件系统之间提供了一个交换层。在VFS上面,是对诸如open、close、read和write之类的函数的一个通用API抽象。在VFS下面则是文件系统抽象,它定义了上层函数的实现方式。可以在./linux/fs文件中找到源代码。 
  文件系统层之下是缓冲区缓存,它问文件系统层提供了一个通用函数集,这个缓存层通过将数据保留一段时间,或随即预先读取数据以便在需要时就可以使用,优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,用于实现特定物理设备的接口。 
  5)网络堆栈 
  在设计上遵循模拟协议本身的分层体系结构。IP是传输协议TCP下面的核心网络层协议。TCP的上面则是socket层,它通过SCI进行调用。 
  socket层是网络子系统的标准API,为各种网络协议提供了一个用户接口。从原始帧访问到IP协议数据单元PDU,再到TCP和UDP,socket层提供了一种标准化的方式来管理连接,并在各个终点之间移动数据。在./linux/net文件中可以找到源码。 
  6)设备驱动程序(DD) 
  设备驱动程序的代码可以在./linux/drivers文件中找到。 
  7)依赖体系结构代码(arch) 
  ./linux/arch子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了BSP)。对于一个典型的桌面系统来说,使用的是i386目录。每个体系结构子目录都包含了很多其他子目录,同时,每个子目录都关注内核中的一个特定方面,例如引导、内核和内存管理等。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实验四主要是通过编写Linux设备驱动程序来学习Linux系统的设备驱动开发,加深对Linux内核机制的理解以及了解驱动程序的核心模块、初始化、卸载等操作。在实验过程中,我们先了解了Linux系统下设备的分类,比如字符设备和块设备,并参照示例程序实现了一个字符设备驱动程序。在编写驱动程序的过程中,我们学习了设备文件的创建、设备初始化函数、文件操作函数、I/O控制函数等相关概念和知识,并通过实践掌握了一些具体技能,如打印调试信息、使用Sysfs文件系统等。 通过本次实验,我们深入了解了Linux设备驱动程序的工作原理和编写方法,能够熟练掌握设备文件的创建、设备初始化函数、文件操作函数、驱动模块的加载和卸载等基本概念及应用方法,从而可以为Linux系统开发相关的设备驱动。同时,我们还了解了Linux内核中常用的调试技巧和工具,这些对我们日后的开发和调试工作都将有很大的帮助。通过本次实验,我们进一步提高了对Linux系统的认识和理解,为日后的系统开发奠定了坚实的基础。 ### 回答2: Linux设备驱动程序开发是基于Linux系统的硬件设备的管理和操作,这个过程需要开发者理解设备特性、熟悉Linux内核的结构。本实验旨在让学生学习Linux设备驱动程序的基础知识和基本操作,了解内核模块的加载和卸载,设备驱动程序的注册和注销等。 本次实验的难点在于学生需要理解设备的工作原理,选取合适的设备进行开发并且需要掌握相关的编程技巧。除此之外,还需要学习工具链使用技巧,包括gcc编译器、makefile生成器、gdb调试器、insmod等命令,此外还需要熟悉Linux内核模块的编写和调试。这些技能都是Linux驱动程序开发必备的技能。 通过本次实验,学生将会了解到Linux驱动程序的编写流程、编程模式、数据结构等基础知识,掌握设备驱动程序的注册和卸载方法,了解内核模块机制,熟悉常见的硬件设备和文件系统接口的使用。这些知识将对于学生今后的Linux系统开发驱动开发有很大的帮助。 ### 回答3: 本次实验的目标是学习linux设备驱动程序的开发。在实验中,我们首先学习了内核模块的编写和加载,了解了内核模块的结构和用法,并通过编写简单的内核模块来巩固理解。 之后,我们学习了字符设备驱动程序的编写,包括了设备文件的创建和使用以及驱动程序的基本结构和函数。通过实现一个简单的字符设备驱动程序,我们了解了驱动程序与用户空间的交互方式和驱动程序的工作原理。 此外,本次实验还包括了中断处理程序的开发,我们学习了中断的触发和处理方式,并通过在驱动程序中实现中断处理程序来巩固理解。 通过本次实验,我们掌握了linux设备驱动程序的开发方法,更深入地了解了操作系统中内核部分的工作原理,对于深入理解操作系统有着重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值