作者:baby欧米茄 | 来源:互联网 | 2022-10-14 16:46
这个问题的原始目标是
是否已连接设备?
如果已连接,设备是什么?
设备信息是什么?
到目前为止,我了解的是(x86英特尔架构Z370芯片组)
I / O设备可以与IN / OUT指令进行交互。
现代计算机采用PCI Express总线体系结构。可以通过枚举PCI配置空间找到连接的设备。
这将至少覆盖图形卡,磁盘驱动器,键盘和鼠标的设备。
我想做的是
迭代所有I / O端口
检查设备是否存在/连接
查看设备信息
继续枚举PCI Express配置空间
但是,几乎没有涉及I / O端口的文章,而且还不够。
Q1。是否有一些文章或书充分解释了使用IN和OUT指令进行I / O端口交互?
找到的文章是
断刺
http://www.brokenthorn.com/Resources/OSDev7.html
http://www.brokenthorn.com/Resources/OSDev9.html
操作系统开发
https://wiki.osdev.org/I/O_Ports
https://wiki.osdev.org/%228042%22_PS/2_Controller
我之所以需要更详细的文章,是因为我有这样的问题,例如是否插入了2个USB键盘,如果0x60可以访问一个,那么如何访问其他键盘呢?可以通过命令检查启用的设备,但是是否必须先进行设备存在性/连接检查?
Q2。另外,这些端口似乎没有像PCI Configuration Header这样的标准,那么如何处理其他端口?
即使是一小部分的答案,也将不胜感激。
PS也许我想做的是编写位于I / O端口(= I / O设备控制器)<-> I / O设备驱动程序之间的阶段的逻辑。这项工作似乎由ACPICA的ACPI完成。但是我希望自己在集会上自己做。
1> Margaret Blo..:
不,它不是那样工作的。
您的思路是枚举所有设备,而必须枚举所有总线。
如您所知,现代x86中的中央总线是PCI Express。
它与传统PCI向后兼容,这更简单。使用旧式PCI将使您走得很远,但并非一路走到尽头。
在PCI总线上找不到旧式设备,例如8042键盘控制器或8259A PIC。
它们存在于此之前。
某些设备同时在PCI总线和旧版端口地址中,因为这些设备仍将旧版接口与PCI BAR(基址寄存器,它告诉将此接口放在IO地址空间中的位置)一起公开。
例如,对于PCI,过时的ATA控制器,就是这种情况。
通常,无法知道端口后面的设备,您可以检查(探测)该设备是否具有可识别的行为。
但这不是100%安全的。
简单地从所有64KiB端口读取不会让你随时随地,返回值in
被总,这意味着有它在错误的情况下返回无特殊值(遗留原因,它使所有的人对不存在的设备,但是这是一个现有设备可以发送的法律价值)。
这就是为什么没有书的原因。
USB是当今使用的另一种大型总线,同样,您的方法应该以总线为中心。
枚举所有PCI设备,包括USB适配器,枚举总线中的所有USB设备,依此类推。
通常,从中央总线开始,枚举所有设备,找到其他总线适配器(I2C,LPC,SPI,USB等)并相应地处理该总线。
las,您还必须处理影响此枚举过程的旧式设备。
总的来说,我对旧设备的建议是:请尽快处理设备,但不要更早。
拉尔夫·布朗(Ralf Brown)以其中断列表而闻名,但他也有一个非常有用的端口文件(A,B,C,D等)。
问题在于它包含许多x86变体,一开始不容易阅读,但非常详细。
正如fuz所评论的那样,bochs也有它所仿真的设备列表。
每个人都喜欢编写管理所有硬件的软件,但事实是,我们只能编写管理我们了解的硬件的软件。
当您需要设备时,请记录下来有关其自身的信息,并了解其连接方式以及接口。
另一个好的方法是至少阅读您的CPU和芯片组的数据表(例如,Intel的PCH)。
笔记本电脑和类似产品也具有嵌入式控制器,而台式机具有Super IO芯片。
如果可以公开获得的话,也可以找到其数据表。
要查找这些组件以及所有其他组件的IC零件号,您可能需要打开计算机。
在某些站点上,您可能会找到主板的原理图,但仍需要该主板的部件号,而不是其型号名称和编号。
对硬件进行编程很有趣,请不要放弃!