Android 匿名共用記憶體C介面分析

來源:互聯網
上載者:User

在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++介面提供基礎。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.