裸机 x86 程序集中的网络

Networking in bare metal x86 assembly

我开始了编写玩具操作系统的旅程,并且正在寻找资源和书籍来帮助我。

我一直想不通的一个功能是网络。我能找到的所有关于 x86 程序集网络的教程都是基于 Unix/Linux 网络系统调用。

如何在裸机 x86 汇编中完成?

是的,对于您想要支持的每个网卡,您都需要 driver。对于每个视频卡,driver。对于每个键盘、鼠标、USB 集线器等。但是直到你有一个 driver 用于 pcie 控制器、USB 根控制器等

IMO OS 的大部分工作是 driver。当您成为 Windows 或 Linux 时,供应商想要为您的 OS 编写 driver,您所要做的就是批准或不批准,但很长在此之前,您必须在没有太多文档访问权限的情况下编写它们。很多时候,Linux driver 源就是您弄清楚如何与设备对话的全部内容。

视频历史上一直是封闭文件,网络不是这样开始的,但 Broadcom 和 Realtek 基本上是封闭文件,即使你是一家非常大的公司,你也可能无法获得 NDA,如果你有保密协议,你必须非常小心你用它做了什么,在 GitHub 上基于它发布源代码到 drivers 是在诉讼中失去你的房子的好方法(创建一个LLC 在您进行任何这些交易之前保护您的个人资产,并聘请律师)。因此,再次获取 Linux 源代码,注意用于该源代码的许可证...

不确定你的目标是什么,但我会最后或永远不会做 x86,从一些 ARM 开始,无论是大的 cortex-m7 mcu 还是全尺寸的手臂,Raspberry Pi,比格犬的东西(比格犬使用ti 部分是开放文档),espresso/macchiatobin,等等。Pi 比 none 秒,甚至比当天的 avr 怪胎还要好,裸机论坛尽管是 Broadcom,文档最少。将 uart 作为您的主要接口,只需进行任务切换并开始形成关于 driver 接口和应用程序 space 与内核以及拥有应用程序 运行 的想法就会让您开心很长时间。

如果你想要 x86,那很好;你一定是陷入了某种特殊的痛苦之中。我宁愿在脚底纹个纹身,疼的少,痊愈的快。

并且你标记了这个程序集,我希望你不是用程序集编写它,但如果你是,我希望你明白它不会比用 C 编写并编译它执行得更快。您可以经常手动调整编译后的代码,现在不会,也永远不会 "perfect",但是对于大型项目,编译器会更加一致。当您对处理器 X 感到厌倦时,您的大部分代码应该移植到处理器 Y,您可以继续使用。您的体验会有所不同。

基于您所问问题的事实意味着您可能看不到项目的规模和所需的时间。也许你这样做了,而且你很喜欢。还要了解您不会在第一次击球时击中一个家 运行,期望将其劈开并砍开或扔掉并从头开始多次。编写大量一次性代码以使某些东西正常工作,然后在创建真正的代码后真正将其丢弃。

任何一件事,无论是一个键盘,一个网卡上的物理层等,本身就是一个需要数周全职工作的研究项目。为即将到来的事情做好准备。

这是非常可行的,个人已经在没有其他程序员的情况下做到了这一点,如果你看的话,这些操作系统就在那里,只是想让你看到大局,再加上缺乏制造商的支持您要使用的产品。


One feature I haven't been able to figure out is Networking. All tutorials about networking in x86 assembly that I could find are based around Unix/Linux networking syscalls.

系统调用不是问题中有趣的部分。网络卡大多是封闭的书,所以你需要 Linux 来源才有机会。网络本身有很好的记录,但你想先从最古老的 RFC 开始,前几天在维基百科上,看起来它们有指向它们的链接,这很好。例如 ICMP(你首先需要 arp/rarp)维基百科似乎在这方面做得非常好,超过了你需要让 ping 工作的东西。但是你在底部看到 RFC 792,然后你看到 RFC 777、760 和 700 等等,我发现在尝试做我自己的堆栈时最好从旧的开始,因为最新的要么有洞要么以您预计已经从事该业务并查看这些内容数十年的方式编写。老的更简单,更容易理解和上手。

有几本网络书籍。当我对这些东西感兴趣时,我买不起的 Comer 书籍,然后 TCP/IP 插图系列,我得到了免费副本(这些天可能会得到非法的 PDF)。 OSI 层您也可以在维基百科上找到,Andrew S. Tanenbaum 书籍也可以用来教授这个。

但归根结底,其中一半是为您提供数据包的硬件。另一半是这些数据包中的 contents/payloads 协议。

How could it be done in bare-metal x86 assembly?

操作系统本质上是一个 bare-metal 程序,因此涵盖了裸机。编程语言是C的编程语言ar 最适合这项工作,没有紧随其后的。但是 asm 你只是写代码,你正在执行的 algorithm/task 和执行它所需的代码是两个不同的东西。如果你知道 task/algorithm/procedure 那么你只需敲出代码,稍后回来清理它...

99% 的 baremetal 正在阅读或者说没有编写最终代码,其中 99% 是一次性代码,它需要弄清楚事情是如何工作的,因为几乎所有文档都有错误,即使写得很好,但大多数都是写得不好。

用任何语言编写代码都是比较容易的部分。

@fuz So, do I have to write driver for every single network card that could be used in this OS?

是的,绝对...这就是制作 OS 的意义所在。幸运的是,芯片数量少于供应商,而且很大一部分人只是购买相同的芯片来制作电路板并在上面贴上自己的名字。这么多 pcie vendor/product ids 可能映射到相同的 driver.