首页系统综合问题如何在自制操作系统写网卡驱动程序(1)

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

时间2022-11-26 13:01:42发布分享专员分类系统综合问题浏览244

今天小编给各位分享网卡驱动的知识,文中也会对其通过如何在自制操作系统写网卡驱动程序(1)和怎么装网卡驱动,我安装系统后网卡没驱动等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!

内容导航:

  • 如何在自制操作系统写网卡驱动程序(1)
  • 怎么装网卡驱动,我安装系统后网卡没驱动
  • 如何安装win10系统无线网卡驱动
  • 网卡驱动
  • 一、如何在自制操作系统写网卡驱动程序(1)

    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控制器,然后用中断机制与网卡进行数据通信的思路是正确的。

    所以,后面的步骤是:

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

    一、怎么装网卡驱动,我安装系统后网卡没驱动

    电脑安装网卡驱动的具体操作方法为:

    1、在电脑上下载驱动人生,下载完成后,点击打开驱动人生应用程序。

    2、打开之后,应用程序会自动扫描驱动。

    3、扫描完成后,找到网卡驱动选项。

    4、之后点击右侧的开始升级即可安装网卡驱动。

    二、如何安装win10系统无线网卡驱动

    win10系统无线网卡驱动可通过以下步骤安装:
    一、所需材料:
    win10系统电脑,无线网卡;
    二、在win10系统使用的两种情况:
    1、系统可识别
    大部分Win10系统集成了许多网卡芯片的驱动,故一般情况下,无线网卡插入电脑后即可直接使用,无需手动安装驱动。
    2、系统不可识别
    少部分无线网卡在插入电脑后,win10系统无法识别,这时则需手动安装程序。
    三、具体操作步骤如下:
    (1)win10系统可识别的操作步骤:
    1、将无线网卡插入电脑后,win10系统会发现硬件并自动安装驱动,等系统自动安装完驱动后,右击桌面上的“计算机”,选择“管理”;

    2、再点击“设备管理器”,如看到无线网卡的信息,则说明无线网卡已被正常识别;

    3、左击桌面菜单的无线网络连接图标,选择对应无线路由器账户并点击“连接”;

    4、输入无线信号密码后点击下一步,即可联网。

    (2)win10系统不可识别的操作步骤:
    1、在网站下载网卡对应Win10系统的驱动;

    2、在“设备管理器”黄色标识的设备上,右击选择“更新驱动程序软件”;

    3、选择“浏览计算机以查找驱动程序软件”,点击“浏览”,找到驱动程序所在的文件夹后,点击“确定”,再点击“下一步”;

    4、如有以下提示,则选择“始终安装此驱动程序软件”,此时驱动已安装成功,即可联网。

    三、网卡驱动

    安装网卡驱动
    1、检查网络线路连接和网卡是否良好。
    2、安装网卡驱动。右击“我的电脑”----“属性”---“硬件”----“设备管理器”—展开“网络适配器”—看有没有黄色的问号?,有,说明缺网卡驱动,有“!”号,说明该驱动不能正常使用,将其卸载。(注意要记下,这是你使用的网卡型号)。
    3、右击展开“网络适配器”下的网卡,从拉出的菜单中选“更新驱动程序”—打开“欢迎使用硬件更新向导”对话框—选“自动安装软件(推荐)--下一步—系统会自动安装—完成。
    4、不能自动安装的,用下述办法安装。
    (1)将网卡光盘放入光驱,右击“我的电脑”----“属性”---“硬件”----“设备管理器”,展开“网络适配器”,右击网卡—选“更新驱动程序”,打开“硬件更新向导”,选“是,仅这一次”---“下一步”---“自动安装软件”--“下一步”,系统即自动搜索并安装光盘中的声卡驱动程序,如果该光盘没有适合你用的声卡驱动,再换一张试试,直到完成。
    (2)如果没有适合的光盘,到驱动之家、中关村在线、华军等网站下载驱动软件,下载驱动软件要注意:一是品牌型号要对,二是在什么系统上便用,三是要看该驱动软件公布的时间,最新的未必适合使用,可多下载几个,挑着使。
    (3)下载的驱动软件一般有自动安装功能,打开即自动安装。不能自动安装的,解压后备用,要记下该软件在磁盘中的具体路径,如D:\ ……\……。右击“我的电脑”----“属性”---“硬件”----“设备管理器”,展开“网络适配器”右击网卡,选“更新驱动程序”,打开“硬件更新向导”,去掉“搜索可移动媒体”前的勾,勾选“从列表或指定位置安装”---“下一步”,勾选“在搜索中包括这个位置”,在下拉开列表框中填写要使用的声卡驱动文件夹的路径(D:\……\……---“下一步”,系统即自动搜索并安装你指定位置中的网卡驱动程序。

    关于网卡驱动的问题,通过《如何安装win10系统无线网卡驱动》、《网卡驱动》等文章的解答希望已经帮助到您了!如您想了解更多关于网卡驱动的相关信息,请到本站进行查找!

    爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

    网卡驱动
    双11游戏本怎么选?这4款性能强,颜值高,闭眼入手即可 【手慢无】机会难得!华硕明星路由器 RT-AX86U特价1069元