怎么就到网络了呢,还是因为猴哥的好奇心很重,搞明白了文件系统之后[在此猴哥就不谦虚了],对IO产生了浓厚的兴趣,那么在整个计算机中IO主要来自于两个模块:1)存储 2)网络。
存储部分,主要是处理pagecache中的page和盘上的block之间的对应关系,那么网络呢?
猴哥本子上的无线网卡型号是:
04:00.0 Network controller: Intel Corporation Wireless 7260 (rev 6b)
Subsystem: Intel Corporation Wireless-N 7260
Flags: bus master, fast devsel, latency 0, IRQ 35
Memory at f1400000 (64-bit, non-prefetchable) [size=8K]
Capabilities: [c8] Power Management version 3
Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [40] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Device Serial Number 28-b2-bd-ff-ff-eb-1a-77
Capabilities: [14c] Latency Tolerance Reporting
Capabilities: [154] Vendor Specific Information: ID=cafe Rev=1 Len=014 >
Kernel driver in use: iwlwifi
Kernel modules: iwlwifi
所以,找到对应的源码是:drivers/net/wireless/iwlwifi
许多教科书中都告诉说:当接受数据块的时候,是在驱动中分配了skb_buffer结构体,发现这个函数是:iwl_mvm_rx_rx_mpdu使用perf抓这个函数调用栈,是怎么样一步步来到iwl_mvm_rx_rx_mpdu呢?
iwl_pcie_irq_handler
---->iwl_mvm_rx
------->iwl_mvm_rx_rx_mpdu
在 iwl_mvm_rx_rx_mpdu 中会调用调用 alloc_skb 去分配一个 sk_buff 来整真正的数据。
如果从iwl_mvm_rx_rx_mpdu处层层向上去解析,你就真的能看到这个数据包是怎么一步步解析出来的,真的很爽,不同于文件系统,这里的内存是驱动分配出来的,并且是从slab中调用kmem_cache_alloc_node分配出来的,也就是说,kmem_cache_alloc_node中进行的内存的分配,谁告诉我不能在中断里进行内存分配的来着?????
再看__alloc_skb中的代码,里面有对其中重要数据结构初始化的代码,太重要了,建议先把那本大红书中关于sk_buff结构体看看。
------------------------
可以先说下对网络的几个疑问,首先,存储中的IO是通过page关联在一起的,那么网络中的IO是通过什么呢?也就是说我随便拿到一个包,怎么知道这个包应该传给哪个进程?这里我感觉应该是TCP/IP协议中的传输层的事情,想到了端口的概念,上学时,端口的意思不就是服务吗?其实对应的就是个进程。理理,这个包经过层层的解析,解析到端口的时候,我们就知道了这个包应该给哪个进程了,怎么通知这个进程?我才这里可能是用到了那种阻塞读/堵塞写等。
还是要看看这个信息传递机制。
一次刨根问底的socket收包过程:
http://blog.csdn.net/bluecloudmatrix/article/details/43501887
ieee80211_queue_work 基本驱动的部分就处理完了吧?