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

在30天自制操作系统上编写网卡驱动:遇到的主要困难总结

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

在30天自制的操作系统上编写网卡驱动,对我来说,是件比较有挑战的事情。

资料难找,没有在30天自制操作系统上的驱动资料,现有的资料都是linux系统上的资料,或者windows系统上的资料,而30天自制操作系统本身是一个新的系统,是书上给出的一个操作系统样例,供大家学习的教学用的操作系统,所以,在这个操作系统上,还没对的驱动发开提供接口。比如linux操作系统或者是windows操作系统都对驱动开发做了支持的,其内核已经实现了对网卡的支持,然后驱动开发人员直接调用操作系统提供的函数去控制网卡就行了。

30天自制操作系统本身就没有对网卡的任何支持,更别说开发一些驱动开发的接口出来了。整体来说,比较有挑战。具体做的话,得先在操作系统内部把驱动运行起来,然后再把相关控制网卡的函数开放出来,供大家在此操作系统上开发驱动程序。

本来想看看linux系统的驱动程序是怎么写的,想移植过来,后来发现不可能直接抄linux系统的驱动程序,windows上的驱动程序,因为操作系统不同。

所以,要写网卡驱动,就得按照嵌入式开发的思路,在现有的30天自制的操作系统上,直接去控制网卡收发数据,网络协议解析等。

万事开头难,在自制操作系统上开发网卡驱动也是这样的。

首先的困难就是没有对网卡设备的发现程序。现在是在虚拟机上把30天自制操作系统运行起来的,虚拟机可能有虚拟的网卡,也可能没有。

后来通过对PCI总线的检测,发现了几个网卡的型号,也算解决了网卡的问题。用虚拟的网卡做实验。

然后紧接着一个问题就是:虚拟的网卡并没有将真实网卡的功能全部模拟。虚拟机只是模拟了真实网卡的部分功能,当你按照网卡的datasheet去操作虚拟网卡的时候,发现虚拟网卡没有反馈。

后来更换了虚拟机,发现有的虚拟机还是可以模拟出网卡的datasheet上的所有功能的。所以,是可以用虚拟机来开发网卡驱动的。

有了可以实验用的虚拟网卡,就可以开始着手开发网卡驱动了。按照datasheet以及嵌入式开发的一些例子,先尝试去读取和写入网卡芯片,然后再尝试让网卡发送数据,接收数据,然后再尝试去按照网络协议去组织数据发送出去,然后按照网络协议接收数据。这样一步一步的,步步为营。

想法虽然很好,但是真正开始开发时,又遇到一个问题:

我手头的虚拟机中的操作系统如何联网呢?

如果虚拟机里安装了一个windows,或者linux,那么我们很容易找到教程,去设置联网问题。现在我们手头的是一个还没有开发网卡驱动的操作系统,根本没有教程教怎么联网。
甚至如果是真实的主板,我们还能把网线插上,这就表示它联网了,等着开发网卡驱动程序就行了,
但是现在是虚拟机,怎么知道,怎么确认虚拟机的网线插上了?

不过以上问题最后都得到了解决。遇到问题是困难的,但是解决问题的那一瞬间就很幸福了。

我是如何找到网卡的

因为在虚拟机里安装linux操作系统后,linux操作系统是可以联网的。

所以,虚拟机本身肯定是带有网卡的,并且这个网卡也是能用的。

那么,如何把虚拟机上的网卡用起来? 查看到网卡的型号,然后搜索网卡芯片的类型,芯片有datasheet,datasheet上就详细说明了网卡如何使用。

不过在去控制网卡之前,要解决一个问题:如何让30自制操作系统找到这个网卡呢?

通过查找资料,我们发现,网卡一般都是通过PCI设备连接到CPU的。所以可以通过对PCI设备做个检索。

那么如何在30天自制操作系统上检索PCI设备呢?

我们的虚拟机的X86架构的CPU,这个CPU要检索PCI设备,只用通过IO端口就可以了,通过对某些固定的IO端口进行读写,就可以检索PCI设备了。


于是写程序去对相应端口进行检索,检索以后,发现,果然有网卡,并且型号为RTL8029.

这样,我就在30自制操作系统上找到网卡了。

后来发现,其实虚拟机启动的时候,是可以设置网卡的。


比如qemu可以通过如下命令设置网卡型号为ne2k_pci,即ne2000网卡,并且这个网卡是通过PCI与CPU相连的。所以,这样设置之后,我们就可以通过端口控制PCI,从而找到这个网卡了。

其实qemu上虚拟的网卡类型挺多的,如下:


其中e1000是qemu虚拟机默认的网卡,我们这里由于最先接触了TRL8029网卡,所以就选了与TRL8029网卡兼容的ne2k_pci。

除了可以把30天自制操作系统放到qemu虚拟机上,也可以放到parallels虚拟机上,parallels在配置界面上设置网卡型号:



可以看到,这两种虚拟机都实现了RTL8029网卡。


又是如何找到比较好用的虚拟网卡的

但是,找到虚拟网卡是第一步。

为什么这样说呢?

真正对网卡进行控制的时候,就发现qemu中的ne2k网卡,其实不能按照8029datasheet所提供的方式去控制:有些寄存器可以设置,有的不可以。这就是说:可能qemu虚拟网卡的功能不全,也可能8029网卡虽然与ne2k兼容,但是又是不同的,所以不能用控制8029方式去控制ne2k。可是,我现在就只有8029网卡的datasheet比较全面,ne2k的找到了零散几页。

这里展示一下找到虚拟网卡后,发现虚拟网卡功能不全的细节:

使用30自制操作系统自带的qemu.exe虚拟机,发现对网卡芯片8029的RCR,TCR,IMR等配置寄存器无法写入与读取,但对CR寄存器等却可以读取。这意味着qemu.exe虚拟机的网卡只能按照某种方式去接收,发送数据,但是真实的网卡是可以按照很多方式去接收发送数据的,我们做驱动开发也是要多种方式去验证的,所以qemu.exe上自带的8029网卡就无法使用了。

这让我的网卡驱动开发工作暂时停了下来。


发现还是不行,无法控制几个重要的配置寄存器去做回环测试。

可能虚拟机中的网卡没有将这些配置寄存器虚拟化。

那怎么办?

直接。。

后来有尝试了将我的qemu更新到最新的版本,发现有一些寄存器可以使用了,但是还是有若干个寄存器无法使用。

看来得去找一块真正的而不是虚拟的TRL-8029网卡了?


不过还是虚拟网卡比较方便些。
既然RTL8029不能操作,那么其他网卡型号能不能使用呢?比如e1000网卡。

于是我试着去找e1000网卡的datasheet,发现还是比较全面的,似乎也可以用。datasheet直接从Intel的官方,去下载就行了。不过操作办法有一些变化,之前很多专门控制8029的代码就不能用了。

通过 PCI配置发现,虚拟机默认的网卡是8086-100f的,这个网卡就是e1000网卡,那么这个网卡内部的芯片是什么呢?

http://pci-ids.ucw.cz/v2.2/pci.ids

在这个网站里,查到:


芯片是82545EM,那么就可以去找这个芯片的datasheet了。

其实在ubuntu上通过lspci -v命令,也可以查看到,网卡类型为e1000e时,其芯片是intel 的82574L

当指定了网卡类型为2k_pci后,就可以查看到TRL-8029了,如下图

可以看到,这个网卡的IO端口时C000,内存映射的位置是0xfeb80000,这里disabled的意思可能是指:当前网卡不支持内存映射访问,只支持IO端口。

不过,最终,我在paralles虚拟机上试了试它提供的RTL8029AS虚拟网卡,发现与我手头的datasheet是完全匹配的。原来在qemu上的那么不能操作的关键寄存器,现在都能够操作了。

这是一个关于qemu上关于虚拟网卡的处理过程,如果不是paralles上的虚拟网卡能用,我恐怕就要去详细看看qemu内部到底是如何虚拟化网卡的了:https://blog.csdn.net/dillanzhou/article/details/120169734

如何确定网卡驱动虚拟机有联网



既然,虚拟机中的ubuntu可以联网,那么虚拟机中的自制操作系统也是可以联网的。

其实,qemu联网也是很方便的,按如下命令来启动:

这里的参数-net user,虚拟机就会简历一个局域网,虚拟一个DHCP服务器来让虚拟机中操作系统获取IP地址。这种连接方式对于我们来说就够用了,因为我们写好网卡的发送程序后,就可以发送一些DHCP消息,去和DHCP服务器互动。

qemu还有一种联网方式是利用网桥,但是这个就需要安装在虚拟机内部的操作系统去连接这个网桥。但是,我们现在手头的30天自制操作系统还没有任何网络设备可用,所以,就不可能去连接这个网桥了。当然,这种方法连接后,虚拟机是可以连接到真实的局域网内部的,就是可以获取一个IP地址,这个IP地址是与运行虚拟机的电脑同一个局域网的。

通过网桥的连接方式就等网卡驱动开发好之后,再尝试做。

不过,由于qemu中的8029网卡我们操作不好,所以,自制操作系统通过qemu虚拟机的联网方式,我没有机会去验证。

在paralles中的8029网卡的寄存器可以被操作,也试了paralles中是否可以联网,发现是可以的,每收到一些网络信息,paralles右上角的网络信号会闪烁:


闪烁这个很鼓励人的。
当我们操作网卡尝试发送数据,但是接收多次方毫无反应,抓包软件也抓取不到,就会很失望:难道我们控制网卡发送数据的方式错了么?但是网卡的操作手册上就是这么写的呀?无从下手。
当看到这个标志有闪烁的时候,并且它与我们的发送动作是一致的:每次我按发送键,它就亮;我就基本可以确定,我确实有控制到网卡。那问题就出在我发出去的数据,可能格式不对,所以抓包软件抓不到。

只要确定我们能真的控制到网卡发送出去数据,那就好办了:

就是继续详细的查看到底格式错在哪里?再把DHCP协议,IP协议,ethernet协议所要求的字段,每个字段的长度,以及需要补零的数量搞搞清楚。

这就是paralles中这个蜘蛛网闪烁的意义。

这就相当于真实网卡的网线头子的那两个灯了:

所以,网线头子插口处的link灯和act灯,就是驱动开发人员看到希望的指路明灯。


当前的进度

实现了控制8029收发数据。

实现了按照DHCP协议去向DHCP服务器申请IP地址。其实实现DHCP,就是实现UDP,IP,ehternet协议。

实现了按照ARP协议去数据,然后解读ARP消息,回应APR消息,

后续准备:
1. 实现一下对ICMP消息的回应:即回应ping命令
2. 尝试利用IP协议传输较长的数据,即IP协议中的分段传输在重组。
3. 实现TCP协议,HTTP协议,尝试开发一个简单的网页服务器。不过这好像超出网卡驱动的范畴了,网页服务器还是不要在操作系统内部开发,要等网卡驱动接口通过0x40中断开放给APP后,开发一个网页服务器APP。
4. 因为当前这些驱动都是在操作系统内部写的,所以后续需要将内部驱动程序中的函数做成接口,通过0x40中断开放出去,这样也就支持了在30天操作系统上进行网络编程,利用这些接口,可以开发一个ping,开发一个arp,或者开发一个网页服务器。

相关推荐

配合制导弹药!土耳其推出反无人机武器系统,可全天候拦截无人机

【军武次位面】作者:FriedrichLau据报道,日前土耳其军队装备了一款名为Sahin"沙欣"的反无人机武器系统。该系统由土耳其Aselsan公司开发,旨在摧毁迷你或小型无人机,...

威纶通常见问题18 威纶通触摸屏密码使用的相关介绍

密码1:屏右下角的系统设定列(向左的箭头)进入密码提醒:上传下载的默认密码均为6个1,若不慎忘记密码,因已加密所以原厂也无法解开,请妥善保管密码。若因不可抗力因素造成的忘记密码,只能将屏恢复出厂设置然...

轻松学会威纶通触摸屏上传与反编译

说到上传,大家并不陌生,上传顾名思义:就是把实际触摸屏画面上传到电脑EasyBuilderPro软件上,上传的作用是什么呢?可以修改触摸屏上原有的画面,所以说在上传这两字在工控中是非常重要的,接下来进...

DLL 可以被反编译吗?(dll文件可以编辑吗)

DLL可以被反编译,但存在一定难度DLL(动态链接库)是一种二进制文件,包含了可执行代码和数据。虽然它不像高级语言源代码那样容易被理解,但可以通过一些反编译工具进行逆向分析。不过,反编译后的结果通常...

复古游戏反编译工具遭任天堂下架 工具名或为诱因

Reddit用户mhjhacker1近日发表文章称,自己开发的一款“复古主机游戏逆向工程”工具被其他用户使用,反编译了一款任天堂四十年前的游戏,因而遭到了Itch.io的下架。而相关的另外三个工具也遭...

protobuf之序列化数据和反序列化数据基础知识

什么是protobufProtocalBuffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。ProtocolBuffers是一种语言无关、平台无关、可扩展的...

MT管理器-简单实战-去除启动页(mt管理器去除登录界面)

每次打开APP都要看着启动页2秒,很烦人,既然如此我们把它去掉吧。学过Android开发的都知道,APP的每个界面都是一个Activity,然后你点击桌面上的图标之后,其实是启动了这个...

这两个强大的开源C#反编译逆向工具,探索C#桌面应用的小秘密

C#的应用也比较多,有时候,我们想要研究一下别人的优秀的项目,可能会借助一些非常规手段来学习。下面,我就分享几款开源的C#反编译工具。dnSpydnSpy是一个用C#开发,开源的调试器和.NET汇...

一款开源的.NET程序集反编译、编辑和调试神器

致力于发掘、评测和推荐各种高效实用的工具和软件,帮助您在工作和生活中事半功倍。项目介绍dnSpyEx是dnSpy项目的非官方Fork维护版本,一款开源、功能强大的.NET反编译工具和调试器,可用于在没...

记一次噩梦般的经历--论学会反编译的重要性

最近在做一个android项目,因为非开源,github上也没购有私有库,所以就没有提交github管理。昨天我感觉写到了一定程度,一个小的版本已经出来了,于是就想U盘和网盘都备份一下。结果出现了下面...

奇!AI(人工智能)能不能反编译二进制代码为高级语言Java或者C?

一直很好奇某些软件的制作过程,使用的算法。因为自己实现的,写的稀烂,虽然功能达到了,但处理速度和处理效率很低下,于是也尝试使用一些反编译软件,如IDAPro软件。想看看人家怎么实现,怎么做到效果那么...

你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类

持续创作,加速成长!这是我参与「掘金日新计划·10月更文挑战」的第7天,点击查看活动详情写下这篇文章,也纯属于是一个机缘巧合,我一个非常要好的朋友程,也是刚刚踏上工作岗位。这个问题也是他踏上岗位...

SpringBoot项目Jar包加密,防止反编译

场景最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来。方案第一种方案使用代码混淆采用proguard-m...

安卓移动应用代码安全加固系统设计及实现

安卓平台已经逐渐成为最受欢迎的移动终端操作系统,基于安卓系统的软件应用数量众多,同时安全威胁也在不断增加。介绍了Android系统的安全风险及加固的核心技术,据此提出了一种安卓应用程序的安全加固系统,...

代码安全之代码混淆(代码混淆器是干什么的)

防止核心代码泄露以及代码合并每日辛辛苦苦码的代码被轻松破解?机密核心模块被盗用?数据库地址和语句暴露?……这些都是由代码未混淆加密,从而进行泄露的我们目前DLL文件存在的风险:一、直接引用二、反编译...