【问题标题】:Linking symbols to fixed memory addresses in Windows DLL将符号链接到 Windows DLL 中的固定内存地址
【发布时间】:2014-11-18 22:08:44
【问题描述】:

我有一个不寻常的情况,我需要创建一个 DLL,它将一些符号声明为预先确定的内存位置。它是一个嵌入式系统,有一堆模块使用共享内存,总是从同一个位置开始。

C 源文件都包含一堆样板文件,如下所示:

__declspec(dllimport) struct shmem_block {
    unsigned char  dum0000001[4952];                                              
    int            _yallahabibi[1];
} arftest;

为了完成这项工作,我需要编译它并将其与一个声明 arftest 以指向特定内存位置的 DLL 链接。怎样才能创建这样的DLL?使用 C,我可以声明一个指针并使其指向某个位置,但是如何使变量名(符号)指向内存位置?

【问题讨论】:

    标签: windows pointers dll linker embedded


    【解决方案1】:

    由于windows中的内存虚拟化和保护,我相信你必须实现一个设备驱动程序来直接访问物理内存。

    通常将数据对象定位到特定位置需要编译器扩展和链接器支持;因此,如果完全支持,这将是特定于工具链的。

    在一般情况下,您会使用指针而不是实例化对象;例如:

    volatile my_struct* my_object = (my_struct*)0x00008000;
    

    然后通过指针访问数据;例如:

    my_object->some_member = 0x00080 ;
    

    或者,在 C++ 中,您可以使用 placement new

    【讨论】:

    • 感谢您为分享该内容所做的努力,但正如我在问题中所说的那样,指针在这种情况下没有用。我无法更改所有源文件中的样板代码,因此需要指向内存位置而不是指向结构的指针是结构变量 arftest。
    • 恕我直言,您没有明确表示您无法更改代码或指针没有用 - 您只是建议您知道如何设置指针。如果您无法修改代码,则无法更改arftest 的位置,但您不需要这样做。 arftest 对你没用,你感兴趣的是结构 shmem_block;您只需要一个位于适当位置的shmem_block 实例,例如:volatile struct shmem_block* my_shared_memory = (struct shmem_block*)0x00008000 ;
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2021-01-07
    • 2011-02-25
    • 2018-03-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多