sysfs 内核文档

合集下载

linux sysfs原理

linux sysfs原理

linux sysfs原理sysfs是一个基于RAM的文件系统,从Linux 2.6内核开始引入,用于导出内核对象(kernel object)的数据和属性到用户空间,以文件目录的形式为用户空间提供对这些数据和属性的访问支持。

从驱动开发的角度看,sysfs为用户提供了除devfs和procfs之外的另外一种访问内核数据的方式。

使用sysfs,编译内核的时候要定义CONFIG_SYSFS,并且通过mount -t sysfs sysfs /sys的方式将其挂载到/sys目录下。

sysfs并没有一个实际存放文件的介质,它基于kobject 的层级结构,读取一个sysfs 的文件就是动态从kobject 中提取信息,生成文件。

sysfs为我们提供了一个kobject为对象层次结构的视图,帮助用户能以一个简单的文件系统的方式来观察系统中各种设备的拓扑结构。

借助属性,kobject可以用导出文件的方式,将内核变量提供给用户修改或者读取。

在sys目录下,各文件的功能如下:1.devices子目录:这里列出了所有系统中注册的设备,每个设备都有一个与其相关的目录。

2.bus子目录:对应驱动和设备,classes子目录有设备的不同分类,它们实际上都是devices目录下设备文件的符号链接。

总的来说,sysfs是Linux内核的一部分,它为用户空间程序提供了一种查看和修改内核数据结构的方法,使得用户可以更方便地理解和控制系统的设备和资源。

在sysfs中,每个目录表示一个kobject,其中包含了设备或设备的集合。

每个kobject都可以包含多个属性(attribute),这些属性以文件的形式在sysfs中表示。

用户空间程序可以通过读取或写入这些属性文件来获取或设置内核对象的属性值。

例如,可以通过读取某个属性文件来获取设备的状态信息,或者通过写入某个属性文件来控制设备的行为。

在sysfs中创建属性文件有两种方法:1.直接在相应的kobject目录下创建属性文件。

Linux虚拟文件系统sysfs之属性文件attribute整理(一)

Linux虚拟文件系统sysfs之属性文件attribute整理(一)

Linux虚拟文件系统sysfs之属性文件attribute整理(一)sysfs接口函数到建立_DEVICE_ATTR架构图:最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作。

说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR原型是#define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)函数宏DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法,_show表示的是读方法,_stroe表示的是写方法。

当然_ATTR不是独生子女,他还有一系列的姊妹__ATTR_RO宏只有读方法,__ATTR_NULL等等如对设备的使用 DEVICE_ATTR ,对总线使用 BUS_ATTR ,对驱动使用 DRIVER_ATTR ,对类别 (class) 使用 CLASS_ATTR, 这四个高级的宏来自于<include/linux/device.h>DEVICE_ATTR 宏声明有四个参数,分别是名称、权限位、读函数、写函数。

其中读函数和写函数是读写功能函数的函数名。

如果你完成了DEVICE_ATTR函数宏的填充,下面就需要创建接口了例如:static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, show_polling, set_polling);static struct attribute *dev_attrs[] = {&dev_attr_polling.attr,NULL,};当你想要实现的接口名字是polling的时候,需要实现结构体struct attribute *dev_attrs[]其中成员变量的名字必须是&dev_attr_polling.attr然后再封装static struct attribute_group dev_attr_grp = {.attrs = dev_attrs,};在利用sysfs_create_group(&pdev->dev.kobj, &dev_attr_grp);创建接口通过以上简单的三个步骤,就可以在adb shell 终端查看到接口了。

bootload、kernel、rootfs

bootload、kernel、rootfs

嵌入式Linux系统的构建一、嵌入式Linux系统中的典型分区结构Root filesystemKernel二、各个结构的分析1、从咱们所学的硬件知识能够明白,在系统上电后需要一段程序来进行初始化(关闭WATCHDOG、改变系统时钟、初始化存储器操纵器、将更多的代码复制到内存中)。

简单的说bootload确实是这么一段小程序(相当于PC机中的BIOS),初始化硬件设备、预备好软件环境,最后挪用操作系统内核。

从某个观点上来看Bootload能够分为两种操作模式:启动模式和下载模式。

启动模式:上电后bootload从板子上的某个固态存储器上将操作系统加载到RAM中运行,整个进程并无效户的介入下载模式:在这种模式下,开发人员能够利用各类命令,通过串口连接或网络连接等通信手腕从主机下载文件,将它们直接放在内存运行或是烧入Flash类固态存储设备中。

Bootload能够分为两个时期:第一时期实现的功能:硬件设备初始化、为加载Bootload的第二时期代码预备RAM空间、复制Bootload的第二时期代码到RAM空间中、设置好栈、跳转到第二时期代码的C入口点第二时期:初始化本时期要利用的硬件设备、检测系统内存映射、将内核镜像和根文件映像从Flash上读到RAM空间中、为内核设置启动参数、挪用内核2、内核的结构:Linux内核文件数量快要2万,除去其他构架CPU的相关文件,支持S3C2410、S3C2440这两款芯片的完整内核文件有1万多个。

这些文件组织结构并非复杂,他们别离位于顶层目录下的17个子目录,各个目录功能独立Linu内核Makefile文件分类3、根文件系统嵌入式Linux 中都需要构建根文件系统,构建根文件系统的规那么在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。

三、根文件系统的制作一、进入到/opt/studyarm 目录,新建成立根文件系统目录的脚本文create_rootfs_bash,利用命令chmod +x create_rootfs_bash 改变文件的可执行限,./create_rootfs_bash 运行脚本,就完成了根文件系统目录的创建。

Linux文件系统之sysfs文档

Linux文件系统之sysfs文档
printk(KERN_ERR "sysfs: could not mount!\n"); err = PTR_ERR(sysfs_mount); sysfs_mount = NULL; unregister_filesystem(&sysfs_fs_type); goto out_err; } } else goto out_err; out: return err; out_err: kmem_cache_destroy(sysfs_dir_cachep); sysfs_dir_cachep = NULL; goto out; } 每个 kobject 对应 sysfs 中的一个目录,kobject 的每个属性对应 sysfs 文件系统中的文件. struct sysfs_dirent 就是用来做 kobject 与 dentry 的互相转换用的.它们的关系如下图所示:
pr_debug("sysfs: could not get root inode\n"); return -ENOMEM; }
/* instantiate and link root dentry */ root = d_alloc_root(inode); if (!root) {
pr_debug("%s: could not get root dentry!\n",__FUNCTION__); iput(inode); return -ENOMEM; } //将 sysfs_root 关联到 root root->d_fsdata = &sysfs_root; sb->s_root = root; return 0; } 在这里要注意几个全局量. sysfs_sb 表示 sysfs 文件系统的 super_block. sysfs_root 表示 sysfs 文件系统根目录的 struct sysfs_dirent. sysfs_get_inode(&sysfs_root)用来将 sysfs_root 导出相应的 inode.代码如下: struct inode * sysfs_get_inode(struct sysfs_dirent *sd) { struct inode *inode; //以 super_block 和 sd->s_ino 为哈希值,到哈希表中寻找相应的 inode.如果不存在,则新 建 inode = iget_locked(sysfs_sb, sd->s_ino); //对新生成的 inode 进行初始化 if (inode && (inode->i_state & I_NEW)) sysfs_init_inode(sd, inode);

Linux内核目录文件简介

Linux内核目录文件简介

Linux V0.11目录文件简介●Makefile文件:该文件是编译辅助工具软件make的参数配置文件。

●boot目录:功能是当计算机加电时引导内核启动,将内核代码加载到内存中,并做一些进入入32位保护运行方式前的系统初始化工作。

①Bootsect.s:磁盘引导块程序,驻留磁盘第一个扇区。

0x7C00②Setup.s:读取机器的硬件配置参数,并把内核模块system移动到适当的内存位置处。

③Head.s:被编译连接在system模块的最前部分,主要进行硬件设备的探测设置和内存管理页面的初始设置工作。

●fs目录:文件系统实现程序的目录。

1、file_table.c文件中,目前仅定义了一个文件句柄(描述符)结构数组。

2、ioctl.c文件将引用kernel/chr_dev/tty.c中的函数,实现字符设备的io控制功能。

3、exec.c程序主要包含一个执行程序函数do_execve(),它是所有exec()函数簇中的主要函数。

4、fcntl.c程序用于实现文件i/o控制的系统调用函数。

5、read_write.c程序用于实现文件读/写和定位三个系统调用函数。

6、stat.c程序中实现了两个获取文件状态的系统调用函数。

7、open.c程序主要包含实现修改文件属性和创建与关闭文件的系统调用函数。

8、char_dev.c主要包含字符设备读写函数rw_char()。

9、pipe.c程序中包含管道读写函数和创建管道的系统调用。

10、file_dev.c程序中包含基于i节点和描述符结构的文件读写函数。

11、namei.c程序主要包括文件系统中目录名和文件名的操作函数和系统调用函数。

12、block_dev.c程序包含块数据读和写函数。

13、inode.c程序中包含针对文件系统i节点操作的函数。

14、truncate.c程序用于在删除文件时释放文件所占用的设备数据空间。

15、bitmap.c程序用于处理文件系统中i节点和逻辑数据块的位图。

sysfs范例

sysfs范例

#include <linux/module.h>//#include <linux/config.h>#include <linux/init.h>#include <linux/sysfs.h>#include <linux/kobject.h>#include <linux/kernel.h>#include <asm/uaccess.h>#include <linux/list.h>#include <linux/sched.h>MODULE_LICENSE("GPL");extern struct reserved_task init_res_task;extern int PMMODE;extern void setPMScheme(int type);#define STRING_ATTR_LEN 32static struct mydev_info_t {char pmscheme[9]; // "SysClock" or "PM-Clock"char cpufreq[PAGE_SIZE]; // <pid><freq>char pmtasks[PAGE_SIZE]; //<pid><budget><period><prio>struct kobject kobj; // A kobject is embedded to expose above attributes} dev_info;/* The following function handles write events of any attribute in* kobjects of our type. In OO terms, this is a method of class "mydev_kobj_type".* - kobj and attr are as above;* - buffer is the input buffer;* - size is the size of the input buffer;* - the function should return the number of characters used from the* input buffer;*/static ssize_t store_example_attr(struct kobject * kobj, struct attribute * attr, const char * buffer, size_t size){/* To determine the structure where the current kobject is embedded in a type-safe and* standard way, the macro "container_of" is used.*/struct mydev_info_t * dev_info_p = container_of(kobj, struct mydev_info_t, kobj);printk(KERN_INFO "sysfs: store request for attribute %s\n", attr->name);if (strcmp(attr->name,"pmscheme")==0){// The integer attribute is being setsscanf(buffer, "%i", &PMMODE);printk(KERN_INFO "pmscheme = %d\n",PMMODE);setPMScheme(PMMODE);return size;}else{// An unexpected attribute was setprintk(KERN_INFO "sysfs_example: unknown attribute requested\n");return 0;}}static ssize_t show_example_attr(struct kobject * kobj, struct attribute * attr, char * buffer){/* To determine the structure where the current kobject is embedded in a type-safe* and standard way, the macro "container_of" is used.*/struct mydev_info_t * dev_info_p = container_of(kobj, struct mydev_info_t, kobj);printk(KERN_INFO "sysfs: show request for attribute %s\n", attr->name);if (strcmp(attr->name,"pmscheme")==0)return snprintf(buffer, PAGE_SIZE, "%d\n",PMMODE);else if (strcmp(attr->name,"cpufreq")==0){memset(dev_info_p->cpufreq,0,PAGE_SIZE);struct reserved_task* head = init_res_task.next;while(head!=NULL){char temp[20];snprintf(temp, PAGE_SIZE, "<%d><%ld>\n",head->task->pid,head->task->cpufreq);strcat(dev_info_p->cpufreq,temp);head=head->next;}return snprintf(buffer, PAGE_SIZE, "%s\n", dev_info_p->cpufreq);}else if (strcmp(attr->name,"pmtasks")==0){memset(dev_info_p->pmtasks,0,PAGE_SIZE);struct reserved_task* head = init_res_task.next;while(head!=NULL){char temp[50];snprintf(temp, PAGE_SIZE, "<%d><%ld><%ld><%ld><%d>\n",head->task->pid,head->task->budget,head->task->_se c,head->task->_nsec,head->task->rt_priority);strcat(dev_info_p->pmtasks,temp);head=head->next;}return snprintf(buffer, PAGE_SIZE, "%s\n", dev_info_p->pmtasks);}else {// An unexpected attribute was requestedprintk(KERN_INFO "sysfs_example: unknown attribute requested\n");return 0;}}/* The following function performs cleanup operations whenever a* kobject of type "mydev_kobj_type" is not needed anymore. In OO* terms, it corresponds to the destructor for class* "mydev_kobj_type".*/static void example_release(struct kobject * kobj){// additional cleanup code here}/* Declare a struct of type sysfs_ops, indicating that the above* functions "show_example_attr" and "store_example_attr" should be used* as implementations for the show and store methods.*/static struct sysfs_ops example_sysfs_ops = {.store = store_example_attr,.show = show_example_attr};/* Declare a struct of type kobj_type. In OO terms, this equals the* definition of a class "mydev_kobj_type" which uses function* "example_release" as a class destructor and the functions indicated* above in "example_sysfs_ops" as class methods.*/static struct kobj_type mydev_kobj_type = {.release = example_release,.sysfs_ops = & example_sysfs_ops,.default_attrs = NULL};/* For each attribute, a struct of type attribute should be declared. * The macro below automates this declaration.*/#define DECLARE_EXAMPLE_ATTRIBUTE(_name_) \ static struct attribute example_##_name_##_attr = { \.name = __stringify(_name_), \.owner = THIS_MODULE, \ .mode = S_IRUGO | S_IWUSR \ };#define DECLARE_ATTRIBUTE(_name_) \static struct attribute lab_##_name_##_attr = { \.name = __stringify(_name_), \.owner = THIS_MODULE, \ .mode = S_IRUGO | S_IWUSR \ };DECLARE_ATTRIBUTE(pmscheme);DECLARE_ATTRIBUTE(cpufreq);DECLARE_ATTRIBUTE(pmtasks);// Perform module initializationstatic int __init sysfs_module_init(void){printk(KERN_INFO "sysfs_18648pm: loading\n");memset(&dev_info, 0, sizeof(dev_info));// Initializing the kobject embedded in our device info struct kobject_init(&dev_info.kobj,&mydev_kobj_type);// Setting the kobject's typedev_info.kobj.ktype = & mydev_kobj_type;// Setting the kobject name (the same name appears in sysfs) kobject_set_name(&dev_info.kobj, "18648pm");// Adding the kobject to sysfskobject_add(&dev_info.kobj,NULL,"18648pm");// Expose attributes to sysfs entrysysfs_create_file(& dev_info.kobj, &lab_pmscheme_attr); sysfs_create_file(& dev_info.kobj, &lab_cpufreq_attr); sysfs_create_file(& dev_info.kobj, &lab_pmtasks_attr);return 0;}// Perform module cleanupstatic void __exit sysfs_module_cleanup(void){printk(KERN_INFO "sysfs_example: unloading\n");// Remove exposed attributessysfs_remove_file(& dev_info.kobj, &lab_pmscheme_attr); sysfs_remove_file(& dev_info.kobj, &lab_cpufreq_attr); sysfs_remove_file(& dev_info.kobj, &lab_pmtasks_attr);// Remove sysfs entrykobject_del(& dev_info.kobj);}module_init(sysfs_module_init);module_exit(sysfs_module_cleanup);。

linux下读cpu负温的方法

linux下读cpu负温的方法

linux下读cpu负温的方法Linux是一个开源的操作系统,广泛使用于各种设备中,包括服务器、台式机、笔记本电脑和物联网设备等等。

在Linux下,我们可以通过多种方法来读取CPU的负温,以帮助我们监控和管理系统的温度。

下面是一篇关于如何在Linux下读取CPU负温的详细指南。

第一步:使用sensors命令检查温度传感器sensors命令是一个用于读取系统硬件传感器信息的实用程序。

它可以读取各种传感器的数据,包括温度传感器。

首先,我们需要确认系统中是否已安装并配置了与CPU温度相关的传感器。

打开终端,并键入以下命令来安装sensors:sudo apt-get install lm-sensors安装完毕后,运行以下命令来探测传感器:sudo sensors-detect根据命令的提示,回答一系列的问题,以完成对传感器的探测和配置。

在问到是否添加传感器到配置文件时,回答"Yes"。

最后,运行以下命令来重新加载内核模块:sudo service kmod start第二步:使用sensors命令读取CPU温度一旦我们成功配置了传感器,就可以使用sensors命令来读取CPU温度。

在终端中键入以下命令:sensors这将显示系统中所有可用传感器的信息,包括CPU温度。

通常,CPU温度信息以“tempX”(X为数字)的形式显示。

温度以摄氏度(C)为单位,并以当前温度和临界温度的方式显示。

当前温度是指应用程序中读取到的当前CPU温度,而临界温度是CPU故障的临界点。

确保CPU温度始终低于临界温度。

第三步:使用top命令监控CPU负载和温度top命令是一个实用程序,用于监控正在运行的进程、系统资源和负载情况。

它还可以显示CPU温度。

在终端中键入以下命令来运行top:top在top界面中,可以看到各种系统资源信息,包括CPU使用率和CPU温度。

默认情况下,CPU温度不会在界面中显示,但是我们可以通过按下“1”键来显示所有的CPU核心和各自的温度。

sysfs 文件系统

sysfs 文件系统
153 return error;
154 }
143-148就是找到父辈的kobject,再调用create_dir();
95 static int create_dir(struct kobject * k, struct dentry * p,
96 const char * n, struct dentry ** d)
wugang@wugang-desktop:~$ ls /sys //运行环境ubuntu 8.04(2.6.16)
block bus class devices firmware fs kernel module power slab
它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于 /sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。
sysfs文件系统与kobject结构紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject 是Linux 2.6引入的新的设备管理机制,在内核中由struct kobject表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux2.6设备模型的核心结构,Kobject是组成设备模型的基本结构。类似于C++中的基类,它嵌入于更大的对象的对象中,用来描述设备模型的组件。如bus,devices, drivers 等。都是通过kobject连接起来了,形成了一个树状结构。这个树状结构就与/sys向对应。

linux设备驱动程序--sysfs用户接口的使用

linux设备驱动程序--sysfs用户接口的使用

linux设备驱动程序--sysfs⽤户接⼝的使⽤linux sysfs⽂件系统本⽂部分内容参考⾃⾃2.6版本开始,linux内核开始使⽤sysfs⽂件系统,它的作⽤是将设备和驱动程序的信息导出到⽤户空间,⽅便了⽤户读取设备信息,同时⽀持修改和调整。

与ext系列和fat等⽂件系统不同的是,sysfs是⼀个系统在启动时构建在内存中虚拟⽂件系统,⼀般被挂载在/sys⽬录下,既然是存储在内存中,⾃然掉电不保存,不能存储⽤户数据。

事实上,在之前也有同样的虚拟⽂件系统建⽴了内核与⽤户系统信息的交互,它就是procfs,但是procfs并⾮针对设备和驱动程序,⽽是针对整个内核信息的抽象接⼝。

所以,内核开发⼈员觉得有必要使⽤⼀个独⽴的抽象接⼝来描述设备和驱动信息,毕竟直到⽬前,驱动代码在内核代码中占⽐⾮常⼤,内容也是⾮常庞杂。

这样可以避免procfs的混乱,⼦系统之间的分层和分离总是能带来更清晰地框架。

sysfs的默认⽬录结构上⽂中提到,sysfs⼀般被挂载在/sys⽬录下,我们可以通过ls /sys来查看sysfs的内容:block bus class dev devices firmware fs kernel module power⾸先需要注意的是,sysfs⽬录下的各个⼦⽬录中存放的设备信息并⾮独⽴的,我们可以看成不同的⽬录是从不同的⾓度来描述某个设备信息。

⼀个设备可能同时有多个属性,所以对于同⼀个驱动设备,同时存在于不同的⼦⽬录下,例如:在之前的章节中,我们使⽤create_dev_node.c编译出create_dev_node.ko模块,加载完成之后,我们可以在/sys下⾯看到当前驱动相关的⽬录:/sys/module/create_device_node//sys/class/basic_class/basic_demo (basic class为驱动程序中创建的class名称,basic_demo为设备名)/sys/devices/virtual/basic_class/basic_demo (basic class为驱动程序中创建的class名称,basic_demo为设备名)理解了这个概念,我们再来简览/sys各⽬录的功能:/sys/block:该⼦⽬录包含在系统上发现的每个块设备的⼀个符号链接。

linux中sysfs创建设备节点的方法和DEVICE_ATTR

linux中sysfs创建设备节点的方法和DEVICE_ATTR

linux中sysfs创建设备节点的⽅法和DEVICE_ATTR使⽤DEVICE_ATTR宏,可以定义⼀个struct device_attribute设备属性,使⽤函数sysfs_create_group或sysfs_create_file便可以在设备⽬录下创建具有show和store⽅法的节点。

能⽅便的进⾏调试。

⼀、使⽤DEVICE_ATTR构建device attribute下⾯将顺着我们直接使⽤的DEVICE_ATTR来分析⼀下,这个宏究竟都做了哪些事情。

DEVICE_ATTR的定义:#define DEVICE_ATTR(_name, _mode, _show, _store) \struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)⽽__ATTR宏的定义在include/linux/sysfs.h⽂件中,如下:#define __ATTR(_name, _mode, _show, _store) { \.attr = {.name = __stringify(_name), \.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \.show = _show, \.store = _store, \}那么struct device_attribute的定义⼜是怎么样的呢?该结构体的定义在include /linux/device.h,其定义如下:/* interface for exporting device attributes */struct device_attribute {struct attribute attr;ssize_t (*show)(struct device *dev, struct device_attribute *attr,char *buf);ssize_t (*store)(struct device *dev, struct device_attribute *attr,const char *buf, size_t count);};⽽其中的struct attribute的定义在include/linux/device.h中,如下:struct attribute {const char *name;umode_t mode;#ifdef CONFIG_DEBUG_LOCK_ALLOCbool ignore_lockdep:1;struct lock_class_key *key;struct lock_class_key skey;#endif};总结⼀下:DEVICE_ATTR(_name, _mode, _show, _store)等价于:struct device_attribute dev_attr_##_name = {.attr = {.name = __stringify(_name),.mode = VERIFY_OCTAL_PERMISSIONS(_mode)},.show = _show,.store = _store,}其中:.show和.store的类型定义如下:show函数的详细描述:ssize_t (*show)(struct device *dev, struct device_attribute *attr,char *buf);⼊参buf是需要我们填充的string即我们cat属性节点时要显⽰的内容;函数的返回值是我们填充buf的长度,且长度应当⼩于⼀个页⾯的⼤⼩(4096字节);其他参数⼀般不⽤关⼼。

linux--第六章Linux内核--文件管理

linux--第六章Linux内核--文件管理
■ 在 1992 年 4 月引入第一个专为 Linux 设计的文件系统--扩展文件系统或 EXT ( Extend File System )
■ 1993 年 ,增加了扩展文件系统第二版 ,或 EXT2
虚拟文件系统VFS
虚拟文件系统
■ 现在的系统大多都在系统内核和文件系统之间提供一 个标准的接口 , 真实的文件系统通过一个接口层从操 作系统和系统服务中分离出来 ,这样不同文件结构之 间的数据可以十分方便地交换。
■ 每一个安装的文件系统都用 VFS 超级块 ■ 参见 include/linux/fs.h
VFS 超级块包含的信息
■ Device 这是包含文件系统的块设备的设备标 识符 。例如,/dev/hda1,设备标识符是 0x301
■ Inode pointers 其中的mounted inode指针指 向该文件系统的第一个inode。Covered inode 指针指向文件系统安装到的目录的 inode 。
第二代扩展文件系统(EXT2)
■ ext2fs由Rey Card设计 ,其目标是为 Linux提供一个强大的可扩展文件系统
■ 支持标准unix 文件类型 ■ 管理大的分区 ,达4TB ■ 支持长文件名 ,255字符 ■ 为超级用户保留5%数据块
EXT2文件系统的物理结构
■ 数据被保存在数据块中 ,每一个文件的长 度都按照块取整 。
■ 参见 include/linux/fs.h
The VFS Inode 包含的信息
■ device 存放这个文件的设备的设备标识符。
■ Inode nunber 这个 inode 的编号。
■ Mode 象 EXT2 一样,这个域描述这个 VFS inode 代表的东西和对它的访问权限。

linux内核sysfs详解【转】

linux内核sysfs详解【转】

linux内核sysfs详解【转】转⾃:"sysfs is a ram-based filesystem initially based on ramfs. It provides a meansto export kernel data structures, their attributes, and the linkages between them touserspace.” --- documentation/filesystems/sysfs.txt可以先把documentation/filesystems/sysfs.txt读⼀遍。

⽂档这种东西,真正读起来就嫌少了。

Sysfs⽂件系统是⼀个类似于proc⽂件系统的特殊⽂件系统,⽤于将系统中的设备组织成层次结构,并向⽤户模式程序提供详细的内核数据结构信息。

去/sys看⼀看,localhost:/sys#ls /sys/block/ bus/ class/ devices/ firmware/ kernel/ module/ power/Block⽬录:包含所有的块设备Devices⽬录:包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构Bus⽬录:包含系统中所有的总线类型Drivers⽬录:包括内核中所有已注册的设备驱动程序Class⽬录:系统中的设备类型(如⽹卡设备,声卡设备等)sys下⾯的⽬录和⽂件反映了整台机器的系统状况。

⽐如bus,localhost:/sys/bus#lsi2c/ ide/ pci/ pci express/ platform/ pnp/ scsi/ serio/ usb/⾥⾯就包含了系统⽤到的⼀系列总线,⽐如pci, ide, scsi, usb等等。

⽐如你可以在usb⽂件夹中发现你使⽤的U盘,USB⿏标的信息。

我们要讨论⼀个⽂件系统,⾸先要知道这个⽂件系统的信息来源在哪⾥。

所谓信息来源是指⽂件组织存放的地点。

2.6内核编译配置选项简介--介绍make menuconfig中的每个选项含义

2.6内核编译配置选项简介--介绍make menuconfig中的每个选项含义

BUG报告,切磋与探讨由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。

如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。

如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。

联系方式:MSN: csfrank122@Code maturity level options代码成熟度选项Prompt for development and/or incomplete code/drivers显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择General setup常规设置Local version - append to kernel release在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到Automatically append version information to the version string自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持Support for paging of anonymous memory (swap)使用交换分区或者交换文件来做为虚拟内存System V IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么IPC NamespacesIPC命名空间支持,不确定可以不选POSIX Message QueuesPOSIX消息队列,这是POSIX IPC中的一部分BSD Process Accounting将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息BSD Process Accounting version 3 file format使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式Export task/process statistics through netlink通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的Enable per-task delay accounting在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间UTS NamespacesUTS名字空间支持,不确定可以不选Auditing support审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计Enable system-call auditing support支持对系统调用的审计Kernel .config support把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息Enable access to .config through /proc/config.gz允许通过/proc/config.gz访问内核的配置信息Cpuset support只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它Kernel->user space relay support (formerly relayfs)在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口Initramfs source file(s)initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白Optimize for size (Look out for broken compilers!)编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码Enable extended accounting over taskstats收集额外的进程统计信息并通过taskstats接口发送到用户空间Configure standard kernel features (for small systems)配置标准的内核特性(为小型系统)Enable 16-bit UID system calls允许对UID系统调用进行过时的16-bit包装Sysctl syscall support不需要重启就能修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核行为的参数或变量Load all symbols for debugging/kksymoops装载所有的调试符号表信息,仅供调试时选择Include all symbols in kallsyms在kallsyms中包含内核知道的所有符号,内核将会增大300KDo an extra kallsyms pass除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项Support for hot-pluggable devices支持热插拔设备,如usb与pc卡等,Udev也需要它Enable support for printk允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择BUG() support显示故障和失败条件(BUG和WARN),禁用它将可能导致隐含的错误被忽略Enable ELF core dumps内存转储支持,可以帮助调试ELF格式的程序Enable full-sized data structures for core在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能Enable futex support快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序Enable eventpoll support支持事件轮循的系统调用Use full shmem filesystem完全使用shmem来代替ramfs.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多Use full SLAB allocator使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用Enable VM event counters for /proc/vmstat允许在/proc/vmstat中包含虚拟内存事件记数器Loadable module support可加载模块支持Enable loadable module support打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中Module unloading允许卸载已经加载的模块Forced module unloading允许强制卸载正在使用中的模块(比较危险)Module versioning support允许使用其他内核版本的模块(可能会出问题)Source checksum for all modules为所有的模块校验源码,如果你不是自己编写内核模块就不需要它Automatic kernel module loading让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)Deadline I/O scheduler使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)CFQ I/O scheduler使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占Voluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU information support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS还不支持BIOS update support for DELL systems via sysfs仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APM AC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medion Laptop ExtrasASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop ExtrasIBM ThinkPad专用Toshiba Laptop ExtrasToshiba笔记本专用Disable ACPI for systems before Jan 1st this year输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements详细的ACPI调试信息,不搞开发就别选Power Management Timer Support这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05 and PNP0A06 Container Driver支持内存和CPU的热插拔Smart Battery System支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequency scaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor'立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor'保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capability checks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备) PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use polling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X)PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.可以使用"pci=nomsi"内核引导参数关闭MSI PCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择}PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformation user configuration interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformation sub policy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguration在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformationIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestion control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了Security Marking对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选Network packet filtering (replaces ipchains)Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃Network packet filtering debugging仅供开发者调试Netfilter使用Bridged IP/ARP packets filtering如果你希望使用一个针对桥接的防火墙就打开它Core Netfilter Configuration核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain 中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)Netfilter netlink interface允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视.Netfilter NFQUEUE over NFNETLINK interface通过NFNETLINK接口对包进行排队Netfilter LOG over NFNETLINK interface通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog的ipt_LOG和ip6t_LOG模块Layer 3 Independent Connection tracking独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议Netfilter Xtables support如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上"CLASSIFY" target support允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它"CONNMARK" target support类似于"MARK",但影响的是连接标记的值"DSCP" target support允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos"MARK" target support允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为"NFQUEUE" target Support用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE只能支持一个"NOTRACK" target support允许规则指定哪些包不进入链接跟踪/NAT子系统"SECMARK" target support允许对包进行安全标记,用于安全子系统"CONNSECMARK" target support针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用"comment" match support允许你在iptables规则集中加入注释"connbytes" per-connection counter match support允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数"connmark" connection mark match support允许针对每个会话匹配先前由"CONNMARK"设置的标记值"conntrack" connection tracking match support连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用"DCCP" protocol match supportDCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务"DSCP" match support允许对IP包头的DSCP字段进行匹配"ESP" match support允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧"helper" match support加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块"length" match support允许对包的长度进行匹配"limit" match support允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击"mac" address match support允许根据以太网的MAC进行匹配,常用于无线网络环境"mark" match support允许对先前由"MARK"标记的特定标记值进行匹配IPsec "policy" match support使用IPsec就选上吧Multiple port match support允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)"physdev" match support允许对到达的或将要离开的物理桥端口进行匹配"pkttype" packet type match support允许对封包目的地址类别(广播/群播/直播)进行匹配"quota" match support允许对总字节数的限额值进行匹配"realm" match support允许对iptables中的路由子系统中的realm值进行匹配"sctp" protocol match support流控制传输协议(SCTP),十年以后也许能够普及的东西"state" match support这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配"statistic" match support允许根据一个给定的百分率对包进行周期性的或随机性的匹配"string" match support允许根据包所承载的数据中包含的特定字符串进行匹配"tcpmss" match support允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配IP: Netfilter Configuration针对IPv4的Netfilter配置Connection tracking (required for masq/NAT)链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力Connection tracking flow accounting允许针对每个连接记录已经传送的字节/包数,常用于connbytes matchConnection mark tracking support允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持Connection tracking security mark support允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)Connection tracking events连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变Connection tracking netlink interface支持基于netlink的用户空间接口SCTP protocol connection tracking supportSCTP是IP网面向多媒体通信的新一代的流控制传输协议FTP protocol supportFTP协议IRC protocol supportIRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生NetBIOS name service protocol supportNetBIOS名字服务协议TFTP protocol supportTFTP是基于UDP的比FTP简单的文件传输协议Amanda backup protocol supportAmanda备份协议PPTP protocol support点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉H.323 protocol supportITU-T提出的用于IP电话的协议SIP protocol supportIETE提出的用于IP电话的协议IP Userspace queueing via NETLINK已废弃IP tables support (required for filtering/masq/NAT)要用iptables就肯定要选上IP range match support允许对ip地址的范围进行匹配TOS match support允许对ip包头的TOS(Type Of Service)字段进行匹配recent match support可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配ECN match support允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法AH match support允许对IPSec包头的AH字段进行匹配TTL match support允许对ip包头的TTL(生存期)字段进行匹配Owner match support允许对本地生成的包按照其宿主(user,group,process,session)进行匹配address type match support。

sysfs_create_group的用法

sysfs_create_group的用法

sysfs_create_group的用法一、简介sysfs是Linux内核提供的一种机制,用于在sysfs文件系统中提供对内核对象和设备驱动程序的访问。

sysfs文件系统提供了对内核对象和设备驱动程序的直接访问,使得用户空间应用程序可以获取和修改内核对象的状态和属性。

而sysfs_create_group则是用于在sysfs文件系统中创建和管理内核对象组。

二、用法1. 定义内核对象组在使用sysfs_create_group之前,需要先定义一个内核对象组。

内核对象组通常由一组相关的内核对象组成,它们共享相同的属性。

可以使用内核提供的sysfs_create_group函数来创建内核对象组。

该函数需要指定内核对象组的名称和属性,以及一个包含内核对象列表的数组。

例如,以下代码定义了一个名为"my_group"的内核对象组,它包含三个相关的内核对象:device1、device2和device3。

```cchar *group_name = "my_group";struct device *device1, *device2, *device3;struct sysfs_group_item *group_item;struct sysfs_create_file *file_list[] = {&device1->dev,&device2->dev,&device3->dev,};group_item = sysfs_create_group(group_name, file_list);```2. 创建内核对象创建内核对象是在内核对象组中添加具体对象的过程。

可以使用sysfs_create_file函数来创建内核对象,该函数需要指定内核对象的名称、属性以及操作函数等。

创建的内核对象将添加到指定的内核对象组中。

例如,以下代码创建了一个名为"attribute"的内核对象,并将其添加到名为"my_group"的内核对象组中:```cchar *attribute_name = "attribute";struct sysfs_create_file *file = &attribute->dev;int result = sysfs_create_file(group_item, attribute_name, file);```3. 操作内核对象创建了内核对象之后,用户空间应用程序可以通过访问相应的sysfs文件来操作这些内核对象。

四种嵌入式web服务器介绍

四种嵌入式web服务器介绍

mm net security
内存管理代码 网络支持代码,每个子目录对应网络的一个方面 安全、密钥相关的代码
sound usr
document ation scripts
音频设备的驱动程序 用来制作一个压缩的cpio归档文件
内核文档 用于配置、编译内核的脚本文件
内核的源代码可以从获取: 1. 首先解压缩内核源代码,修改顶层的Makefile文件 ARCH?= arm CROSS_COMPILE ?= arm-linux这里需要指定目标平台的体系结构和交叉编译工具链的路径。 2. 修改linux-2.6.26.8/arch/arm/mach-s3c2440/mach-smdk2440.c文件 s3c24xx_init_clocks(16934400)修改为s3c24xx_init_clocks(12000000) 指定开发板的晶振频率为12MHz。
第12章 嵌入式BOA服务器的构建
12.1
概述 嵌入式Linux系统移植 嵌入式Linux的BOA服务器移植
12.2
12.3
12.1 概述
下面简介下嵌入式web服务器。由于嵌入式 设备资源一般都比较有限,并且也不需要能同时 处理很多用户的请求,因此不会使用Linux下最 常用的如Apache等服务器,而需要使用一些专 门为嵌入式设备设计的Web服务器,这些Web 服务器在存贮空间和运行时所占有的内存空间上 都会非常适合于嵌入式应用场合。常见的嵌入式 Web服务器主要有:lighttpd、thttpd、shttpd 和BOA等等。
4.BOA BOA是一个非常小巧的Web服务器,可执行代码只有约60KB。它是 一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进 程来处理并发连接请求。但BOA支持CGI,能够为CGI程序fork出一个进 程来执行。BOA的设计目标是速度和安全,在其站点公布的性能测试中, BOA的性能要好于Apache服务器。

sysfs write 例程

sysfs write 例程

sysfs write 例程全文共四篇示例,供读者参考第一篇示例:sysfs是Linux内核中的一个虚拟文件系统,它允许用户空间程序与内核模块进行通信和交互。

sysfs中的文件可以用来查询和设置内核中的各种参数和状态信息,对于开发人员来说具有很大的便利性。

在这篇文章中,我们将讨论如何使用sysfs write接口来编写一个例程,实现从用户空间向内核空间写入数据的功能。

在Linux系统中,sysfs文件系统通常挂载在/sys目录下,其中包含了一系列虚拟文件以及相应的属性和参数。

用户可以通过读写这些文件来与内核进行交互,以实现各种功能。

在sysfs文件系统中,每个文件都有一个路径,形式为/sys/路径/文件名,其中路径是文件所在的目录结构,而文件名则是文件的名称。

对于编写一个sysfs write例程来说,首先需要创建一个sysfs节点,这个节点将会被挂载到sysfs文件系统中。

在内核模块的初始化函数中,可以通过调用sysfs_create_file函数来创建一个sysfs文件。

具体的调用方式为:```sysfs_create_file(KOBJ, &attr.attr);```在这个函数中,KOBJ代表了要创建文件的内核对象,通常是一个内核模块的结构体对象。

而attr则是一个具有文件属性的结构体,包括文件的名称、权限等信息。

创建好sysfs文件之后,用户空间程序就可以通过sysfs write接口来向该文件写入数据。

在用户空间程序中,可以通过open函数打开sysfs文件,并获取文件描述符。

之后可以使用write函数向文件中写入数据,实现数据的传输。

在写入数据之后,还可以通过close函数关闭文件描述符,释放资源。

下面我们来看一个简单的示例代码,来演示如何编写一个sysfs write例程。

假设我们要编写一个内核模块,创建一个名为test_value 的sysfs文件,用户可以通过写入数据来设置一个变量的值。

使用sysfs文件系统访问Linux内核【精选】

使用sysfs文件系统访问Linux内核【精选】

使用 sysfs 文件系统访问 Linux 内核简介: sysfs 是 Linux 内核中设计较新的一种虚拟的基于内存的文件系统,它的作用与 proc 有些类似,但除了与 proc 相同的具有查看和设定内核参数功能之外,还有为 Linux 统一设备模型作为管理之用。

相比于 proc 文件系统,使用 sysfs 导出内核数据的方式更为统一,并且组织的方式更好,它的设计从 proc 中吸取了很多教训。

本文就 sysfs 的挂载点 /sys 目录结构、其与 Linux 统一设备模型的关系、常见属性文件的用法等方面对 sysfs 作入门介绍,并且就内核编程方面,以具体的例子来展示如何添加 sysfs 支持sysfs 与 /syssysfs 文件系统总是被挂载在 /sys 挂载点上。

虽然在较早期的2.6内核系统上并没有规定 sysfs 的标准挂载位置,可以把 sysfs 挂载在任何位置,但较近的2.6内核修正了这一规则,要求 sysfs 总是挂载在 /sys 目录上;针对以前的 sysfs 挂载位置不固定或没有标准被挂载,有些程序从 /proc/mounts 中解析出 sysfs 是否被挂载以及具体的挂载点,这个步骤现在已经不需要了。

请参考附录给出的 sysfs-rules.txt 文件链接。

sysfs 与 procsysfs 与 proc 相比有很多优点,最重要的莫过于设计上的清晰。

一个 proc 虚拟文件可能有内部格式,如/proc/scsi/scsi,它是可读可写的,(其文件权限被错误地标记为了 0444 !,这是内核的一个BUG),并且读写格式不一样,代表不同的操作,应用程序中读到了这个文件的内容一般还需要进行字符串解析,而在写入时需要先用字符串格式化按指定的格式写入字符串进行操作;相比而言, sysfs 的设计原则是一个属性文件只做一件事情, sysfs 属性文件一般只有一个值,直接读取或写入。

转载:linux驱动层到应用层的重要接口sys文件系统---sys目录详解

转载:linux驱动层到应用层的重要接口sys文件系统---sys目录详解

转载:linux驱动层到应⽤层的重要接⼝sys⽂件系统---sys⽬录详解linux驱动层到应⽤层的重要接⼝sys⽂件系统---/sys⽬录详解Linux2.6内核中引⼊了sysfs⽂件系统。

sysfs⽂件系统整理的设备驱动的相关⽂件节点,被视为dev⽂件系统的替代者。

同时也拥有类似proc ⽂件系统⼀样查看系统相关信息的功能。

最主要的作⽤是sysfs把连接在系统上的设备和总线组织成分级的⽂件,使其从⽤户空间可以访问或配置。

Sysfs被加载在 /sys/⽬录下,它的⼦⽬录包括:(本⽂以⾼通sdm630平台为例)1)Block:在系统中发现的每个块设备在该⽬录下对应⼀个⼦⽬录,如mmcblk0对应eMMC设备主节点(此部分可以参考⽂章:。

每个⼦⽬录中⼜包含⼀些属性⽂件,它们描述了这个块设备的各⽅⾯属性,如:设备⼤⼩。

(loop块设备是使⽤⽂件来模拟的)我们查看/sys/block⽬录的详细信息,发现都是链接⽂件,指向了/sys/devices/下的设备:2)Bus:在内核中注册的每条总线在该⽬录下对应⼀个⼦⽬录,如: ide pci scsi usbpcmcia 其中每个总线⽬录内⼜包含两个⼦⽬录:devices和drivers,devices⽬录包含了在整个系统中发现的属于该总线类型的设备,drivers⽬录包含了注册到该总线的所有驱动。

3)Class:将设备按照功能进⾏的分类,如/sys/class/net⽬录下包含了所有⽹络接⼝。

其中power_supply可以查看充电相关的信息:cat /sys/class/power_supply/battery/uevent4)Devices:包含系统所有的设备。

该⽬录层次与devicetree中描述的设备层次是相互对应的。

如上图中的soc⽂件夹对应dtsi⽂件中的:slv_wlan⽂件夹对应dtsi中的:5)Kernel:内核中的配置参数6)Module:系统中所有模块的信息7)Firmware:系统中的固件8)Fs:描述系统中的⽂件系统9)Power:系统中电源选项。

常见sysfs属性的功能

常见sysfs属性的功能

常见sysfs 属性的功能使用sysfs 的关键就是掌握这些sysfs 属性的用法,下面以一些常见的sysfs 属性来展示它的用法;使用设备(PCI)的sysfs 属性文件以一份桌面系统上的视频卡为例,列举它对应的kobject 上的属性文件的对应用途;一般来说,在Linux 桌面上都有视频卡以支持Xorg 软件包作为XWindow 服务器来运行,因此先找到Xorg 的进程号,查看这个进程所使用的所有文件(注意查看这个进程属性需要root 用户权限);# ps xfa |grep Xorg2001 tty1 Ss+ 2:24 \_ /usr/bin/Xorg :0 -nr -verbose -auth \/var/run/gdm/auth-for-gdm-NPrkZK/database -nolisten tcp vt1# lsof -nP -p 2001Xorg 2001 root mem REG 8,3 617732 231033 \/usr/lib/xorg/modules/drivers/sis_drv.so[...]Xorg 2001 root mem REG 0,0 8 5529 \/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource0Xorg 2001 root mem REG 0,0 131072 5531 \/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource1[...]Xorg 2001 root 7u REG 0,0 256 5504 \/sys/devices/pci0000:00/0000:00:00.0/configXorg 2001 root 8u unix 0xdbe66000 0t0 8756 socketXorg 2001 root 9u REG 0,0 256 5528 \/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/config注意到此Xorg 服务器是以内存映射(mem) 的形式打开了"/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource0" 和"/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/resource1" ,同时以文件读写形式(7u,9u) 打开了"/sys/devices/pci0000:00/0000:00:00.0/config" 和"/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/config" 事实上,PCI 设备对应的kobject 目录下的config 正是代表PCI设备的“配置空间”,对于普通PCI (非PCI-E)设备而言,其配置空间大小一般是256字节,这个空间可以使用十六进制工具dump 出来,如下。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sysfs - _The_ filesystem for exporting kernel objects. sysfs - 用于导出内核对象(kobject)的文件系统Patrick Mochel<mochel@>翻译: tekkamanninja <tekkamanninja@>10 January 20032003年1月10日翻译时间:2007年12月29日What it is:简介:~~~~~~~~~~~sysfs is a ram-based filesystem initially based on ramfs. It providessysfs 是一个最初基于ramfs的位于内存的文件系统。

它提供a means to export kernel data structures, their attributes, and the一些方法以导出内核的数据结构、他们的属性和linkages between them to userspace.他们与用户空间的连接。

sysfs is tied inherently to the kobject infrastructure. Please readsysfs 始终与kobject的底层结构紧密相关。

请阅读Documentation/kobject.txt for more information concerning the kobjectDocumentation/kobject.txt 文档以获得更多关于 kobject 接口的信息。

interface.Using sysfs使用~~~~~~~~~~~sysfs is always compiled in. You can access it by doing:sysfs 通常被编译进内核。

你可以通过使用以下命令访问它:mount -t sysfs sysfs /sys(此命令含义是挂载 sysfs 到根目录下的sys目录)Directory Creation创建目录~~~~~~~~~~~~~~~~~~For every kobject that is registered with the system, a directory is一旦有 kobject 在系统中注册,就会有一个目录在sysfs中被创建。

created for it in sysfs. That directory is created as a subdirectory这个目录是作为 kobject 的 parent 下的子目录创建的,of the kobject's parent, expressing internal object hierarchies to以准确的传递内核的对象层次到userspace. Top-level directories in sysfs represent the common用户空间。

sysfs中的顶层目录代表着内核对象层次的共同祖先;ancestors of object hierarchies; i.e. the subsystems the objects例如:某些对象属于某个子系统。

belong to.Sysfs internally stores the kobject that owns the directory in theSysfs内部存储着 kobject ,这些 kobject 在 d_fsdata 指针(在 kobject->d_fsdata pointer of the directory's dentry. This allows sysfs to do的dentry结构体中)中拥有目录。

这使得 sysfs 可以在文件reference counting directly on the kobject when the file is opened and打开和关闭时,直接在 kobject 上实现引用计数。

closed.Attributes属性~~~~~~~~~~Attributes can be exported for kobjects in the form of regular files inkobject 的属性能在文件系统中以普通文件的形式导出。

the filesystem. Sysfs forwards file I/O operations to methods definedSysfs 为属性定义了面向文件 I/O 操作的方法,for the attributes, providing a means to read and write kernel以提供对内核属性的读写。

attributes.Attributes should be ASCII text files, preferably with only one value属性应为 ASCII 码文本文件,以一个文件只存储一个属性值为宜。

per file. It is noted that it may not be efficient to contain only但一个文件只包含一个属性值可能影响效率,value per file, so it is socially acceptable to express an array of所以一个包含相同数据类型的属性值数组也是被广泛接受的。

values of the same type.Mixing types, expressing multiple lines of data, and doing fancy混合类型、表达多行数据以及一些怪异的数据格式是会遭强烈反对。

formatting of data is heavily frowned upon. Doing these things may get这样做是很丢脸的,而且you publically humiliated and your code rewritten without notice.你的代码会在未通知你的情况下被重写。

An attribute definition is simply:一个简单的属性结构定义如下:(到2.6.22.2已添加了struct module * owner;)struct attribute {char * name;mode_t mode;};int sysfs_create_file(struct kobject * kobj, struct attribute * attr);void sysfs_remove_file(struct kobject * kobj, struct attribute * attr);A bare attribute contains no means to read or write the value of the一个裸的属性并不包含读写其属性值的方法。

attribute. Subsystems are encouraged to define their own attribute最好为子系统定义自己的属性structure and wrapper functions for adding and removing attributes for和 为了增删特殊对象类型的属性而 包装过的函数。

a specific object type.For example, the driver model defines struct device_attribute like:例如:驱动程序模型定义的device_attribute 结构体如下:struct device_attribute {struct attribute attr;ssize_t (*show)(struct device * dev, char * buf);ssize_t (*store)(struct device * dev, const char * buf);};int device_create_file(struct device *, struct device_attribute *);void device_remove_file(struct device *, struct device_attribute *);It also defines this helper for defining device attributes:它为了定义设备的属性也定义了辅助的宏:#define DEVICE_ATTR(_name, _mode, _show, _store) \struct device_attribute dev_attr_##_name = { \.attr = {.name =.show = _show, \.store = _store, \};For example, declaring例如:声明static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo);is equivalent to doing:等同于这样的代码static struct device_attribute dev_attr_foo = {.attr= {.name = "foo",.mode = S_IWUSR | S_IRUGO,},.show = show_foo,.store = store_foo,};Subsystem-Specific Callbacks子系统特有的调用~~~~~~~~~~~~~~~~~~~~~~~~~~~~When a subsystem defines a new attribute type, it must implement a当一个子系统定义一个新属性类型时,set of sysfs operations for forwarding read and write calls to the一系列的sysfs操作必须被执行,以帮助读写函数实现show and store methods of the attribute owners.属性所有者的显示和储存的方法。

struct sysfs_ops {ssize_t (*show)(struct kobject *, struct attribute *, char *);ssize_t (*store)(struct kobject *, struct attribute *, const char *); };[ Subsystems should have already defined a struct kobj_type as a[子系统应已经定义了一个kobj_type 结构体作为descriptor for this type, which is where the sysfs_ops pointer is这个类型的描述符,存储 sysfs_ops 的指针。

相关文档
最新文档