亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1867 | 回復(fù): 2
打印 上一主題 下一主題

vmalloc 跟蹤之后發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題~~ [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-19 16:47 |只看該作者 |倒序?yàn)g覽
本帖最后由 vonnyfly 于 2011-12-19 18:05 編輯

這些天詳細(xì)看一下vmalloc的實(shí)現(xiàn),打印log后發(fā)現(xiàn)了一個(gè)很奇怪的問(wèn)題,頓時(shí)改變了我的“世界觀”。
因?yàn)樵趌og中我發(fā)現(xiàn)地址老不對(duì)勁,就打印PAGE_SIZE ,發(fā)現(xiàn)它竟然在不停的變化,呼呼~~
log 如下:地址 長(zhǎng)度都是16進(jìn)制的   PAGE_SIZE=0X1000
  1. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~size=1000,,PAGE_SIZE=1000,bit=13
  2. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~pid=1,comm=swapper,addr=df800000,vstart=df800000,vend=fc000000,size=2000,align=2000
  3. /*遍歷vmap_area */
  4. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df800000,va_end=df802000
  5. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df804000,va_end=df806000
  6. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df808000,va_end=df80a000
  7. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df800000,va_end=df802000,addr=df800000,align=2000
  8. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df804000,va_end=df806000,addr=df804000,align=2000
  9. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df808000,va_end=df80a000,addr=df808000,align=2000

  10. /*遍歷vmlist ,看到?jīng)]  沒(méi)有同步,少了一項(xiàng) */
  11. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df808000,tmp->size=2000
  12. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df80c000,tmp->size=2000
  13. goldfish nand dev0: size 45e0000, page 2048, extra 64, erase 131072
  14. goldfish nand dev1: size 4000000, page 2048, extra 64, erase 131072
  15. goldfish nand dev2: size 4000000, page 2048, extra 64, erase 131072
復(fù)制代碼
以下開始不正常了。。。。。。
  1. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~size=1000,,PAGE_SIZE=20000,bit=18
  2. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~pid=31,comm=servicemanager,addr=df800000,vstart=df800000,vend=fc000000,size=21000,align=40000
  3. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df800000,va_end=df802000
  4. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df804000,va_end=df806000
  5. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df808000,va_end=df80a000
  6. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df80c000,va_end=df80e000
  7. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df810000,va_end=df812000
  8. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df804000,va_end=df806000,addr=df800000,align=40000
  9. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df808000,va_end=df80a000,addr=df840000,align=40000
  10. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df80c000,va_end=df80e000,addr=df840000,align=40000
  11. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df810000,va_end=df812000,addr=df840000,align=40000
  12. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df808000,tmp->size=2000
  13. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df80c000,tmp->size=2000
  14. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df810000,tmp->size=2000
  15. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df840000,tmp->size=21000
  16. [ binder_mmap ] vonnyfly(lfeng^-^)~~~~~~~~~~~vma->vm_start=0x40009000,proc->buffer=0xdf840000
  17. binder: 31:31 write 4 at bec91be0, read 0 at 00000000
  18. binder: 31:31 wrote 4 of 4, read return 0 of 0
  19. binder: 31:31 write 0 at 00000000, read 128 at bec91be0
  20. sh: can't access tty; job control turned off
  21. $ eth0: link up
  22. warning: `rild' uses 32-bit capabilities (legacy support in use)
  23. binder_open: 35:59,name=rild
  24. [ binder_mmap ] vonnyfly(lfeng^-^)~~~~~~~~~~~binder_buffer size=40
  25. binder_mmap: 35 40209000-40307000 (1016 K) vma 200075 pagep 30f
  26. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~size=1000,,PAGE_SIZE=fe000,bit=20
  27. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~pid=59,comm=rild,addr=df800000,vstart=df800000,vend=fc000000,size=ff000,align=100000
  28. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df800000,va_end=df802000
  29. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df804000,va_end=df806000
  30. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df808000,va_end=df80a000
  31. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df80c000,va_end=df80e000
  32. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df810000,va_end=df812000
  33. [ scanRBtree ] vonnyfly(lfeng^-^)~~~~~~~~~~~va_start=df840000,va_end=df861000
  34. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df804000,va_end=df806000,addr=df800000,align=100000
  35. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df808000,va_end=df80a000,addr=df900000,align=100000
  36. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df80c000,va_end=df80e000,addr=df900000,align=100000
  37. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df810000,va_end=df812000,addr=df900000,align=100000
  38. [ alloc_vmap_area ] vonnyfly(lfeng^-^)~~~~~~~~~~~first----va_start=df840000,va_end=df861000,addr=df900000,align=100000
  39. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df808000,tmp->size=2000
  40. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df80c000,tmp->size=2000
  41. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df810000,tmp->size=2000
  42. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df840000,tmp->size=21000
  43. [ __get_vm_area_node ] vonnyfly(lfeng^-^)~~~~~~~~~~~vmlist :  tmp->addr=df900000,tmp->size=ff000
  44. [ binder_mmap ] vonnyfly(lfeng^-^)~~~~~~~~~~~vma->vm_start=0x40209000,proc->buffer=0xdf900000
復(fù)制代碼
我是在android虛擬機(jī)上面跑得內(nèi)核,采用goldfish arch,內(nèi)核版本2.6.29,分配的ram=500M.添加的打印信息位置是:
  1. static struct vm_struct *__get_vm_area_node(unsigned long size,
  2.                 unsigned long flags, unsigned long start, unsigned long end,
  3.                 int node, gfp_t gfp_mask, void *caller)
  4. {
  5.         static struct vmap_area *va;
  6.         struct vm_struct *area;
  7.         struct vm_struct *tmp, **p;
  8.         unsigned long align = 1;

  9.         BUG_ON(in_interrupt());
  10.         if (flags & VM_IOREMAP) {
  11.                 int bit = fls(size);

  12.                 if (bit > IOREMAP_MAX_ORDER)
  13.                         bit = IOREMAP_MAX_ORDER;
  14.                 else if (bit < PAGE_SHIFT)
  15.                         bit = PAGE_SHIFT;

  16.                 align = 1ul << bit;
  17.                 VONNYFLY_printk("size=%lx,,PAGE_SIZE=%lx,bit=%d",PAGE_SIZE,size,bit);//看這兒,*******PAGE_SIZE這個(gè)問(wèn)題解決了,打印順序錯(cuò)了,嗚嗚~
  18.         }
  19. 。。。。。。。。。。。。
復(fù)制代碼
現(xiàn)在說(shuō)下我的疑問(wèn):
1、VM_IOREMAP這個(gè)到底干嘛的呢,僅僅是更改對(duì)齊,哪有是按照什么標(biāo)準(zhǔn)呢,int bit = fls(size);這個(gè)函數(shù)看不懂額,按照注釋說(shuō)的是 從右邊開始不是1的那個(gè)位的位置吧,不知道理解是不是有誤,1頁(yè)那又為什么是13而不是12.。。。。。

2、內(nèi)核vmalloc m部分搞了vmap_area   vm_struct兩個(gè)東西來(lái)管理,何必呢,完全可以合并阿,一個(gè)是通過(guò)RBtree來(lái)管理,一個(gè)簡(jiǎn)單的單鏈表。而且通過(guò)上面的log還會(huì)發(fā)現(xiàn),RBtree和vmlist這兩個(gè)東西有點(diǎn)不同步。。。是怎么回事。。

3、對(duì)alloc_vmap_area函數(shù)中間的那一陀愣是沒(méi)咋看懂額。按理說(shuō)一遍掃描不就ok了,怎么找了好幾遍,3.0的這部分更復(fù)雜,有hole 、 cache相關(guān)的額,代碼的細(xì)節(jié)好難看懂阿。
  1. if (n) {
  2.                 struct vmap_area *first = NULL;

  3.                 do {
  4.                         struct vmap_area *tmp;
  5.                         tmp = rb_entry(n, struct vmap_area, rb_node);
  6.                         if (tmp->va_end >= addr) {
  7.                                 if (!first && tmp->va_start < addr + size)
  8.                                         first = tmp;
  9.                                 n = n->rb_left;
  10.                         } else {
  11.                                 first = tmp;
  12.                                 n = n->rb_right;
  13.                         }
  14.                 } while (n);

  15.                 if (!first)
  16.                         goto found;

  17.                 if (first->va_end < addr) {
  18.                         n = rb_next(&first->rb_node);
  19.                         if (n)
  20.                                 first = rb_entry(n, struct vmap_area, rb_node);
  21.                         else
  22.                                 goto found;
  23.                 }

  24.                 while (addr + size > first->va_start && addr + size <= vend) {
  25.                         VONNYFLY_printk("first----va_start=%lx,va_end=%lx,addr=%lx,align=%lx",first->va_start,first->va_end,addr,align);
  26.                         addr = ALIGN(first->va_end + PAGE_SIZE, align);//xxxxxxxxxx
  27.                         if (addr + size - 1 < addr)
  28.                                 goto overflow;

  29.                         n = rb_next(&first->rb_node);
  30.                         if (n)
  31.                                 first = rb_entry(n, struct vmap_area, rb_node);
  32.                         else
  33.                                 goto found;
  34.                 }
  35.         }
  36. found:
復(fù)制代碼
4、vmalloc 的實(shí)現(xiàn)函數(shù)  __get_vm_area_node  有點(diǎn)小搞不明白,這個(gè)地方插入鏈表的操作好奇怪,我以前一直認(rèn)為指針不在話下,今兒突然發(fā)現(xiàn),我越來(lái)越暈了,仔細(xì)看

  1.         write_lock(&vmlist_lock);
  2.         for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) {
  3.                 if (tmp->addr >= area->addr)
  4.                         break;
  5.         }  
  6.         area->next = *p;
  7.         *p = area;//這一步很詭異阿,前面的東西好像沒(méi)連起來(lái)額  。。。。大伙看看
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-12-19 17:30 |只看該作者
VONNYFLY_printk("size=%lx,,PAGE_SIZE=%lx,bit=%d",PAGE_SIZE,size,bit);你的參數(shù)順序錯(cuò)了吧?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-12-19 17:51 |只看該作者
whaaat 發(fā)表于 2011-12-19 17:30
VONNYFLY_printk("size=%lx,,PAGE_SIZE=%lx,bit=%d",PAGE_SIZE,size,bit);你的參數(shù)順序錯(cuò)了吧?

暈死,的確阿。。。。謝了哥們
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP