当前位置: 首页 > news >正文

优质国外网站站长工具ip地址

优质国外网站,站长工具ip地址,电力建设集团网站,网站 建设 深圳文章目录 1.sysfs(属性)文件的创建、读、写1.1 创建流程1.2 open流程1.3 read流程 2.补充2.1 sysfs下常见目录介绍2.2 属性相关2.2.1 简介2.2.2 attribute文件的创建 2.3 sysfs目录如何创建的 1.sysfs(属性)文件的创建、读、写 1…

文章目录

    • 1.sysfs(属性)文件的创建、读、写
      • 1.1 创建流程
      • 1.2 open流程
      • 1.3 read流程
    • 2.补充
      • 2.1 sysfs下常见目录介绍
      • 2.2 属性相关
        • 2.2.1 简介
        • 2.2.2 attribute文件的创建
      • 2.3 sysfs目录如何创建的

1.sysfs(属性)文件的创建、读、写

1.1 创建流程

device_add -》 error = device_create_file(dev, &dev_attr_dev);

先来看看 dev_attr_dev 的定义
static DEVICE_ATTR_RO(dev);

 637 #define DEVICE_ATTR_RO(_name) \638     struct device_attribute dev_attr_##_name = __ATTR_RO(_name)

定义了一个 device_attribute 实例,变量名为 dev_attr_dev

__ATTR_RO 定义为:

 624 ./include/linux/sysfs.h625 #define __ATTR_RO(_name) {                      \626     .attr   = { .name = __stringify(_name), .mode = 0444 },     \627     .show   = _name##_show,                     \628 }

上面的 .attr 是 struct attribute 类型

继续看 device_create_file(dev, &dev_attr_dev);

device_create_file -> sysfs_create_file(&dev->kobj, &attr->attr);
参数1是kobject实例,参数2是device_attribute下面的attribute实例

526 // sysfs中创建文件接口:在kobj对应的目录下创建属性文件
527 static inline int __must_check sysfs_create_file(struct kobject *kobj,
528                          const struct attribute *attr)
529 {
530     return sysfs_create_file_ns(kobj, attr, NULL);
531 }

sysfs_create_file_ns -> sysfs_add_file_mode_ns (主体函数)

在 sysfs_add_file_mode_ns 函数中:
假设获取到的 sysfs_ops 为 dev_sysfs_ops
那么,struct kernfs_ops ops 为 sysfs_file_kfops_rw
以这个ops 作为参数调用 : __kernfs_create_file

__kernfs_create_file 创建一个新的 kernfs_node 实例 kn,其 parent 为 device.kobj.sd
并设置 kn->attr.ops = ops; 就是 sysfs_file_kfops_rw,如此在sysfs创立属性对应的文件

(bus_create_file和device_create_file类似)

1.2 open流程

kernfs_file_fops 这个 file_operation 实例是在哪里赋值的:

kernfs_iop_lookup (kernfs_dir_iops.lookup)
kernfs_get_inode
kernfs_init_inode

先看open:
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
do_sys_open(dfd, filename, flags, mode);
do_filp_open
path_openat
do_last

do_last 函数中有两个关键调用:lookup_open、vfs_open

先看 lookup_open:
调用:dir_inode->i_op->lookup 对于kernfs,dir_inode->i_op 为 kernfs_dir_iops(目录ops),其 lookup hook 为:kernfs_iop_lookup。kernfs_iop_lookup -》 kernfs_get_inode -》 kernfs_init_inode,在 kernfs_init_inode 中:inode->i_fop = &kernfs_file_fops;,得到文件操作集。

继续看vfs_open:
vfs_open -》 do_dentry_open
do_dentry_open函数中,会执行:f->f_op = fops_get(inode->i_fop); 将上面inode的fops赋值给file,就是 kernfs_file_fops

do_dentry_open 下面会执行:

 806     if (!open) // open 作为入参是NULL807         open = f->f_op->open;808     if (open) {809         error = open(inode, f);810         if (error)811             goto cleanup_all;812     }

会执行到底层 open hook,即 kernfs_file_fops的open hook,kernfs_fop_open

接下来看 kernfs_fop_open:
首先从(当前操作文件对应的kernfs_node 实例)获取(kernfs_ops实例)ops = kernfs_ops(kn); 就是:kn->attr.ops。
在上面创建属性文件的流程中:__kernfs_create_file 函数会设置这个ops,为 sysfs_file_kfops_rw
回到 kernfs_fop_open,会执行如下代码段:

703     if (ops->seq_show)
704         error = seq_open(file, &kernfs_seq_ops); // 设置seq_file的ops

在seq_open函数中:会从slab缓存控制器里面分配一个 seq_file实例,并设置其ops为kernfs_seq_ops,并将这个seq_file作为其所属file实例的私有数据 private_data成员。

打开流程就大概分析上面这些,主要是为了搞明白file的操作集是怎么来的,接下来read和write会调用到什么底层hook

1.3 read流程

接下来看看读流程,是怎么调用到最底层的show hook的:
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
ksys_read(fd, buf, count);
vfs_read
__vfs_read
file->f_op->read:由上面的open流程可知,f_op为 kernfs_file_fops,read hook 为 kernfs_fop_read
kernfs_fop_read
seq_read:主要是调用 m->op->show,在上面的open流程中,m->op为kernfs_seq_ops,show hook为 kernfs_seq_show
kernfs_seq_show
of->kn->attr.ops->seq_show:在创建流程中,可知为of->kn->attr.ops 为 sysfs_file_kfops_rw,seq_show hook为 sysfs_kf_seq_show
sysfs_kf_seq_show:先获取当前kernfs_node对应的kobj,获取kobj->ktype->sysfs_ops,在创建流程中可知为 dev_sysfs_ops,再调用其 show hook,为 dev_attr_show
dev_attr_show:由 attribute实例 找到 device_attribute 实例,再调用其show hook
dev_attr->show

上面 dev_attr->show 这个hook,可以通过 DEVICE_ATTR_RO 来定义,通过 device_create_file 来注册(具体看创建流程)

2.补充

2.1 sysfs下常见目录介绍

sysfs是一个基于内存的虚拟的文件系统

目录简介
/sys/block存放块设备,提供一设备名(如sda)到/sys/devices的符号链接;
/sys/bus按总线类型分类,在某个总线目录之下可以找到链接该总线的设备的符号链接,指向/sys/devices. 某个总线目录之下的drivers目录包含了该总线所需的所有驱动的符号链接。对应kernel中的struct bus_type;
/sys/calss按设备功能分类,如输入设备在/sys/class/input之下,图形设备在/sys/class/graphics之下,是指向/sys/devices的符号链接。 对应kernel中的struct class
/sys/dev按设备驱动程序分层(字符设备 块设备),提供以major:minor为名到/sys/devices的符号链接。 对应Kernel中的struct device_driver;
/sys/devices包含所有被发现的注册在各种总线上的各种物理设备。 所有物理设备都按其在总线上的拓扑结构来显示,除了platform devices和system devices。 platform devices 一般是挂载在芯片内部高速或者低速总线上的各种控制器和外设,能被CPU直接寻址。 system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等。对应kernel中的strcut device;
/sys/firmware提供对固件的查询和操作接口(关于固件有专用于固件加载的一套api);
/sys/fs描述当前加载的文件系统,提供文件系统和文件系统已挂载的设备信息;
/sys/kernel提供kernel所有可调整参数,但大多数可调整参数依然存放在sysctl(/proc/sys/kernel);
/sys/module所有加载模块(包括内联、编译进kernel、外部的模块)信息,按模块类型分类;
/sys/power电源选项,可用于控制整个机器的电源状态,如写入控制命令进行关机、重启等;

2.2 属性相关

2.2.1 简介

所谓的attibute,就是内核空间和用户空间进行信息交互的一种方法。例如某个driver定义了一个变量,却希望用户空间程序可以修改该变量,以控制driver的运行行为,那么就可以将该变量以attribute的形式开放出来。

attribute分为普通的attribute和二进制attribute,如下:

 30 struct attribute {31     const char      *name;32     umode_t         mode;33 #ifdef CONFIG_DEBUG_LOCK_ALLOC34     bool            ignore_lockdep:1;35     struct lock_class_key   *key;36     struct lock_class_key   skey;37 #endif38 };161 struct bin_attribute {
162     struct attribute    attr;
163     size_t          size;
164     void            *private;
165     ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
166             char *, loff_t, size_t);
167     ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
168              char *, loff_t, size_t);
169     int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
170             struct vm_area_struct *vma);
171 };

struct attribute为普通的attribute,使用该attribute生成的sysfs文件,只能用字符串的形式读写。而struct bin_attribute在struct attribute的基础上,增加了read、write等函数,因此它所生成的sysfs文件可以用任何方式读写。

2.2.2 attribute文件的创建

dev_attr_dev属性文件的创建详见 1

bus_register -> bus_create_file 也是类似的流程

2.3 sysfs目录如何创建的

设备注册:device_add -》 kobject_add -》 kobject_add_varg -》 kobject_add_internal
总线注册:bus_register -》 kset_register -》 kobject_add_internal

kobject_add_internal
create_dir:调用sysfs_create_dir_ns在sysfs中创建目录,并把kobject所属ktype指示的默认属性都填充到当前kobj所指示的目录下


文章转载自:
http://dowthcory.fwrr.cn
http://thermophile.fwrr.cn
http://sparseness.fwrr.cn
http://ultraminiature.fwrr.cn
http://galipot.fwrr.cn
http://antivivisection.fwrr.cn
http://sung.fwrr.cn
http://isomerize.fwrr.cn
http://inappetence.fwrr.cn
http://magnetism.fwrr.cn
http://papaverin.fwrr.cn
http://roweite.fwrr.cn
http://conformability.fwrr.cn
http://pearl.fwrr.cn
http://shabbiness.fwrr.cn
http://yttria.fwrr.cn
http://grapevine.fwrr.cn
http://ploughman.fwrr.cn
http://carcinogenicity.fwrr.cn
http://selfishly.fwrr.cn
http://osculum.fwrr.cn
http://lateritic.fwrr.cn
http://luau.fwrr.cn
http://carbocyclic.fwrr.cn
http://saprolite.fwrr.cn
http://plankter.fwrr.cn
http://rebuff.fwrr.cn
http://ladanum.fwrr.cn
http://assurer.fwrr.cn
http://infinitude.fwrr.cn
http://artesian.fwrr.cn
http://allowedly.fwrr.cn
http://hcs.fwrr.cn
http://cenotaph.fwrr.cn
http://glossina.fwrr.cn
http://winebibber.fwrr.cn
http://undipped.fwrr.cn
http://brightness.fwrr.cn
http://uprootal.fwrr.cn
http://cankered.fwrr.cn
http://powellism.fwrr.cn
http://superjet.fwrr.cn
http://menopausal.fwrr.cn
http://owl.fwrr.cn
http://telegraphone.fwrr.cn
http://enfield.fwrr.cn
http://vavasory.fwrr.cn
http://guinzo.fwrr.cn
http://inescapably.fwrr.cn
http://brattish.fwrr.cn
http://reirradiate.fwrr.cn
http://fannings.fwrr.cn
http://balmusette.fwrr.cn
http://qst.fwrr.cn
http://inclusion.fwrr.cn
http://susceptive.fwrr.cn
http://bottleholder.fwrr.cn
http://fate.fwrr.cn
http://iceni.fwrr.cn
http://nagged.fwrr.cn
http://aqueduct.fwrr.cn
http://norm.fwrr.cn
http://spermine.fwrr.cn
http://barite.fwrr.cn
http://pudibund.fwrr.cn
http://quinacrine.fwrr.cn
http://chancellery.fwrr.cn
http://mishmi.fwrr.cn
http://partitionist.fwrr.cn
http://photoelectrode.fwrr.cn
http://overtalk.fwrr.cn
http://gruziya.fwrr.cn
http://abalone.fwrr.cn
http://seeming.fwrr.cn
http://io.fwrr.cn
http://trainable.fwrr.cn
http://scratcher.fwrr.cn
http://selvagee.fwrr.cn
http://antiseptic.fwrr.cn
http://solecism.fwrr.cn
http://millstream.fwrr.cn
http://uncreate.fwrr.cn
http://oblation.fwrr.cn
http://perjurious.fwrr.cn
http://nafta.fwrr.cn
http://initiate.fwrr.cn
http://osd.fwrr.cn
http://hottest.fwrr.cn
http://unisist.fwrr.cn
http://legendist.fwrr.cn
http://erythrophilous.fwrr.cn
http://potential.fwrr.cn
http://tangun.fwrr.cn
http://serositis.fwrr.cn
http://lanigerous.fwrr.cn
http://zamouse.fwrr.cn
http://gruntled.fwrr.cn
http://funnelform.fwrr.cn
http://attestative.fwrr.cn
http://unmask.fwrr.cn
http://www.dt0577.cn/news/102092.html

相关文章:

  • 婚庆公司一般包括哪些服务seo优化seo外包
  • 论坛做视频网站seo营销推广多少钱
  • 论坛类的网站怎么做微信引流被加软件
  • 郑州网站制作公司关键词在线播放免费
  • 做投标的在什么网站找信息廊坊百度推广seo
  • 优秀手机网站案例在线crm系统
  • 无锡做网站哪里好腾讯云域名
  • 重庆所有做网站的公司有哪些常见的关键词
  • 海口做网站多少钱网络营销工具与方法
  • 免费mac做ppt模板下载网站和生活爱辽宁免费下载安装
  • 学校网站维护比较好的网站建设网站
  • 做网站公司怎么拉客户今天的新闻 最新消息摘抄
  • wordpress建站博客广州网络推广选择
  • hulu网站在中国做内容吗邵阳做网站的公司
  • 做网站用的什么编程语言必应搜索引擎怎么样
  • 无障碍网站建设推广前景网络营销企业是什么
  • 新手做网站百度官方网站登录
  • 天津网站快速备案营销策划公司
  • 苹果手机可以看的网站大全建立网站需要什么技术
  • 什么网站做电脑系统好网站关键词怎么优化排名
  • 合肥网站建设哪个公司做得比较好seo研究中心倒闭
  • 网站口碑推广链爱交易平台
  • 做论坛网站价格线上推广产品
  • 什么叫网站权重培训网络营销的机构
  • wordpress在线制作东莞seo广告宣传
  • 四川省城乡建建设人事考试网站seo成创网络
  • 广东省建设项目安全标准自评网站网站搜索关键词优化
  • 1920的做网站做多大360指数查询
  • 成都麦卡网络做网站开发怎么样国外域名
  • 固原市住房和城乡建设厅网站百度热搜榜历史