diff --git "a/source/_posts/OS\351\241\271\347\233\256-igb\351\251\261\345\212\250\345\274\200\345\217\221\346\200\273\347\273\223.md" "b/source/_posts/OS\351\241\271\347\233\256-igb\351\251\261\345\212\250\345\274\200\345\217\221\346\200\273\347\273\223.md" new file mode 100644 index 0000000000..b49b415530 --- /dev/null +++ "b/source/_posts/OS\351\241\271\347\233\256-igb\351\251\261\345\212\250\345\274\200\345\217\221\346\200\273\347\273\223.md" @@ -0,0 +1,43 @@ +--- +title: OS项目unikernel igb驱动开发总结 +date: 2024-12-20 20:25:37 +tags: + - author: + - repo: +--- + +# 一、验证说明 +在这个仓库中 https://github.com/ghostdragonzero/arceos_test 我直接修改了ixgbe的pid vid匹配参数来匹配igb网卡,并且通过修改axdriver到引用我自己的仓库。以此来实现替换ixgbe的目的。 +拉取后可以直接执行`make A=examples/httpserver PLATFORM=aarch64-qemu-virt LOG=debug SMP=2 NET=y FEATURES=driver-ixgbe NET_DEV=user run` + +这个仓库 https://github.com/ghostdragonzero/igb-driver/tree/my_driver +是我在share_test框架下实现的驱动完成了 link_up rx_init tx_init 初始化流程也是我在这个框架下实现然后搬到ixgbe框架里在arceos内运行没问题的 +但是这里实现的memry是使用的arceos中hal的实现 ring结构是直接使用的ixgbe的ring + + + +# 二、学习的感受 +这是我第一次成功完成这个训练营,之前参加了很多次都在各种阶段就没有坚持下去,这次能成功完成是相当开心的。 + +并且这次的驱动开发给我感受最深的就是,**硬件(虽然是模拟的外设)的逻辑是很固定的出现了预期之外的行为,99%是自己写的存在错误** +记录我认为在我开发的时候我查看时间最久的问题: +1. 注意有效数据位 +在操作MDIC寄存器的时候,我使用的先读取在写入的方法,但是我读取的是u32,它的数据位是低16位。我把高位的标志位也保留到了下次要写的数据里面。导致一直出错,后面是使用断点调试的方法才对比出来不同再进行了改正。 +2. 注意不要定义类似的常量 +还是在操作MCIC寄存器的时候 在判断标志位时候我错误的使用了**MDIC_READ**作为**READY**导致我一直读取成功但是写失败,这我反复的追查了好久,但是这也是我自己的不细心。 +3. 注意set_flag和set_reg的区别 +这是在最后的检查的时候发现的,因为是在ixgbe的基础上使用的所以一些寄存器不仅仅是地址变了 一些功能也分配到了不同的寄存器,而导致有些适用set_reg有些则应该是set_flag +这一点要尤其注意因为很多时候就是一些标志位的不同就会有不一样的地方 + + +# 三、学习的总结 +这次学习给我最大的收获就是真的从datasheet来一步步的开发一个驱动的经验,并且在开发的过程中一步一步的调试,通过设置断点来看寄存器的值。这个是我最喜欢的一个功能,因为我在平时驱动的开发时候最难受的就是修改需要编译版本才能做验证,找不到一个快速验证的办法导致问题进展缓慢。如果能有多一点的可以这样来验证的控制就好了。 + +再来说一下,这次学习中我的不足,实际上我算是让这个网卡能用起来了 但是我还是不理解他更上层的东西,不清楚他的ring是怎样收发信息的,不明白他这个网络是怎么跑通的,群友说的报文又是什么。体现在开发过程中就是,出现问题我只能再次去查看linux的igb驱动都配置了哪些寄存器,ixgbe有什么流程但是对于这些流程的意义我不明白,只是datasheet上写了,或者看到其他驱动做了于是我也就去做试试看。 + +感觉还需要继续学习一下网络相关的基本概念才能真的完成这个网卡驱动 + +# 四、关于ixgbe与igb的思考 +因为我是直接鸠占鹊巢的方式在arceos里成功用起来igb,所以我认为既然能够这样用起来 是不是侧面说明对于ixgb_hal和ixgbe_nic的抽象就是一个能够在igb上(或者同一E100系列的网卡)复用的结构。后续是不是可以直接通过条件编译或者直接在网卡驱动的匹配处来区分出来,这样可以减少重复的代码结构,并且我认为上层本来也不关心下层实际的控制器。 + +