外贸建站wordpress昆山网站建设jofuns

news/2025/9/29 19:25:07/文章来源:
外贸建站wordpress,昆山网站建设jofuns,微信小程序需要服务器吗,深圳网站开发培训价格以下内容整理于Linux字符设备驱动剖析#xff0c;如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件#xff0c;read、write、ioctl设备文件#xff0c;最后close设备文件退出。 int main(int argc ,char *argv[]) { unsigned char val[1] 1; …以下内容整理于Linux字符设备驱动剖析如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件read、write、ioctl设备文件最后close设备文件退出。 int main(int argc ,char *argv[])   {  unsigned char val[1]  1;  int fd open(/dev/LED,O_RDWR);//打开设备  write(fd,val,1);//写入设备这里代表LED全亮  close(fd);//关闭设备  return 0;   }   二、/dev目录与文件系统 /dev/NULL和/dev/console是在制作根文件系统的时候静态创建的其他设备文件都是系统加载根文件系统和各种驱动初始化过程中自动创建的当然也可以通过命令行手动mknod设备文件。 三、设备文件的创建 1/dev目录下的设备文件基本上都是通过mdev来动态创建的。mdev是一个用户态的应用程序位于busybox工具箱中。其创建过程包括 驱动初始化或者总线匹配后会调用驱动的probe接口。该接口会调用device_create(设备类, 设备号, 设备名)在“/sys/class/设备类”目录生成唯一的设备属性文件包括设备号和设备名等信息并且发送uvent事件KOBJ_ADD和环境变量如路径等信息到用户空间通过socket方式。mdev是一个work_thread线程收到事件后会分析“/sys/class/设备类”的对应文件最终调用mknod动态来创建设备文件。设备文件内容主要是设备号这个设备文件对应的inode会记录文件的属性是一个设备其他属性还包括目录一般文件符号链接等。应用程序open最重要的一步就是通过文件系统接口获得该设备文件的内容即设备号。2如果初始化过程中没有调用device_create接口来创建设备文件则需要手动通过命令行调用mknod接口来创建设备文件。 3mknod接口分析 四、open设备文件 1open设备文件是为了获取该设备驱动的file_operations操作集。 该接口集是struct file的成员open返回file数据结构指针 struct file    {  const struct file_operations *f_op;  unsigned int f_flags;//可读可写等  …   };   2以下是led设备驱动的操作接口。open(/dev/LED,O_RDWR)就是为了获得led_fops。 static const struct file_operations led_fops  {  .owner THIS_MODULE,  .open led_open,  .write  led_write,   };   仔细看应用程序int fd open(/dev/LED,O_RDWR)open的返回值是int并不是file其实是为了操作系统和安全考虑。fd位于应用层而file位于内核层它们都同属进程相关概念。在linux中同一个文件对应于唯一的inode可以被不同的进程打开多次而每次打开都会获得file数据结构。每个进程都会维护一个已经打开的file数组fd就是对应file结构的数组下标。因此file和fd在进程范围内是一一对应的关系。 3open接口分析 通过系统调用后对应调用sys_open其是vfs层的接口Sys_open(/dev/led) SYSCALL_DEFINE3(open,const char __user *, filename, int, flags, int, mode)  do_sys_open(AT_FDCWD,/dev/tty, flags, mode);    fd get_unused_fd_flags(flags);    struct file *f do_filp_open(dfd, tmp, flags, mode, 0);      path_init(dfd, pathname, LOOKUP_PARENT, nd);//path_init返回时nd-dentry即为搜索路径文件名的起点      link_path_walk(pathname, nd);//link_path_walk一步步建立打开路径的各个目录的dentry和inode      do_last(nd, path, open_flag, acc_mode, mode, pathname);        filp nameidata_to_filp(nd);//通过inode节点创建file           __dentry_open()             f-f_op fops_get(inode-i_fop);在__dentry_open()函数中有  [cpp] view plain copy if (!open  f-f_op)      open  f-f_op-open;  if (open) {      error  open(inode, f);      if (error)          goto cleanup_all;  }  其中inode-i_fop在mknod的init_special_inode调用中被赋值为def_chr_fops。open(inode, f)即调用到chrdev_open。其可以看出是字符设备所对应的文件系统接口我们姑且称其为字符设备文件系统。[cpp] view plain copy const struct file_operations def_chr_fops  {    .open  chrdev_open,  };  4继续分析chrdev_open Kobj_lookup(cdev_map,inode-i_rdev, idx)即是通过设备的设备号inode-i_rdev在cdev_map中查找设备对应的操作集file_operations。关于如何查找我们在理解字符设备驱动如何注册自己的file_operations后再回头来分析这个问题。五、字符设备驱动的注册 1字符设备对应的结构体cdev [cpp] view plain copy struct cdev   {    struct kobject kobj; // 每个 cdev 都是一个 kobject    struct module* owner; // 指向实现驱动的模块    const struct file_operations *ops; // 操纵这个字符设备文件的方法    struct list_head list; //对应的字符设备文件的inode-i_devices 的链表头    dev_t dev; // 起始设备编号    unsigned int count; // 设备范围号大小  };  2led设备驱动初始化和设备驱动注册 cdev_init是初始化cdev结构体并将led_fops填入该结构。cdev_add函数[cpp] view plain copy int cdev_add(struct cdev *p, dev_t dev, unsigned count)  {    p-dev  dev;    p-count  count;    return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);  }  kobj_map函数1kobj_map函数使用hash散列表来存储cdev数据结构即存储设备的信息。2通过注册设备的主设备号major来获得cdev_map-probes数组的索引值ii major % 2553然后把一个类型为struct probe的节点对象加入到probes[i]所管理的链表中4probes[i]-data即是cdev数据结构而probes[i]-dev和range代表字符设备号和范围。5其中参数cdev_map的类型如下六、再述open设备文件 通过第五步的字符设备的注册过程应该很容易理解Kobj_lookup查找led_ops的过程这里不写。 至此获得led设备驱动的led_ops。 1接着调用file-f_ops-open来调用led_open 该函数中对led用到的GPIO进行ioremap并设置GPIO方向、上下拉等硬件初始化。 2最后chrdev_open一步步返回 最后到do_sys_open函数中的“struct file *f do_filp_open(dfd, tmp, flags, mode, 0);”返回。fd_install(fd, f)是在当前进程中将存有led_ops的file指针填入进程的file数组中下标是fd。最后将fd返回给用户空间。而用户空间只要传入fd即可找到对应的file数据结构。七、设备操作 这里以设备写为例主要是控制led的亮和灭。 write(fdval1)系统调用后对应sys_write其对应所有的文件写包括目录、一般文件和设备文件。 一般文件有位置偏移的概念即读写之后当前位置会发生变化所以如要跳着读写就需要fseek。对于字符设备文件没有位置的概念。因此重点跟踪vfs_write的过程。 fget_light在当前进程中通过fd来获得file指针vfs_write对于led设备file-f_op-write即是led_write。在该接口中实现对led设备的控制。八、再论字符设备驱动的初始化 综上所述字符设备的初始化包括两个主要环节 1字符设备驱动的注册 即通过cdev_add向系统注册cdev数据结构提供file_operations操作集和设备号等信息最终file_operations存放在全局指针变量cdev_map指向的Hash表中其可以通过设备号索引并遍历得到。2创建属性文件、设备文件 通过device_create(设备类设备号设备名)在“sys/class/设备类”中创建设备属性文件并发送uevent事件而mdev利用该信息自动调用mknod在/dev目录下创建对应的设备文件以便应用程序访问。

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

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

相关文章

第三方控件库的添加和使用

添加把第三方控件库先复制到根目录下 ,也就是Debug 的目录下然后再拖到工具箱的空白处下就可以了使用 和之前的控件使用相同 ‍

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统2025-09-29 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

C4NR PVP服务器1.2 天穹炮塔更新

C4NR PVP服务器1.2 天穹炮塔更新 更新内容在风弹获得处增加了一个建筑,可以使用风弹上去。上面是一个放置压力板的一个平台。踩压力板会获得20点风弹伤害并且生成一个风弹。玩家可以通过向指定方向攻击风弹来控制风弹…

树形dp [JOI Open 2020] 发电站 / Power Plant

作为最强摸鱼人的 BaiBaiShaFeng,这个题解也是发到洛谷上了,希望给过。 先辈们说的太简略了我感觉有点难懂,虽然我的表达能力很弱,估计强不了多少。 注:参考过网上零散题解。 题意很好理解,我们就不过多叙述了。…

深入解析:灵画-AI绘画小程序

深入解析:灵画-AI绘画小程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

AT_arc156_b [ARC156B] Mex on Blackboard

首先枚举你花 \(i\) 次操作可以搞到的最大值是什么,然后你剩下的集合就随便取,只要取不超过 \(k - i\) 个即可,用插板法很容易做。

实用指南:CAN邮箱深度解析:从硬件架构到实战应用

实用指南:CAN邮箱深度解析:从硬件架构到实战应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

产品排序

考虑区间 $dp$。设 $f_{i,j}$ 表示处理 $[i,j]$ 最小的总惩罚值。分类: - 产品 $i$ 第一个出栈,则有 $f_{i,j}=t_i\times sd_{i,j}+f_{i+1,j}$ - 产品 $i$ 第 $k$ 个出栈,则有 $f_{i,j}=f_{i+1,k}+f_{k + 1,j}+st_{…

众包网站开发网站建设录哪个科目

先拆成链的情况来看。 设B[i]表示i要向i1拿糖果的数量,C为平均数,则B[i] C - A[i] B[i-1] Answer就是B的绝对值之和 现在来看环的情况,也就是说B[n]指的是n要向1拿糖果的数量。不妨设B[n]为K,则B[1] C - A[1] K………… 照着式…

云阳一平米网站建设打开百度网页

LVGL_基础控件label 1、创建一个基础对象 /* 创建一个基础对象 label */ lv_obj_t * label lv_label_create(lv_scr_act()); // 创建一个label部件(对象),他的父对象是活动屏幕对象2、设置显示内容 char * text "www.100ask.net"; // 要显示的文字 /* 展示文…

环形链表II-leetcode

题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系…

ubuntu20.04安装nvidia显卡

24.04内核最新升级6.14.0,但是会出现英伟达驱动问题,现有的版本是6.8 重新安装了ubuntu20.04 先检查可用驱动:ubuntu-drivers devices下面会显示推荐安装的驱动版本,因为我原先的版本太低了,导致ubuntu内核更新一…

搬瓦工的主机可以用来做网站吗如何自己做加盟网站

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…

[线段树系列 #6] 标记永久化

[线段树系列 #6] 标记永久化 标记永久化是线段树的一个技巧,通常用于对主席树等难以 pushdown 的数据结构进行区间修改 具体思想已经体现在名字里了,我们结合例题稍微讲解一下 例题1 P3372 【模板】线段树 1 线段树区…

c语言switch和if语句

c语言switch和if语句c语言中switch和if语句 #include <stdio.h>int main(){int category = 2;float price = 299.9;switch (category){case 1 :if (price < 500){printf("电子产品价格较低,无优惠\n&qu…

Qt(制作一个方便的文本编辑器)

Qt(制作一个方便的文本编辑器)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

购买网站空间后怎么做海南省官网

path_provider获取应用存储路径path_provider是flutter提供的一个获取应用存储路径的插件&#xff0c;它封装了统一的api来获取Android和ios两个平台的应用存储路径&#xff0c;提供的api如下&#xff1a;getTemporaryDirectory()&#xff1a;获取应用临时文件夹&#xff0c;该…

长沙建设工程造价网站wordpress连接服务器配置

戳“在看”一起来充电吧!C语言的那些经典程序 第十四期本期小C给大家带来三个用C语言解决实际问题的典例。如果全都理解&#xff0c;相信肯定能给大家带来收获&#xff01;接下来让我们看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;运行结果&#xff1a;程序分析:该…

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析

DeepSeek-V3.2-Exp 完整分析:2025年AI模型突破与稀疏注意力技术深度解析DeepSeek-V3.2-Exp是DeepSeek AI于2025年9月29日发布的实验性大语言模型,标志着该公司在AI架构创新方面的重要里程碑。作为V3.1-Terminus的升级…

Java EE初阶启程记05---线程安全 - 指南

Java EE初阶启程记05---线程安全 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…