2017-07-14 70 views

回答

2

您可以在內部shm共享內存文件系統中創建一個文件。

const char *name = "example"; 
loff_t size = PAGE_SIZE; 
unsigned long flags = 0; 
struct file *filp = shmem_file_setup(name, size, flags); 
/* assert(!IS_ERR(filp)); */ 

該文件實際上並未鏈接,因此名稱不可見。這些標誌可以包括VM_NORESERVE以預先跳過會計,而不是分配頁面時的會計。現在你有一個shmem文件。您可以像這樣映射一個頁面:

struct address_space *mapping = filp->f_mapping; 
pgoff_t index = 0; 
struct page *p = shmem_read_mapping_page(mapping, index); 
/* assert(!IS_ERR(filp)); */ 
void *data = page_to_virt(p); 
memset(data, 0, PAGE_SIZE); 

還有shmem_read_mapping_page_gfp(..., gfp_t)指定如何分配頁面。當你完成它時,不要忘記把頁面放回去。

put_page(p); 

同上的文件。

fput(filp); 
+0

這看起來正是我想要的。謝謝! – qbt937

+0

在這裏使用page_to_virt恰好適用於帶有直接映射的拱形,但完全沒有道理。要做的事情是kmap_atomic。更重要的是,雖然真正的問題是OP想要這樣做的。 –