Chinaunix首页 | 论坛 | 博客
  • 博客访问: 406216
  • 博文数量: 139
  • 博客积分: 106
  • 博客等级: 民兵
  • 技术积分: 613
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 16:03
文章分类

全部博文(139)

文章存档

2016年(1)

2014年(16)

2013年(23)

2012年(98)

2011年(1)

分类:

2012-11-15 20:13:24

内核通过不同的接口将信息输出到用户空间,除了用于请求特定信息的系统调用(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.

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