我有一個內存映射設備,我需要與它進行通信。我的老闆告訴我可以通過/dev/mem
。我在網上查找並沒有發現任何與之相關的內容。是否有可能做到這一點,或者我的老闆是錯的?與linux中的內存映射設備進行通信
假設您擁有超級用戶權限。
任何幫助表示讚賞。
我有一個內存映射設備,我需要與它進行通信。我的老闆告訴我可以通過/dev/mem
。我在網上查找並沒有發現任何與之相關的內容。是否有可能做到這一點,或者我的老闆是錯的?與linux中的內存映射設備進行通信
假設您擁有超級用戶權限。
任何幫助表示讚賞。
設備節點/dev/mem
可讓您直接訪問系統的物理內存。
您可以在/proc/iomem
找到器件存儲器映射。請注意,也有/dev/ports
及其對應/proc/ioports
。通過/proc
中的文件,您可以確定/dev/mem
中設備內存的映射位置。
使用常規文件操作訪問映射區域(通常,訪問明確限制爲內存映射區域)肯定可以使用/dev/mem
。我不能告訴你這是否是最好的方法。
該文件/dev/mem
有一個man page。這聽起來像你只需打開/dev/mem
並執行常規文件操作來從內存讀取和寫入。您可能會使用系統調用open
打開它,lseek
轉到特定地址,read
或write
可以訪問該地址處的內存。
它看起來像內核源代碼的權力/dev/mem
是在這裏:
您在地址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;
我在網上問了更多問題,它看起來像'mmap'工作的設備需要一個驅動程序。目前沒有一個。在開發驅動程序之前,我需要一些非常簡單的東西是否可以通過直接讀寫'/ dev/mem'來與設備進行通信? – flashburn
@flashburn:無論你需要驅動程序。通過打開/ dev/mem,您正在使用通用的/ dev/mem驅動程序,該驅動程序可以訪問任何內存映射的內容。使用/ dev/mem驅動程序,可以使用讀取,寫入或mmap來訪問內存映射設備。 –
@ChrisDodd我從來沒有做過這種「東西」之前。如何瞭解我的設備如何映射? – flashburn