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权限泛滥的问题. 我首先写好方案后,给老大看,取得老大的支持后, ...
随机推荐
- linux信号量之进程间同步
概念 linux信号量: 允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别: 互斥锁只允许一个线程进入临界区. 所在头文件: semaphore.h 主要函数 初始化函 ...
- 【mongodb】 需求
增删改查 增加: (表名,增加内容) 删除: (表名,数据id) 改: (表名 根据id获取数据 修改 增加 查 (表名,字段 ) 关联查询? 请主站提供一下 在使用的接口
- 包装设计模式的实现以改进BufferedReader中的readLine方法为例
实现与目标对象相同的接口 BufferedReader 定义一个变量记住目标对象 定义一个构造器接收被增强对象 覆盖需要增强的方法 对于不想增强的方法,直接调用目标对象的方法. package ...
- 设计模式Builder(建造者)模式
1.出现原因 在软件系统中,有时候会面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂的对象的各个部分可能面临着剧烈的变化,但是把他们组合在一起的算法 ...
- 交互式shell和非交互式shell、登录shell和非登录shell的区别
交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(intera ...
- sqlserver2008 解决 ldf文件过大的方法
SQL2008清空删除日志: '在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式. ------------------------------------------ ...
- DIV+CSS高手必知的15个CSS常识
1.不要使用过小的图片做背景平铺.这就是为何很多人都不用 1px 的原因,这才知晓.宽高 1px 的图片平铺出一个宽高 200px 的区域,需要 200*200=40, 000 次,占用资源. 2.无 ...
- linux常用命令详解
Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...
- java基础知识回顾之---java StringBuffer类
/* * StringBuffer:就是字符串缓冲区,线程安全. * 用于存储数据的容器. * 特点: * 1,长度的可变的. ...
- hdu 2481 Toy
好题!!!没话说…… 用到的知识面很多,这题的难点在于公式的推导. 原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795d ...