用mmap作I/O

 1.   Introduction

   mmap是Linux中一個相對複雜的函數,僅函數的參數就有6個。可是他也是一個十分強大的函數,在文件I/O,進程間通訊,和malloc函數的實現中皆有他的身影。mmap的強大來源於他和進程的地址空間存在十分密切的關係。mmap用於建立一個虛擬內存區域(vm_area_struct)。
   mmap六個參數:addr通常置爲NULL,先按下不表。length表示映射的內存區域的大小。prot是一組標識位,表示映射的內存區的權限,包括(讀,寫,執行,沒法訪問)。flags表示採用怎樣的方式去映射內存區域(私有:MAP_PRIVATE,共享:MAP_SHARED)。fd在文件映射時表示文件描述符。offset表示文件映射時文件的起點。fd和offfset只有在文件映射時,才生效。
表1
 
    mmap支持的映射方式如表2所示,共有四種,包括私有文件映射,共享文件映射,私有匿名映射,共享匿名映射。本節我僅就共享文件映射進行講解。
表2
 
2.  共享文件映射
    共享映射表示多個進程的虛擬地址空間共享(映射到)同一個相應的物理內存中的區域。任何一個進程對虛擬內存區域寫入數據,都會致使相應的文件發生更改。文件映射表示咱們要將一個文件映射到進程的虛擬地址空間中。下面我用一個執行文件拷貝功能的代碼,來說解一下如何去使用共享文件映射。
    文件的拷貝過程共分爲如下幾個步驟:
    1>. 打開源文件,並建立一個目的文件。獲取文件描述符。
 
    2>. 獲取源文件的大小,並設置目的文件的大小和源文件一致。
    開始執行文件的拷貝工做,咱們限制每次最多隻能拷貝1GB數據(其實我是看APUE這麼寫的,嘿嘿)。 由於存在這個限制和咱們使用memcpy函數複製數據,咱們只能屢次mmap。copyed表示已經複製的文件大小。cpsize表示本次映射和拷貝的大小。
 
    3>. 調用mmap函數將源文件和目的文件映射到不一樣的vma,並獲取首地址src_addr和dst_addr。
    4>. 使用memcpy函數執行拷貝操做(src_addr to dst_addr)。
    5>. 調用munmap函數釋放映射的區域。
3. 總結
    今天只是簡單的總結一下如何使用mmap函數去實現文件的拷貝功能,在後續的章節裏,我還會就其餘的映射方式,和內核相關的原理進行講解。
4. 參考
a. Linux系統編程手冊
b. 深刻理解Linux內核
c. 學堂在線Linux分析與應用
相關文章
相關標籤/搜索