Linux设备管理之权限倾斜——mem、proc、devfs、sysfs、udev(下)
linux发展第一阶段
01devfs(linux2.6之前)
02udev(用户空间)
03sysfs(linux2.6之后,描述设备属性)
linux发展第二阶段
01sysfs+udev(udev用户空间)
02devfs(内核空间)
03proc:在用户态检查内核状态的机制
各个内容简介:
01 sysfs特性:
同比devfs而言:linux2.6之后
作用:表示设备结构,属性
在驱动中用到函数:
- /*------------------------------------------------------------------------------------
- sysfs访问设置设备属性-*/
- /*访问设置属性方法 */
- static ssize_t hello_val_show(struct device* dev, struct device_attribute* attr, char* buf);
- static ssize_t hello_val_store(struct device* dev, struct device_attribute* attr, const char* buf, size_t count);
- /*定义设备属性*/
- static DEVICE_ATTR(val, S_IRUGO | S_IWUSR, hello_val_show, hello_val_store);
- /*----------------------------------------------------------------------------------*/
02 udev
与sysfs同是linux2.6之后出现
简述:udev仅仅是根据sysfs来干活的一个工具而已。完全在用户态工作。
03 devfs
Jack:淫龙,Linux实现的设备管理机制是什么样子的呢?
我:在2.4内核里,主流的解决方案是devfs。
Jack:我知道。在2.6里,devfs已经被udev替代了(谬论)。
我:这种说法是不准确的,是一种外行看热闹的说法。
Jack:怎么说?
我:让我给你讲一讲proc文件系统的起源吧。听完了,你自然就明白了。
Jack:proc文件系统?穿越了。
我:在很久很久很久以前,Linux内核的所有代码都是写死的,如果你想修改其中一些参数,必须要手动修改源代码,然后重新编译,重新写软盘,重新跑起来。在很久很久以前,在Unix的/dev目录下出现了一个文件——/dev/mem。这是一个特殊(变异)的设备文件,通过对这个文件的读写(从用户进程),可以改变整个内核的内存。从此,内核的内存可以动态进行修改,而不需要停机修改内核代码、重新编译、重新写软盘、重新启动这一些列的复杂过程。
Jack:然后,然后,王子和公主性福地生活在一起了?
我:去死吧。Linux内核的开发者从/dev/mem这个变异的设备文件中尝到了甜头后,就一发不可收拾了。他们接着在/下设立了一个/proc目录,同时创建了proc文件系统。/proc目录下的文件都是变异型文件,不存在磁盘中,而是在访问时动态建立,存在于ramfs里。这些文件在早期主要是对内存使用情况的统计以及动态修改,而到了后来,内核设计人员的胃口越来越难以满足。所有他们认为易于管理的理念都应该加入这个目录,/proc下就不再局限于内存信息,甚至包括外部设备管理信息——sysfs。
Jack:那这个devfs是什么关系呢?
我:devfs就是在这种背景下成长起来的。算是proc文件系统的一种推广或者变异。但是,devfs有很多致命的缺陷,导致devfs的作者没有解决的能力与信心,终于,决定宣布失败,彻底放弃。然后,在Linux2.5的内核中,尝试构建一种sysfs文件系统。这个文件系统挂接在/sys下。
Jack:devfs的致命缺陷是什么呢?
我:这个问题网上已经很多了,随便Google一下就行了。
Jack:那么udev又是怎么回事儿呢?
我:先不要急。让我把sysfs说完,你再听udev就完全明白了。sysfs相比于devfs,它已经是一套成型的、统一的设备管理模型。sysfs的描述能力不仅仅局限于干活的外部设备,甚至包括外部总线(pci总线等)。挂接在/sys目录下的文件的根目录是按类型(而非层级)来分类的。包括/sys/bus,/sys/block,/sys/class等。
Jack:那么,udev是怎么来的呢?
我:sysfs文件系统能直观地反应加入计算机的总线、设备的信息(通过kobject对象实现)。但是,它仅仅是一种体现和反应,并不能如devfs一样,在生成设备文件时(不管设备在不在),就直接把设备驱动加载进来(其实,这是不必要的)。如果想智能地控制外部设备的管理,还需要一个任务,一个专业的工具。在devfs里,干这个活儿的是一个内核线程。而udev正好相反,它通过等待内核注册过的设备热插拔引起的事件,激发相应的功能。
Jack:这样有什么优势吗?
我:这样做,最大的优势在于,内核的负载降低了,工作移交到了用户进程里。
Jack:可是,从CPU的角度来讲,不是一样要干活吗?整体的负载并没有降低。
我:是的。从CPU的角度讲,负载并没有降低,但是,devfs所负责的工作并非操作系统最核心的工作,这种工作能移交到用户空间是最好。好处至少有三点:
1、如果该线程(或进程)崩溃,对整个系统而言,在用户空间崩溃比在内核空间崩溃的负面影响要小得多(尤其是在一些金融系统内)。
2、运行在内核空间的线程会碰到大量的同步与互斥的问题,设计起来会比较困难,如果以后想在内核添加一个什么功能(尤其是核心功能),那么难度将会成指数增长。
3、内核并非是垃圾场,不能什么都往里扔,即便现在没有坏。但是,如果根基打坏了,10年后,整个系统遗留下来的问题将会非常可怕。这种现象在各大互联网公司非常严重。
Jack:这么说来,udev和devfs根本就不是同一个层次的概念。devfs不仅包括了一个文件系统机制,还包括了监控外部设备以及干活的线程。而udev仅仅是根据sysfs来干活的一个工具而已。(该文总解释)
我:可以这样理解。所以,我说“devfs被udev替代”是一种外行看热闹的说法。
Jack:那你可以说一说devfs与udev实现上的差异吗?
我:不可以。(单)devfs(体系)已经在2.6内核里被彻底废弃了,我对它的实现没有认识。关于sysfs+udev可以简单谈一下它的原理。最重要的是3个结构体:kobjects、ksets、subsystems。其中,当一个kobjects结构体对象被生成的时候(驱动工程师实现)会发生两个重要的事情:1、在/sys/目录下会有相应的文件夹。2、产生一个hotplug事件,当有外部设备被插/拔时,内核将会把这个时间主动通知到用户空间的进程(udev。本质上,hotplug是一种信号或者软中断机制,信号也是广义上的软中断)。相比于kobjects的高度抽象,kset更具体一些。具体到什么程度呢?所有具有相同属性的kobjects被分为一个kset。至于什么样的设备具有相同的kobjects属性,由驱动工程是自己判断。而一个设备具体是怎么加入Linux的,就不是设备模型应该考虑的问题,而是驱动工程师的实现。设备模型仅仅是给出了一个框架,所有的设备都需要遵守,但并不是手把手教驱动工程师写驱动。
-------
Linux设备管理之权限倾斜——mem、proc、devfs、sysfs、udev(下)的更多相关文章
- Linux用户组和权限管理
Linux用户组和权限管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux的安全模型 1>.安全3A 这并不是Linux特有的概念,在很多领域都有3A的概念 ...
- Linux设备管理(五)_写自己的sysfs接口
我们在Linux设备管理(一)_kobject, kset,ktype分析一文中介绍了kobject的相关知识,在Linux设备管理(二)_从cdev_add说起和Linux设备管理(三)_总线设备的 ...
- Linux设备管理(四)_从sysfs回到ktype
sysfs是一个基于ramfs的文件系统,在2.6内核开始引入,用来导出内核对象(kernel object)的数据.属性到用户空间.与同样用于查看内核数据的proc不同,sysfs只关心具有层次结构 ...
- 第六章、Linux 的文件权限与目录配置
第六章.Linux 的文件权限与目录配置 1. 使用者与群组 2. Linux文件权限概念 2.1 Linux文件属性 2.2 如何改变文件属性与权限: chgrp, chown, chmod 2.3 ...
- Linux设备管理(四)_从sysfs回到ktype【转】
转自:https://www.cnblogs.com/xiaojiang1025/archive/2016/12/21/6202298.html sysfs是一个基于ramfs的文件系统,在2.6内核 ...
- Linux设备管理(三)_总线设备的挂接
扒完了字符设备,我们来看看平台总线设备,平台总线是Linux中的一种虚拟总线,我们知道,总线+设备+驱动是Linux驱动模型的三大组件,设计这样的模型就是将驱动代码和设备信息相分离,对于稍微复杂一点的 ...
- Linux设备管理(二)_从cdev_add说起
我在Linux字符设备驱动框架一文中已经简单的介绍了字符设备驱动的基本的编程框架,这里我们来探讨一下Linux内核(以4.8.5内核为例)是怎么管理字符设备的,即当我们获得了设备号,分配了cdev结构 ...
- Linux设备管理(一)_kobject, kset,ktype分析
Linux内核大量使用面向对象的设计思想,通过追踪源码,我们甚至可以使用面向对象语言常用的UML类图来分析Linux设备管理的"类"之间的关系.这里以4.8.5内核为例从kobje ...
- 简单的Linux的用户权限管理
企业生产环境用户权限集中管理方案案例 建立中要添加如下的项目经验: 在了解公司业务流程后,提出权限整改解决方案,改进公司超级用户Root权限泛滥的问题. 我首先写好方案后,给老大看,取得老大的支持后, ...
随机推荐
- python命令行参数处理模块 optparse 使用参考
from optparse import OptionParser parser = OptionParser() parser.add_option( '-f', '--file', dest='f ...
- 提高Linux上socket性能
在 开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求.利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序.本文内容包括对于 Soc ...
- rJava配置
1. 下载安装R-3.1.1-win.exe: 2. 在R中安装rJava > install.packages("rJava") 3. 设置环境变量: PATH:D:\So ...
- github 中删除/更名版本库(repository)
问题描述: github 中版本库创建/删除/更该名称 问题解决: (1)创建版本库(Repository) 注: 在上图中的+按钮图标指示的是创建版本库的按钮 注 ...
- 【BZOJ】【1324】王者之剑
网络流/二分图最大点权独立集 Amber(胡伯涛)论文<最小割模型在信息学竞赛中的应用>中的例题…… 感觉这个好神啊,果然是一切皆为网络流……这转化太神奇了 /************** ...
- 【BZOJ】【1103】【POI2007】大都市meg
dfs序 模板题,进点+1出点-1,刚好对于不在路径上的点一进一出刚好抵消,由于本题要动态修改(变成公路以后+1-1都变成0)所以在序列上套一个树状数组即可. TLE:1.递归dfs给爆了……写了个手 ...
- Directx3D SimpleSample Sample
在d3d 2010 june这个版本里的samples 不知道为什么SimpleSample Sample 这个 它的documents基本等于没有 Starting point for new Di ...
- Guava文档翻译之ListenableFuture
ListenableFutureExplained 并发是一个困难的问题,但是使用强大而简单的抽象可以极大地简化并发问题.为了简化事情,Guava使用ListenableFuture继承了JDK的Fu ...
- java 页面换行处理
在taxtarea中输入的文本.如果含有回车或空格.在界面上显示的时候则不哪么正常.回车消失了,空格变短了. 如何解决这个问题呢.有2种方法. 1.使用<pre>标签 w3c对pre元素是 ...
- Unity3D研究院之与Android相互传递消息
原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...