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

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


推荐阅读
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • 解决MacOS Catalina升级后VMware Fusion黑屏问题的详细指南
    本文深入探讨了如何在MacOS Catalina升级后解决VMware Fusion黑屏的问题。通过详细的步骤和代码示例,帮助用户快速恢复虚拟机的正常运行,并提供了额外的安全建议。适用于希望提升工作效率或学习新技术的读者。 ... [详细]
  • 深入理解 JMeter 定时器
    本文详细介绍了JMeter中定时器的功能和使用方法,探讨了其在性能测试中的重要性,并结合实际案例解释了如何合理配置定时器以模拟真实的用户行为。文章还涵盖了定时器的执行顺序及其与其他元件的相互作用。 ... [详细]
  • 变量名 'name' 是否具有特殊含义?
    探讨变量名 'name' 在编程中的特殊性及其使用场景,解析其背后的技术原理。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文介绍如何在 Visual Studio Code 中使用 Jupyter Notebook 插件,包括创建、编辑和运行笔记本的基本操作。 ... [详细]
  • 724. 寻找数组的中轴索引
    给定一个整数数组 `nums`,编写一个方法返回该数组的“中轴”索引。定义中轴索引为该索引左侧所有数字之和等于右侧所有数字之和的索引。如果不存在这样的索引,则返回 -1。如果有多个中轴索引,返回最左边的一个。 ... [详细]
  • 本文详细介绍如何通过设置SSH密钥来获取连接GitHub远程仓库的权限,包括生成密钥、添加到GitHub账户以及验证连接等步骤。 ... [详细]
  • 近期我们开发了一款包含天气预报功能的万年历应用,为了满足这一需求,团队花费数日时间精心打造并测试了一个稳定可靠的天气API接口,现正式对外开放。 ... [详细]
  • 如何在SQL Server 2008中通过Profiler跟踪特定数据库及获取客户端信息
    本文介绍如何利用SQL Server Profiler工具来监控特定数据库的操作,并获取执行这些操作的客户端计算机名和账户名。步骤包括创建新的跟踪、配置跟踪属性以及设置列筛选器以精确过滤数据。 ... [详细]
  • cJinja:C++编写的轻量级HTML模板引擎
    本文介绍了cJinja,这是一个用C++编写的轻量级HTML模板解析库。它利用ejson来处理模板中的数据替换(即上下文),其语法与Django Jinja非常相似,功能强大且易于学习。 ... [详细]
  • 本文探讨了C#语言中类的嵌套使用,特别是当嵌套类作为方法参数时,其内部状态是否会因方法调用而发生改变的问题。通过实例分析,详细说明了引用类型在不同情况下的行为。 ... [详细]
  • 如何从python读取sql[mysql基础教程]
    从python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pa ... [详细]
  • 深入解析:OpenShift Origin环境下的Kubernetes Spark Operator
    本文探讨了如何在OpenShift Origin平台上利用Kubernetes Spark Operator来管理和部署Apache Spark集群与应用。作为Radanalytics.io项目的一部分,这一开源工具为大数据处理提供了强大的支持。 ... [详细]
  • JavaScript 动态向 HTML 添加内容的方法
    本文介绍了使用 JavaScript 的 insertAdjacentHTML 和 insertAdjacentText 方法动态向 HTML 页面中添加内容或文本的技术。这些方法允许开发者根据指定的位置精确地插入新的 HTML 或纯文本。 ... [详细]
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社区 版权所有