linux内核去掉设备驱动,基于嵌入式Linux内核的系统设备驱动程序开发设计

2023-05-16

引言

Linux是一个遵循POSIX标准的免费操作系统。具有BSD和SYSV的扩展特性。与其他操作系统相比,嵌入式Linux系统以其可应用于多种硬件平台、内核高效稳定、源码开放、软件丰富、网络通信和文件管理机制完善等优良特性而正被作为研究热点,越来越多的研究人员采用Linux平台来开发自己的产品。Linux设备驱动程序在Linux内核源代码中占有很大比例,从2.0、2.2到 2.4版本的内核,源代码的长度日益增加,其实主要是设备驱动程序在增加。

47823d6c07fbc09fe5c87130d99b1c00.png

设备驱动程序的编写

设备驱动程序是linux内核的一部分,是操作系统内核和机器硬件之间的接口,它由一组函数和一些私有数据组成,是连接应用程序与具体硬件的桥梁。Linux的一个基本特点是它对硬件设备的管理抽象化,系统中的每一个设备都用一个特殊的文件来表示。所有的硬件设备都像普通的文件一样看待,使用与操作系统相同的标准系统来进行打开、读写和关闭。

在Linux 操作系统下有3类主要的设备文件类型:块设备、字符设备、网络设备。字符设备是指存取时没有缓存的设备。可像文件一样访问字符设备,字符设备驱动程序负责实现这些行为。系统的控制台和并口就是字符设备的例子,它们可以很好地用“流”来描述。块设备是文件系统的宿主,如磁盘。 Linux允许像字符设备那样读取块设备——允许一次传输任意数目的字节。结果是,字符设备和块设备读取数方式一致。而网络设备不同于字符设备和块设备, 它面向的上一层不是文件系统而是网络协议层,是通过BSD套接口访问数据。与设备相对应的是三类设备驱动程序,字符设备驱动程序、块设备驱动程序、网络设备驱动程序。

字符设备驱动程序、块设备驱动程序与网络设备驱动程序的结构体是不同的。

在linux 源代码linux/ include / linux/ fs. h中定义了字符设备和块设备驱动程序中必须使用的file_operations结构,每个设备驱动都实现这个接口所定义的部分或全部函数。随着内核的不断升级, file_operaTIons结构也越来越大,不同的版本的内核会稍有不同。file_operaTIons定义如下:

struct file_operaTIons{

int( * lseek) ( struct inode * , struct file * , off_t , int) ; int( *release) ( struct inode * , struct file * ) ;

int( * read) ( struct inode * , struct file * , char * , int) ; int( * fsync) ( struct inode *, struct file * ) ;

int( *write) ( struct inode * , struct file * , const char *, int) ; int( * fasync) ( struct inode * , struct file *, int) ;

int( * readdir) ( struct inode , struct file , void * , dilldir) ; int( *check_media_change) ( kdev_t dev) ;

int(*select) ( struct inode *, struct file * , int, select_table * ) ; int( * revalidate) ( kdev_t dev) ; };

int ( * ioctl) ( struct inode * , struct file *, unsigned int, unsigned long) ;

int( *mmap) ( struct inode * , struct file * , struct vm_area_struct * ) ;

int( * open) ( struct inode *, struct file *) ;

应用程序只有通过对设备文件的open、release、read、write、ioctl等才能访问字符设备和块设备。用户自己定义好 file_operaTIons结构后,编写出设备实际所需要的各操作函数,对于不需要的操作函数用NULL初始化,这些操作函数将被注册到内核,当应用程序对设备相应的设备文件进行文件操作时,内核会找到相应的操作函数,并进行调用。如果操作函数使用NULL,操作函数就进行默认处理。

对于字符设备而言,llseek( ),read( ),write(),ioctl( ),open( ),release( )这些函数是不可缺的;对于块设备,open( ),release( ),ioctl(),check_media_change( ),revalidate( )是不可缺少的。

网络设备结构体 net_device 定义在 includelinuxnetdevice.h 里,如下所示:

struct net_device

{

char name ; int (*init)(struct

net_device *dev);

unsigned short flags ; int (*open)

(struct net_device *dev);

unsigned long base_addr; int

(*stop)(struct net_device *dev)

unsigned int irq ; int

(*hard_start_xmit)(struct sk_buff *skb,

unsigned char dev_addr; struct

net_device *dev);

unsigned char addr_len; int

(*set_mac_address)( struct net_device

unsigned long trans_start; *dev,void* addr);

……

}

定义好net_device结构体后,根据实际情况编写操作函数,其中hard_start_xmit()函数是用来发送数据的,set_mac_address()是进行网络参数设置的。

当linux初始化时将调用初始化函数int device_init( ),该函数包括以下内容:

注册所用设备。linux用设备号来标识字符设备和块设备。设备号分为主设备号和从设备号,最终形成设备接点。设备节点在访问字符设备和块设备的设备驱动程序时将使用。通常主设备号标识设备对应的驱动程序,大多数设备是“一个主设备号对应一个驱动程序”,如:虚拟控制台和串口终端由驱动程序4管理。次设备号由内核使用,用于确定设备文件所指的设备。字符设备和块设备注册时必须先定义好设备号。

字符设备注册函数如下:

int register_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

其中 major是主设备号。

由于对网络设备驱动程序的访问不需要设备节点,它的注册函数如下:

int register_netdev(struct net_device *dev)

注册设备所用的中断。中断在现代计算机结构中有重要的地位,操作系统必须提供程序响应中断的能力。一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后调用驱动程序的处理程序。

注册中断所用的函数如下:

int request_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

其中,irq是中断向量;handler是中断处理函数;flags是中断处理中的掩码;devices是设备名;dev_id是在中断共享使用的id。

当linux不使用该设备时,就要调用清除函数void_devicie_exit ( ),它同初始化函数相对应的,主要是:

注销设备,字符设备注销函数如下:

int unregister_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

注销中断,注销中断所用的函数如下:

int free_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

释放资源,模块初始化和清除函数采用module_init(device_init),module_exit(device_exit) 形式

编写服务子程序

服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分是由于系统调用的结果。这部分程序在执行的时候.系统仍认为是和进行调用的进程属于同一个进程. 只是用户态变成了核心态,具有进行此系统调用的用户程序的运行环境.因此可以在其中调用sleep等与进程运行环境有关的函数。

中断服务子程序,又称为驱动程序的下半部分。在Linux系统中.并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候.不能依赖于仟何进程的状态,也就不能调用任何与进程运行环境相关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。

设备驱动程序的使用

直接将驱动程序编译进linux内核

将设备驱动程序复制到 linux/drivers相关的子目录下,比如字符设备驱动程序 就放在linux/drivers/char下。

修改linux/drivers相关的子目录的Makefile,

如obj-$(config_dev_driver) +=dev_driver.o,这样在编译内核时将会编译dev_driver.c,生成 dev_driver.o.

对内核进行重新编译时,进行相关的配置,比如要使用AT91RM9200的UART,就要如下配置:

Character devices -》 Serial drivers -》AT91RM9200 serial port support

将驱动程序编译成驱动模块

在设备驱动程序中要有两个重要函数:

module_init(dev_init),module_exit(dev_exit)

利用相应的交叉编译器以及编译命令将驱动程序dev_driver.c编译成dev_driver.o 这样的动态驱动模块。利用insmod命令给系统安装驱动模块,如果在/dev目录下没有相应的设备文件,就可以使用mknod创建一个设备文件。利用 rmmod命令卸载驱动模块,设备文件的删除可以用rm命令。

结语

设备驱动程序的开发是在Linux环境中最复杂的编程任务之一 。它需要和硬件打交道,容易引起系统崩溃,而且很难调试。掌握设备驱动程序的开发技术,将使得开发嵌入式Linux的系统更为迅速和有效。

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

linux内核去掉设备驱动,基于嵌入式Linux内核的系统设备驱动程序开发设计 的相关文章

  • 小草1.3.0

    VERSION 转载于 https www cnblogs com llw87 p 10149903 html
  • go gorm获取数据库报错:goexit: BYTE $0x90 // NOP

    报错内容很多 xff0c 其实看下来有用的其实就几条 runtime error invalid memory address or nil pointer dereference goexit BYTE 0x90 NOP 我按照官方示例和
  • chrome浏览器开发者工具F12中某网站的sources下的源码如何批量保存?

    目录 chrome浏览器 开发者工具F12中某网站的sources下的源码如何批量保存1 常用保存Sources源码的两种方法 1 1单个文件1 2 单个页面2 问题3 解决方案 chrome浏览器 开发者工具F12中某网站的sources
  • GlobalExceptionHandler 捕获抛出的异常,返回特定值给前端

    64 author hhh 64 date 2019 1 17 16 28 64 Despriction 64 ResponseBody 64 ControllerAdvice 64 Log4j2 public class GlobalEx
  • 获取百度地图POI数据一(详解百度返回的POI数据)

    POI是一切可以抽象为空间点的现实世界的实体 xff0c 比如餐馆 xff0c 酒店 xff0c 车站 xff0c 停车场等 POI数据具有空间坐标和各种属性 xff0c 是各种地图查询软件的基础数据之一 百度地图作为国内顶尖的地图企业 x
  • c/c++ linux epoll系列3 利用epoll_wait设置timeout时间长度

    linux epoll系列3 利用epoll wait设置timeout时间长度 epoll wait函数的第四个参数可以设置 xff0c epoll wait函数的等待时间 xff08 timeout时间长度 xff09 例子1 xff0
  • socket编程原理

    socket编程原理 1 问题的引入 1 普通的I O操作过程 UNIX系统的I O命令集 xff0c 是从Maltics和早期系统中的命令演变出来的 xff0c 其模式为打开一读 写一关闭 xff08 open write read cl
  • linux考试题答案2016,2016年4月全国自主考试(网络操作系统)真题

    2016年4月全国自主考试 网络操作系统 真题及答案解析 2016年4月全国自主考试 网络操作系统 真题及答案 xff0c 计算机网络自主考试历年真题 一 单项选择题 本大题共20小题 xff0c 每小题2分 xff0c 共40分 在每小题
  • (14)嵌入式软件开发工程师技能要求总结

    找准一个行业方向 xff1a 音视频 人工智能 深度学习 视觉识别 机器学习 嵌入式软件开发工程师 xff1a 技能要求 xff1a 熟悉 Linux操作系统 shell 脚本语言 mysql 的开发 xff0c 部署 xff0c 优化优先
  • 原来bug解决了,是这样的感觉

    终于过了 xff0c 感觉好想哭啊 xff0c 又莫名其妙的爽 xff0c 原来这就是bug 转载于 https www cnblogs com allison aichipingguo p 10018117 html
  • 闲话handle和handler

    虽然handle和handler只有一个字符之差 xff0c 但在计算机的世界里 xff0c 含义却大相径庭 1 先说说handle 北京话说 34 一边儿玩儿去 xff0c 玩勺子把儿去 34 xff0c 34 勺子把儿 34 说的就是h
  • 大数据发展前沿 期末总结复习

    其实就是简单的在网上搜了一下每个重要词条的基本概念 1 对抗学习 xff08 含Pytorch最简单的深度学习命令 xff09 生成对抗网络 xff08 GAN xff09 是非监督式学习的一种方法 xff0c 透过两个神经网络相互博弈的方
  • 出租车Jt/T 905协议与部标1078协议融合的网约车视频监控平台

    出租车 jt t 905协议 xff0c 是 jt t 808 协议的一个变种 xff0c 设计者将部标 808 协议拿过来 xff0c 并不是单纯的增加网约车相关的指令集 xff0c 而且对原有的指令如定位 0 0200 指令也进行了修改
  • 几款Git GUI客户端工具

    工欲善其事 xff0c 必先利其器 作为一名开发人员 xff0c 你不可能不知道git xff0c 无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发 xff0c git都已经是源代码管理工具的首选 当然 xff0c 那些hard
  • 毕设(一)C#的百度api调用

    这个学期就要毕业了 xff0c 选了一个无人机地面站软件设计的题目 xff0c 这几天也开始着手做 xff0c 首先做了一个百度地图的调用 xff0c 这里因为是上位机的开发 xff0c 所有就不介绍Javascript的 调用方法 xff
  • tf-ros

    http wiki ros org cn tf Tutorials https www ncnynl com archives 201708 1881 html 1 广播变换 发布坐标之间的坐标关系 include lt ros ros h
  • Makefile shell subst $(1)

    MAKE 3 80 realpath 61 shell top srcdir scripts realpath sh 39 subst SQUOTE SQUOTE 1 39 以上Makefile思考好几天不得要领 xff1a 今天想通了 x
  • docker 卸载

    使用yum安装docker xff08 安装过程可以参照linux 安装docker xff09 xff0c 如需卸载docker可以按一下步骤操作 xff1a 1 查看当前docker状态 如果是运行状态则停掉 systemctl sto
  • VIN-Fusion config with Realsense D435i

    First shot Copy the launch file in package VINS Fusion to the directory of realsense2 cameara launch cp home william cat
  • 算法的5个层次

    对算法的掌握 xff0c 大致可以分为5个层次 听说 了解 理解 实现 应用 Level 1 xff1a 听说 知道算法名 知道算法功能 Leven 2 xff1a 了解 知道算法原理 自然语言描述 知道算法优缺点 Leven 3 xff1

随机推荐

  • elf文件下载出错问题

    现在遇到的是sof文件下载有问题 xff0c 不是对应的sof文件 在复制工程后 xff0c 可以在assignment gt setting中指定生成文件所在的文件夹 xff0c 防止sof文件的不对应 转载于 https www cnb
  • 搞定INTEL快速存储技术(用SSD硬盘做缓存加速)

    给朋友买了个联想 ideapad s400 超级本 xff0c 还真是锻炼我的 idea 啊 xff0c 原机不带 WIN7 系统 xff0c 所以只好自己动手装 WIN7 xff0c 并打开 24G SSD 硬盘做缓存 一 用常规方法 G
  • php取今天开始结束,PHP获取今天开始和结束的时间戳

    PHP获取今天开始和结束的时间戳 xff1a t 61 time 开始时间戳 start 61 mktime 0 0 0 date 34 m 34 t date 34 d 34 t date 34 Y 34 t 结束时间戳 end 61 m
  • Java中Semaphore(信号量)的使用

    Semaphore的作用 xff1a 在java中 xff0c 使用了synchronized关键字和Lock锁实现了资源的并发访问控制 xff0c 在同一时间只允许唯一了线程进入临界区访问资源 读锁除外 xff0c 这样子控制的主要目的是
  • git找回丢失的代码

    多人开发时找回丢失的代码 1 先保证所有分支的代码都已经提交并拉取到最新状态 2 最重要的是需要找到最近一条自己代码还存在的记录 xff0c 然后复制到最近的更早一条的提交记录的id xff0c 比如e36e9e76da144536c196
  • Docker容器进入的4种方式

    Docker容器进入的4种方式 在使用Docker创建了容器之后 xff0c 大家比较关心的就是如何进入该容器了 xff0c 其实进入Docker容器有好几多种方式 xff0c 这里我们就讲一下常用的几种进入Docker容器的方法 进入Do
  • HTTP Basic和Digest认证介绍与计算

    一 说明 web用户认证 xff0c 最开始是get提交 43 把用户名密码存放在客户端的cookie中的形式 xff1b 在意识到这样不安全之后逐渐演变成了post提交 43 把用户凭证放到了服务端的session中的形式 xff08 当
  • TeamViewer 的替代品 ZeroTier + NoMachine

    之前不怎么用 TeamViewer xff0c 最近用的多了 xff0c 特别好用 xff0c 有点上瘾 xff0c 在哪儿都能连家里的 RTX xff0c 太棒了 然后它就开始作了 有没有好的替代方案呢 xff1f 有人推荐向日葵 xff
  • Kubernetes tutorial - K8S 官方入门教程 中文翻译

    官方教程 xff0c 共 6 个小节 每一小节的第一部分是知识讲解 xff0c 第二部分是在线测试环境的入口 kubectl 的命令手册 原文地址 1 创建集群 1 1 使用 Minikube 创建集群 Kubernetes 集群 Kube
  • 两年,从纯小白到腾讯阿里,应届非计算机毕业生的2014互联网求职之路

    0 写在前面 以此文 xff0c 献给自己这两年的青葱岁月 xff0c 感谢淘宝的朗英师兄和微博的旭爷 全栈pm莹姐姐 酷炫石女王 以及我逝去的头发 参照Lucida的 9个offer xff0c 12家公司 xff0c 35场面试 一文
  • 在cmd中使用start运行exe文件闪退问题

    如果我们是使用的bat批处理文件来执行某件事 xff0c 我们可以直接使用 k参数 xff0c 或者pause命令来让容器 cmd 执行完文件后不退出 如果我们是在cmd中使用start或其他命令直接执行任务 xff0c 导致当前容器退出
  • GreenPlum 5.0的安装

    基本环境 xff1a serverIPMDW172 16 16 31SDW1172 16 16 34SDW2172 16 16 35 1 xff1a 检查操作系统是否符合要求 xff0c 以及系统设置 我这里使用的系统是CentOS 操作系
  • 转载:Pixhawk源码笔记八:添加新的参数

    转载 xff1a 新浪 64 WalkAnt 第九部分 添加新的参数 英文参考 xff1a http dev ardupilot com wiki code overview adding a new parameter 本节源自 xff1
  • Ubuntu(Linux) 下 unzip 命令使用详解

    1 功能作用 xff1a 解压缩zip文件 2 位置 xff1a usr bin unzip 3 格式用法 xff1a unzip Z opts modifiers file zip list x xlist d exdir 4 主要参数
  • Linux之Libcurl库的介绍与应用20170509

    一 LibCurl简介 LibCurl是免费的客户端URL传输库 xff0c 支持FTP FTPS HTTP HTTPS SCP SFTP TFTP TELNET DICT FILE xff0c LDAP等协议 xff0c 其主页是http
  • 面试问题之操作系统:动态链接库和静态链接库的区别

    动态链接库是一个可以被其它应用程序共享的程序模块 xff0c 其中封装了一些可以被共享的例程和资源 动态链接库文件名的扩展名一般是dll xff0c 也有可能是drv xff0c sys和fon xff0c 它和可执行文件 exe 非常类似
  • (uC/OS-II学习笔记) 消息邮箱&&消息队列

    原文出处 xff1a http www cnblogs com hebaichuanyeah 与信号量一样 xff0c 消息邮箱与消息列队都是一种事件块 消息邮箱可以在任务间实现信息传递 比如 xff0c 在任务1中发送一条消息 xff0c
  • rosbag使用--记录深度相机数据

    首先看一下教程 xff1a http wiki ros org openni launch Tutorials BagRecordingPlayback 知道了rosbag如何进行使用记录深度数据 但是按照以上教程记录下来的bag file
  • Postman 基本操作学习

    History 所有使用postman发送的request都会保存在这里 点击之后会在当前Tab打开 参考 xff1a Requests History Environments 这里用来设定当前request 发送时使用的环境 xff0c
  • linux内核去掉设备驱动,基于嵌入式Linux内核的系统设备驱动程序开发设计

    引言 Linux是一个遵循POSIX标准的免费操作系统 具有BSD和SYSV的扩展特性 与其他操作系统相比 xff0c 嵌入式Linux系统以其可应用于多种硬件平台 内核高效稳定 源码开放 软件丰富 网络通信和文件管理机制完善等优良特性而正