在《linux0.99网络模块-网络模块初始化》中我们分析了网络模块的初始化过程,其中关于设备初始化我们单独拿到这里来分析。
对于linux0.99内核来说,它初始化了两个设备-loopback和wd8003.
1.数据结构
net/tcp/dev.h
47 #define DEV_NUMBUFFS 3
48 #define MAX_ADDR_LEN 6
49 #define MAX_HEADER 14
50 #define MAX_ROUTE 16
48 #define MAX_ADDR_LEN 6
49 #define MAX_HEADER 14
50 #define MAX_ROUTE 16
52 struct device
53 {
54 char *name; //设备名
55 unsigned long rmem_end; //接收内存结束地址
56 unsigned long rmem_start; //接收内存起始地址
57 unsigned long mem_end; //设备发送内存结束地址
58 unsigned long mem_start; //设备发送 内存起始地址
59 unsigned short base_addr; //寄存器基地址(见tcp/wereg.h:128)
60 unsigned char irq; //中断
61 unsigned char start:1, // 启动标志
62 tbusy:1, //设备忙
63 loopback:1, //回环设备标志
64 interrupt:1, //是否有中断
65 up:1; // 发送标志
66 struct device *next; //连接下一个设备
67 int (*init)(struct device *dev); //初始化函数指针
68 unsigned long trans_start; //传输开始
69 struct sk_buff *buffs[DEV_NUMBUFFS]; //缓冲区
70 struct sk_buff *backlog; /* no longer used. */ //积压队列
71 int (*open)(struct device *dev); //打开设备函数指针
72 int (*stop)(struct device *dev); //停止设备函数指针
73 int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev); //向硬件发送数据
74 int (*hard_header) (unsigned char *buff, struct device *dev, / / 生成首部
75 unsigned short type, unsigned long daddr,
76 unsigned lo
53 {
54 char *name; //设备名
55 unsigned long rmem_end; //接收内存结束地址
56 unsigned long rmem_start; //接收内存起始地址
57 unsigned long mem_end; //设备发送内存结束地址
58 unsigned long mem_start; //设备发送 内存起始地址
59 unsigned short base_addr; //寄存器基地址(见tcp/wereg.h:128)
60 unsigned char irq; //中断
61 unsigned char start:1, // 启动标志
62 tbusy:1, //设备忙
63 loopback:1, //回环设备标志
64 interrupt:1, //是否有中断
65 up:1; // 发送标志
66 struct device *next; //连接下一个设备
67 int (*init)(struct device *dev); //初始化函数指针
68 unsigned long trans_start; //传输开始
69 struct sk_buff *buffs[DEV_NUMBUFFS]; //缓冲区
70 struct sk_buff *backlog; /* no longer used. */ //积压队列
71 int (*open)(struct device *dev); //打开设备函数指针
72 int (*stop)(struct device *dev); //停止设备函数指针
73 int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev); //向硬件发送数据
74 int (*hard_header) (unsigned char *buff, struct device *dev, / / 生成首部
75 unsigned short type, unsigned long daddr,
76 unsigned lo