网卡生命周期
计算机启动时,初始化网卡驱动的流程
初始化程序入口,主要是调用了iwl_pci_register_driver()来注册驱动
位于iwl-drv.c
static int __init iwl_drv_init(void) {
int i, err;
// ... ...
err = iwl_pci_register_driver();
// ... ...
return 0;
}
module_init(iwl_drv_init);
(1)这里描述了一个PCI驱动的格式iwl_pci_driver
位于drv.c
static struct pci_driver iwl_pci_driver = {
.name = DRV_NAME,
.id_table = iwl_hw_card_ids,
.probe = iwl_pci_probe,
.remove = iwl_pci_remove,
.driver.pm = IWL_PM_OPS,
};
(2)注册一个 PCI 驱动到 Linux 内核的 PCI 子系统中
位于drv.c
int __must_check iwl_pci_register_driver(void)
{
int ret;
ret = pci_register_driver(&iwl_pci_driver);
// ... ...
return ret;
}
(3)具体的注册驱动
位于pci-driver.c
int __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name) {
/* initialize common driver fields */
drv->driver.name = drv->name;
drv->driver.bus = &pci_bus_type;
drv->driver.owner = owner;
drv->driver.mod_name = mod_name;
drv->driver.groups = drv->groups;
drv->driver.dev_groups = drv->dev_groups;
spin_lock_init(&drv->dynids.lock);
INIT_LIST_HEAD(&drv->dynids.list);
/* register with core */
return driver_register(&drv->driver);
}
EXPORT_SYMBOL(__pci_register_driver);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下