跳转到内容

Aros/开发者/NICDriversDev

来自 Wikibooks,开放书籍,开放世界
Aros 维基百科的导航栏
Aros 用户
Aros 用户文档
Aros 用户常见问题解答
Aros 用户应用程序
Aros 用户 DOS Shell
Aros/用户/AmigaLegacy
Aros 开发文档
Aros 开发人员文档
从 AmigaOS/SDL 移植软件
适用于 Zune 初学者
Zune .MUI 类
适用于 SDL 初学者
Aros 开发人员构建系统
特定平台
Aros x86 完整系统 HCL
Aros x86 音频/视频支持
Aros x86 网络支持
Aros Intel AMD x86 安装
Aros 存储支持 IDE SATA 等
Aros Poseidon USB 支持
x86-64 支持
摩托罗拉 68k Amiga 支持
Linux 和 FreeBSD 支持
Windows Mingw 和 MacOSX 支持
Android 支持
Arm Raspberry Pi 支持
PPC Power 架构
杂项
Aros 公共许可证

SANA2 规范(版本 2 可从 Aminet 获得,sana2_v2.lha 来自 通用 FTP 德国 FTP英国 html 并在网上阅读 此处

Aminet comm/tcpAminet comm/net 并搜索 搜索 Aminet

与 SANA II 兼容意味着它将支持 AROS 的所有主要网络协议。

组播:(第一个字节的最低有效位 - 字节中低位优先传输)广播

Sana2IOReq

  • 6 个字节的目标地址(以太网地址由 47 位地址信息和 1 位组播标志组成)
  • 6 个字节的源地址
  • 2 个字节的类型,
  • 64 到 1500 个字节的数据(数据包)
  • (后面是 4 个字节的 CRC 值,覆盖上述所有内容,由硬件生成和检查,因此即使在原始数据包中也不包含)
decimal   Hex           Description
-------   ---           -----------
  000     0000-05DC     IEEE 802.3 Length Field
 2048     0800          TCP/IP -- IP
 2054     0806          TCP/IP -- ARP
32821     8035          TCP/IP -- RARP
32923     809B          Appletalk
33011     80F3          AppleTalk AARP (Kinetics)
33100     814C          SNMP
33079     8137-8138     Novell, Inc. 

简单 NIC 驱动程序概述

[编辑 | 编辑源代码]
setup tx (transfer/driver) & rx (receive) descriptors and data buffers
    set packet size, split data into packets and queue serially (one after the other) 
    handshaking/data integrity check per packet
    poll until all rx packets received 

一个典型的以太网驱动程序在 workbench/devs/networks/ 中有这些与之关联的文件

device.c      - (APTR)DevOpen, (APTR)DevClose, (APTR)DevExpunge, (APTR)DevReserved, (APTR)DevBeginIO, (APTR)DevAbortIO, 
aros-device.c - AROSDevInit, AROSDevOpen, AROSDevClose, AROSDevExpunge, AROSDevReserved, AROSDevBeginIO, AROSDevAbortIO, 
                RXFunction, TXFunction, *DMATXFunction, AROSInt, 
expansion.c   - GetExpansionCount(), *AllocExpansionCard(), FreeExpansionCard(), 
                AddExpansionIntServer(), RemExpansionIntServer(), 
pci.c         - GetPCICount(), *GetPCIUnit(), *FindPCIUnit(), *CreatePCIUnit(), DeletePCIUnit(), *AllocCard(), FreeCard(), 
                AddPCIIntServer(), RemPCIIntServer(), IsCardCompatible(), Product_Codes, 
unit.c        - *CreateUnit(), DeleteUnit(), InitialiseAdapter(), ConfigureAdapter(), FillConfigData(), 
                 GoOnline(), GoOffline(), AddMulticastRange(), RemMulticastRange(), *FindMulticastRange(), SetMulticast(), 
                *FindTypeStats(), FlushUnit(), StatusInt(), RXInt(), CopyPacket(), AddressFilter(), TXInt(), TXEndInt(), 
                UpdateStats(), ReportEvents(), UnitTask(), ReadMII(), WriteMII(), BusyMicroDelay(), 
                GetEEPROMAddressSize(), ReadEEPROM(), ReadEEPROMBits(), WriteEEPROMBits(), ReadEEPROMBit(), WriteEEPROMBit, 
request.c     - ServiceRequest(), CmdInvalid(), CmdRead(), CmdWrite(), CmdFlush(), CmdS2DeviceQuery(), PutRequest(), 
                CmdGetStationAddress(), CmdConfigInterface(), CmdBroadcast(), CmdTrackType(), CmdUntrackType(), 
                CmdGetTypeStats(), CmdGetSpecialStats(), CmdGetGlobalStats(), CmdOnEvent(), CmdReadOrphan(), 
                CmdOnline(), CmdOffline(), CmdDeviceQuery(), CmdAddMulticastAddresses(), CmdDelMulticastAddresses(), 

一个典型的无线驱动程序在 workbench/devs/networks/ 中有这些与之关联的文件

aros-device.c
device.c
encryption.c
request.c
startup.c
unit.c

GPL-linux 驱动程序如何工作

[编辑 | 编辑源代码]

http://en.wikipedia.org/wiki/Device_driverhttp://lwn.net/Kernel/LDD3/https://wikibooks.cn/wiki/The_Linux_Kernel

检测设备,启用设备并了解网络设备

[编辑 | 编辑源代码]

总线无关设备访问

[编辑 | 编辑源代码]

了解 PCI 配置空间

[编辑 | 编辑源代码]

初始化 net_device

[编辑 | 编辑源代码]

了解传输机制和接收机制

[编辑 | 编辑源代码]

使设备准备好传输数据包并接收数据包

[编辑 | 编辑源代码]

如何将 GPL-linux 驱动程序转换为 SANA2 AROS 驱动程序

[编辑 | 编辑源代码]

有谁知道为什么我们的网络栈有以下限制

  • 每个任务都需要打开自己的库基址
  • 任务 A 创建的套接字不能在没有进行一些“共享魔法”的情况下被任务 B 使用

此限制是将多线程网络软件从 Linux 世界移植过来的一个重大障碍,因为在那里,没有这样的限制。

因为有些东西是基于信号的,而信号属于某个任务。此外,没有其他方法可以拥有线程安全的 errno 和 DNS 查询。这来自于原始 AmiTCP 的设计,Miami 也是一样的。只有 Roadshow(OS4 栈)提供共享 SocketBase。这可以通过查询 SocketBaseTag 来查询,我不记得细节了。在 AROSTCP 中,可以通过将任务上下文与 SocketBase 分开,并使用 AVL 树将上下文与任务关联来实现相同的功能。这对于 Exec Signalling 设置是正确的 - 所有任务都分配自己的信号(这是来自原始 exec 的)。或者等待 relbase 补丁提交并使用该机制。然后它将为你完成。

AROS 是否需要重新编写 TCP 堆栈,以便拥有一个带有共享库基座的通用库,以及作为附加数据的每个调用者专业数据?以及是否可以*选择*设置每个任务私有数据?每个任务数据仍然需要有一个关联查找机制。

这是从 AmiTCP 网络堆栈和 Miami Classic Amiga 网络堆栈实现中保留的,当网络应用程序(AmiTCP 或 Miami 或 MiamiDX)启动时,会创建 bsdsocket.library 本身。

这也是从 Classic Exec 的任务/进程模型中保留的,允许每个库打开者拥有一个自定义库基座。

“众所周知,每个使用 bsdsocket.library 的进程都必须仅出于其自身目的打开该库 - 库的数据库与进程相关联,并且无法在其他进程之间共享。”(来源:http://aminet.net/package/comm/tcp/networksnooper

大多数主要的 UAE 版本都有内存专用的 bsdsocket.library(包括所有其他“虚拟”设备,如 uaehf.device、uaescsi.device 等)。我认为某些端口确实(曾经有?)“真实”库,但它很可能只包含 m68k<>host C-例程跳转表魔法。

AmiTCP/IP 文档 到 Aminet。

我梦想着一个基于 Amiga 消息传递系统的完整 TCP/IP。因此,例如,会有 ip.device、tcp.device、udp.device 等。

参考资料

[edit | edit source]

每个 sana2 设备都拥有

AbortIO 
CloseDevice 
CMD_CLEAR 
CMD_FLUSH 
CMD_INVALID 
CMD_READ 
CMD_RESET 
CMD_START 
CMD_STOP 
CMD_UPDATE 
CMD_WRITE 
OpenDevice 
S2_ADDMULTICASTADDRESS 
S2_BROADCAST 
S2_CONFIGINTERFACE 
S2_DELMULTICASTADDRESS 
S2_DEVICEQUERY 
S2_GETGLOBALSTATS 
S2_GETSPECIALSTATS 
S2_GETSTATIONADDRESS 
S2_GETTYPESTATS 
S2_MULTICAST 
S2_OFFLINE 
S2_ONEVENT 
S2_ONLINE 
S2_READORPHAN 
S2_TRACKTYPE 
S2_UNTRACKTYPE
华夏公益教科书