以前,听过有一首歌叫做《谁是谁的谁》,好像还不错,世界这么大,你我各自走着自己的精彩的人生,到底谁是谁的谁呢?就像启东事件,就像什锦事件,还是有好多人知道自己是谁的谁,*了那些不知道自己是谁的人。震撼,敬佩。
本节继续上次说到那几个结构体,那么他们的作用究竟是什么呢?直接上代码:
最基本的解释在上面了,表层的解释,第一印象,这也是人们选美的第一个标准。就想前不久,重庆环球小姐大赛出炉,海南小姐选美大赛出炉之后,遭到网友的吐槽,乱骂声,这分明是在挑战中国的传统审美观嘛,无奈只好重选。实践证明第一印象很重要的,该是什么就是什么,不要欺骗普通屌丝大众啊。
第1604行,分配一个网络设备,但是传进去的大小让我们很好奇唉,为什么是板子板子相关的数据的大小呢?我去。。好吧。。作为一个有探索精神的人,咱们进去看看:
尼玛坑爹啊,没直接进去,有出来一个函数alloc_etherdev_mq,好吧,再次ctrl+鼠标左键
我了个去,又调了另外一个函数?好吧。。进入
我了个去,还有这么一层?好吧。。我只能说,这才是为人民服务的公仆,你看看表面平静的alloc_etherdev函数,实际内心是多么的波澜壮阔啊。这才是人民的公仆,无论人家内心是怎样的哈,但是人是公仆啊,公仆就要为人民提供便利,就像xxx和尚哈?人也是公仆啊,人度化了多少女子哈?而且还是那样度化的。唉,这个年头,表面看来很简单的事情,确实蕴含着复杂深刻的道理啊。你再比如刘翔这次110米栏,这在运动员的生涯中是多么普通的一件事情啊,但就是越是看起来简单,其实越复杂。
我们看到英文的解释是这样的:
alloc_etherdev_mqs这个函数分配并且初始化一个网络设备,其中参数sizeof_priv是要分配的附加的驱动私有结构体的大小,当然这个结构体是要为我们的网络设备服务的
txqs这个设备有的接收队列的数量,rxqs当然就是发送队列的数量
这个函数使用基本的网络设备的值填充了设备结构体,其实做了除了注册这个网络设备之外的所有的基本的事情,猜也知道这小子干了不小事儿啊。
再次进入,我了个去。。有点儿长啊。。唉,别怕,有我在呢。。神马都是浮云。咱们继续
额。。咱们一点儿点儿的进行啊。。
先解释一下英文注释:alloc_netdev_mqs分配一个网络设备 ,其中参数sizeof_priv是要分配的私有数据的大小,name是设备名字格式化的字符串 ,setup是初始化设备的回调函数,txqs和rxqs还是那连个队列的数量。
5782行, 限制了名字的长度,那么最大是多少呢?告诉你是16,原因在struct net_device中dev的name是一个长度为16数组,为了避免一下子层次太过与深入,暂时不解释struct net_device,我就知道它就是一个网络设备
5782行,发送队列的数量不能小于1,继续贴代码:
5791行 如果定义了CONFIG_RPS这个选项,那么接收队列的数量也不能小于1。这个选项是什么意思呢?Receive Flow Steering接收流转向,应该是网络协议栈相关的东西,暂时不去关心。
5800-5808行 计算struct net_device的大小加上私有数据的大小,并做一个32位的对齐
5810-5813行 分配上述大小的空间给p做了一个对齐,内核在某些应用中,为了实现某种机制,比如分页,或者提高访问效率需要保证数据或者指针地址对齐到某个特定的整数值,比如连接代码脚本。这个值必须是2N。数据对齐,可以看做向上圆整的一种运算。内核提供了两个用来对齐的宏ALIGN和PTR_ALIGN,一个实现数据对齐,而另一个实现指针的对齐。它们实现的核心都是__ALIGN_MASK,其中mask参数为低N位全为1,其余位全为0的掩码,它从圆整目标值2N - 1得到。
并且计算了一下对齐之后多出的大小放在padded成员中。