一、mdev
mdev(udev的BusyBox简化版),自动产生驱动所需的节点文件, mdev会把所有的设备文件都动态地创建在 /dev/ 目录下.
每个dev属性文件所在的路径都可表示为: /sys/class/subsystem/device_name/dev
在 /dev目录下创建相应的设备文件
例如,cat /sys/class/tty/tty0/dev会得到4:0,subsystem为tty, device_name为tty0
1. 在busybox\files\rcS中有:
/bin/mount -t sysfs none /sys -----挂载sysfs
/sbin/mdev -s
2. 开机执行mdev -s命令时,mdev扫描/sys/block 和 /sys/class两个目录下的dev属性文件,在 /dev目录下创建相应的设备文件
3. 热插拔事件:由于启动时运行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug,那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev
这时mdev通过环境变量中的 ACTION 和 DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。
接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在 /dev 下创建设备节点文件,该dev属性文件以"major:minor\n"形式输出设备编号
4. 开始挂载脚本,如自动挂载 SD 卡脚本:
apps_proc\oe-core\meta-msm\recipes\busybox\files\mdev.conf
mmcblk0 0:6 0660 */etc/mdev/automountsdcard.sh $MDEV
*********************************************************************
二、proc
procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或cat这样的文件操作命令对系统信息进行查取和调整了。同时procfs也提供了一个接口,使得我们自己的内核模块或用户态程序可以通过procfs进行参数的传递.
简单点,即/proc 文件系统提供了一个基于文件的Linux 内部接口,它可以用于确定系统的各种不同设备和进程的状态.
bus 总线信息 (只读)
drivers 驱动信息 (只读)
fs 文件系统特别信息(只读)
ide IDE接口信息 (只读)
irq IRQ信息 (只读)
net 网络子系统信息 (只读)
scsi SCSI系统信息 (只读)
sysvipc IPC子系统信息 (只读)
tty tty子系统信息 (只读)
sys 系统内核可调参数(可调)
1. 进程信息
/ # ps |grep core_app
588 root 1:42 /usr/oem/core_app
/proc/588 # ls
auxv fd ns smaps
cgroup fdinfo oom_adj stack
clear_refs limits oom_score stat
cmdline maps oom_score_adj statm
comm mem pagemap status
coredump_filter mountinfo personality task
cwd mounts root wchan
environ mountstats sched
exe net schedstat
对各项的说明:
/proc/pid/cmdline 包含了用于开始进程的命令
/proc/pid/cwd 包含了当前进程工作目录的一个链接
/proc/pid/environ 包含了可用进程环境变量的列表
/proc/pid/exe 包含了正在进程中运行的程序链接;
/proc/pid/fd/ 这个目录包含了进程打开的每一个文件的链接;
/proc/pid/mem 包含了进程在内存中的内容;
/proc/pid/stat 包含了进程的状态信息;
/proc/pid/statm 包含了进程的内存使用信息
/proc/pid/task 查看线程信息
/proc/pid/status 查看进程状态,包括父进程等信息
/proc/pid/cwd 当前工作目录的链接
/proc/pid/exe 指向该进程的执行命令文件
/proc/pid/maps 内存映象
/proc/pid/statm 进程内存状态信息
/proc/pid/root 链接此进程的root目录
一个案例;
所有 open 都失败了,查看 cat /proc/pid/status
FDSize:1024 ,比正常产品大
ls -l /proc/`pgrep core_app|grep -v grep`/fd
找到open多次的文件了
2. 系统及内核信息
直接用 cat 就可以读出想要的信息,各项的说明如下:
/proc/cpuinfo - CPU 的信息(型号, 家族, 缓存大小等)
/proc/meminfo - 物理内存、交换空间等的信息
/proc/mounts - 已加载的文件系统的列表
/proc/devices - 可用设备的列表(块设备/字符设备)
/proc/filesystems - 被支持的文件系统
/proc/modules - 已加载的模块
/proc/partitions 系统分区信息
/proc/uptime 系统正常运行时间
/proc/version - 内核版本
/proc/cmdline - 系统启动时输入的内核命令行参数
/proc/kmsg 内核日志信息
/proc/loadavg 系统平均负载
1.02 0.36 0.13 1/197 842
前三个数字大家是1、5、15分钟内的平均进程数,后面两个,一个的分子是正在运行的进程数,分母是进程总数;另一个是最近运行的进程ID号
/proc/dma 使用的DMA通道
/proc/interrupts 中断的使用
/proc/ioports I/O端口的使用
/proc/kcore 内核核心印象
/proc/ksyms 内核符号表
/proc/locks 内核锁
/proc/misc 杂项
/proc/rtc 实时时钟
/proc/slabinfo Slab池信息
/proc/stat 全面统计状态表
/proc/swaps 对换空间的利用情况
3. /proc/sys
/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。
/proc/sys/kernel 可配置内核,如 hostname 等
/proc/sys/net 可修改网络属性
另 /proc/ne t也是关于网络的,挺复杂的,暂时不管了。
*********************************************************************
三、sys
这篇讲的挺好;http://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/
因为对驱动理解不是很深,所以sys也不是很懂,那就把网上的笔记抄下来几下吧,也许以后用的到
ramdisk 文件系统基于磁盘模拟技术,实际文件系统是ex2 ex3等
sysfs是一种基于ram文件系统,和proc一样
Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。
其实,就是 在用户态可以通过对sys文件系统的访问,来看内核态的一些驱动或者设备等
除了与 proc 相同的具有查看和设定内核参数功能之外,还有为 Linux 统一设备模型作为管理之用
在实际目录中 sys 即就是 sysfs:
apps_proc\oe-core\meta-msm\recipes\busybox\files
mount -t sysfs sysfs /sys
各文件的说明:
/sys/devices
内核对系统中所有设备的分层次表达模型,也是 /sys 文件系统管理设备的最重要的目录结构;
/sys/dev
按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件
/sys/bus
按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的一部分;
/sys/class
按照设备功能分类的设备模型,如系统所有输入设备都会出现在 /sys/class/input 之下,而不论它们是以何种总线连接到系统。它也是构成 Linux 统一设备模型的一部分;
/sys/block
系统中当前所有的块设备所在,已正式移到 /sys/class/block, /sys/block 为了向后兼容保留存在,但其中的内容已经变为指向它们在 /sys/devices/ 中真实设备的符号链接文件;
/sys/firmware
系统加载固件机制的对用户空间的接口,关于固件有专用于固件加载的一套API
/sys/fs
描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有 fuse,gfs2 等少数文件系统支持 sysfs 接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在 sysctl (/proc/sys/fs) 接口中;
/sys/kernel
内核所有可调整参数的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于 sysctl (/proc/sys/kernel) 接口中 ;
/sys/module
系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文件),都可能会出现在 /sys/module 中:
编译为外部模块(ko文件)在加载后会出现对应的 /sys/module/<module_name>/, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、加载状态、所提供的驱动程序等;
编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的 /sys/module/<module_name>, 这些模块的可用参数会出现在 /sys/modules/<modname>/parameters/<param_name> 中,
如 /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀;
所有内联模块的参数也可以由 "<module_name>.<param_name>=<value>" 的形式写在内核启动参数上,如启动内核时加上参数 "printk.time=1" 与 向 "/sys/module/printk/parameters/time" 写入1的效果相同;
没有非0属性参数的内联模块不会出现于此。
/sys/power
系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。
可以这样理解:
在 /sys 根目录之下的都是 kset,它们组织了 /sys 的顶层目录视图;
在部分 kset 下有二级或更深层次的 kset;
每个 kset 目录下再包含着一个或多个 kobject,这表示一个集合所包含的 kobject 结构体;
在 kobject 下有属性(attrs)文件和属性组(attr_group),属性组就是组织属性的一个目录,它们一起向用户层提供了表示和操作这个 kobject 的属性特征的接口;
在 kobject 下还有一些符号链接文件,指向其它的 kobject,这些符号链接文件用于组织上面所说的 device, driver, bus_type, class, module 之间的关系;
不同类型如设备类型的、设备驱动类型的 kobject 都有不同的属性,不同驱动程序支持的 sysfs 接口也有不同的属性文件;而相同类型的设备上有很多相同的属性文件;
使用 sysfs 的关键就是掌握这些 sysfs 属性的用法, 更多的 sysfs 属性的功能只能靠阅读源代码来理解
在 sysfs 下的很多 kobject 下都有 uevent 属性,它主要用于内核与 udev (自动设备发现程序)之间的一个通信接口
如果你正在开发的设备驱动程序中需要与用户层的接口,一般可选的方法有:
1. 注册虚拟的字符设备文件,以这个虚拟设备上的 read/write/ioctl 等接口与用户交互;
但 read/write 一般只能做一件事情, ioctl 可以根据 cmd 参数做多个功能,
但其缺点是很明显的: ioctl 接口无法直接在 Shell 脚本中使用,为了使用 ioctl 的功能,还必须编写配套的 C语言的虚拟设备操作程序,
ioctl 的二进制数据接口也是造成大小端问题 (big endian与little endian)、32位/64位不可移植问题的根源;
2. 注册 proc 接口,接受用户的 read/write/ioctl 操作;同样的,一个 proc 项通常使用其 read/write/ioctl 接口,它所存在的问题与上面的虚拟字符设备的的问题相似;
3. 注册 sysfs 属性;