裸机 x86 组件中的网络

1 networking assembly operating-system osdev

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

我一直无法弄清楚的一项功能是网络。我能找到的所有关于 x86 程序集中网络的教程都是基于 Unix/Linux 网络系统调用的。

如何在裸机 x86 组装中完成它?

old*_*mer 5

是的,对于您想要支持的每块网卡,您都需要一个驱动程序。每块显卡都有一个驱动程序。适用于每个键盘、鼠标、USB 集线器等。但前提是您拥有 pcie 控制器、USB 根控制器等的驱动程序。

在我看来,操作系统的大部分工作是驱动程序。当您成为 Windows 或 Linux 用户时,供应商希望为您的操作系统编写驱动程序,而您所要做的就是批准或不批准它们,但在此之前很久,您必须在没有太多文档访问的情况下编写它们。通常,您只需要 Linux 驱动程序源即可弄清楚如何与设备通信。

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

不确定你的目标是什么,但我会最后做 x86 或永远不会,从一些 ARM 开始,无论是一个大的 cortex-m7 mcu 还是一个全尺寸的手臂,Raspberry Pi,beagle 之类的东西(beagles 使用 ti 部件,这是开放文档), Pi 拥有首屈一指的裸机论坛,甚至比当时的 avr 怪胎还要好,尽管它是 Broadcom 的,文档很少。将 uart 作为您的主要接口,只需进行任务切换并开始形成有关驱动程序接口和应用程序空间与内核的想法以及让应用程序运行将会让您开心很长时间。

如果你想要 x86,那没问题;你一定陷入了某种特殊的痛苦之中。我宁愿在脚底纹个纹身,这样痛得更小,愈合得也更快。

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

基于您提出的问题的事实意味着您可能看不到项目的规模和所需的时间。也许你会这样做并且你对此很感兴趣。还要了解,您不会在第一次击球时打出本垒打,而是要多次将其劈开或砍断或扔掉并从头开始。编写大量一次性代码来让某些东西正常工作,然后在创建真正的代码后实际上将其丢弃。

任何一件事,无论是一个键盘、一个网络板上的物理层等,本身都可以是一个需要数周全职工作的研究项目。为你即将面临的事情做好准备。

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


我一直无法弄清楚的一项功能是网络。我能找到的所有关于 x86 程序集中网络的教程都是基于 Unix/Linux 网络系统调用的。

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

有一些网络书籍。当我对这些东西感兴趣时,我买不起 Comer 书籍,然后是 TCP/IP 插图系列,我收到了免费副本(这些天可能会得到非法 PDF)。您也可以在 Wikipedia 上找到 OSI 层,以及 Andrew S. Tanenbaum 的书籍用于教授此内容。

但归根结底,一半是为您提供数据包的硬件。另一半是协议,即这些数据包中的内容/有效负载。

如何在裸机 x86 组装中完成它?

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

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

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

@fuz那么,我是否必须为该操作系统中可以使用的每个网卡编写驱动程序?

是的,绝对……这就是制作操作系统的意义所在。幸运的是,芯片数量比供应商少,而且很大一部分人只是购买制造电路板的相同芯片并在上面贴上自己的名字。如此多的 PCIE 供应商/产品 ID 可能映射到相同的驱动程序。