免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13288 | 回复: 11
打印 上一主题 下一主题

ifconfig命令是怎样调用到网络设备驱动的open函数的?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-31 16:09 |只看该作者 |倒序浏览
当>ifconfig eth1 192.168.0.156 up后,log信息里打印出:
zd1205: (enter) zd1205_open, /home/will/stblinux-2.6.12-5.0/ZD1211_sigmadesign_f
araday_v16/src/zd1205.c line 4418
zd1205: (exit) zd1205_open, /home/will/stblinux-2.6.12-5.0/ZD1211_sigmadesign_fa
raday_v16/src/zd1205.c line 4517
所以这个网络设备驱动的open函数被调用到了,但是没看到源码里是怎么调用到的,心里总是不踏实,有没有人告诉我一下这个调用的详细过程或者原理??
谢谢!

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-10-31 17:08 |只看该作者
原帖由 todayrw 于 2008-10-31 16:09 发表
当>ifconfig eth1 192.168.0.156 up后,log信息里打印出:
zd1205: (enter) zd1205_open, /home/will/stblinux-2.6.12-5.0/ZD1211_sigmadesign_f
araday_v16/src/zd1205.c line 4418
zd1205: (exit) zd1205_ ...


你可以尝试自己跟代码,下去看看实现,写个心得出来分享,呵呵

论坛徽章:
0
3 [报告]
发表于 2008-11-01 00:28 |只看该作者
小弟我刚接触linux驱动,看到跟内核有关的源码就犯晕,能否给点提示?说个大概的原理吧!!

论坛徽章:
0
4 [报告]
发表于 2008-11-01 01:15 |只看该作者
我在ldd3中看到这样一段话:
“当 ifconfig 用来给接口安排一个地址, 它做 2 个任务. 第一, 它通过 ioctl(SIOCSIFADDR)( Socket I/O Control Set Interface Address) 来安排地址. 接着它设置 dev->flag 的 IFF_UP 位, 通过 ioctl(SIOCSIFFLAGS) ( Socket I/O Control Set Interface Flags) 来打开接口.”
我猜想,ifconfig eth0 xxx.xxx.xxx.xxx up就是ioctl(SIOCSIFFLAGS),通过它来调用netdev->open函数,然后我在ifconfig源码里找到这句
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&my_ifr) < 0)
但ioctl函数的定义找不到。
1.我的猜想是否正确?
2.如果正确,是否ioctl函数里会有涉及到调用netdev->open函数?
3.哪里能找到ioctl函数的定义?

dreamice 兄,解惑一下吧!

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
5 [报告]
发表于 2008-11-01 12:30 |只看该作者

回复 #4 todayrw 的帖子

首先,ifconfig应该是通过ioctl来实现的。ioctl实际上是一个系统调用,实现了userspace对io接口的操作(通常不是用于大量数据的传输)。
内核驱动中包含了具体驱动程序的实现,也就是对应于特定的硬件设备,其ioctl实现是不一样,对于你这里的应用,也就是网络设备接口的配置。你需要弄明白,对于ifconfig,ioctl实现时传递的参数是什么,然后跟到内核驱动的实现,看看对应的ioctl实现,这样就明白了。

具体问题,我给你引了一条思路,代码还是你自己琢磨,理解才会更深刻一些。

论坛徽章:
0
6 [报告]
发表于 2008-11-01 13:51 |只看该作者
谢谢!我再深入看看!

论坛徽章:
0
7 [报告]
发表于 2008-11-11 16:00 |只看该作者
问题清楚了!!
过程是这样的:
首先要清楚linux网络设备驱动中一个重要的结构体net_device,它的众多成员中,有一个是flags,而这个flags有很多标志值:IFF_UP、IFF_BROADCAST、IFF_NOARP等等。只要IFF_UP被改变,则内核马上调用open或close设备函数(同时也会调用set_multicast_list设备函数)
在ifconfig源码中,可以找到一个叫setifflags函数,ifconfig ... up命令将通过此函数来更改这个网络设备的flags。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-11-11 16:16 |只看该作者
原帖由 todayrw 于 2008-11-11 16:00 发表
问题清楚了!!
过程是这样的:
首先要清楚linux网络设备驱动中一个重要的结构体net_device,它的众多成员中,有一个是flags,而这个flags有很多标志值:IFF_UP、IFF_BROADCAST、IFF_NOARP等等。只要IFF_UP被 ...



恭喜兄弟,能不能讲得在详细点,把代码的执行流程罗列分析一下,供兄弟们分享一下
自己解决问题,就是爽吧,呵呵

论坛徽章:
0
9 [报告]
发表于 2008-11-25 10:44 |只看该作者
ifconfig ethx xxx.xxx.xxx.xxx.up (用户)--->ifconfig源码中setifflags函数调用了ioctl(SIOCSIFFLAGS),将net_device的成员flags置为IFF_UP标志--->内核探测到这个标志,就自动调用设备的open方法

内核源码看得晕,所以也只能说到这里了,反正大概的原理知道了,慢慢来吧

评分

参与人数 1可用积分 +9 收起 理由
dreamice + 9 我很赞同

查看全部评分

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2008-11-25 10:50 |只看该作者

回复 #9 todayrw 的帖子

奖励一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP