【问题标题】:How do I access the USB port through the BIOS in 16-bit x86 real mode?如何在 16 位 x86 实模式下通过 BIOS 访问 USB 端口?
【发布时间】:2012-01-12 12:52:31
【问题描述】:

我是组装世界的新手,

我正在尝试编写一些汇编代码来与串行、并行、VGA、键盘等硬件设备进行通信。

我在 x86 英特尔处理器的实模式下执行此操作,方法是从我个人编写的 boostrap 引导我的代码以加载我的汇编代码。

嗯,根据我从阅读教程中收集到的知识,对我来说最简单的方法是使用 BIOS INT 服务例程 (ISR),另一方面,最长的方法是访问硬件的不同寄存器,例如例如:串口的状态寄存器和控制寄存器......

Q1:我说得对吗?

我可以使用 BIOS INT 与 VGA 和串行硬件通信,但我找不到 USB 控制器的任何 BIOS 中断..?!

Q2:您能帮我解决这个问题,以便能够与 USB 端口和其他剩余端口进行通信,让它通用吗?

第三季度:

【问题讨论】:

  • 为什么要在汇编中编码?为什么不在操作系统(即 Linux 的某些程序)之上编写代码?你的目标是什么(学习汇编、编写操作系统)?今天的编译器生成的汇编代码比大多数人编写的要好。
  • 这就像一部你看到人类与恐龙作战的电影。时代不合时宜,USB 是在 32 位操作系统普及之后很久才发明的。从来没有对它的 16 位支持,没有意义。
  • OP的问题很严重。我认为诸如“如果已安装某些软件,您为什么不以某种方式执行”之类的答案。作为汇编程序员,您几乎不会假设已经安装了任何软件,即使该软件是 OS 或 BIOS。假设您正在编写一个 BIOS 模块。

标签: assembly interrupt bios


【解决方案1】:

PC BIOS 中没有任何内容支持 USB I/O,类似于所有其他 I/O(键盘、显示器、串行、并行、磁盘、扬声器)。 USB 来得太晚了。您可以从 BIOS 中获得的唯一与 USB 相关的内容是支持通过 USB 连接的 USB 键盘和存储(您可以在现代 PC 上从它们启动)。除此之外,您必须实现自己的 USB 堆栈。

【讨论】:

  • @Alex 所以我想写我自己的USB堆栈函数只能在保护模式(32位模式)下,对吧?你能给我一些很好的资源来帮助我在保护模式下使用汇编或 C 编程 USB...或者你对我有什么建议 Alex?
  • 它不必处于保护模式,硬件不在乎CPU处于什么模式。我不能提供USB参考,因为我自己不太了解USB。我只能说有一个 USB 标准,您可能可以将它与 Linux USB 代码一起研究,以了解 USB 的工作原理以及应该如何编程。
【解决方案2】:

正如 Alex 所说,没有对 USB 的通用 BIOS 级支持。但是,已经有一些尝试为 USB 设备制作实模式 DOS 驱动程序。我找到了一个页面,其中包含一些您应该可以使用的源代码:http://bretjohnson.us/source/source.htm

【讨论】:

    【解决方案3】:

    根据 GEUB 手册 (http://www.gnu.org/software/grub/manual/html_node/Installing-GRUB-using-grub_002dinstall.html),没有错误的 BIOS 会将 USB 暴露为硬盘驱动器。因此,您可以像普通硬件一样使用硬盘中断(例如 INT 0x13)来探测和访问 USB。 BIOS 对 CDROM 执行相同的操作(请参阅http://wiki.osdev.org/El-Torito 无仿真模式)。我认为 BIOS 将为所有受支持的启动选项执行此操作,但我还没有找到任何支持此操作的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2011-01-08
      相关资源
      最近更新 更多