This commit is contained in:
Ciro Santilli
2017-06-27 21:26:35 +01:00
parent 2df31fe7dc
commit 92002a6822
2 changed files with 56 additions and 2 deletions

View File

@@ -8,5 +8,12 @@ C programs require cross compiling, but give us more control over system calls.
These programs can also be compiled and used on host. These programs can also be compiled and used on host.
1. [myinsmod](myinsmod.c) 1. Standalone
1. [myrmmod](myrmmod.c) 1. [myinsmod](myinsmod.c)
1. [myrmmod](myrmmod.c)
1. [devmem](devmem.c)
1. [init_hello](init_hello.c)
1. Module tests
1. [anonymous_inode](anonymous_inode.c)
1. [poll](poll.c)
1. [ioctl](ioctl.c)

View File

@@ -0,0 +1,47 @@
/*
https://stackoverflow.com/questions/12040303/accessing-physical-address-from-user-space
Sample call:
/phys.out 0 16
Confirm memory from QEMU monitor with:
xp/0 16
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: %s <phys_addr> <len>\n", argv[0]);
return 0;
}
off_t offset = strtoul(argv[1], NULL, 0);
size_t len = strtoul(argv[2], NULL, 0);
size_t pagesize = sysconf(_SC_PAGE_SIZE);
off_t page_base = (offset / pagesize) * pagesize;
off_t page_offset = offset - page_base;
int fd = open("/dev/mem", O_SYNC);
size_t reallen = page_offset + len;
unsigned char *mem = mmap(NULL, reallen, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, page_base);
if (mem == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
for (size_t i = 0; i < len; ++i) {
printf("%02x ", (unsigned int)mem[page_offset + i]);
mem[page_offset + i] = i % 256;
}
puts("");
if (munmap(mem, reallen) == -1) {
perror("munmap");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}