Tôi có một chương trình đơn giản cố gắng truy cập vào bộ nhớ vật lý trong không gian người dùng, nơi hạt nhân lưu trữ trang cấu trúc đầu tiên. Trên một máy 64 bit địa chỉ này là:Làm thế nào để truy cập mmaped/dev/mem mà không làm đứt hạt nhân Linux?
- kernel địa chỉ ảo: ffffea0000000000
- địa chỉ vật lý: 0000620000000000
Tôi cố gắng để truy cập vào địa chỉ vật lý này thông qua mmap trong không gian sử dụng. Nhưng đoạn mã sau bị treo hạt nhân.
int *addr;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0) {
printf("Error opening file. \n");
close(fd);
return (-1);
}
/* mmap. address of first struct page for 64 bit architectures
* is 0x0000620000000000.
*/
addr = (int *)mmap(0, num*STRUCT_PAGE_SIZE, PROT_READ, MAP_PRIVATE,
fd, 0x0000620000000000);
printf("addr: %p \n",addr);
printf("addr: %d \n",*addr); /* CRASH. */
Giá trị mmap() trả về trong addr là gì? – BjoernD
@BjoernD: Tôi đã thử ở trên trên một x86 32-bit (thay thế bù đắp mmap là 0x01000000); addr = 0xffffffff. Và vâng, nó đổ vỡ tất nhiên về sự dereference. Giải pháp là gì? – kaiwan
0xffffffff == -1 -> mmap() trả về lỗi. Theo trang người đàn ông, lý do cho lỗi được đưa ra trong biến 'errno'. Vì vậy, bạn có thể muốn kiểm tra tat. – BjoernD