跳轉到內容

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://wikibook.tw/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
華夏公益教科書