标签: base-address

什么是PCIe中的基址寄存器(BAR)?

经过我理解的一些基础文档后,基地址寄存器是可以通过PCIe IP访问的地址空间.PCIe IP既可以在基地址寄存器中传输数据,也可以将接收到的数据写入其中.

我对吗?或遗漏任何东西?

base-address pci pci-e

15
推荐指数
4
解决办法
3万
查看次数

EXE或DLL映像基址

有没有办法在C++/windows中获取exe/DLL映像基址?谢谢 :)

c++ windows base-address portable-executable

14
推荐指数
4
解决办法
3万
查看次数

.NET程序集和DLL rebasing

根据这篇文章,由于代码的JIT编译,.NET程序集不需要变基.文章指出:

"JIT编译的代码没有重定位问题,因为地址是在运行时根据代码放置在内存中的位置生成的.此外,MSIL很少受到基地址丢失的影响,因为MSIL引用是基于令牌的,而不是地址因此,当使用JIT编译器时,系统对基地址冲突具有弹性."

但是,我注意到VS2008为所有程序集分配了默认的0x0400000基址(项目属性>构建>高级),如果我listdlls /r为我的进程执行了一个操作,那么我的所有.NET程序集实际上都是默认的.

如果我自己分配地址,则不会进行变基.

我的问题是:在这种情况下,什么是重新定义的?为什么?

编辑:我应该补充一点,我不是在谈论NGen'ed集会.

.net assemblies base-address rebasing

11
推荐指数
1
解决办法
2869
查看次数

几个WCF服务可以共享一个公共BaseAddress吗?

我有一个包含几个WCF服务的程序集,每个服务都有自己的合同.这一切都很好.app.config中服务的服务配置如下所示:

<services>
  <service behaviorConfiguration="WcfService.AlyzaServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceWebsites">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceWebsites">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/Websites/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="Sam.Alyza.WcfService.LogReaderServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceLogReader">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceLogReader">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/LogReader/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="Sam.Alyza.WcfService.ServiceSystemverwaltungBehavior"
    name="Sam.Alyza.WcfService.ServiceSystemverwaltung">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceSystemverwaltung">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/Systemverwaltung/" />
      </baseAddresses>
    </host>
  </service> …
Run Code Online (Sandbox Code Playgroud)

wcf app-config endpoints base-address

11
推荐指数
1
解决办法
2万
查看次数

DLL,内存映射,基地址,内存使用和.NET?

在我开始讨论真正的问题之前,我只想说我可能会在这里得到一些错误的细节.如果是这样,请逮捕我,甚至不要回答我的问题.

我的问题基本上是关于DLL和.NET的.我们有一个使用相当多内存的应用程序,我们正试图弄清楚如何正确地测量它,特别是当问题主要发生在客户端的计算机上时.

让我感到震惊的是,我们有一些相当大的.NET程序集和生成的ORM代码.

如果我使用的是具有唯一基址的非托管(Win32)DLL,则同一台计算机上的多个并发进程会将DLL加载到物理内存中,并将其映射到所有应用程序的虚拟内存中.因此,物理内存将用于此DLL一次.

问题是.NET程序集会发生什么.这个DLL包含IL,虽然它的这一部分可能在应用程序之间共享,但是这个IL产生的JITted代码呢?这是共享的吗?如果没有,我如何衡量以解决这个问题实际上是否导致问题?(是的,我知道,它会有所贡献,但我不会花太多时间在这上面,直到这是最大的问题).

另外,我知道我们没有查看解决方案中所有.NET程序集的基址,.NET程序集是否有必要这样做?如果是这样,是否有一些关于如何确定这些地址的指南?

任何对这一领域的见解都是最受欢迎的,即使事实证明这不是一个大问题,甚至根本不是问题.


编辑:刚刚发现这个问题:.NET程序集和DLL rebasing部分回答了我的问题,但我仍然想知道JITted代码如何影响所有这些.

从该问题及其接受的答案看来,JITted代码放在堆上,这意味着每个进程将加载共享二进制程序集映像,并在其自己的内存空间内生成代码的私有JITted副本.

我们有什么方法可以衡量这一点吗?如果这会产生大量代码,我们必须更多地查看生成的代码,以确定是否需要调整它.


编辑:在此处添加了一个较短的问题列表:

  1. 是否有任何意义确保.NET程序集的基址是唯一且不重叠的,以避免重新定义一个主要用于从JIT中获取IL代码的dll?
  2. 我如何测量JITted代码使用多少内存来确定这是否真的是一个问题?

@Brian Rasmussen 在这里的答案表明JITting将按照我的预期生成JITted代码的每个进程副本,但是重新组装程序集实际上会减少内存使用量.我将不得不深入研究他提到的WinDbg + SoS工具,我已经在我的列表上停留了一段时间,但现在我怀疑我不能再把它关掉了:)


编辑:我在这个主题上找到的一些链接:

.net memory dll base-address

10
推荐指数
1
解决办法
4285
查看次数

找到正确的baseaddress

我意识到我的正确版本baseaddress是错误的

Process[] iexp = Process.GetProcessesByName("Solitaire");
if (iexp.Length == 0) {
    //EXIT
}
Process internet = iexp[0];
uint baseAddress = (uint)internet.MainModule.BaseAddress.ToInt64();
Run Code Online (Sandbox Code Playgroud)

但这baseaddress是错的

我也看了MSDN,这段代码非常奇怪,给了我一个无限循环.

我希望你能帮助我,因为我找不到任何例子.

编辑:

 ReadProcessMemory(readHandle, ((IntPtr)(((baseAddress) + 0x14) + 0x50)), bytes, (UIntPtr)4, ref rw);
Run Code Online (Sandbox Code Playgroud)

在这里,我制作了桌面图像.我真的很困惑,也许有人知道我犯了什么错误. http://i.stack.imgur.com/50lva.jpg

c# memory base-address

7
推荐指数
1
解决办法
3566
查看次数

获取C/C++中的指令地址

获取指令地址的方法有哪些?我曾经尝试过标记指令并获取标签的地址,但似乎它只适用于带有&&运算符的GCC编译器.(参考:本文)如果有其他编译器怎么办?

对这个问题的任何想法?

c base-address

7
推荐指数
1
解决办法
4026
查看次数

如何在C++中获取进程的起始/基址?

我在微软的Spider Solitaire上使用它来测试整个基本/静态指针.所以我得到了玩家使用的"移动"量的基本指针,并且作弊引擎告诉我它是"SpiderSolitaire.exe + B5F78".所以现在我不知道如何弄清楚SpiderSolitaire.exe的起始地址是什么(当然每次程序启动时这都会改变).如何找到SpiderSolitaire.exe的起始地址,以便我可以添加偏移量并获取"移动"值的实际地址(当然是用c ++)?

c++ memory windows process base-address

6
推荐指数
2
解决办法
3万
查看次数

从 GNU/Linux shell 中使用 devmem 读取 Armv8-A 寄存器

我想读取一些Cortex-A53寄存器的值,例如

  • D_AA64ISAR0_EL1 (AArch64)
  • ID_ISAR5 (Aarch32)
  • ID_ISAR5_EL1 (Aarch64)

不幸的是,我缺乏一点嵌入式/组装经验。文档显示

访问 ID_AA64ISAR0_EL1: MRS 、 ID_AA64ISAR0_EL1 ;将ID_AA64ISAR0_EL1读入Xt ID_AA64ISAR0_EL1[31:0]可以通过内部存储器映射接口和外部调试接口访问,偏移量0xD30。

我决定在我的目标上使用 devmem2(因为 busybox 不包含 devmem 小程序)。以下读取寄存器的过程是否正确?

devmem2 0xD30
Run Code Online (Sandbox Code Playgroud)

我不确定的部分是使用“偏移量”作为直接物理地址。如果它是实际地址,为什么要调用“offset”而不是“address”。如果是偏移量,基地址是多少?我 99% 确定这不是正确的过程,但我如何知道要添加偏移量的基地址?我搜索了Armv8技术参考手册和A53 MPCore文档没有结果。详细解释了寄存器内容,但似乎假设您使用标签 ID_AA64ISAR0_EL1 从 ASM 读取它们。

更新:

我找到了这个:

配置基地址寄存器,EL1 CBAR_EL1 的特性包括: 用途 保存内存映射 GIC CPU 接口寄存器的物理基地址。

但它只是重复了我的问题,如何读取另一个寄存器?

更新 2: 第一个更新似乎仅与 GIC 相关,与我试图读取的配置寄存器无关(我认为我误解了信息)。

对于手头的具体问题(检查加密扩展可用性),人们可以简单地 cat /proc/cpuinfo 并查找 aes/sha 等。

更新3:

我现在正在调查http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0176c/ar01s04s01.html,以及 SoC 特定的基地址,因此可以在SoC 的参考手册。

更新4:

感谢这个很好的答案,我似乎能够通过我的内核模块读取数据:

[ 4943.461948] ID_AA64ISA_EL1 : 0x11120
[ 4943.465775] ID_ISAR5_EL1     : 0x11121
Run Code Online (Sandbox Code Playgroud)

PS: 这篇文章非常有见地,再次感谢!

更新5: 根据要求源代码:

/******************************************************************************
 *
 *   Copyright …
Run Code Online (Sandbox Code Playgroud)

cpu-registers base-address memory-mapping cortex-a armv8

5
推荐指数
1
解决办法
2320
查看次数

获取进程的基本地址

我正在尝试制作一个程序来读取Minesweeper的计时器值.(操作系统是Windows 7 64位)

使用作弊引擎我找到了变量的基地址,但每次运行扫雷时它都会改变.

我需要做什么才能自动找到基地址?

它与可执行基地址有关吗?

这是我的代码:

#include <windows.h>
#include <iostream>
using namespace std;



int main()
{
    DWORD baseAddress = 0xFF1DAA38;//always changing
    DWORD offset1 = 0x18;
    DWORD offset2 = 0x20;
    DWORD pAddress1;
    DWORD pAddress2;

    float value = 0;
    DWORD pid;
    HWND hwnd;

    hwnd = FindWindow(NULL,"Minesweeper");
    if(!hwnd)//didn't find the window
    {
        cout <<"Window not found!\n";
        cin.get();
    }
    else
    {
        GetWindowThreadProcessId(hwnd,&pid);
        HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);//get permission to read
        if(!phandle)//failed to get permission
        {
            cout <<"Could not get handle!\n";
            cin.get();
        }
        else
        { …
Run Code Online (Sandbox Code Playgroud)

c++ readprocessmemory base-address minesweeper

4
推荐指数
1
解决办法
9216
查看次数