通過/dev/mem操作物理內存


  /dev/mem設備可以用來訪問物理內存。下面一段應用程序的代碼,實現了通過/dev/mem對物理內存空間中SRAM1的訪問。

#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

#define SRAM1_ADDR  0x10000000

struct test_data {
        int32_t val;
};

int main(void)
{
        struct test_data *data;
        int ret = 0;
        void *base;
        int fd;

        fd = open("/dev/mem", O_RDWR | O_SYNC);
        if (fd == -1) {
                printf("failed to open /dev/mem!");
                return -1;
        }

        base = mmap(NULL, sizeof(struct test_data), PROT_READ | PROT_WRITE,
                    MAP_SHARED, fd, SRAM1_ADDR);
        if (base == MAP_FAILED) {
                printf("failed to mmap /dev/mem!");
                ret = -1;
                goto err_mmap;
        }

        data = (struct test_data *)base;

        printf("data value: %x\n", data->val);
        data->val = 0x12345678;
        printf("write: %x\n", data->val);

        if (munmap(base, sizeof(struct test_data)) == -1) {
                printf("failed to munmap /dev/mem!");
                ret = -1;
        }

err_mmap:
        close(fd);
        return ret;
}

  可以通過devmem命令驗證該程序。通過devmem預先把data設置成0xffffffff,然后用該程序把0x12345678寫入data,最后用devmem再讀取驗證。

# devmem2 0x10000000 w 0xffffffff
/dev/mem opened.
Memory mapped at address 0xb6f36000.
Value at address 0x10000000 (0xb6f36000): 0x11111111
Written 0xFFFFFFFF; readback 0xFFFFFFFF

# ./a.out
data value: ffffffff
write: 12345678

# devmem2 0x10000000
/dev/mem opened.
Memory mapped at address 0xb6f15000.
Value at address 0x10000000 (0xb6f15000): 0x12345678

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM