【问题标题】:How to write to & read from network card in x86 assembly?如何在 x86 程序集中读写网卡?
【发布时间】:2009-12-03 04:11:27
【问题描述】:

有谁知道如何访问主板或 pci 卡上的以太网端口等设备?

有特殊的寄存器吗?操作码?我必须打电话给操作系统吗?如果有,怎么做?

提前致谢。

【问题讨论】:

  • 你想做什么?写驱动?驱动程序确实是唯一适合这种访问的地方......什么操作系统?
  • 我只是想尝试一下——也许传输一两个数据包?我现在正在学习装配(MIPS)课程,并且还在网络研究实验室工作,所以我认为应该将两者融合在一起。我可以在任何主要操作系统上进行开发,但偏好会按照 Mac、Linux、Win 的顺序排列。

标签: assembly x86 mips ethernet


【解决方案1】:

这取决于您尝试与之通信的特定以太网 MAC 芯片。即使是同一家族的芯片,它们的运行方式也往往会有细微的差别。这就是现代操作系统有“驱动程序”概念的原因:硬件制造商通常会编写驱动程序,因为他们知道硬件,而驱动程序提供了硬件和操作系统想要看到的内容之间的转换。

您通常可以从 MAC 芯片的制造商处获取文档来编写自己的驱动程序。同样,您必须确切地知道要与哪个芯片交谈才能获得正确的规格。有些芯片没有公开文档,但这通常不是以太网芯片的问题。

【讨论】:

  • 哇,太好了(从某种意义上说,我刚刚学到了一些新东西)。谢谢!因此,如果我为我的 MAC 芯片找到了正确的规格,我基本上可以编写自己的驱动程序来获得乐趣或其他功能。有没有一种简单的方法可以在应用层了解 MAC 芯片?而且,驱动程序显然必须被组装成字节码,但是有没有一种简单的方法可以将它们“反汇编”回汇编?上述步骤在 Linux 社区中经常发生,对吗?
  • 是的,您应该能够仅从芯片文档中编写驱动程序;找到上述文档可能是一个挑战。要检测正在使用的芯片,您可以遍历 PCI 设备表;例如,在 Linux 中,有 lspci 命令可以为您执行此操作。是的,您可以拆卸驱动程序,但如果您有芯片的规格,则没有理由这样做。不,Linux 以太网驱动程序通常不是从 Windows 驱动程序逆向工程的。其他类型的驱动程序有时也会发生这种情况,但正如我所说,以太网芯片规格通常并不难获得。
【解决方案2】:

最简单的答案,虽然可能不是您要寻找的,但可能是编写 C 代码来访问卡,对其进行编译,然后查看编译器生成的代码。

C代码很可能直接通过网卡驱动,或者使用winpcap之类的库。例如,出于安全原因,Windows 上对 raw sockets 的内置支持已被禁用。

但这并不是了解 NIC 工作原理的最佳方式。为此,请选择一个流行的嵌入式 NIC 的数据表,例如 LAN91C111,并阅读如何访问它。 会教你很多关于以原始方式连接 Eterthet 的知识。

这仍然不是一个足够好的沙盒来学习汇编语言,恕我直言。为此,只需在汇编中实现一些小的算法程序 - 比如二叉树搜索。

【讨论】:

    【解决方案3】:

    您可以使用对卡本身的调用,使用输入和输出指令或类似的东西。每个以太网卡都不同,因此您需要制造商提供的文档。

    假设您使用的是 Windows,下一级是 DOS 函数调用。这些将允许您使用标准 MSDOS 调用访问以太网卡的有限功能。您可以在旧的 MSDOS 文档中找到这些内容。如果我没记错的话,它们中的大多数仍然可以在更高版本的 Windows 上运行。

    【讨论】:

    • 我相信在 9x 之后的任何窗口下的用户模式代码中都拒绝直接端口访问。
    • 你有例子吗?是否将设备的内存地址加载到寄存器中?我如何获得所说的内存地址?我会使用 x86 中的哪些关键字?等等。不幸的是,在这种情况下,在 Windows 上进行开发的可能性很小。如果我在任何方面都取得了成功,我可能希望它与其他代码一起使用,所有这些都是我在 Unix 系统上开发的。
    • 正如 Yetapb 所说,直接端口访问可能存在安全限制。您可以从硬件制造商处获得所有这些的详细信息。每个制造商和大多数型号都可能不同。抱歉,我没有过去十年的任何例子。
    【解决方案4】:

    您需要写入特定的端口地址。此 Wiki 页面可能会帮助您入门。
    MemoryMappedIO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多