On Thu, 13 Jul 2006, Brian Ford wrote: > On Thu, 13 Jul 2006, Corinna Vinschen wrote: > > I added an (hopefully) appropriate patch, which commits a page within a > > MAP_NORESERVE area when memory in this page is accessed by the > > application. If commiting the memory fails, SIGBUS is generated. Please > > test CVS HEAD or the next developer snapshot from > > http://cygwin.com/snapshots/ > > Wow! Thanks. Given my limited Windows API knowledge, that sounded > difficult to accomplish properly. I'll test it for you shortly.
One problem found. If the memory is not touched before using it as a buffer to a read call, the read returns -1 with errno set to ISDIR. STC attached. Thanks again for looking at this. -- Brian Ford Lead Realtime Software Engineer VITAL - Visual Simulation Systems FlightSafety International the best safety device in any aircraft is a well-trained crew... .
#include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> int main(int argc, char * argv[]) { int virt_size, fd; void *addr; addr = NULL; virt_size = 0x18000000; addr = mmap(addr, virt_size, (PROT_READ|PROT_WRITE), (MAP_NORESERVE|MAP_PRIVATE|MAP_ANON), -1, 0); if (addr == MAP_FAILED) { perror("mapping VM scratch space"); return -1; } fd = open("/proc/self/exe", O_RDONLY); if (fd < 0) { perror("open self"); return -1; } #ifdef PRE_TOUCH memset(addr, -1, sysconf(_SC_PAGESIZE)); #endif if (read(fd, addr, sysconf(_SC_PAGESIZE)) < 0) { perror("read"); close(fd); return -1; } close(fd); return 0; }
-- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/