深入理解Linux网络技术内幕——网络设备初始化
概述
asmlinkage void __init start_kernel(void) { ... parse_early_param();//间接调用parse_args parse_args(...); //处理内核引导程序(boot loader)在引导期间传给内核的参数, ... init_IRQ(); //初始化硬件中断 tick_init(); init_timers(); //定时器用于支持后续初始化工作的运行。 hrtimers_init(); softirq_init(); //初始化软件中断 ... rest_init(); //这里会通过kernel_thread函数调用内核线程init(kernel_init). }
static init __ref kernel_init(void *unused) { kernel_init_freeable(); //Linux-3.12 在这里调用do_basic_setup free_initmem(); //用于释放已经不再需要的内存。 ..... run_init_process(execute_command) ... }
static void __init do_basic_setup(void) { cpuset_init_smp(); usermodehelper_init(); shmem_init(); driver_init(); init_irq_proc(); do_ctors(); usermodehelper_enable(); do_initcalls(); //初始化内核子系统和内建的设备驱动 random_int_secret_init(); }
设备的注册和初始化
设备与内核之间的交互
int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id) void free_irq(unsigned int irq, void *dev_id)
static netdev_tx_t el3_start_xmit(struct sk_buff *skb, struct net_device *dev) { …… netif_stop_queue (dev); …… dev->trans_start = jiffies; if (inw(ioaddr + TX_FREE) > 1536) netif_start_queue(dev); else /* Interrupt us when the FIFO has room for max-sized packet. */ outw(SetTxThreshold + 1536, ioaddr + EL3_CMD); …… }
初始化选项
设备处理层的初始化
static int __init net_dev_init(void) subsys_initcall(net_dev_init);
用户空间辅助程序
- /sbin/modprobe 在内核需要加载某个模块时调用,判断内核传递的模块是不是/etc/modprobe.conf文件中定义的别名
- /sbin/hotplug 在内核检测到一个新设备插入或拔出系统时调用,它的任务是根据设备标识加载正确的驱动
- 以模块方式加载
kmod模块加载器允许内核组件通过调用request_module请求加载某个模块
举个例子;如果系统管理员使用ifconfig配置某个网卡,但这个网卡驱动还没有加载,如eth0,内核就会给/sbin/modprobe发送一个请求,让它加载名称为
eth0的模块。如果/etc/modprobe.conf中包含“alias eth0 xxx”的字符,/sbin/modprobe就会尝试加载xxx.ko模块。
module_param 宏定义在引入sysfs后可以通过文件来访问得到模块参数
模块选项有三项 , 第一项参数名称,第二项参数类型,第三项表示参数作为文件在sys文件系统中所有的权限。
每个模块都会在sys/modules下生成对应的目录,通过目录下的文件可以获取模块参数。
- pnp热插拔
hotplug允许内核检测热插拔设备的插入和拔出并通知用户进程(/sbin/hotplug),用户进程根据这些通知来加载相应的驱动
在编译内核时,会在kernel目录下生成modules.pcimap和modules.usbmap两个文件,这两个文件分别包含了内核所支持设备的pci id和usb id,文件中还包
含于每个设备的id相对应的内核模块名称,当用户进程收到内核关于pnp的通知后,会使用这个文件来查找正确的设备驱动
虚拟设备
/proc调整
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。