我希望用汇编程序编写一个能够发送和接收网络数据包的可引导程序。我不想使用任何库,我想自己创建它(并在这样做的同时学习)。不幸的是,我找不到任何有关与最低级别的网卡通信的信息(发送原始套接字)。OUT
我相信使用和说明是必要的IN
,虽然我找不到任何关于分配给网卡的端口的信息(或者如何找到它,如果它并不总是相同的话)。有人能指出我正确的方向吗?;-)
3 回答
这是一个相当大的问题需要解决。即使达到“原始套接字”的程度也将是相当多的工作。
首先,使用现代 BIOS,您的网卡通常不会默认配置,因此您需要处理PCI 配置以将其配置为具有处理器可见的某些端口。这将为您提供让 CPU 与网卡实际对话的基本能力。
其次,你必须找到一些关于它碰巧使用的特定芯片组的文档,这样你就会知道如何读取和写入网络数据。对于一些较旧的卡,这很容易,但大多数较新的卡充当具有分散/收集硬件的总线主控器。对它们进行编程以进行即使是简单的传输也并非易事。不过,这完全取决于硬件。
第三,您需要开发 IP 堆栈的重要部分才能使用原始套接字。在硬件级别,您基本上有两个功能:接收任何碰巧到达的数据包,并将数据包发送到指定的 MAC 地址 - 或其他硬件地址,如果您的卡不是(并且看起来/不像)以太网。
接下来的几层将是ARP 解析器(让您使用 IP 地址而不是 MAC 地址)和 DNS 客户端(因此您可以使用普通地址名称而不是点四边形之类的名称。除此之外,您' 可能想要构建知道如何创建/理解IP 数据报的软件。
不同的网卡有不同的硬件接口(这就是为什么它们有不同的设备驱动程序)。
您可能会从设备制造商那里获得有关硬件的信息(或者您可能不会:他们可能会将其视为专有信息,并编写自己的设备驱动程序)。
你也可以通过查看开源网卡的源代码来获得这些信息:例如,我猜,对于 Linux;或者,也许是Crynwr 数据包驱动程序。
在 x86-64 Linux 中,您可以进行系统调用以使用原始套接字。
global _start
section .text:
_start:
;sys_socket: rax, 41
mov rax,41
;sys_socket inputs:
;%rdi %rsi %rdx
;family type protocol
mov rdi,2 ;AF_INET
mov rsi,2 ;DGRAM Socket
mov rdx,0 ;protocol
syscall
;sys_sendto: rax, 44
; I will do this later because rax holds the file desc
;sys_sendto inputs:
;%rdi %rsi %rdx %r10 %r8 %r9
;file desc buff lenght flags addr addr-lenght
mov rdi,rax ;file desc
mov rax,44 ;sys_sendto
mov rsi,msg ;buff
mov rdx,msgl ;length
mov r8,addr ;addr
mov r9,16 ;remember htons()??? that's why 16
syscall
section .data:
msg: db "hello"
msgl: equ $-msg
;addr
addr: dw 2
db 10h,00h ;htons()
db 7fh,0h,0h,01h
db 0,0,0,0,0,0,0,0
来自教程视频: https ://youtu.be/vOJoisKtR-A