如何获取 AHCI 基地址 (ABAR) ?我怎样才能知道,这是哪个内存地址?我知道,它从 PCI 基地址开始计算,但我也不知道如何获得 PCI 基地址。
问问题
608 次
2 回答
0
我最近想从 AHCI 基地址读取内存。我刚刚找到了三种可以提供帮助的方法。方法 1。你可以通过winring0读取pci基地址。有很多demo可以下载。链接是 链接是http://bbs.aau.cn/forum.php?mod=viewthread&tid=4914。方法2.我只是运行第三个工具(lspci.exe)来读取ahci基地址。
private string getAhciBaseAddress()
{
string output = "";
ProcessStartInfo StartInfo = new ProcessStartInfo();
StartInfo.FileName = @"C:\pciutils-3.2.0\lspci.exe";
StartInfo.Arguments = "-v -s.2";
StartInfo.UseShellExecute = false;
StartInfo.RedirectStandardInput = false;//不重定向输入
StartInfo.RedirectStandardOutput = true; //重定向输出
StartInfo.CreateNoWindow = true; //不创建窗口
StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process myProcess = null;
try
{
myProcess = Process.Start(StartInfo);
while (!myProcess.HasExited)
{
myProcess.WaitForExit(3000);
}
output = myProcess.StandardOutput.ReadToEnd();//读取进程的输出
Console.WriteLine("output==" + output);
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
finally
{
if (myProcess != null) myProcess.Close();
}
string key = "Memory at ";
int index = output.IndexOf(key);
string addressString = "";
int length = IntPtr.Size == 4 ? 8 : 16;
if (index!= -1)
{
addressString = output.Substring(index + +key.Length, length);
}
return addressString;
}
链接是http://blog.csdn.net/shmily453397/article/details/13767599
于 2013-11-12T08:37:34.533 回答
0
AHCI基地址位于AHCI主机控制器的BAR5,也是一个PCI设备。这里的“BAR5”表示PCI配置空间中的偏移量0x27~0x24(DWORD)。要获得这个基地址,s/w 应该发出配置读取周期!
下面是使用汇编语言获取 BAR5 的代码示例(假设 AHCI 主机控制器在总线 3,设备 0,功能 0)
mov eax, 80030024h ; PCI function address
mov dx, 0cf8h ; config address io port
out dx, eax
mov dx, 0cfch ; get data from config data port
in eax, dx ; read DWORD into register eax
也许您应该做的第一件事就是研究 PCI 规范。然后您可以查看以下链接:
于 2013-10-28T09:15:09.140 回答