从sys_ioctl()到8139too驱动中的rtl8139_get_settings()过程.pdf

从sys_ioctl()到8139too驱动中的rtl8139_get_settings()过程.pdf

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从sys_ioctl()到8139too驱动中的rtl8139_get_settings()过程

Rtl8139too.c 驱动分析 ———从sys_ioctl()到驱动中的rtl8139_get_settings()过程 (说明:分析代码2.6.35.4 ) 在2.6.24 内核代码中,在fs/ioctl.c 中定义的是sys_ioctl(),但是在2.6.35.4 内核中定义的代码 是(fs/ioctl.c): 因此,分析的开始函数是上面的这个函数。 linu 内核把socket 套接字当作文件来处理,内核在创建socket 套接字时,为套接字分配文件id 以及生成与id 对应的文件节点,节点的i_mode 域是代表文件类型的位域标志字段。在本文档所述的内容 中,fd 就是指向的是一个套接字的文件句柄。 前提:使用ethtool 工具时,键入的命令是:ethtool eth0;以此为例子,来说明调用流程,当然, 要得到该命令所期望的结果,需要调用rtl8139too.c 中的rtl8139_get_settings(). 接着调用,do_vfs_ioctl()vfs_ioctl() : 在vfs_ioctl()中执行f_op-unlocked_ioctl()函数,即sock_ioctl()函数(net/socket.c),因为 fd 是一个socket 文件句柄,则fd 指向的文件是一个socket 文件,则在net/socket.c 中: 下面接着f_op-unlocked_ioctl()继续分析: 在sock_ioctl()中——sock_do_ioctl()(net/socket.c)dev_ioctl() (net/core/dev.c),在dev_ioctl()中,如下图: 先看: 由此可以看到,传进去的参数arg 由此发生了变化: 在ethtool 应用程序中是ifr系统调用中argdev_ioctl()中ifr ,为达到这个目 的使用了copy_from_user()函数。 并且在dev_ioctl()中: 根据传进去的cmd 参数:SIOCETHTOOL,调用:dev_ioctl()dev_ethtool() (net/core/ethtool.c),此时传给dev_ethtool()的参数变成为了ifr,这个ifr 即是用来承载所要得到 的数据的载体,通过copy_to_user()将这个承载着数据的载体to_user_space 的ethtool 应用程序: 在dev_ethtool()(net/core/ethtool.c): 在dev_ethtool()中,根据在ethtool 用户态应用程序中输入的命令行参数eth0,即ifr_name,得 到对应接口网卡的net_device 即上面代码中的dev; 注意,让我们看看上面代码中的ifr-ifr_data,首先我们回到用户态的ethtool 应用程序中的函数 do_gdrv()中看看: 可以看到,ifr-ifr_data=(caddr_t)drvinfo。 结合上面的代码就可以知道:useraddr 中存放的就是ethtool_drvinfo 类型的drvinfo 的起始地 址。 在ethtool 的源代码中,include/linux/ethtool.h 中,有ethtool_drvinfo 的定义: 从此处可以看到,drvinfo 的开始的__u32 存放的就是该drvinfo 需要获取什么信息所对应的 cmd,所以在dev_ethtool()中: 在dev_ethtool()中,定义了u32 的ehtcmd,则根据drvinfo 的起始地址useraddr,使用 copy_from_user()得到和该drvinfo 所对应的cmd,并用ethcmd 作为case 判断条件,找到对应的 操作: 根据ethcmd,dev_ethtool()ethtool_get_settings(dev,useraddr) (net/core/ethtool.c ): 即dev 为ehto 对应网卡接口的net_dev ,useraddr 是用来承载信息的ethtool_drvinfo 的起 始地址。 下面,来看看ethtool_get_settings()的代码: 从中可以看到,在这个函数中调用了和eht0 网卡接口对应的net_dev 结构的函数指针: dev—ethtool_o

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档