Memory Mapped Files Using the Linux mechanism for direct access to device data Typical file access senario • • • • Use open(), lseek(), read(), write(), close() Each involves two privilege-transitions At most 4096 bytes transferred each time Inefficient for non-sequential data access Alternative: use ‘mmap()’ • • • • Take advantage of the paging mechanism Associate virtual addresses with the data Similar to ‘swapping’ or ‘page-cacheing’ Simple standard C programming API: – ‘mmap()’ creates the memory mapping – ‘munmap()’ deletes the memory mapping • Example: look at ‘dump.cpp’ on website Four easy steps • • • • 1) open the file 2) map the file 3) use the file 4) unmap the file and close the file Device memory mapping • • • • Recall our ‘vram.c’ character driver Allowed users to access display memory But lacks efficiency for serious graphics We implement driver ‘mmap()’ method ‘mmap()’ driver-method • Ideas from LDD textbook: Chapter 13 • But also required lots of experimentation • Four steps in the ‘mmap()’ method 1) compute map’s starting-point and length 2) check: cannot map past end-of-memory 3) mark mapped area as ‘non-swappable’ 4) request kernel to set up the page-tables Information from vm_area_struct • • • • • • ‘vm_start’ is starting address in user-space ‘vm_end’ is ending address in user-space ‘vm_pgoff’ is page-offset in device memory ‘vm_page_prot’ is page-protection bitmap ‘vm_flags’ is bitmap of requested attributes ‘EAGAIN’ error-code tells kernel ‘try again’ Comparing execution-times • • • • • • We ccan use our ‘tsc.c’ device-driver Step 1: read and save timestamp counter Step 2: perform our drawing operations Step 3: read and save timestamp counter Step 4: subtract timestamp counter values Step 5: report the number of CPU cycles