漂亮人妻洗澡被公强啪啪_中文字幕AV人妻少妇一区二区_亚洲日韩精品欧美一区二区一_中文字幕亚洲乱码熟女一区二区

分(fen)享到:

西安雁塔兆隆計算機培訓中心西安軟件開發,西安java培訓,全國領先的軟件開發培訓

聯系資料

西安雁塔兆隆計算機培訓中心
所在地區:
陜西省 西安市
公司主頁:
暫無
電話號碼:
029-*******
傳真號碼:
暫無
聯 系 人:
王老師
移動電話:
1592*******
電子郵箱:
暫無

北大青鳥西安兆隆:Android Pmem

發(fa)布于:2012年12月31日 來源:springcrossstitch.cn
[摘要]Pmem是Android系統里面的內存管理。PMEM用于向用戶空間提供連續的物理內存區域,DSP和某些設備只能工作在連續的物理內存上。我們的Display和B2R2需要連續的內存區域。所以我們和PMEM打交道會很多的。 我們看到resolve_buf的函數。這個函數是為了解析B2R2傳

Pmem是系(xi)統里面的(de)(de)內存(cun)(cun)管理。PMEM用(yong)于向(xiang)用(yong)戶空間提供連續的(de)(de)物理內存(cun)(cun)區域(yu),DSP和(he)某些設備只能工(gong)作在連續的(de)(de)物理內存(cun)(cun)上(shang)。我們(men)的(de)(de)Display和(he)B2R2需要連續的(de)(de)內存(cun)(cun)區域(yu)。所(suo)以我們(men)和(he)PMEM打(da)交道會很多的(de)(de)。

 

       我們看(kan)到(dao)resolve_buf的函數(shu)。這個函數(shu)是為了(le)解析(xi)B2R2傳送過來的2D加速的blt buffer。有(you)關這方面(mian)的東西(xi)我們在(zai)B2R2里面(mian)分析(xi)。在(zai)這里面(mian)我們看(kan)到(dao)了(le)有(you)關pmem的函數(shu):get_pmem_file,我們就先(xian)從(cong)這里入(ru)(ru)手。插入(ru)(ru)pmem的世界里。

復制到剪貼板  C/C++代碼
  1.          
  2.   
  3. int get_pmem_file(int fd, unsigned long *start, unsigned long *vstart,   
  4.     unsigned long *len, struct file **filp)   
  5. {   
  6.        struct file *file;   
  7.   
  8. file = fget(fd);   
  9.        if (unlikely(file == NULL)) {   
  10.               printk(KERN_INFO "pmem: requested data from file descriptor "that doesn't exist.");   
  11.   
  12. return -1;   
  13.        }   
  14.   
  15. if (get_pmem_addr(file, start, vstart, len))   
  16.        goto end;   
  17.   
  18. if (filp)   
  19.  ;      *filp = file;   
  20.  return 0;   
  21.   
  22. end:   
  23.        fput(file);   
  24.  return -1;   
  25.   
  26. }   
  27.   

首先通過fget得到文件指針,然后調用get_pmem_addr。這里的文件指針為什么要在pmem里面調用不清楚。
 

復制到剪貼板  C/C++代碼
  1. int get_pmem_addr(struct file *file, unsigned long *start,   
  2.                 unsigned long *vstart, unsigned long *len)   
  3. {   
  4.        struct pmem_data *data;   
  5.        int id;   
  6.     
  7.        if (!is_pmem_file(file) || !has_allocation(file)) {   
  8.               return -1;   
  9.        }   
  10.     
  11.        data = (struct pmem_data *)file->private_data;   
  12.        if (data->index == -1) {   
  13. #if PMEM_DEBUG   
  14.               printk(KERN_INFO "pmem: requested pmem data from file with no "  
  15.                 ;     "allocation.\n");   
  16.               return -1;   
  17. #endif   
  18.        }   
  19.        id = get_id(file);   
  20.     
  21.        down_read(&data->sem);   
  22.        *start = pmem_start_addr(id, data);   
  23.        *len = pmem_len(id, data);   
  24.        *vstart = (unsigned long)pmem_start_vaddr(id, data);   
  25.        up_read(&data->sem);   
  26. #if PMEM_DEBUG   
  27.        down_write(&data->sem);   
  28.        data->ref++;   
  29.        up_write(&data->sem);   
  30. #endif   
  31.        return 0;   
  32. }   

 

 

這個函數我們能看到分別調用了pmem_start_addr得到物理上的連續地址的首地址,pmem_len得到pmem的長度,pmem_start_vaddr得到虛擬地址。
 
這(zhe)個函數我們(men)知道(dao)了(le)他的(de)(de)功能,就是(shi)通(tong)過PMEM得到物理地址和虛擬(ni)地址,還有buf的(de)(de)長度(du)。這(zhe)些(xie)干什么用(yong)那(nei)?嘻(xi)嘻(xi),別忘(wang)了(le)B2R2的(de)(de)功能啊(a)!!--bit blit。這(zhe)樣(yang)我們(men)知道(dao)了(le)source 的(de)(de)buf也知道(dao)了(le)destination的(de)(de)buffer 地址,我們(men)就該copy了(le)。

(責(ze)任(ren)編輯:)