相关疑难解决方法(0)

27
推荐指数
5
解决办法
4万
查看次数

在Linux中将物理地址转换为虚拟地址并读取其内容

我有Linux,我有一个物理地址:(即0x60000000).
我想从用户空间Linux程序中读取此地址.

该地址可能位于内核空间中.

c unix linux security operating-system

24
推荐指数
2
解决办法
4147
查看次数

如何在Linux中刷新地址空间区域的CPU缓存?

我感兴趣的是仅针对地址空间区域刷新缓存(L1,L2和L3),例如从地址A到地址B的所有缓存条目.在Linux中是否存在从用户或内核空间执行此操作的机制?

c linux x86 arm linux-kernel

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

如何在QEMU源代码中添加新设备?

qemu使用QOM方法模拟/添加新设备的步骤方法是什么?

DeviceState/BusState和其他属性的变化是什么以及在哪里?

linux hardware kernel qemu emulation

13
推荐指数
2
解决办法
9030
查看次数

如何使用O_DIRECT将内核空间内存(物理地址)写入文件?

我想为文件写一个物理内存.内存本身不会再被触摸,因此我想O_DIRECT用来获得最佳的写入性能.

我的第一个想法是打开/dev/mem并映射内存并将所有内容写入一个打开的文件O_DIRECT.写调用EFAULT在mmap返回的内存地址上失败().如果我不使用O_DIRECT,它会产生一个memcpy.

#include <cstdint>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <malloc.h>
#include <sys/mman.h>

#define PRINT_ERRNO_REASON(reason)  \
        case reason: { std::cout << #reason << std::endl; } break;

void write_page_aligned_buffer(int out_fd)
{
    const ssize_t PAGE_SIZE = getpagesize();

    void* page_aligned_buffer = memalign(PAGE_SIZE, PAGE_SIZE);
    if(!page_aligned_buffer)
    {
        std::cout << "Could not allocate page aligned buffer." << std::endl;
        return;
    }

    std::cout << "Allocated a buffer …
Run Code Online (Sandbox Code Playgroud)

linux kernel kernel-module dma

12
推荐指数
1
解决办法
1992
查看次数

如何在Linux中解码/ proc/pid/pagemap条目?

我试图破译如何使用/ proc/pid/pagemap来获取给定页面集的物理地址.假设从/ proc/pid/maps,我得到对应堆的虚拟地址afa2d000-afa42000.我的问题是如何使用此信息遍历页面映射文件,并找到对应于地址afa2d000-afa42000的物理页面框架.

/ proc/pid/pagemap条目采用二进制格式.有没有工具可以帮助解析这个文件?

linux linux-kernel memory-address

12
推荐指数
3
解决办法
8243
查看次数

是否有可能在用户空间中在Linux上分配不可缓存的内存块?

我的应用程序中有一堆缓冲区(其中25到30个)相当大(.5mb)并且访问了simulataneousley.更糟糕的是,它们中的数据通常只读取一次,并且经常更新(例如每秒30次).排序非完美缓存使用的完美风暴.

无论如何,我想到如果我可以将一块内存标记为不可缓存,那将会很酷......从理论上讲,这将为缓存中的其他所有内容留出更多空间.

那么,他们是否有办法在Linux中标记为不可缓存的内存块?

linux memory caching

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

我们可以在内核模块中使用virt_to_phys来存储用户空间吗?

我将使用分配用户应用程序中的内存,malloc并将malloc返回的地址通过字符驱动程序接口发送到内核​​模块。

我将get_user_pages_fast在内核模块中使用该内存的页面。

我可以virt_to_phys用来获取所返回的地址吗malloc?有效吗 如果没有,我如何获得正确的物理地址?

我的目的是获取用户空间分配内存的物理地址。我将传输大小限制为页面大小(4KB)。

memory malloc memory-management linux-device-driver linux-kernel

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

如何使用mmap()映射物理内存

我正在尝试访问物理内存地址,0x30000000并且正在尝试使用完成此操作mmap()。当我将此地址映射到虚拟地址指针时,无法从内存中读取正确的值。当我使用调试器(带JTAG的TI Code Composer Studio)查看内存时,可以看到内存中的值,但是我的代码中没有相同的值吗?我使用mmap()正确吗?

off_t          dev_base = 0x30000000;
size_t         ldev = 0x3FFFFFF;
int offset = 0x00;


memfd = open("/dev/mem", O_RDWR | O_SYNC);
mapped_base = (int*)mmap(0, ldev, PROT_READ|PROT_WRITE, MAP_SHARED, memfd, dev_base);

if (mapped_base == MAP_FAILED)
{
    errx(1, "mmap failure");
}

printf("mapped_base = %08p\n", mapped_base);


printf("The value at address [%08p] = %08p\n", offset + ((int)mapped_base), mapped_base[offset/4]);

munmap(mapped_base, ldev);
close(memfd);
Run Code Online (Sandbox Code Playgroud)

linux mmap virtual-memory linux-device-driver

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

读取程序外部的内存而没有段错误

是否可以在不抛出段故障的情况下读取内存地址(真实,非虚拟)?我希望阅读所有实时,使用过的内存地址和日志结果.

c++ memory

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

在 ARM 上的 Linux 中写入和读取内存映射设备寄存器

我正在尝试按照以下步骤在我的 ARM9 (SAM9X25) 上读写寄存器:http ://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3750.html
我结束了使用以下代码:

#include "stdio.h"

#define PIO_WPMR_BANK_D                     0xFFFFFAE4  // PIO Write Protection Mode Register Bank D
#define PIO_PUER_BANK_D                     0xFFFFFA64  // PIO Pull-Up Enable Register Bank D
#define PIO_PUSR_BANK_D                     0xFFFFFA68  // PIO Pull-Up Status Register Bank D

#define MASK_LED7                           0xFFDFFFFF  // LED7 Mask
#define DESABLE_WRITE_PROTECTION_BANK_D     0x50494F00  // Desable write protection Bank D

int main(void) {
    printf("test");
    unsigned int volatile * const register_PIO_WPMR_BANK_D = (unsigned int *) PIO_WPMR_BANK_D;

    unsigned int volatile * const register_PIO_PUSR_BANK_D = (unsigned int *) …
Run Code Online (Sandbox Code Playgroud)

c linux arm cpu-registers gpio

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

SEGMENT_START("text-segment", 0x400000) 代表什么?

我正在学习可执行二进制文件的布局。我的最终目标是分析可以重构(在其源代码中)以减少编译输出大小的特定可执行文件。

我一直在使用https://www.embeddedrelated.com/showarticle/900.phphttps://www.geeksforgeeks.org/memory-layout-of-c-program/作为这个初步学习的参考。

据我所知,链接器脚本指定了放置已编译二进制文件部分的地址。例如

> ld --verbose | grep text
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
Run Code Online (Sandbox Code Playgroud)

我认为这意味着text编译二进制文件的段从内存地址开始0x400000- 真的吗?

这个值0x400000代表什么?我可能没有正确理解某些东西,但肯定0x400000不代表物理内存位置,是吗?例如,如果我跑我的编译的两个实例a.out可并行执行,他们不可能同时占据的空间0x400000,对不对?

linker binaryfiles ld memory-layout binutils

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