Io 操作系统内核如何定义所有的输入和输出?

Io 操作系统内核如何定义所有的输入和输出?,io,operating-system,kernel,Io,Operating System,Kernel,我想知道操作系统内核如何定义自己的输入和输出,以使计算机运行。当然,您需要合适的硬件才能让它工作,但您如何简单地创建一些变量并将其称为USB\u PORT\u 1或其他什么呢?它是否也与固件有关?分配任意值本身没有任何作用,因此当您将1 TB的HDD插入USB 3.0插槽时,硬件和软件之间的交互肯定缺少一些东西,该插槽由内核标记为USB3\u PORT\u 0。在这一点上,固件中显然有一些东西在进行,那么它是什么呢 原因:我正在做一个。要真正理解硬件和软件之间的相互作用,你必须理解事物如何在低水

我想知道操作系统内核如何定义自己的输入和输出,以使计算机运行。当然,您需要合适的硬件才能让它工作,但您如何简单地创建一些变量并将其称为
USB\u PORT\u 1
或其他什么呢?它是否也与固件有关?分配任意值本身没有任何作用,因此当您将1 TB的HDD插入USB 3.0插槽时,硬件和软件之间的交互肯定缺少一些东西,该插槽由内核标记为
USB3\u PORT\u 0
。在这一点上,固件中显然有一些东西在进行,那么它是什么呢


原因:我正在做一个。

要真正理解硬件和软件之间的相互作用,你必须理解事物如何在低水平上工作。什么是变量?在编程语言中,变量可以被赋值,以后可以修改,等等。但是这些变量在机器中的物理存储位置是什么?事实上,它可以储存在几个地方。它可能在处理器的某个寄存器中,也可能在RAM中,或者可能在完全不同的位置

当内核希望与硬件通信时,有时它可能会通过您称之为固件的方式进行通信,但在大多数情况下并不需要这样做。硬件以多种方式向内核暴露自己,但最简单的方式是将其视为RAM。RAM可以通过地址访问,所以0x1000是RAM中某个地方的内存地址。一般来说,没有理由必须将任何特定地址映射到RAM。假设我有一个USB控制器。我可以将一些地址(我们称之为0xDEADBEEF)映射到此内存控制器。因此,如果我阅读0xDEADBEEF,它可能会告诉我有多少设备连接到系统。另一个相邻的地址可能会告诉我哪个端口,等等。每个设备都有不同的操作方式,因此我们有设备驱动程序来告诉内核如何访问设备,然后内核就不必担心特定的内存地址或任何事情,它只需将所有内容抽象为一种称为“USB3_port_0”的东西内核和软件只是使用它来引用设备,设备驱动程序将其转换为一组通过内存进行的访问,包括中断等


我不可能列举出硬件和软件可以交互的方式,但是这应该能让你了解如何进行交互。

检查这是否能帮助你--->当我说
USB3\u PORT\u 0
或类似的话时,我可能不是很宽泛。我的意思是一般来说,比如说。。。键盘输入、硬盘上的位置、处理器中的寄存器、处理器中的内核、当前信息传输到哪条总线等等。。。我想你现在明白了;我的问题比你可能意识到的要广泛得多。@karimRaslan阅读计算机体系结构没有任何意义,但是查找驱动程序如何与内核接口并没有浪费时间。这与JNI(Java本机接口)类似吗?