



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用户空间与内核空间之间的通研究它们。例如,在本章中,你会了解到,如何在/proc文件系统中增加一个;内核如何处理ioctl令;netlink提供了哪些接口函数(netlink是目前用户空间程序配ifconfigroute等应用空间程序与内核通信的接口和内核如何方法,请参考UnderstandingtheLinuxKernel(O'Reilly)。概这是一个虚拟文件系统,通常挂接在/proc下,内核通过文件的形式将内部信息展现给用户空间程序。这些文件都不是磁盘文件,但是可以使用cat或者more是不可写的(任何用户都不能在/proc下创建或者删除一个文件或大多数(但不是全部)LINUX版的内核都缺省包含了procfs的支持。procfs不能被编译成内核模块。内核中与此相关的编译项在“Filesystems-->Pseudofilesystems-->/procfilesystemsupport”中。sysctl,种是通过procfs。如果内核支持procfs,它会/proc (/poc/sys,这 里面包含了sysctl导出变量的列表procps包里的sysctl命令可以用于配置sysctl 大多数但不是部)LINUX版的内核都省含了syscl的支持。sysctl不GnralseupSyclsuppo”目sysfs(/sysprocfs和sysctl已经被误用了很多年,这导致了新的文件系统sysfs的出现。sysfs量都已经移植到了sysfs上。sysfs的支持。sysfs不能被编译成内核模块。内核中与此相关的编译项在“Filesystems-->Pseudofilesystems-->sysfsfilesystemsupportNEW)”中。这个选项只有在开启“Generalsetup-->Configurestandardkernelfeatures(forsmall你可以在版的LinuxDeviceDrivers中看到关于sysfs的详细分析。在第17章中,ioctl系统调socket描述符由socket系统调用返回,并被网络代码使用。这个接口在一些旧的网络程序中使用,比如ifconfig和route等。Netlink令都使用这个接口。LINUX的netlink与BSD的routingsocket功能相似。大部分的网络功能都可以用netlink和ioctl,procfsprocfs和sysctl都可以导出内核内部信息,但是procfs是导出简单的变量或者数据结构,那么应该使用sysctl。反之,如果导出大量复杂的数大多数的网络功能在初始化时,都会在/proc中一个或多个文件,不管初始化动作输出相应的信息。网络代码的文件一般位于/proc/net下。/proc文件系统中创建可以调用proc_mkdir。创建和删除文件可以分别调用proc_net_fops_create和proc_net_remove,这两个函数在include/linux/proc_fs.h中定义。这两个函数分别包装了函数create_proc_entry和remove_proc_enty。需要注意的是这是arp协议在/proc/net下arp文件的例子staticstructfile_operationsarp_seq_fops=........ =........ =........ =........ =........ =staticint init{if(!proc_net_fops_create("arp",S_IRUGO,&arp_seq_fops))return--ENOMEM;return}proc_net_fops_creaearparp_seq_opsfie_operations结构里面的函数会以的数回。同据很。,可以一arp缓存,或者次个路表。open函数(arp_seq_open)会做另一个重要的初始化:它staticstructseq_operationsarp_seq_ops=........ =........ =........ =........ =staticintarp_seq_open(structinode*inode,structfile{rc=seq_open(file,}用户在 把它放在/proc/sys的什么地方。同一组件或功能的变量一般放在同一个下。例如,/proc/sys/net/ipv4下放的是与IPv4相关的变量。 过sysctl系统调用接口直接。 (在第36章讨论)和/proc/sys/net/ipv4/neigh(在第29章讨论) /proc/sys下的文件和都可以用ctl_table结构来定义。ctl_table结构可以用register_sysctl_table和unregister_sysctl_table来分别和卸载,这两个函数的定义在kernel/sysctl.c中。下面是ctl_tableconstchar*/proc/sys中的文件名。intmaxlenmode_t 这是用户在读写/proc/sys中的文件时,内核调用的函数。与文件相关的ctl_instances必须初始化这个函数指针。与相关的函数指针由内核赋一个缺省这个函数在使用sysctl系统调用/proc/sys 对于不同的文件,proc_handlerstrategy被初始化成不同的函数。例如,如果内核变量包含一个或多个整数,那么proc_handler就被初始化为proc_ntvec。表3-1和表3-2kernel/sysctl.c中。读写一个读写一个读写一个与proc_ntvec类似,但是会检如果不是,就会这个输入值。jiffies成jiffiesjiffies转换成jiffies与proc_ntvec_minmax,但是数值jiffies小、最大范围之3-2可以strategy的函FnnDst读写一个读写整型数组,数组在最小最大范围读写jiffies值,并把它读写jiffies值,并把它转换成和ctl_table让我们先来看看一个文件或如何ctl_table结构,以及它们是如何被使用的。这是net/ipv4/devinet.c中定义的/proc/sys/net/ipv4/conf/default/forwarding文件初始化ctl_table的例子。这个文件的应用在第36章中有描述。{............. = =............. =............. =............. =.............proc_handler=}到这个问题。上面的结构所描述的信息是:文件名forwarding,与文件相关联的内核变量是ipv4_devconf.forwarding(是一个复杂数据结构中的一项,参数的类型是整型,文件的权限是0644(任何人可读,只有超级用户可写)proc_handler被初始化成 {............ = =............. =............. =}这是 都提供了一个缺省的函数需child项。child是指向另一个ctl_table实例的指针,这个实例仅仅是一个ctl_table表中的第一个元素(net下的每个文件和目在/proc/sys中一个文我们/proc/sys目录下的文件可以用register_sysctl_tableunregister_sysctl_table和卸载。函数,需要两个输入参数一个指向ctl_table一个标记,用于说明把这个新元素加入元素所 ctl_table表的什么位置需要注意的是,register_sysctl_table的输入参数中并没有包含/proc/sys 中加入一个文件,你需要创建一个完整路径的树(ctl_tablechild指我们来看两个例子,首先是一个简单的。这段代码来自drivers/scsi/scsi_sysctl.c,它展示了logging_level如何被定义并放到/proc/sys/dev/scsi/ staticctl_tablescsi_table[]={.ctl_name =DEV_SCSI_LOGGING_LEVEL, ="logging_level",............ =............ =............ =............proc_handler= ntvec{staticctl_tablescsi_dir_table[]={... = =............ =............ =scsi_table{staticctl_tablescsi_root_table[]={... = =............ =............ =scsi_dir_table{int init{scsi_table_header=register_sysctl_table(scsi_root_table,1)}register_sysctl_tablescsi_root_table,它是上面代码中的根ctl_table。最后的结果如图3-1所示:图3-1/proc/sys/dev/scsi/logging_level文如果你想在相同的下添加另一个文件abc,你需要定义一个相同的树(相同的,代devscsi的ctl_table,和新的,代表文件abcctl_table。树的代码(scs_ro_abe和scsi_dir_table(。在第29章中,我们可以看到,ne/core/neighbour.c中的neigh_sysctl_register使用neigh_sysctl_template重要的网络代码源文件图3-2展示了网络代码在/proc/sys下的主要。每个,都有相应的章节来描图3-2/proc/sys/net让我们来看看,根据前面描述的信息,/proc/sys/net下的是如何定义并在系统启动图3-2中所示的每一个,以及下的每一个文件都有一个与之对应的ctl_table。3-33-2中所示的大多数是在哪里定义的,以及它们的父子关系。图中没有包含所有的。图3-3的三个方框里面的代码展示了三个ctl_tablenetdev_max_backlog文件有proc_handler函数,但没有strategy函数。因为netdev_max_backlog是一个整数,用户输入通过proc_ntvec。min_delay文件同时拥有proc_handler和strategy函数。因为ip_rt_min_delay以两个函数都需要做秒与jiffies之间的转换。个值是一个范围。范围用最小、最大值来表示。所以,strategy和proc_handler函数需要处理一个整型数组(在这里是一个两个元素的数组。ctl_table的两在图3-4中,你可以看到ioctl是如何被调用的。让我们来看看ifconfig我们前面,ifconfig使用ioctl接口与内核通信。例如,如果系统管理员输入命令ifconfigeth0mtu1250eth0mtu。ifconfig首先打开一个socket,并根据系统管理员的输入初始化一个数据结构,然后把这个数据结构传递给ioctl。修改mtu令标识是SIOCSIFMTU。structifreqfd=socket(PF_INET,SOCK_DGRAM,<...initialize err=ioctl(fd,SIOCSIFMTU,ioctl命令在内核的不同地方被处理。图3-4展示了网络代码使用的ioctl命令如何被sock_ioctl分派并路由到正确的处理函数上。我们没有看到sock_ioctl是如何被调用,还图3-3在 图中所示的ioctl命令的名字可以根据自己的需要(与模块相关)来解析。例如,在路由表中添加路由令,SIOCADDRT,可以被分解为SIOCADDRT。它强调两件重要的事情:ADD强调添加一些东西,而RT强调添加的是路由表项。大多数令都遵循G代表,而S代表设置。例如,在接口上添加和删除ip地址令就分别是SIOCGIFADDRSIOCSIFADDR。前面ifconfig例子里面提到的SIOCSIFMTU是设置接口的最大传输单元(MTU。SIOCSIFMTU被dev_ioctl分派,所以没有在3-4中出现。3-4ioctl命令的与网络相关的ioctl命令的定义在include/linux/sockios.h中。设备驱动可以定义新的(私有)命令,命令编号的范围是SIOCDEVPRIVATE到SIOCDEVPRIVATE+15。可以参考 可以定义有命令,命令编号的是SIOCPROTOPRIVATESIOCPROTOPRIVATE+15
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论