首页 > 系统相关 >linux进阶:设备号

linux进阶:设备号

时间:2023-08-13 15:44:07浏览次数:47  
标签:进阶 struct int loff unsigned long file linux 设备

设计字符设备

文件系统调用系统IO的内核处理过程

在Linux文件系统管理中,当应用程序调用open函数时,内核会根据文件路径找到文件的索引结点(inode),为文件分配文件描述符和文件对象,并根据打开模式和权限等参数进行相应的操作和设置。

 

 

硬件层原理

思路:把底层寄存器配置操作放在文件操作接口里,新建一个文件绑定该文件操作接口,应用程序通过操作指定文件来设置底层寄存器。

基本接口实现:查原理图,数据手册,确定底层需要配置的寄存器。类似于裸机开发。实现一个文件的底层操作接口,这是文件的基本特征。

struct file_operations存放在ebf-buster-linux/include/linux/fs.h。

struct file_operations {
        struct module *owner;
        loff_t (*llseek) (struct file *, loff_t, int);
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*iterate) (struct file *, struct dir_context *);
        int (*iterate_shared) (struct file *, struct dir_context *);
        __poll_t (*poll) (struct file *, struct poll_table_struct *);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct *);
        unsigned long mmap_supported_flags;
        int (*open) (struct inode *, struct file *);
        int (*flush) (struct file *, fl_owner_t id);
        int (*release) (struct inode *, struct file *);
        int (*fsync) (struct file *, loff_t, loff_t, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct file_lock *);
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
        int (*flock) (struct file *, int, struct file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
        int (*setlease)(struct file *, long, struct file_lock **, void **);
        long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len);
        void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
        unsigned (*mmap_capabilities)(struct file *);
#endif
        ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int);
        int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t, u64);
        int (*dedupe_file_range)(struct file *, loff_t, struct file *, loff_t, u64);
        int (*fadvise)(struct file *, loff_t, loff_t, int);
} __randomize_layout;

 

驱动层原理

把file_operations文件操作接口注册到内核,内核通过主次设备号来记录它

构造驱动基本对象:struct cdev,里面记录具体的file_operations

cdev_init()  //把用户构建的file_operations结构体记录在内核驱动的基本对象

 

两个Hash表(帮助找到cdev结构体)

chrdevs:登记设备号。

__register_chrdev_region()

cdev_map->probe:保存驱动基本对象struct cdev。

cdev_add()

 

文件系统层原理

mknod + 主次设备号

构建一个新的设备文件,通过主次设备号在cdev_map中找到cdev->file_operations,把cdev->file_operations绑定到新的设备文件中。

到这一步,应用程序就可以使用open()、write()、read()等函数来控制设备文件了。

 

 

设备号的组成与哈希表

 

标签:进阶,struct,int,loff,unsigned,long,file,linux,设备
From: https://www.cnblogs.com/couvrir/p/17626647.html

相关文章

  • Linux安全加固
    配置口令复杂度:vi/etc/pam.d/system-auth添加:passwordrequisitepam_cracklib.sodifok=3minien=8ucredit=1lcredit=-1dcredit=1#3种类型组合,最短8位设置口令认证失败锁定次数:添加:authrequiredpam_tally.soonerr=faildeny=10unlock_time=300配置口令生存期:是否有以下......
  • Linux 学习十章
    第一章:Linux基础概念Linux的历史与发展Linux发行版及其特点常用的Linux命令行工具和基本操作第二章:文件和目录管理Linux文件系统的层级结构常用的文件和目录操作命令文件权限和所有权管理第三章:文本编辑器和Shell脚本常用的文本编辑器,如Vi或NanoShell脚本编程基础常用的Shell脚本语......
  • Linux MQTT智能家居(温度,湿度,环境监测,摄像头等界面布局设置)
    (文章目录)前言本篇文章来完成另外三个界面的布局设置。这里会使用到feiyangqingyun的一些控件库。一、温度湿度曲线布局TempHumtiy.h:#ifndefTEMPHUMTIY_H#defineTEMPHUMTIY_H#include<QWidget>#include"wavechart.h"namespaceUi{classTempHumtiy;}class......
  • Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?
    我们在做Android平台RTMP推送和GB28181设备对接的时候,遇到这样的问题,有的设备,麦克风采集出来的audio,音量过高或过低,特别是有些设备,采集到的麦克风声音过低,导致播放端听不清前端采集的audio,这时候,就需要针对采集到的audio,做音量放大处理。先说如何采集,android平台通用的做法是采集au......
  • 使用Linux路由功能
    使用Linux路由功能1、开启Linux主机路由配置功能永久开启,更改配置文件vim/etc/sysctl.confnet.ipv4.ip_forward=1默认值为0[root@ketang-test~]#sysctl-p令修改立刻生效临时开启:echo1>/proc/sys/net/ipv4/ip_forward2、临时添加路由条目使用route命令添加的路由,机器......
  • Linux下C语言调用libcurl库获取天气预报信息
    一、概述当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTPGET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。二、设计思路【1】使用libcurl库进行HTTPGET请求在代码中包含<curl/curl.h>头文件,以便使用libc......
  • Linux下Shell脚本中比较大小
    数字比较-eq等于,如:if["$a"-eq"$b"]-ne不等于,如:if["$a"-ne"$b"]-gt大于,如:if["$a"-gt"$b"]-ge大于等于,如:if["$a"-ge"$b"]-lt小于,如:if["$a"-lt"$b......
  • 活字格-Linux部署
    活字格-Linux部署什么是活字格?活字格是一个企业级低代码开发平台,旨在显著提升企业或者软件公司应用系统的开发效率,同时提供前所未有的灵活性和扩展性,开发人员可以使用涵盖整个开发生命周期的集成开发环境(活字格设计器,服务管理器)进行开发、质量检测、部署、监控和管理。什么需......
  • Linux常见面试题,应对面试分享
    操作系统基础1.cpu占⽤率太⾼了怎么办?排查思路是什么,怎么定位这个问题,处理流程其他程序:1.通过top命令按照CPU使⽤率排序找出占⽤资源最⾼的进程2.lsof查看这个进程在使⽤什么⽂件或者有哪些线程3.询问开发或者⽼⼤,是什么业务在使⽤这个进程4.是否可以将这台机器隔离,不影响......
  • Linux上安装Qt Creator
    在Linux系统上安装QtCreator1.在qt官网下载安装包:qt-opensource-linux-x64-5.12.9.run2.wgethttps:://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run3.赋予可执行权限,加上sudo权限进入安装,这样会安装在/opt目录下chmod+xqt-opensource-linux-......