|
|
1
4
所以我确实找到了一些东西,虽然它不是最优雅的解决方案,而且肯定不适用于任何地方,但它已经在我的硬件上工作了,所以我想我会分享。 首先,您必须从lspci命令中获取sata控制器的地址,如nikolai所示(-d只显示完整的域号):
现在,使用这个地址(0000:00:1f.2),您可以进入/sys。 在/sys/bus/pci/devices中,应列出您的设备:
现在在这个目录中有几个hostx目录。
在其中一个hostx目录中,将有一个targetx:x:x目录。这个targetx:x:x目录将有一个名为x:x:x:x的目录(x是可以变化的数字)。
在x:x:x:x目录中,有一个名为“block:sdx”的链接(其中x是字母)。此SDX是此目录对应的驱动器的名称。
所以/dev/sda对应于0000:00:1f.2处SATA控制器上的主机0。现在,为了找到可以通过inb()和outb()命令与/dev/sda通信的地址,我们在/sys/bus/pci/devices/0000:00:1f.2/中查找名为“resource”的文件。
我们要找的地址是fe00,在第一行。我们需要第一行,因为它是主机0,如果它是主机1,我们将查看第二行,主机2是第三行,依此类推。主机号由前面找到的hostx目录提供。资源文件中的每一行分为3列: 第1列=起始地址 第2列=结束地址 第3列=标志 所以这就是我如何从/dev/sda到0xfe00,以便向设备发送命令。 如果有人知道更好的方法,我会全力以赴… |
|
|
2
1
设备很可能挂在PCI总线上,所以
这显示控制器的PCI配置空间。详情请参见 Linux Device Drivers, Third Edition. Chapter 12: PCI Drivers . 编辑:看看这个 partition and mass-storage naming howto 有关Linux驱动器命名的帮助。 |
|
|
3
1
您是从用户空间程序还是从内核模块访问硬件? 如果您是从用户空间进行的,那么很难找到物理地址信息的原因是没有人以这种方式访问硬件;任何需要接触原始硬件的东西都存在于内核中。
如果您正在编写内核模块,则可以从内核结构中获取地址信息,而不是通过访问
|
|
|
4
1
路径似乎在内核3.10中发生了变化,这就是我如何找到相应的设备节点:
|