linux 記憶體對映2 核心 使用者程序間通訊

2021-04-13 05:05:39 字數 1902 閱讀 4586

1、register_chrdev() 函式註冊字元裝置:

if (register_chrdev(major_num, " gobalvar ", &gobalvar_fops))

else

其中,register_chrdev函式中的引數major_num為主裝置號,"gobalvar"為裝置名,gobalvar_fops為包含基本函式入口點的結構體,型別為file_operations。當gobalvar模組被載入時,gobalvar_init被執行,它將呼叫核心函式 register_chrdev,把驅動程式的基本入口點指標存放在核心的字元裝置位址表中,在使用者程序對該裝置執行系統呼叫時提供入口位址。

2、virt_to_phys、ioremap被定義為乙個marco,其原型為__ioremap,所以在編譯時要加選項   -o1(或-o2).

3、int remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long size,

pgprot_t prot)

其中from是對映開始的虛擬位址。這個函式為虛擬位址空間from和from+size之間的範圍構栽 頁表;

phys_addr是虛擬位址應該對映到的實體地址;size是被對映區域的大小;prot是保護標誌

//巨集module_parm(var,type) 用於向模組傳遞命令列引數。

//var為接受引數值的變數名,type為採取如下格式的字串[min[-max]]。

//min及max 用於表示當引數為陣列型別時,允許輸入的陣列元素的個數範圍;

//b:byte;h:short;i:int;l:long;s:string。

//如果為module_parm(myintarray, "4i"),那麼表示陣列的最大長度為4

module_parm(mem_start, "i");   

module_parm(mem_size, "i");

static int mem_start = 201, mem_size = 10;

static char *reserve_virt_addr;

static int major;

static struct file_operations mmapdrv_fops = ;

int init_module(void)

printk("mmap device major = %d/n", major);

printk("high memory physical address 0x%ldm/n", virt_to_phys(high_memory)

/1024/ 1024);

reserve_virt_addr = ioremap(mem_start *1024* 1024, mem_size*1024* 1024 );

if (reserve_virt_addr)

} else

return 0;

}/* remove the module */

void cleanup_module(void)

int mmapdrv_open(struct inode *inode, struct file *file)

int mmapdrv_close(struct inode *inode, struct file *file)

int mmapdrv_release(struct inode *inode, struct file *file)

int mmapdrv_mmap(struct file *file, struct vm_area_struct *vma)

offset = offset + mem_start * 1024* 1024;

在系統能夠啟動的時候自動的做了預留空間,並且在使用者使用mmap時可以對映到使用者空間

Windows核心程式設計 記憶體對映檔案(2)

2.對映到記憶體的資料檔案 這種方法最大的優點是讓系統為我們處理所有與檔案快取有關的操作,我們不必關心分配記憶體 把檔案中的資料載入記憶體,把資料 寫回檔案 以及釋放記憶體等操作,不過如果 操作過程被打斷,比如斷電,資料可能被破壞。要使用記憶體對映檔案,需執行以下步驟 1 建立或開啟乙個檔案核心物件...

Linux記憶體對映

使用記憶體對映處理大檔案很方便,在windows系統中,實現了這樣的藉口。在linux中我們也可以通過mmap函式來實現。以下內容完全參考自 如有冒犯,請諒解 mmap函式實現把乙個檔案對映到乙個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read write也要快上許多。在某些時...

Linux記憶體對映

本文討論的linux版本是linux 2.6.26.5,體系結構是smdk2410,採用arm s3c2410。在該版本中虛擬位址是32位位址,採用四級頁表結構,依次是 pgd pud pmd pte offset page shift pmd shift pud shift pgdir shift...