Memory Mapped Files

advertisement
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
Download