当前位置:首页 > 创业 > 正文内容

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

wwwnzt88com2年前 (2022-11-11)创业61

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

初始化的过程中,并没有PCI的初始化

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

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

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

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

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

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

port_read在中断函数中调用

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

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

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

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

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

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

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

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

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

查看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函数,

配置PCI控制器的端口号:一个地址,一个数据

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

还是直接去官网下载一份源代码看: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网卡驱动的中断开启和关闭,如下图:

e1000网卡的中断关闭与开启

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

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

所以,后面的步骤是:

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

扫描二维码推送至手机访问。

版权声明:本文由小草网发布,如需转载请注明出处。

本文链接:http://www.nzt88.com/70817.html

分享给朋友:

“网卡驱动是什么(如何在自制操作系统写网卡驱动程序(1))_2” 的相关文章

震悚的拼音(孤孀的拼音)

震悚的拼音(孤孀的拼音)

震悚的拼音拼音: zhnsng (以Zhen拼音开始的语言;以song拼音开始的语言) ) ) ) ) ) ) ) ) ) ) )(() ) ) ) ) ) ) ) )。结构:震(上下结构)悚悚(左右结构) ) ) ) ) ) )。说明:很抱歉受到打击。《三国志魏志高贵乡公髦传》 :“臣等有位,不...

萸的笔顺(萸的笔顺及拼音)

萸的笔顺笔画顺序点的笔顺笔顺如下。“萸”字拼音怎么读?笔顺:横、纵、纵、惯、纵、横、横折、横、横、惯、压(1)落叶小乔木,果实长椭圆形核果,红色,酸味,入药。 俗称“山茱萸”)落叶乔木,果实红色,可入药。 俗称“吴茱萸”)落叶乔木,枝具刺,羽状复叶,果实红色、球形,可入药,可提取芳香油。 俗称“食茱...

壹贰叁肆伍陆柒捌玖拾佰仟万(壹贰叁肆伍陆柒捌玖拾佰仟万亿拼音)

壹贰叁肆伍陆柒捌玖拾佰仟万(壹贰叁肆伍陆柒捌玖拾佰仟万亿拼音)

大写12345678910百千万怎么写写法是壹贰叁肆伍陆柒挖玖拾佑仟万。扩展数据:大写规则:1、中文大写金额至"元"时,"元"后可写"整" (或"正" )字,"角"后可不写"整" )或"正" )字。 大写数字有“分”,在“分”后不写“整”(或“正”)字。2、必须在中文大写金额数字前注明“人民币”字样...

耶和华你是我的神歌谱(耶和华你是我的神歌谱钢琴)

耶和华你是我的神歌谱(耶和华你是我的神歌谱钢琴)

耶鲧歌曲赞美基督教歌曲前100名01求02主我的力量03我愿向04耶和华所定的日子05磐石耶稣基督投降06万物的结局近了07除你以外08神的众子09从现在起到主殿歌10进入你的同在11我以祈祷来到你面前12献上自己13我们的上帝本来就是14个大的同一个地球15云彩上的太阳16歌颂一切的赞美17这里有...

摇撼的近义词(摇撼的近义词是不是震撼)

摇撼的近义词。同义词:震动动摇_语言解释...

宣城太守知不知(宣城太守知不知)

宣城太守知不知(宣城太守知不知)

江州司马青衫湿,宣城太守知不知什么意思原文来自哪里,这里不说。 楼上也出现了原文的回答。 “江州司马青衬衫湿了,宣城县不知道。 ”这首《诗》是网友恶搞的杰作,类似的诗句比比皆是。 只是笑了笑,没必要深究。 例如,曾哥哥离婚过,前妻李宇春。商女不知道亡国恨隔江唱双棍棒。万事朝离别圆圆,我就变成天马流星...

兴致盎然的意思(兴致盎然的意思并造句)

兴致盎然的意思(兴致盎然的意思并造句)

兴致盎然是什么意思?指充满气氛、兴趣等的样子。 兴致勃勃的样子兴致盎然/不甘示弱/一览无遗/坎坷不平各是什么意思?形容兴趣盎然。不服输【解释】:表示、表现。 懊悔地表示自己不如别人。 表示决胜负,比较高低。一眼就能看到; 遗:遗存。 一眼就能看到所有的景色。 表示建筑物结构没有曲折,诗文内容平淡,回...

物换星移的意思(物换星移岁月匆匆意思)

.物换星移什么意思(变东西)变风景; 星星移动:星星的移动。 景色变了,星星的位置也变了。 比喻时间的变化。 【来源】:唐王勃《秋日登洪府滕王阁饯别序》 :“闲云潭影日悠悠,物物交换星数度秋移。 ”光阴荏苒,物换星移是什么意思?荏苒:小时一点一点地流逝着。 指时间渐渐过去了。 来源明罗贯中:\\《三...

五事七计(孙子兵法五事七计)

孙子兵法中的五事七计中的五事是指什么?“五事”是指直接影响战争胜负的五个基本因素。 一曰、二曰天、三曰地、四曰将、五曰法。 走在路上的人,让人民从上面同意。 所以,可以与之死,可以与之生,不可不谨慎; 天、阴阳、寒暑、时态也; 地、高、远近、易危、宽窄、死生也; 将、智、信、仁、勇、严也; 法律家、...

锁骨纹身英文字母图片(锁骨纹身女英文字母图片有意义)

锁骨英文字母纹身,加中文翻译女孩的纹身9个字)通常在手臂内侧,后脑勺(发际线下),但你爱你的爱人。 锁骨下胸(以乳晕部为中心,线上三分之二的位置推荐最佳like you.[ su ] g [解剖] claviclecollarbone[解剖]Claviculateclavicle急求英文花体纹...

宋祖英几岁

她曾是“民歌天后”,人们称她为“辣妹子”,52岁的她过得咋样?你平时喜欢听什么类型的歌? 我想懂音乐的人都知道,歌曲种类很多,但今天的小系列是关于民谣的,也有民族特色。 这样的歌曲一般唱功高,有一定的民族风情,一定有很多唱民谣的歌手。 说起女民谣歌手,你会想到谁? 个人可能有自己的爱,但每个国家的心...

沈万三故居(老门东沈万三故居)

沈万三故居(老门东沈万三故居)

周庄沈万三故居主要展示了什么内容?在沈万三的声誉和影响下,他给周庄带来的经济繁荣和发展,周庄人看得见。 后代建造了沈万三故居。 沈万三故居位于周庄镇东垞,是后人根据历史资料和历史原貌,在平原基础上精心设计、精心建造的仿古式建筑。 参照故居沈万三致富的各种传说、生意坎坷的历史、一生的传奇经历、沈家生活...

什么叫平邮(什么叫平邮和付件拒签)

什么叫平邮平邮是指邮政中邮寄和包裹业务的总称,也包括普通信件。 平邮是所有邮政配送业务中速度最慢的业务,将在全国7-30日配送。 平邮不像快递一样快递。 邮递员事先把通知书发给你家的信箱或门卫。 用户必须凭通知书和收件人的身份证到最近的邮局领取包裹。 邮件安全送到是邮政的目的。 否则,邮件也就失去意...

颧怎么读(鹳怎么读)

颧的同音字怎么读?颧骨同音字共,读: qun颧字解释,颧字什么意思 怎么读颧骨,读作qun,名词指颧骨,又称“颧骨”、“补骨”,是指位于眼睛外下方,向脸部隆起的部分。 例如颧骨辅助(颧骨和牙床); 颧骨颊(借指脸)这个回答由网友推荐颧这个字怎么读颧 这个字的读音是啥...

前四史分别是(前四史分别是哪四史)

四史 是哪四史?作者是谁 分别是什么朝代的?四史,其实是前四史,分别为《史记》、《汉书》、《后汉书》和《三国志》,属于二十四正史中的前四部,是中国历史学的巨萧。1 .史记汉司马迁2汉书汉班固3后汉书南朝鲜宋范晔4三国志晋陈寿《史记》是中国历史上第一部纪传体通史,全书共一百三十篇,分为本纪、书、表、世...

前程似锦押韵的下一句(祝大家前程似锦押韵的下一句)

前程似锦押韵的下一句(祝大家前程似锦押韵的下一句)

“祝你前程似锦绣”的下一句是什么?“祝你前途无量”的下一句是宏图开拓未来。旭日东升,万里无忧。前途如锦,表示前途如锦,多用于祝福。锦:色彩鲜艳,面料精美的绸缎。 形容前途美好,形容前途非常美好。元贾仲名第四成:“想到我们美好的前途,关系很好。 ”【例】女儿真的开始了属于自己的人生。 在她面前~,谁也...