在Android 匿名共用記憶體驅動源碼分析中詳細分析了匿名共用記憶體在Linux核心空間的實現,雖然核心空間實現了匿名共用記憶體,但仍然需要在使用者空間為使用者使用匿名共用記憶體提供提供者。Android系統在使用者空間,C++應用程式架構層,Java層分別提供了提供者 本文首先介紹匿名共用記憶體在使用者空間提供的C語言介面,在後續文章中在介紹Android匿名共用記憶體的C++及Java介面,從而全面理解並掌握Android匿名共用記憶體的使用。 1)匿名共用記憶體的建立system\core\libcutils\ashmem-dev.c[java] int ashmem_create_region(const char *name, size_t size) { int fd, ret; //開啟"/dev/ashmem"裝置檔案 fd = open(ASHMEM_DEVICE, O_RDWR); if (fd < 0) return fd; //根據Java空間傳過來的名稱修改裝置檔案名稱 if (name) { char buf[ASHMEM_NAME_LEN]; strlcpy(buf, name, sizeof(buf)); //進入匿名共用記憶體驅動修改匿名共用記憶體名稱 ret = ioctl(fd, ASHMEM_SET_NAME, buf); if (ret < 0) goto error; } ////進入匿名共用記憶體驅動修改匿名共用記憶體大小 ret = ioctl(fd, ASHMEM_SET_SIZE, size); if (ret < 0) goto error; return fd; error: close(fd); return ret; } ASHMEM_DEVICE的宏定義如下:[java] #define ASHMEM_DEVICE "/dev/ashmem" 函數ashmem_create_region首先通過open函數進入匿名共用記憶體驅動開啟/dev/ashmem裝置檔案,開啟過程在Android 匿名共用記憶體驅動源碼分析中已經詳細分析了,就是在匿名共用記憶體初始化過程建立的slab緩衝區ashmem_area_cachep中建立並初始化一個ashmem_area結構體了,接著通過IO命令來修改該ashmem_area結構體的成員name和size,具體設定過程請查看Android 匿名共用記憶體驅動源碼分析。匿名共用記憶體的建立過程可以歸納為以下三個步驟:1. 開啟/dev/ashmem裝置檔案;2. 修改匿名共用記憶體名稱3. 修改匿名共用記憶體大小 2)設定匿名共用記憶體屬性通過Ioctl命令控制系統調用進入核心空間的匿名共用記憶體驅動來設定匿名共用記憶體塊的屬性值,比如設定匿名共用記憶體塊的鎖定與解鎖,設定匿名共用記憶體塊的大小,名稱,保護位等屬性資訊。Android對匿名共用記憶體的這些屬性訪問也提供了相應的C語言介面: 1. 設定匿名共用記憶體的保護位 [java] int ashmem_set_prot_region(int fd, int prot) { return ioctl(fd, ASHMEM_SET_PROT_MASK, prot); } 2.鎖定匿名共用記憶體塊[java] int ashmem_pin_region(int fd, size_t offset, size_t len) { struct ashmem_pin pin = { offset, len }; return ioctl(fd, ASHMEM_PIN, &pin); } 3.解鎖指定匿名共用記憶體塊[java] int ashmem_unpin_region(int fd, size_t offset, size_t len) { struct ashmem_pin pin = { offset, len }; return ioctl(fd, ASHMEM_UNPIN, &pin); } 4.擷取建立的匿名共用記憶體大小[java] int ashmem_get_size_region(int fd) { return ioctl(fd, ASHMEM_GET_SIZE, NULL); } 無論是匿名共用記憶體的屬性設定還是擷取,都是直接使用ioctl系統調用進入匿名共用記憶體驅動中實現的,關於匿名共用記憶體驅動是如何?這些功能的,在Android 匿名共用記憶體驅動源碼分析中有詳細的介紹,這裡就不重複介紹了。這裡我們知道Android提供的匿名共用記憶體C語言介面比較簡單。瞭解了匿名共用記憶體的C語言介面之後也為以後學習匿名共用記憶體的C++介面提供基礎。