百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

如何在自制操作系统写网卡驱动程序(1)

ninehua 2024-11-18 15:22 9 浏览

30天自制操作系统的解读文章已经更新到day23天了,基本的操作系统雏形已经完成了。不过我把这本书翻完后,发现这个操作系统的上限还是有点低。

怎么说这个操作系统的上限有点低呢?

这个操作系统包含了内存管理器,哨兵模式的超时器控制器,多任务控制器,多图层控制器,API接口库的设计等操作系统内核的重要模块,这份代码和linux系统的内核1.1版本相比的话,其实思路大体类似,毕竟使用的硬件是一样的。

但是这个操作系统离实际应用还有些距离。

为什么说它离实际应用还有些距离?

因为在这个操作系统之上开发的应用还是太少了,特别是缺少串口驱动,网卡驱动等与其他涉别通信的应用。

比如在day24,day25,day26,day27,day28,day29,day30等,也会开发一些较为实用的APP。

比如小蜜蜂游戏,图片查看器,文档浏览器,压缩软件等。

但没有了通信用的APP,它只能单机运行,对于一个简单的操作系统来说,如果只能单机运行,显然生命力就会很弱。

通信模块实现分析

所以,我就想如何给这个操作系统加上网络模块。

那么怎么给操作系统添加网络模块呢?

其实就是把网卡管理起来,也即是说cpu要控制网卡收发信息。

这跟cpu与键盘的交互,cpu与显示屏的交互其实有点类似,但是细节不同。

我们通过执行0x10号中断函数,来设置显示屏。

跟键盘交互时,先通过I/O来设置键盘控制器,然后当键盘有键按下时,就可以通过中断的方式通知CPU。

可以看到,CPU与外部设备打交道时,总是通过中断进行的。

特别是CPU控制键盘的过程,是比较常用的过程。

一般的外部设备都是让CPU先通过 I/O口来对自己的控制器进行设置,然后再通过中断把自己的信息传送给CPU的。

网卡也是外部设备,网卡也是先让CPU通过I/O来对自己的控制器进设置,然后再通过中断把自己的信息传送给CPU。

其实CPU就是一个计算器,它需要为很多外部设备提供计算,调度的功能才够完成功能丰富的操作系统。

外部设备的种类是非常丰富的,如果不同厂商的外部设备都需要一个自己特定的协议,才能跟CPU通信,那么对用户来说,一旦使用了这个外部设备,就不能更换其他厂商的产品了,这就非常不方便。

所以,有必要制定一个统一的标准Peripheral Component Interconnect,PCI,翻译:外部设备相互连接。通过硬件厂商可以让自己的硬件,比如网卡,声卡,显卡遵守这个PCI标准,从而降低自己的硬件设备被接受的成本。

这就造成了CPU与网卡之间,有个PCI控制器。CPU通过I/O口设置PCI控制器,PCI控制器再控制网卡即可。

所以,要在这个操作系统上控制网卡,实现网络通信,其实就是通过I/O口来设置PCI控制器,然后CPU就可以和网卡进行数据交换了,网卡收到数据会给CPU发送中断信号,只要我们编写合适的中断函数来处理网卡发送的数据,就像处理键盘发送过来的数据一样,这个操作系统就实现了联网的功能了。

不过,虽然道理上说的通,但是要具体实践起来,我们还需要一些参考。

那么linux的内核是开源的,可以去查看一下,顺便验证一下上述思路。


参考linux1.1内核

找到一份有详细注释的linux1.1内核代码:https://gitee.com/ydong08/linuxkernel1.1.git



上图linux1.1的主程序,可以看到这个主程序在一大堆初始化完成之后,就是一个永久运行的for循环了。

其实任务操作系统启动完之后,本身的程序都是一个永久的for循环。


我在这份代码中,并没有找到控制网卡的部分,可能linux1.1的内核并没有对网卡直接支持,我再找找。

不过这份代码的块设备相关的头文件中,找到了关于I/O的读写的语句:

可以看到,这里有用汇编写的port_read,port_wirte函数,这两个函数是用汇编写的,跟咱们在30天自制操作系统中解读的hari操作系统中的汇编是一样的。都是直接向I/O端口写控制字,然后从I/O端口拿数据。

这说明块设备作为外部设备与CPU交互的时候,也是先空过I/O端口来初始化的。



到这里,我们看到,在linux1.1中,硬盘作为外部设备,与CPU的通信,也是通过中断机制的。

那么继续找,就找到了硬盘的初始化函数:


这里,设置了硬盘的中断号,并且用I/O端口操作进行了一定的设置。这里的outb_p的实现也是汇编:


总的来说,通过查看linux1.1的内核代码,与咱们 30天自制操作系统中的系统内核代码相比,

在CPU 控制 外部设备的思路上,都是通过I/O端口 以及中断机制的。

所以,CPU控制遵守PCI协议的设备,应该也是通过I/O端口以及中断机制的。

既然1.1版本的内核里没有网络模块,可能这个版本太低了,我们直接看当前ubuntu20的5.13版本的内核。

这个内核是最新的版本,因为操作系统是现成的,所以这份代码就不用从网上下载了。

直接在ubuntu上运行如下命令:


可以看到内核版本是5.13.0-40的,所以内核代码所在的文件夹就是:

/usr/src/linux-hwe-5.13-headers-5.13.0-40


参考ubntu的linux5.13内核

打开这份内核代码,就看到一个名字为net 的文件夹,这说明这份内核代码里,是一定包含有网卡的基本驱动的。所以也必定有通过I/O端口来设置PCI控制器。

用pci作用搜索关键字,搜索到这设置pci的基本汇编语句:


这说明这份代码里,肯定对我们有用的。接着找,发现__raw_readb其实直接操作的指针,直接访问的内存了,并不是I/O操作。说明这个函数是在已经把网卡设备的地址通过I/O端口映射到内存地址之后,才运行的。 此时,访问内存地址,就相当于访问PCI所连接的网卡内的地址。


我们再看看最底层的用汇编写的对I/O端口的调用程序,我们直接搜索I/0操作的汇编指令,然后再找这些指令所在的函数有没有被PCI控制器的初始化函数调用。

这个汇编的写法,与之前的汇编写法有所不同,注意这些指令insbl,inswl,extbl,extwl,分别是往I/O上输入一个字节,输入一个词,输出一个字节,输出一个词,这是基本的I/O端口输入输出语句。

然后去搜索PCI控制器初始化函数,因为pci设备众多,所以,应该能搜索带很多pci设备


比如这张图上,我们大概搜索到了drivesr/net/wireless下的 pci_init.o模块,显然这是无线网卡的驱动程序,在链接的时候,使用了pci_init.o模块。

然后c4100.h文件中也有pci_init,可能ce4100也是某种pci设备。

然后最后一个pci_x86.h中的x86_default_pci_init函数,


不过这份代码似乎并不完全,也可能用了设计模式,所以很多逻辑不太好整理。

还是直接去官网下载一份源代码看:https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz

这份源码跟5.13版本思路是一致的,可以认为是5.13版本的完整版,基本上在5.13版本里有的代码它都有,5.13版本没有的,它也有。

这份源码中可以搜索到很多个init_pci函数,说明是不同设备,不同场景对pci设备的初始化。

在pci_enable_device中,又调用了pci_enable_device_flags

而图中的pci_read_config_worl最终调用的是汇编I/O端口写操作,这似乎印证了“通过I/O端口配置PCI控制器”的思路。

包括do_pci_enable_device函数里,展开之后

发现里面的函数,凡是涉及到read,write的,最后都可以查到是汇编实现的。

那么当网卡收到数据时,会不会发送中断信号呢?我们也和容易搜索到了e1000网卡驱动的中断开启和关闭,如下图:

其中ew32函数是经过内联汇编实现的。

通过以上对linux内核1.1版本,5.13版本,5.6版本的源码查找,大体上基本印证了用I/O配置PCI控制器,然后用中断机制与网卡进行数据通信的思路是正确的。

所以,后面的步骤是:

  1. 整理出5.6版本e1000网卡的基本结构。
  2. 移植到30天自制操作系统教程上的操作系统harios上。

相关推荐

DOTA7.22版本更新了什么 7.22版本更新内容一览

[海峡网]《DOTA2》7.22版本近日上线了,7.22版本后DOTA2迎来了全面A杖时代,而某些英雄的A杖效果过于IMBA,导致冰娃很快发布了新补丁7.22b,一起来看看吧。7.22b削弱了当前一些...

网易电竞平台发布首款游戏DOTA 六大革新机制首曝

网易首款专业电竞平台今日对外发布,并宣告将于6月20日正式开启首轮精英测试,首款平台游戏则是大名鼎鼎的DOTA。网易电竞平台作为国内最专业的新一代电子竞技游戏平台,致力于为电子竞技玩家提供更稳定、更快...

水友吐槽最失望的全明星 冷板凳的选手们

本次全明星采取主持人随机现场观众,报喜爱的选手名字进行10V10比赛,然而很多人气选手均没有上场的机会,国外水友粉粉吐槽应该改善投票方式Handa711:V社的套路需要改变一下了。这次全明星太逊。Sl...

Dota2:NB假赛事件再起风波,中单AQ直接自爆,茶队被牵连其中

就在前一天,一则消息的传出,让整个Dota2圈子甚至是电竞圈都感到意外:TI4冠军、TI7亚军得主Newbee战队,涉嫌打假赛从中获利,被CDA联盟以及IMBA传媒共同出面,将其永久封禁,禁止参加CD...

DOTA的世界,LOL玩家你不懂! dota?

◆IntroductionDOTA玩家与LOL玩家究竟有什么不同,看完你就知道了,不要有任何优越感哦,都是玩游戏的,没必要!....暗牧对蛮王说:给自己5秒的人永远不是真男人。龙骑对龙姬说:你身上流的...

Dota2:肉核体系已完全没落?刚被、混沌、幽鬼等英雄胜率垫底

哈喽大家好,这里是蜻蜓队长Zwj。想必大家都能感觉得到,越是大赛职业战队们就越偏爱刚被、潮汐、斧王、幽鬼这种进可攻退可守的肉核型英雄;而在7.30更新后,这些英雄却几乎绝迹了。下面,就让队长带大家一起...

探访上海IMBA电竞体验中心 电子竞技高手荣誉相册引人注目

来源:环球网2021年5月10日,上海,探访世界级电子竞技品牌赛事之一“SL-iS7CS:GO群星联赛”举办地IMBA电竞体验中心,整排的电竞职业高手荣誉相册和手模吸引眼球。作为普陀区首个设在商业...

dota2IMBA Tinker修补匠进阶攻略 dota修补匠外号

他曾经是某个版本第一无解后期,刷新BKB骑脸的感觉,酸爽。但是随后的版本更新在刷新下面加了一行小字,不可以刷新BKB,tinker修补匠就再次跌下神坛。也许你是tinker的忠实粉丝,也许你怀念那个B...

《DOTA2》新版本6.83c降临:寒冬飞龙登场、斧王遭削弱

新年将至,《DOTA2》也迎来了全新版本6.83c,本次的新版本也是亮点多多,除了加入万众期待的英雄“寒冬飞龙”之外,冰女MM的全新至宝也一并公开,相信届时又有大批土豪会为自己的冰女换上漂亮的装扮。除...

dota2imba虚空假面攻略 dota2虚空假面出什么装备

本文由17173DOTA2特约作者[41酱]原创提供,未经许可禁止转载。节奏快,人头多,就是干是他的标签,比起有着冗长无聊的farm时间的普通模式,来一场imba绝对可以战个痛快。200人头?那只是起...

OMG模式中,你拿到这些技能就赢了一半

?技能征召(OMG)是什么?技能征召是DOTA2中普通匹配的一种模式,与全英雄选择、加速模式、随机征召并列,在点击“开始DOTA”后选择普通匹配可以勾选。该模式偏娱乐,可以自由组合搭配自己的技能,刚接...

DOTA2编辑器开放 米米亚将制作DOTA2版IMBA

今天(8月7日)上午,IceFrog在微博发布消息,称V社官方发布了DOTA2自定义游戏制作工具——Dota2WorkshopToolsAlpha供广大开发者使用[本站相关报道],这可能是一个在...

以现在的眼光来看,dota中最离谱的英雄是谁?老玩家:27技能卡尔

哈喽大家好,这里是蜻蜓队长Zwj。大家应该都知道,dota1远古时期中的很多英雄都是很imba的(成长或技能),而在聊起远古时期中最离谱的英雄时队长就想到了手握27个不同技能的召唤师。召唤师/祈求者聊...

Dota2:美女解说公然辱骂Ti冠军队,被教育不知悔改,遭Imba开除

近期国内外的刀圈,最重要的赛事可以说是DPC联赛第二赛季的比赛了,国内的S级联赛方面竞争还是非常激烈的,一度出现了6支战队同为2胜2负的盛况,茶队这边近期状态不错取得了4连胜高举榜首,SAG难求一胜,...

DOTA2采访EG.Cr1t-:无敌斩斩莲花很糟糕!最大的对手就是VG

北京时间11月21日,MDL成都Major媒体日上EG战队EG.Cr1t-接受我们采访。采访中他对于昨天剑圣斩莲花感到非常难受,并且认为VG就是他们本次比赛最大的对手。Q:对于EG在这次Major的...