android匿名共享內(nèi)存Ashmem(c庫接口)

Ashmem

Android系統(tǒng)的匿名共享內(nèi)存Ashmem驅(qū)動(dòng)程序利用了Linux的共享內(nèi)存子系統(tǒng)導(dǎo)出的接口來實(shí)現(xiàn)输玷。

在Android系統(tǒng)中蹋嵌,匿名共享內(nèi)存也是進(jìn)程間通信方式的一種。

相比于malloc和anonymous/named mmap等傳統(tǒng)的內(nèi)存分配機(jī)制耍攘,Ashmem的優(yōu)勢是通過內(nèi)核驅(qū)動(dòng)提供了輔助內(nèi)核的內(nèi)存回收算法機(jī)制(pin/unpin)。

內(nèi)存回收算法機(jī)制就是當(dāng)你使用Ashmem分配了一塊內(nèi)存,但是其中某些部分卻不會被使用時(shí)藏杖,那么就可以將這塊內(nèi)存unpin掉。

unpin后脉顿,內(nèi)核可以將它對應(yīng)的物理頁面回收蝌麸,以作他用。你也不用擔(dān)心進(jìn)程無法對unpin掉的內(nèi)存進(jìn)行再次訪問艾疟,因?yàn)榛厥蘸蟮膬?nèi)存還可以再次被獲得(通過缺頁handler)来吩,因?yàn)閡npin操作并不會改變已經(jīng) mmap的地址空間。

android匿名共享內(nèi)存接口

源碼是最好的老師蔽莱,廢話不多說弟疆,直接看代碼。

源碼路徑:system/core/libcutils/ashmem-dev.c

android源碼中盗冷,ashmem的實(shí)現(xiàn):
打開共享內(nèi)存:


/*
 * ashmem_create_region - creates a new ashmem region and returns the file
 * descriptor, or <0 on error
 *
 * `name' is an optional label to give the region (visible in /proc/pid/maps)
 * `size' is the size of the region, in page-aligned bytes
 */

int ashmem_create_region(const char *name, size_t size)
{
    int ret, save_errno;
    
    int fd = __ashmem_open();
    if (fd < 0) {
        return fd;
    }
    
    if (name) {
        char buf[ASHMEM_NAME_LEN] = {0};
        
        strlcpy(buf, name, sizeof(buf));
        ret = TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_SET_NAME, buf));
        if (ret < 0) {
            goto error;
        }
    }
    
    ret = TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_SET_SIZE, size));
    if (ret < 0) {
        goto error;
    }
    
    return fd;

error:
    save_errno = errno;
    close(fd);
    errno = save_errno;
    return ret;
}

在函數(shù)中調(diào)用驅(qū)動(dòng)接口:

__ashmem_open

__ashmem_open函數(shù)的實(shí)現(xiàn)如下:

/* logistics of getting file descriptor for ashmem */
static int __ashmem_open_locked()
{
    int ret;
    struct stat st;

    int fd = TEMP_FAILURE_RETRY(open(ASHMEM_DEVICE, O_RDWR));
    if (fd < 0) {
        return fd;
    }

    ret = TEMP_FAILURE_RETRY(fstat(fd, &st));
    if (ret < 0) {
        int save_errno = errno;
        close(fd);
        errno = save_errno;
        return ret;
    }
    if (!S_ISCHR(st.st_mode) || !st.st_rdev) {
        close(fd);
        errno = ENOTTY;
        return -1;
    }

    __ashmem_rdev = st.st_rdev;
    return fd;
}

static int __ashmem_open()
{
    int fd;

    pthread_mutex_lock(&__ashmem_lock);
    fd = __ashmem_open_locked();
    pthread_mutex_unlock(&__ashmem_lock);

    return fd;
}

可見函數(shù)最后是通過open去操作ashmem驅(qū)動(dòng)文件怠苔。
返回為一個(gè)文件描述符。

int ashmem_valid(int fd) 
{
    return __ashmem_is_ashmem(fd, 0) >= 0;
}

除此之外仪糖,源碼中還提供了幾個(gè)接口函數(shù):

1. 鎖定匿名共享內(nèi)存塊

int ashmem_pin_region(int fd, size_t offset, size_t len)
{
    struct ashmem_pin pin = { offset, len };

    int ret = __ashmem_is_ashmem(fd, 1);
    if (ret < 0) {
        return ret;
    }

    return TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_PIN, &pin));
}

2. 解鎖匿名共享內(nèi)存塊

int ashmem_unpin_region(int fd, size_t offset, size_t len)
{
    struct ashmem_pin pin = { offset, len };

    int ret = __ashmem_is_ashmem(fd, 1);
    if (ret < 0) {
        return ret;
    }

    return TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_UNPIN, &pin));
}

3. 獲取大小

int ashmem_get_size_region(int fd)
{
    int ret = __ashmem_is_ashmem(fd, 1);
    if (ret < 0) {
        return ret;
    }

    return TEMP_FAILURE_RETRY(ioctl(fd, ASHMEM_GET_SIZE, NULL));
}


因?yàn)槭俏募枋龇趟荆躁P(guān)閉直接采用close.

close(fd)

使用例子

創(chuàng)建共享內(nèi)存

fd = ashmem_create_region(NULL,length);
if(fd < 0)
    printf("Creating code cache, ashmem_create_region error.");          

將共享內(nèi)存映射到用戶空間

data = (char *)mmap(NULL, data.length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 
if(data != MAP_FAILED){
    printf("mmap sharemem success....");
    memcpy(data.data,gucDotBuffer,length);
}else{
    printf("mmap sharemem failed....'%s'",strerror(errno));
}

關(guān)閉映射并關(guān)閉共享內(nèi)存文件

munmap(data,length);
close(fd);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市乓诽,隨后出現(xiàn)的幾起案子帜羊,更是在濱河造成了極大的恐慌,老刑警劉巖鸠天,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讼育,死亡現(xiàn)場離奇詭異,居然都是意外死亡稠集,警方通過查閱死者的電腦和手機(jī)奶段,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剥纷,“玉大人痹籍,你說我怎么就攤上這事』扌” “怎么了蹲缠?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵棺克,是天一觀的道長。 經(jīng)常有香客問我线定,道長娜谊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任斤讥,我火速辦了婚禮纱皆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芭商。我一直安慰自己派草,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布铛楣。 她就那樣靜靜地躺著近迁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛉艾。 梳的紋絲不亂的頭發(fā)上钳踊,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音勿侯,去河邊找鬼。 笑死缴罗,一個(gè)胖子當(dāng)著我的面吹牛助琐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播面氓,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼兵钮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舌界?” 一聲冷哼從身側(cè)響起掘譬,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呻拌,沒想到半個(gè)月后葱轩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藐握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年靴拱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猾普。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袜炕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出初家,到底是詐尸還是另有隱情偎窘,我是刑警寧澤乌助,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站陌知,受9級特大地震影響眷茁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纵诞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一上祈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浙芙,春花似錦登刺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至南窗,卻和暖如春揍很,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背万伤。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工窒悔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敌买。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓简珠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虹钮。 傳聞我的和親對象是個(gè)殘疾皇子聋庵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料芙粱? 從這篇文章中你...
    hw1212閱讀 12,704評論 2 59
  • 閱讀之前祭玉,不妨先思考一個(gè)問題,在Android系統(tǒng)中春畔,APP端View視圖的數(shù)據(jù)是如何傳遞SurfaceFling...
    看書的小蝸牛閱讀 62,834評論 31 159
  • 人心到底有多惡毒脱货,細(xì)思極恐。 知乎上看到一句話:如果看書(《惡意》)的時(shí)候不知道后面會有多少頁會更爽拐迁。 ...
    風(fēng)繼續(xù)吹SH閱讀 499評論 0 0
  • 《紅樓夢》這部巨著被后人稱之為百科全書蹭劈,它包括了詩詞歌賦、琴棋書畫线召、醫(yī)療烹飪铺韧、園林建筑、服飾收藏缓淹、社會風(fēng)俗等等哈打,當(dāng)...
    jasmine南京閱讀 1,044評論 0 1
  • 不知從何時(shí)起塔逃,內(nèi)心變得異常柔弱、易感料仗,仿佛被剝了殼的蝸牛湾盗,不堪一觸...... 周末,姐妹們相約去賞花立轧,本來是興致...
    若素約時(shí)光閱讀 589評論 0 1