经过我理解的一些基础文档后,基地址寄存器是可以通过PCIe IP访问的地址空间.PCIe IP既可以在基地址寄存器中传输数据,也可以将接收到的数据写入其中.
我对吗?或遗漏任何东西?
有没有办法在C++/windows中获取exe/DLL映像基址?谢谢 :)
根据这篇文章,由于代码的JIT编译,.NET程序集不需要变基.文章指出:
"JIT编译的代码没有重定位问题,因为地址是在运行时根据代码放置在内存中的位置生成的.此外,MSIL很少受到基地址丢失的影响,因为MSIL引用是基于令牌的,而不是地址因此,当使用JIT编译器时,系统对基地址冲突具有弹性."
但是,我注意到VS2008为所有程序集分配了默认的0x0400000基址(项目属性>构建>高级),如果我listdlls /r
为我的进程执行了一个操作,那么我的所有.NET程序集实际上都是默认的.
如果我自己分配地址,则不会进行变基.
我的问题是:在这种情况下,什么是重新定义的?为什么?
编辑:我应该补充一点,我不是在谈论NGen'ed集会.
我有一个包含几个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) 在我开始讨论真正的问题之前,我只想说我可能会在这里得到一些错误的细节.如果是这样,请逮捕我,甚至不要回答我的问题.
我的问题基本上是关于DLL和.NET的.我们有一个使用相当多内存的应用程序,我们正试图弄清楚如何正确地测量它,特别是当问题主要发生在客户端的计算机上时.
让我感到震惊的是,我们有一些相当大的.NET程序集和生成的ORM代码.
如果我使用的是具有唯一基址的非托管(Win32)DLL,则同一台计算机上的多个并发进程会将DLL加载到物理内存中,并将其映射到所有应用程序的虚拟内存中.因此,物理内存将用于此DLL一次.
问题是.NET程序集会发生什么.这个DLL包含IL,虽然它的这一部分可能在应用程序之间共享,但是这个IL产生的JITted代码呢?这是共享的吗?如果没有,我如何衡量以解决这个问题实际上是否导致问题?(是的,我知道,它会有所贡献,但我不会花太多时间在这上面,直到这是最大的问题).
另外,我知道我们没有查看解决方案中所有.NET程序集的基址,.NET程序集是否有必要这样做?如果是这样,是否有一些关于如何确定这些地址的指南?
任何对这一领域的见解都是最受欢迎的,即使事实证明这不是一个大问题,甚至根本不是问题.
编辑:刚刚发现这个问题:.NET程序集和DLL rebasing部分回答了我的问题,但我仍然想知道JITted代码如何影响所有这些.
从该问题及其接受的答案看来,JITted代码放在堆上,这意味着每个进程将加载共享二进制程序集映像,并在其自己的内存空间内生成代码的私有JITted副本.
我们有什么方法可以衡量这一点吗?如果这会产生大量代码,我们必须更多地查看生成的代码,以确定是否需要调整它.
编辑:在此处添加了一个较短的问题列表:
@Brian Rasmussen 在这里的答案表明JITting将按照我的预期生成JITted代码的每个进程副本,但是重新组装程序集实际上会减少内存使用量.我将不得不深入研究他提到的WinDbg + SoS工具,我已经在我的列表上停留了一段时间,但现在我怀疑我不能再把它关掉了:)
编辑:我在这个主题上找到的一些链接:
我意识到我的正确版本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
是错的
我希望你能帮助我,因为我找不到任何例子.
编辑:
ReadProcessMemory(readHandle, ((IntPtr)(((baseAddress) + 0x14) + 0x50)), bytes, (UIntPtr)4, ref rw);
Run Code Online (Sandbox Code Playgroud)
在这里,我制作了桌面图像.我真的很困惑,也许有人知道我犯了什么错误. http://i.stack.imgur.com/50lva.jpg
获取指令地址的方法有哪些?我曾经尝试过标记指令并获取标签的地址,但似乎它只适用于带有&&运算符的GCC编译器.(参考:本文)如果有其他编译器怎么办?
对这个问题的任何想法?
我在微软的Spider Solitaire上使用它来测试整个基本/静态指针.所以我得到了玩家使用的"移动"量的基本指针,并且作弊引擎告诉我它是"SpiderSolitaire.exe + B5F78".所以现在我不知道如何弄清楚SpiderSolitaire.exe的起始地址是什么(当然每次程序启动时这都会改变).如何找到SpiderSolitaire.exe的起始地址,以便我可以添加偏移量并获取"移动"值的实际地址(当然是用c ++)?
我想读取一些Cortex-A53寄存器的值,例如
不幸的是,我缺乏一点嵌入式/组装经验。文档显示
访问 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) 我正在尝试制作一个程序来读取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) base-address ×10
c++ ×3
memory ×3
.net ×2
windows ×2
app-config ×1
armv8 ×1
assemblies ×1
c ×1
c# ×1
cortex-a ×1
dll ×1
endpoints ×1
minesweeper ×1
pci ×1
pci-e ×1
process ×1
rebasing ×1
wcf ×1