linux-device-driver – 查找通过inb()和outb()进行通信的设备基地址

linux-device-driver – 查找通过inb()和outb()进行通信的设备基地址,第1张

概述我正在尝试使用inb(),inw(),outb()和outw()命令与磁盘驱动器通信,以便我可以找到有关驱动器的特定信息.但是,要使用这些命令,我​​需要为设备提供正确的I / O端口.当我有正确的I / O端口时,我可以很容易地找到我正在寻找的信息,但是,我不知道如何在 Linux中找到设备的I / O端口的基地址. 在DOS中,我能够使用Hdat2来查找设备的基地址,但是,我试图在Linux中 我正在尝试使用inb(),inw(),outb()和outw()命令与磁盘驱动器通信,以便我可以找到有关驱动器的特定信息.但是,要使用这些命令,我​​需要为设备提供正确的I / O端口.当我有正确的I / O端口时,我可以很容易地找到我正在寻找的信息,但是,我不知道如何在 Linux中找到设备的I / O端口的基地址.

在DOS中,我能够使用Hdat2来查找设备的基地址,我试图在linux中找到该地址.有没有办法找到哪个设备映射到linux中的哪个I / O端口?

/ proc中有一个名为ioports的文件,其中包含一些信息,但我不知道如何将此信息与特定设备相关联.

任何帮助将不胜感激.谢谢!

解决方法 所以我确实找到了一些东西,虽然它不是最优雅的解决方案,它绝对无法在任何地方工作,它已经在我的硬件上工作,所以我想我会分享.

首先,你必须从像尼古拉所示的lspci命令中获取SATA控制器的地址(-D只显示完整的域号):

# lspci -D...0000:00:1f.2 SATA controller: Intel Corporation 82801IR 6 port SATA AHCI Controller...

现在有了这个地址(0000:00:1f.2),你可以进入/ sys.

在/ sys / bus / pci / devices中,应列出您的设备:

# ls -l /sys/bus/pci/devices...lrwxrwxrwx 1 root root 0 Jan 14 12:35 0000:00:1f.2 -> ../../../devices/pci0000:00/0000:00:1f.2

现在在这个目录中将有几个hostX目录.

# ls -l /sys/bus/pci/devices/0000\:00\:1f.2/...drwxr-xr-x 4 root root    0 Jan 13 12:40 host0drwxr-xr-x 4 root root    0 Jan 13 12:40 host1drwxr-xr-x 3 root root    0 Jan 13 12:40 host2drwxr-xr-x 3 root root    0 Jan 13 12:40 host3drwxr-xr-x 3 root root    0 Jan 13 12:40 host4drwxr-xr-x 4 root root    0 Jan 14 08:21 host5...

在其中一个hostX目录中,将有一个targetX:X:X目录.这个targetX:X:X目录将有一个名为X的目录:X:X:X(X是可以变化的数字).

# ls -R /sys/bus/pci/devices/0000\:00\:1f.2/host0/sys/bus/pci/devices/0000:00:1f.2/host0:power  scsi_host:host0  target0:0:0  uevent/sys/bus/pci/devices/0000:00:1f.2/host0/target0:0:0:0:0:0:0  power  uevent...

在X:X:X:X目录中,有一个名为“block:sdX”的链接(其中X是一个字母).此sdX是此目录对应的驱动器的名称.

# ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host0/target0\:0\:0/0\:0\:0\:0/lrwxrwxrwx 1 root root    0 Jan 14 15:01 block:sda -> ../../../../../../block/sda

所以/ dev / sda对应于SATA控制器上0000:00:1f.2的主机0.现在找到我们可以用来通过inb()和outb()命令与/ dev / sda交谈的地址,我们查看/ sys / bus / pci / devices / 0000:00:1f中名为“resource”的文件0.2 /.

# cat /sys/bus/pci/devices/0000\:00\:1f.2/resource0x000000000000fe00 0x000000000000fe07 0x00000000000001010x000000000000fe10 0x000000000000fe13 0x00000000000001010x000000000000fe20 0x000000000000fe27 0x00000000000001010x000000000000fe30 0x000000000000fe33 0x00000000000001010x000000000000fec0 0x000000000000fedf 0x00000000000001010x00000000ff970000 0x00000000ff9707ff 0x00000000000002000x0000000000000000 0x0000000000000000 0x0000000000000000

我们要寻找的地址是fe00,它位于第一行.我们想要第一行,因为它是主机0,如果它是主机1,我们将查看第二行,主机2看第三行,依此类推.主机号由我们之前找到的hostX目录给出.资源文件中的每一行分为3列:

第1列=起始地址
第2列=结束地址
第3列=标志

所以这就是我从/ dev / sda到0xfe00的方式,以便向设备发送命令.

如果有人知道更好的方法来做到这一点,我全都耳朵……

总结

以上是内存溢出为你收集整理的linux-device-driver – 查找通过inb()和outb()进行通信的设备基地址全部内容,希望文章能够帮你解决linux-device-driver – 查找通过inb()和outb()进行通信的设备基地址所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1025262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存