- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在 x86_64 平台上编写玩具内核。我计划提升我的内核以使用 VGA 和其他设备。到目前为止,我只是将我的玩具内核与键盘和 UART 连接起来。现在我认为它已经足够成熟,可以开始使用一些基本设备了。
但是,我发现很难在早期启动时找到有关 PCI 接口(interface)的文档。我正在寻找关于 linux PCI 驱动程序的文档,但不是我真正需要的东西。我必须自己走。如果 BIOS 将 PCI 空间映射到某个地方,我仍然感到困惑。
谁能解释一下它或指出一些文档。
谢谢
最佳答案
您要做的第一件事是执行 PCI 枚举。基本上有两种方法可以进行 PCI 枚举,基于端口或基于内存映射。基于端口的是较旧的方式,内存映射 PCI 配置空间是随 PCI Express 引入的。基于端口的方法仍然适用于较新的机器,也适用于模拟器/虚拟机以实现向后兼容性。因此,我将在接下来的解释中使用这种方法。这也有效,因为它有点复杂,如果您了解如何进行基于端口的枚举,内存映射枚举将非常简单。我应该补充一点,一些非 PC 兼容的 x86 板不支持基于端口的 PCI 枚举。
要通过端口访问 PCI 配置空间(以执行枚举),您需要了解两个特定端口:
CONFIG_ADDRESS
- 端口 0xCF8
CONFIG_DATA
- 端口 0xCFC
基本上,您要做的是将地址写入 CONFIG_ADDRESS
,然后使用 CONFIG_DATA
读取或写入该地址的值。写入 CONFIG_ADDRESS
的地址格式如下:
31 30 - 24 23 - 16 15 - 11 10 - 8 7 - 2 1 - 0
Enable Bit Reserved Bus Number Device Number Function Number Register Number 00
假设您要使用 CONFIG_DATA
读取或写入值,启用位基本上应始终设置为 1。
假设您希望读取配置中第一个设备的第一个寄存器,您可以执行如下操作:
outl(CONFIG_ADDRESS, 1 << 31);
uint32_t result = inl(CONFIG_DATA)
要确定每个寄存器是什么,您可以查看此表:
因此在前面的示例中,第一个寄存器包含设备 ID 和供应商 ID。
现在您已经知道如何从 PCI 配置空间读取寄存器,您需要知道何时找到设备。基本上,如果第一个寄存器是 0xFFFFFFFF,则没有设备连接到该设备号处的总线。蛮力方法是扫描所有总线和设备,如果找到设备则扫描功能。更复杂的方法将查看第一条总线上第一个设备的 header 类型,以确定需要检查哪些总线。您可以找到有关如何进行更复杂枚举的更多信息 here .
要执行基于内存映射的方法,您需要找到 ACPI 中指定的 MCFG 表(也包含在更简单的 SFI 中)。这将为您提供可用于 PCI 枚举的物理地址。所有内存地址都将是该地址的偏移量。关键区别之一是配置空间已扩展,因此地址位字段与基于端口的枚举位字段不匹配。 PCI Express 的地址使用以下格式:
31 - 28 27 - 20 19 - 15 14 - 12 11 - 8 7 - 2 1 - 0
ZEROS bus number device number function number extended register number register number offset
这是从 MCFG 表中获得的物理地址的偏移量。您可以找到有关 PCI express here 的更多信息.
最后,虽然它是特定于设备的,但您可以从 PCI 配置空间获得的最有用的信息通常是基地址寄存器。这些通常是设备内存映射到的物理地址,假设它是内存映射的,或者是端口地址,假设它是基于端口的。当然中断pin和线也是有用的。
关于linux - 通过玩具内核访问pci空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808895/
当操作系统枚举 PCI 总线时,它会从每个 PCI 设备收集信息。我的问题是,操作系统在哪里存储这些信息?每个操作系统在运行时是否在 RAM 中都有一个 64KB 的数组? 最佳答案 PCI 信息被存
我们正在做一个项目,它的性质有点像拼车,我读到了 PCI 合规性,我知道如果我们处理信用卡或付款,我们必须符合 PCI 合规性我有点模棱两可,我们是否存储我们的司机银行信息例如数据库中的帐号(加密),
我们过去从未传输、处理或存储信用卡信息,因为我们通过 PayPal 完成所有操作,因此我们从不需要符合 PCI 标准。 但是,我们正在推出一个新的在线商店,并通过无缝结账处理信用卡信息而不重定向到 P
我有一个 NIC 卡和一个 HDD,它们都连接在 Linux 机器的 PCIe 插槽上。理想情况下,我希望在不涉及 CPU 或最少涉及 CPU 的情况下将传入数据包传送到 HDD。是否可以像这样沿着
根据 PCI 标准,设备是根据供应商 ID、设备 ID 和总线编号来识别的。所有相同类型的设备都具有相同的供应商 ID 和设备 ID。如果我将两个这样的设备放在同一条总线上,比如总线 0。PCI 软件
我正在查看商家帐户,据我所知,存储送货地址符合 PCI 合规性,这是真的吗?此外,Recurly 的 API 似乎需要 SAQ C 或 SAQ D,我查看了一些示例问题: 配置标准是否包括对防火墙的要
我们进行的某些信用卡处理需要符合 PCI 标准。人们在其他商店是如何做到这一点的? 如何保护您的 SVN? 如何保护构建服务器的安全? 代码如何从开发人员迁移到生产环境? 最佳答案 不是为了转移其他答
我只是想知道如果您存储加密的信用卡号以进行定期计费,PCI 认证级别会是多少。 我计划每年交易量少于 20,000 笔,但我不确定存储的信用卡号码。 最佳答案 如果您确实(确实)需要存储卡号,那么您就
我正在查看商家帐户,据我所知,存储送货地址符合 PCI 合规性,这是真的吗?此外,Recurly 的 API 似乎需要 SAQ C 或 SAQ D,我查看了一些示例问题: 配置标准是否包括对防火墙的要
我知道 PCI 配置空间中的基地址寄存器 (BAR) 定义了 PCI 地址的起始位置,但是该区域的大小是如何确定的? 当然,这是硬件的一个属性,因为只有它知道它可以处理的地址空间有多远。但是,我似乎在
我正在做的是开发一款财务软件,并将其连接到符合 pci 标准的第三方信用卡公司。我们公司是一家加拿大公司。我们不符合 pci,也不打算符合 pci。但我们希望保存 PAN 的后 4 位数字,以帮助一线
我目前正在从事该项目,其功能之一是电子商务,因此我们的系统应负责用户信用卡信息和其他凭证信息的安全性。 我知道任何处理用户支付卡信息的网络服务都应遵循 PCI 合规性(支付卡信息数据安全标准)。作为前
我们需要为基于订阅/定期付款的 SaaS 应用程序存储信用卡的最后 4 位数字(以便让客户知道他们使用了哪张卡?)和到期日期(通知客户他们的卡即将到期)。 PCI DSS 中允许这两种数据存储吗?请引
我正在用 C# 编写一个程序来对许多 Windows XP 工作站执行硬件审核。 我需要确定哪些 PCI 设备是通过主板插槽连接的实际卡 - 而不是也使用 PCI 总线(内置于主板中)的板载设备。 我
在 Linux 中,有没有办法找出哪个 PCI 卡插入哪个 PCI 插槽? /sys/bus/pci/devices/包含许多不是卡的设备(网桥、CPU channel 等),我无法在设备目录中找到有
我们想使用银行 API 从我们的银行账户到用户的银行账户进行 SEPA 转账。为此,用户需要在表格中输入他的 IBAN 和 BIC。我们获取这些数据(受 SSL 保护)并使用银行 REST API 转
我以前从未处理过 PCI 合规性问题。我一直在阅读他们的文档,它说我需要保护信用卡号、到期日期和持卡人的姓名。永远不会存储安全代码。 在他们的文档中,它只是说保护。这是说我需要加密数据库中的这 3 列
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我正在做一个项目,我需要从用户空间通过 PCI BAR0 访问 FPGA 内存。 我以前在旧内核中所做的是打开位于 /sys/bus/pci/devices/my_device/ 中的名为 resou
如果我的 PCI 总线(没有 PCI-PCI 桥)有 3 个设备: spy 设备、发送方 PCI 设备和接收方设备(例如,从 PCI 到 CPU 的桥接器)。 发送方开始向接收方传输数据。 spy 设
我是一名优秀的程序员,十分优秀!