2016-07-11 81 views
2

我有一個內存映射設備,我需要與它進行通信。我的老闆告訴我可以通過/dev/mem。我在網上查找並沒有發現任何與之相關的內容。是否有可能做到這一點,或者我的老闆是錯的?與linux中的內存映射設備進行通信

假設您擁有超級用戶權限。

任何幫助表示讚賞。

回答

1

設備節點/dev/mem可讓您直接訪問系統的物理內存。

您可以在/proc/iomem找到器件存儲器映射。請注意,也有/dev/ports及其對應/proc/ioports。通過/proc中的文件,您可以確定/dev/mem中設備內存的映射位置。

使用常規文件操作訪問映射區域(通常,訪問明確限制爲內存映射區域)肯定可以使用/dev/mem。我不能告訴你這是否是最好的方法。

0

該文件/dev/mem有一個man page。這聽起來像你只需打開/dev/mem並執行常規文件操作來從內存讀取和寫入。您可能會使用系統調用open打開它,lseek轉到特定地址,readwrite可以訪問該地址處的內存。

它看起來像內核源代碼的權力/dev/mem是在這裏:

http://lxr.free-electrons.com/source/drivers/char/mem.c

2

您在地址MMIO_ADDR其中所佔的字節MMIO_LEN有一個內存映射設備。您需要在設備的地址空間中切換第123個字節。這看起來像這樣:

#define MMIO_ADDR 0xDEAD0000 
#define MMIO_LEN 0x400 

// open a handle into physical memory, requires root 
int memfd = open("/dev/mem", O_RDWR); 
// map the range [MMIO_ADDR, MMIO_ADDR+MMIO_LEN] into your virtual address space 
unsigned char* shmem = mmap(0, MMIO_LEN, PROT_WRITE | PROT_READ, MAP_SHARED, memfd, MMIO_ADDR); 

// do your deed 
unsigned char *magic_toggle_byte = &shmem[123]; 
*magic_toggle_byte = !*magic_toggle_byte; 
+0

我在網上問了更多問題,它看起來像'mmap'工作的設備需要一個驅動程序。目前沒有一個。在開發驅動程序之前,我需要一些非常簡單的東西是否可以通過直接讀寫'/ dev/mem'來與設備進行通信? – flashburn

+1

@flashburn:無論你需要驅動程序。通過打開/ dev/mem,您正在使用通用的/ dev/mem驅動程序,該驅動程序可以訪問任何內存映射的內容。使用/ dev/mem驅動程序,可以使用讀取,寫入或mmap來訪問內存映射設備。 –

+0

@ChrisDodd我從來沒有做過這種「東西」之前。如何瞭解我的設備如何映射? – flashburn

相關問題