Article View: gmane.linux.kernel
Article #307702mmap (2) vs read (2)
From: "Linh Dang"
Date: Sat, 17 Sep 2005 12:10
Date: Sat, 17 Sep 2005 12:10
78 lines
1874 bytes
1874 bytes
Hi, how come reading memory from /dev/mem using pread(2) or mmap(2) will give diffent results? I run the little prog below 10 times and it always give the following results # for i in `seq 1 10`; do ./bar 0x4000000 ; done 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 04000000: 00000000 pread(04000000): 00cc7d83 thanx ----------------------------------- bar.c --------------------------------- #include <unistd.h> #include <stdio.h> #include <inttypes.h> #include <sys/types.h> #include <sys/mman.h> #include <fcntl.h> #include <errno.h> int main(int argc, char** argv) { uint32_t *addr, item; uint32_t offset, val; int fd, update = 0; if (argc < 2) return 1; offset = strtoul(argv[1], NULL, 0); if (argc > 2) { val = strtoul(argv[2], NULL, 0); update = 1; } fd = open("/dev/mem", O_RDWR, 0666); addr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, 0x8080|MAP_SHARED, fd, offset); if (addr) { printf("%8.8x: %8.8x", offset, *addr); if (update) { *addr = val; msync(addr, 4096, MS_SYNC); printf("-> %8.8x\n", *addr); } else printf("\n"); pread(fd, &item, sizeof(item), offset); printf("pread(%8.8x): %8.8x\n", offset, item); munmap(addr, 4096); } close(fd); }
Message-ID:
<wn58xxvhdz8.fsf@linhd-2.ca.nortel.com>
Path:
gmane.pugleaf.net!archive.newsdeef.eu!archive!g.newsdeef.eu!gmane.newsdeef.eu!news.gmane.org!not-for-mail