热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

如何从程序集引导加载程序与x86I/O设备进行交互?

如何解决《如何从程序集引导加载程序与x86I/O设备进行交互?》经验,为你挑选了1个好方法。

这个问题的原始目标是

是否已连接设备?

如果已连接,设备是什么?

设备信息是什么?

到目前为止,我了解的是(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零件号,您可能需要打开计算机。
在某些站点上,您可能会找到主板的原理图,但仍需要该主板的部件号,而不是其型号名称和编号。

对硬件进行编程很有趣,请不要放弃!


推荐阅读
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了如何使用Maven高效管理多模块项目,涵盖项目结构设计、依赖管理和构建优化等方面。通过具体的实例和配置说明,帮助开发者更好地理解和应用Maven在复杂项目中的优势。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
author-avatar
baby欧米茄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有