[20211014.B64驱动培训]linux内核启动+驱动初始化+网卡初始化

本文详细阐述了从ROM加载初始化程序到操作系统内核启动的过程,包括实模式到保护模式的转换、内核初始化函数的调用,以及用户态进程的启动。特别地,重点介绍了网卡初始化的步骤,如分配子slotid、获取MAC地址、初始化tagMessage结构体等,并解析了PCI设备扫描和驱动加载机制。最后,提到了获取UUID、设置桥MAC和磁盘加密写入的环节。
摘要由CSDN通过智能技术生成
  • ROM(Read Only Memory只读存储器),里面固化了初始化程序(可以理解成BIOS),帮我们检查硬件是否完好等。
  • 然后从启动盘启动(这些代码由Grub2放置的),包括boot.img,实模式切换到保护模式,kernel.img等,最后kernel.img会启动我们的操作系统内核
  • 内核启动start_kernel(),进行进程管理初始化INIT_TASK(init_task),中断初始化trap_init(),内存管理初始化mm_init(),调度模块初始化sched_init(),虚拟文件系统初始化init_rootfs(),最后调用的是rest_init().
  • rest_init()中启动了用户态祖先1号进程kernel_init(SCM),内核态总管2号进程kthreadd,
  • kernel_init结束后会使用initcalls机制来动态加载已经注册好了的对应产品的驱动初始化函数(注册的代码位置:对应产品的init.c,stDrvInitBeforeOsInit,stDrvFwd等阶段,_comware_initcall)。
  • 网卡初始化主要的做的工作:分配subslotid并与将槽号排序,获取mac地址,初始化tagMessage结构体。
    函数调用流程:
    vsr2000_init_systeminit_post_pre()->
    DRV_Init_SystemInit_Pre()->
    DRV_ProductInit()->
    DRV_PCI_Init()->
    DRV_PCI_Slot_Init()[这个函数中会确定PCI扫描到的所有网卡的型号是否支持DRV_PCI_Device_Match(),如果支持,会在DRV_SetDevLinkAndPortInfo()中根据网卡型号来给对应的网卡各个回掉函数赋值,例如E1000_CardInit()].E1000_CardInit()啥时候调的?->
    DRV_PCI_Slot_Map()映射槽号并填充槽号->
    最后获取uuid,设置桥mac并校验,加密写磁盘。
  • 重点结构体:tagMessage,DRV_CARD_INFO_S,DRV_CARD_PORT_INFO_S.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值