首页 > 系统相关 >linux字符设备内核源码

linux字符设备内核源码

时间:2022-10-31 17:32:25浏览次数:77  
标签:map struct dev 源码 cdev 内核 kobj linux inode


文件位于fs/chr_dev.c

重要的结构体

struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
struct char_device_struct {
struct char_device_struct *next;
unsigned int major;
unsigned int baseminor;
int minorct;
char name[64];
struct cdev *cdev; /* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];
struct kobj_map {
struct probe {
struct probe *next;
dev_t dev;
unsigned long range;
struct module *owner;
kobj_probe_t *get;
int (*lock)(dev_t, void *);
void *data;
} *probes[255];
struct mutex *lock;
};

struct kobj_map

struct kobj_map里面strcut probe *probe[255]是一个哈希链表数组,如下:

linux字符设备内核源码_设备号


struct kobj_map *cdev_map = kobj_map_init(…)

cdev_alloc\cdev_init -> kobject_init(&cdev->kobj, &ktype_cdev_default);

cdev_add -> kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p);

cdev_del -> kobj_unmap(cdev_map, dev, count);

cdev_get -> try_module_get(struct module *);

、、、、 -> kobject_get(struct kobject *);

cdev_put -> kobject_put(struct kobject *);

、、、、 -> module_put(struct module *);

没搞明白这个计数到底有什么用处?

struct char_device_struct

如果分配了一个设备号,就会创建struct char_device_struct的对象,并将其添加到chrdevs数组中,,这样通过chrdevs数组,我们就知道分配了哪些设备号。

linux字符设备内核源码_设备号_02


register_chrdev_region 分配指定的设备号 -> __register_chrdev_region

alloc_chrdev_region 动态分配设备号 -> __register_chrdev_region

以上这两个函数仅仅是注册设备号,如果要和cdev关联起来,还要调用cdev_add

register_chrdev()申请指定的设备号,并且将其注册到字符设备驱动模型中。


cdev与inode、file的关系

linux字符设备内核源码_.net_03


cdev->list下面挂了很多inode 
inode->i_rdev是字符设备号
inode->i_cdev对应struct cdev,所以可以通过inode找到cdev
int chrdev_open(struct inode *inode, struct file *file)
{
struct cdev *p = inode->i_cdev;
filp->f_op = fops_get(p->ops);
filp->f_op->open(inode, file);

}

参考过以下两篇文章:
​​​http://www.fx114.net/qa-35-95320.aspx​​​
​​​http://blog.chinaunix.net/uid-27097876-id-3352195.html​


标签:map,struct,dev,源码,cdev,内核,kobj,linux,inode
From: https://blog.51cto.com/u_15854579/5810544

相关文章

  • linux内核资料
    Documentation搜集一下看到过的Documentation1、关于gnumakefile的使用说明Documentation/Kbuild/makefiles.txt2、介绍kernel各个参数及其意义Documentation/kernel......
  • PetaLinux 工程中隐藏的Linux特性
    KR260的PetaLinuxBSP工程里,默认使能了Linux内核的OF_OVERLAY等特性。使用PetaLinux配置Linux内核,禁止OF_OVERLAY等特性。在生成的配置文件user_2022-10-31-06-59-00.cfg......
  • 驱动开发:内核层InlineHook挂钩函数
    在上一章《驱动开发:内核LDE64引擎计算汇编长度》中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩......
  • linux漏洞修复——tomcat
    检测到的漏洞修复方式一般分为两种:修改配置文件、升级组件规避漏洞,一般紧急规避是选择前一种方式。1.tomcat隐藏版本信息a.cd /usr/tomcat9/lib/cp catalina.jar......
  • linux文档编辑的命令都有哪些?linux命令详解
    在Linux系统中,所有的操作都是需要执行命令才能完成的,可以说,命令的掌握程度对于Linux运维工程师来说至关重要,本篇文章将为大家介绍几个Linux文档编辑命令,以下是详细的内容:1......
  • Linux下漏洞整改方案
    一.nginx版本漏洞Nginx默认是显示版本号curl-Ihttp://192.168.252.135:8000/----后面为nginx站点地址这样暴露出来的版本号就容易变成攻击者可利用的信息。所以,从安......
  • linux控制cpu占用率
    之前在<编程之美>上提到说控制cpu的使用率使能在任务管理器上画一条正弦线现在下面提供一个在Linux平台上实现的控制cpu频率在某个值​cpu_load.c​​#include<iostream......
  • linux cpu使用率
    限制某个进程的cpu使用率cd/sys/fs/cgroup/cpumkdircg1//在cpu目录下创建一个cpu控制族群,这时会在这个目录下自动生成几个文件,其中,限制cpu使用率主要和两个文件有关:......
  • linux下PS1命令提示符
    PS1PS1就是用来设置命令提示符的环境变量以下是PS1中可以使用的转义字符\d:代表日期,格式为weekdaymonthdate,例如:"MonAug1"\H:完整的主机名称。例如:我的机器名称为......
  • linux 利用rsync同步文件到多台机器
    背景:我需要经常把160机器上的文件,同步到171,111,105等为什么选择rsync?它可以实现增量同步。解决方案:1.安装sudoapt-getinstallrsync#Debiansudoyum......