在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++接口提供基礎。