【问题标题】:Networking in bare metal x86 assembly裸机 x86 组件中的网络
【发布时间】:2020-08-29 10:24:16
【问题描述】:

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

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

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

【问题讨论】:

  • 在裸机 x86 组装中,这有点困难,因为您首先需要为网卡编写驱动程序。参见例如here 了解如何对简单的 NE2000 芯片组进行编程。然后你必须编写自己的网络堆栈。这已经完成了,但确实是相当多的工作。
  • @fuz 那么,我是否必须为每个可以在这个操作系统中使用的网卡编写驱动程序?
  • 如果操作系统自己不提供任何驱动程序,这正是您需要做的。
  • 有两种卡通常用于业余操作系统项目:Novell NE2000(包括克隆)和 Intel E1000 (Pro/1000)。两者都相当容易获得,而且对于一个爱好项目,最好将自己限制在一个或两个模型上。
  • @fedqx 当然。但请注意,编写纯以太网驱动程序只是编写网络堆栈的一小部分。实现 IP 和 TCP 要复杂得多。

标签: assembly networking operating-system osdev


【解决方案1】:

是的,对于您想要支持的每个网卡,您都需要一个驱动程序。对于每个视频卡,一个驱动程序。适用于每个键盘、鼠标、USB 集线器等。但要等到您拥有 pcie 控制器、USB 根控制器等的驱动程序后才能使用。

IMO 操作系统的大部分工作是驱动程序。当您成为 Windows 或 Linux 时,供应商希望为您的操作系统编写驱动程序,而您所要做的就是批准与否,但在此之前很久,您必须编写它们而没有太多的文档访问权限。很多时候,Linux 驱动程序源就是您要弄清楚如何与设备通信的全部内容。

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

不确定你的目标是什么,但我会坚持做 x86 或永远不会做 x86,从一些 ARM 开始,无论是大的 cortex-m7 MCU 还是全尺寸的手臂、Raspberry Pi、小猎犬(小猎犬使用开放的 ti 部件)文档),浓缩咖啡/玛奇朵宾等。 Pi 拥有首屈一指的,甚至比当天的 avr 怪胎更好,尽管是 Broadcom 的文档最少的裸机论坛。一个 uart 作为您的主要接口,只需进行任务切换并开始形成有关驱动程序接口和应用程序空间与内核的想法并让应用程序运行将会让您开心很长时间。

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

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

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

任何一件事,无论是一个键盘,一个网络板上的 phy 等,其本身都可能是一个需要数周全职工作的研究项目。为你即将进入的领域做好准备。

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


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

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

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

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

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

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

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

用任何语言编写代码都很容易。

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

是的,绝对......这就是制作操作系统的全部意义所在。幸运的是,芯片比供应商少,而且很大一部分人只是购买相同的芯片来制作电路板并在上面写上他们的名字。如此多的 pcie 供应商/产品 ID 可能映射到同一个驱动程序。

【讨论】:

  • 感谢您的回答!
  • 感谢您撰写本文!节省了我很多时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多