Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3167987
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2014-09-03 19:27:57

原文地址:http://blog.chinaunix.net/uid-14518381-id-3408521.html

内核通过不同的接口将信息输出到用户空间,除了用于请求特定信息的系统调用(system call)外,还有三个特殊接口:

  1. procfs(/proc文件系统):这是一个虚拟文件系统,挂载在/proc目录下。允许内核以文件的形式向用户空间输出内部信息。这些文件并不实际存在于磁盘上,但可以通过cat或more以及‘>’shell重定向字符写入。也可以设置文件的访问权限。目录不能被写入,即用户不能把文件或目录添加到/proc中的任何目录或删除文件和目录。 
    procfs不能编译成为一个模块。配置菜单中的相关内核选项为“Filesystems->pseudo filesystems->/proc file system support”
  2. sysctl(/proc/sys目录): 此接口允许用户读取或修改内核变量的值。不能用此接口对每个内核变量进行操作:内核应明确指出哪些变量从此接口是可见的。从用户空间可以用两种方式访问sysctl输出的变量,一是sysctl系统调用,另一种是procfs。当内核支持procfs时,会在/proc中添加一个特殊目录(/proc/sys),为每个由sysctl所输出的内核变量引入一个文件。procfs包随附的sysctl命令可用于配置由sysctl接口输出的变量,此命令通过写入/proc/sys与内核通信。sysctl不能编译成为一个模块。内核配置选项为“General setup –>sysctl support”。
  3. sysfs:以非常干净而有组织的方式输出很多信息。由sysctl所输出的部分信息可以移植到sysfs上。配置菜单中的内核选项为“Filesystem->pseudo filesystems->sysfs filesystem support(NEW)”,只有想开启“General setup->Configure standard kernel features(for small system)”选项后,才能看见上述选项。
  4. ioctl系统调用:ioctl系统调用操作的对象时一个文件,通常用于实现特殊设备需要而标准文件系统没有提供的操作。
  5. Netlink套接字:这是网络应用程序和内核通信时最新的首选机制。多数的网络内核功能都可以用Netlink或ioctl接口进行配置。


Procfs与sysctl

procfs和sysctl都输出内核内部信息,但procfs主要是输出只读数据,而大多数sysctl信息是可写入的,但只要超级用户能写入。与一个简单的内核变量或数据结构相关联的一些文件,可以用sysctl输出。其他涉及更为复杂的数据结构而需要特殊格式时,就以procfs输出,如缓存和统计数据。


Procfs

大多数网络功能会在引导时或在模块加载时其初始化期间在/proc中注册一个或多个文件。当用户读取该文件时,会引起内核间接运行一组内核函数,返回某种输出内容。网络代码所注册的文件位于/proc/net。

/proc中的目录可以使用proc_mkdir创建。/proc/net中的文件可以使用定义在include/linux/proc_fs.h中的proc_net_fops_create和proc_net_remove予以注册和注销。

还有两个通用的API函数create_proc_entry和remove_proc_entry。proc_net_fops_create负责调用proc_net_create创建文档,然后初始化器文件操作处理函数。

如ARP协议在/proc/net中注册其arp文件:

static const struct file_operations arp_seq_fops = { 
.owner = THIS_MODULE, 
.open = arp_seq_open, 
.read = seq_read, 
.llseek = seq_lseek, 
.release = seq_release_net, 
};

static int __net_init arp_net_init(struct net *net) 

if (!proc_net_fops_create(net, "arp", S_IRUGO, &arp_seq_fops)) 
return -ENOMEM; 
return 0; 
}

static void __net_exit arp_net_exit(struct net *net) 

proc_net_remove(net, "arp"); 
}

proc_net_fops_create参数中权限必须指定为只读。当用户读取该文件时,使用file_operations数据结构,返回数据给用户。open所初始化的例程如前例中的qrp_seq_open会做另一次重要的初始化:注册一个函数指针数组,包括procfs用于变量要传回给用户数据的所有例程:一个例程启动dump复制数据,另一个索引到下一条记录,在dump该条记录,继续后移。这些例程的内部保存必要的环境信息,就是已经dump了多少信息。这些信息是dump点已经到正确位置继续dump所必需的。

static const struct seq_operations arp_seq_ops = { 
.start = arp_seq_start, 
.next = neigh_seq_next, 
.stop = neigh_seq_stop, 
.show = arp_seq_show, 
};

static int arp_seq_open(struct inode *inode, struct file *file) 

return seq_open_net(inode, file, &arp_seq_ops, 
sizeof(struct neigh_seq_state)); 
}

1.

2.内核态和用户态通讯知识收集

3.在 Linux 下用户空间与内核空间数据交换的方式

4.



阅读(881) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~