简单的网络(一)了解PCI
简单的网络(二)环境模拟搭建
简单的网络(三)
简单的网络(四)发收包
一、题外话
没有碰我的os有一段时间了,忘得都差不多了,当时是遇到问题了也找了一些资料(E文不过关啊),也有点想放松下就放一旁了。
最近又不知道干嘛了,打算重新走完网络这一块。
最重要的是刚闲搞的时候居然正常跑起来了,神啊这是什么情况。
这里对简单的网络(二)环境模拟搭建做点补充来,但是还有问题,明白原因后会补上来的
#BOCHS 2.6.2配置
ne2k: ioaddr=0x300, irq=3, mac=b0:c4:20:00:00:00, ethmod=win32, ethdev=\Device\NPF_{927D22EC-523E-4C78-9DC2-8EFCC9E4FF67}
pci: enabled=1, chipset=i440fx
pci: enabled=1, chipset=i440fx, slot1=ne2k OK了
#下面这个挂在就会导致端口的访问不正确,暂且不知道确切原因,有知道告诉我
#pci: enabled=1, chipset=i440fx , slot1=pcivga, slot2=ne2k
ps:debug的时候可以看配置的一个方面是通过生成的log
一个方面是通过命令 info device 'ne2k'
二、长篇累牍的内容
2.1 NE2K系列有4页寄存器,兼容的只有前3页,PAGE0~PAGE2.
其实是0x00-0x1f分为四组寄存器,但是ne2k只兼容前面三组
2.3 NE2k的IO访问范围
端口地址可以在 0x280---》0x380的任意地方,通常配置在0x300地方
端口偏移:00--0F 寄存器地址
10--17 作用一样是DMA地址
18--1F 复位端口
/*
CR---命令寄存器
TSR---发送状态寄存器
ISR---中断状态寄存器
RSR---接收状态寄存器
RCR---接收配置寄存器
TCR---发送配置寄存器
DCR---数据配置寄存器
IMR---中断屏蔽寄存器
NCR---包发送期间碰撞次数
FIFO---环回检测后 查看 FIFO 内容
CNTR0---帧同步错总计数器
CNTR1---CRC 错总计数器
CNTR2---丢包总计数器
PAR0-5---本节点 MAC 地址
MAR0-7---多播地址匹配
*/
2.3 ne2k的DMA内存地址
网卡含有16K字节的RAM,地址为0x4000-0x7fff(指的是网卡上的存储地址,而不是ISA总线的地址,是网卡工作用的存储器),每256 个字节称为一页,共有64页。页的地址就是地址的高8位,页地址为0x40--0x7f 。这16k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。当然也可以给用户使用。
网卡除了16k(地址0x4000-0x7FFFF)的接收发送存储RAM之外,还有别的RAM,还有一块大小为256字节的RAM,地址为0x0000 -0x00FF,这部分RAM是eeprom 93C46的影像存储(不完全一样),存储的内容的一部分跟93C46存储的是一样的。 网卡在上电的时候将93C46的一部分内容读到这256字节的RAM里。存储是WORD类型,其中地址:
0x0000-0x000b共12个字节是网卡的物理地址。(网卡的物理地址是6个字节的,为什么要用12字节?因为这12字节是重复存储的。例如网卡物理地址0x52544CC118CF,存储在0x0000-0x000b里是这样的:
525254544C4CC1C11818CFCF
我们可以看到单和双的地址存储的是一样的。0x000b后面的地址存储的是生产厂商的代码和产品标识代码,也是单双地址重复存储,这里就不说了。
三、简单的例子
3.1重置
在复位端口发送任何数据都可以,然后检测ISR的第七位如果置位就说明成功
3.2读取RAM的地址
1.通过CR寄存器设置读写 页数
2.设置起始开始低地址、高地址
3.设置去读的开始低地址、高地址
4.开启命令