非连续内存分配(vmalloc)的高端映射原理

admin 2024-12-26 30人围观 ,发现31个评论

高端映射对立的是低端映射或所谓直接映射,内核中有关变量定义它们的它们的分界点,全局变量high_memory,该变量定义在mm/文件中(存在MMU的前提下),可见不区分体系结构,对于当前我手头的marvell的arm设备即对于arm体系结构,high_memory在初始化阶段的创建内存页表时初始化值,它的值就是:物理内存最后一个node的末尾,比如物理内存只有一个node,大小是256MB,再根据如下的算法就可以得出high_memory是多少:

high_memory=__va((max_lowPAGE_SHIFT)-1)+1;max_low代表的是当前node的在物理内存中的物理页地址,比如物理内存从0x0开始(由PHYS_OFFSET决定),大小是256MB,即65536(0x10000)个物理页,那么max_low的值为0x10000,则high_memory的值为该物理页地址转为物理地址再转为虚拟地址的结果:0xd0000000。

high_memory之上就是高端内存的范围,这样的说法也不一定对,比如对于有的体系结构如arm,它的永久映射实际上就在high_memory之下的地方,但它依然是高端内存,所有物理内存都在初始化时映射在低端空间也是不一定正确的(这个可以在初始化时内存映射中发现,哪样的物理内存是会属于HIGHMEM区),所以我想通常意义的高端内存可以基本上定义为“不能直接通过偏移实现虚拟地址和物理地址映射”的虚拟空间、而“可以直接通过偏移实现虚拟地址和物理地址映射”的虚拟空间是低端内存(为什么低端映射也叫直接映射,这里体现出了直接的感觉)这样的方式界定比较好一些。


大体上内核有3种高端映射的机制,分别是永久映射、临时映射、非连续内存分配映射。

一、非连续内存分配(vmalloc)1.1、vmalloc原理

前面的文章细致描述过内核是如何通过slab/buddy获取大大小小的连续的物理内存的,它们是linux在低端虚拟地址空间的分配机制,使用连续物理内存是有很大好处的,对于充分利用CPU的cache有极大的利好;此外buddy和slab分别尽力地避免了物理内存空间的外碎片和内碎片;

只是有些时候比如我们的物理内存本身就不大,随着运行时间增长,物理内存的碎片可能会越来越多,分配连续的物理内存尤其是大尺寸连续的物理内存将越来越费劲;

为了尽可能避免这种情况或者在出现这种情况下能够缓解进一步费劲,对于某些不频繁的分配释放的内存申请,可以采用一种方式,即所谓的不连续内存分配。

不连续内存映射空间即vmalloc区在4GB地址空间的什么位置应该很清楚了,现在描述下所谓不连续内存映射空间是什么意思:

不连续内存映射,不连续是指物理内存不连续,后面描述它的具体实现就能很清楚地发现它为什么是不连续,这里直接知道结果就是它映射物理地址的方式是一页一页映射的,比如需要映射10页物理地址空间,那么它是10次调用alloc_page从buddy获取,这样就会存在物理地址不连续的可能,之所以这样做就是如上面所说,某些东西申请内存后不会频繁的访问,并且它的长度如果不是很大的话,那么它适合vmalloc,因为分配一个连续的很大的物理地址是越来越困难的;

但是它的虚拟地址是连续的,如上面的图所示,每一个vmallocX就是一个vmalloc映射,显然虚拟地址是连续的,只是它映射的物理地址是不一定连续的;

看到这里,就会明白为什么vmalloc需要增加内存页表的表项了,这都是初始化时没有的映射关系,而且确切的说是需要二级映射的,因为虚拟地址和物理地址之间都是一页一页映射的,可见vmalloc申请起来比较麻烦;另外,虚拟地址和物理地址之间都是一页一页映射,说明最好在申请的时候也按页的整数倍进行对齐值申请。

那么,宏VMALLOC_START和VMALLOC_END是怎么定义的呢?如下:

defineVMALLOC_END(PAGE_OFFSET+0x30000000)

即vmalloc区始于high_memory加8MB的位置,结束于一个固定位置为0xF0000000;

最后看看到底哪些场合使用vmalloc:

1、swap;

2、为module分配空间,见函数module_alloc就明白了;

3、为IO驱动程序分配缓冲区(ioremap);

1.2、vmalloc实现

1、接口函数:

接口函数就是vmalloc和__vmalloc,它俩的区别就是vmalloc只需指定长度即可,而__vmalloc是由调用者自行指定gfpmask和prot参数,prot参数一般都是PAGE_KERNEL,gfpmask参数一般就是GFP_KERNEL|__GFP_HIGHMEM,调用__vmalloc可能会加上标志GFP_ZERO用于清零,它们都调用函数__vmalloc_node;此外还有个用于只申请一段vmalloc区间但不映射物理地址的接口函数get_vm_area;

2、具体实现:

staticvoid*__vmalloc_node(unsignedlongsize,unsignedlongalign,gfp_tgfp_mask,pgprot_tprot,intnode,void*caller){structvm_struct*area;void*addr;unsignedlongreal_size=size;/*size页对齐,因为vmalloc映射的物理内存不连续,所以是一页一页的映射,即映射的物理内存大小必然是页的倍数,所以必须页对齐*/size=PAGE_ALIGN(size);/*检查size正确性,不能为0且不能大于totalram_pages,totalram_pages是bootmem分配器移交给伙伴系统的物理内存页数总和*/if(!size||(sizePAGE_SHIFT)totalram_pages)returnNULL;/*申请一个vm_struct插入vmlist链表,申请一个vmap_area并插入红黑树完成非连续内存区的高端虚拟地址分配,注意size总会额外在最后加一页,用于安全区(上图的4KB隔离带)注意:vm_struct本身是使用kmalloc_node()在slab,所以在低端内存中;而函数alloc_vmap_area真正分配了连续的高端虚拟地址简单的总结:分配一个vm_struct结构,获取对应长度(注意额外加一页)高端连续地址,最终插入vmlist链表*/area=__get_vm_area_node(size,align,VM_ALLOC,VMALLOC_START,VMALLOC_END,node,gfp_mask,caller);if(!area)returnNULL;/*本函数实际的给虚拟地址映射了不连续的物理内存(调用函数alloc_page一页一页的分配物理地址,函数map_vm_area实现映射)返回值是分配的高端虚拟地址的起始*/addr=__vmalloc_area_node(area,gfp_mask,prot,node,caller);/**Aref_count=3isneededbecausethevm_structandvmap_area*structuresallocatedinthe__get_vm_area_node()functioncontain*referencestothevirtualaddressofthevmalloc'edblock.*/kmemleak_alloc(addr,real_size,3,gfp_mask);/*返回值是分配的高端虚拟地址的起始*/returnaddr;}

主要就是两大部分:分配高端虚拟地址(即分配一段vmalloc区间)+给虚拟地址映射物理地址;

1.2.1、高端地址分配
进入函数__get_vm_area_node:staticstructvm_struct*__get_vm_area_node(unsignedlongsize,unsignedlongalign,unsignedlongflags,unsignedlongstart,unsignedlong,intnode,gfp_tgfp_mask,void*caller){staticstructvmap_area*va;structvm_struct*area;BUG_ON(in_interrupt());if(flagsVM_IOREMAP){intbit=fls(size);if(bitIOREMAP_MAX_ORDER)bit=IOREMAP_MAX_ORDER;elseif(bitPAGE_SHIFT)bit=PAGE_SHIFT;align=1ulbit;}size=PAGE_ALIGN(size);if(unlikely(!size))returnNULL;/*申请一个vm_struct,本质还是通过kmalloc申请,申请的是高端的虚拟内存kmalloc可保证虚拟内存的连续性,这验证了vmalloc申请的虚拟地址是连续的本质就是:使用kmalloc_node()在slab中,分配一个vm_struct结构*/area=kzalloc_node(sizeof(*area),gfp_maskGFP_RECLAIM_MASK,node);if(unlikely(!area))returnNULL;/**Wealwaysallocateaguardpage.*//*vmalloc总是要将size加上一个页框的大小作为安全区*/size+=PAGE_SIZE;/*在start到中,分配足够size大小的内核虚拟空间*//*注意:vmap_area结构体(返回值va)本身也是通过kmalloc分配,所以也在低端内存中,它的成员va_start和va_指示了真正申请的高端虚拟内存的地址范围,可见是线性的(连续的)[va_start---va_]落在高端内存的非连续映射区(vmalloc区)中,va_-va_start=size=实际需要映射长度+4KB(安全区)寻找新节点在红黑树的插入点并计算出应该的高端地址值(addr),关于红黑树,细节暂不讨论留在后续将最终的高端地址值赋给va,并插入红黑树中*/va=alloc_vmap_area(size,align,start,,node,gfp_mask);if(IS_ERR(va)){kfree(area);returnNULL;}/*将va的值(高端地址起始和长度)赋给area,最终把area插入vmlist链表*/insert_vmalloc_vm(area,va,flags,caller);/*这里area已经被赋值的成员有,addr和size(高端地址)、flag、caller*/returnarea;}

首先注意结构体vm_struct,它是vmalloc的管理方法非常重要:

structvm_struct{structvm_struct*next;/*指向下一个vm区域*/void*addr;/*指向第一个内存单元(线性地址)*/unsignedlongsize;/*该块内存区的大小*/unsignedlongflags;/*内存类型的标识字段*/structpage**pages;/*指向页描述符指针数组*/unsignedintnr_pages;/*内存区大小对应的页框数*/unsignedlongphys_addr;/*用来映射硬件设备的IO共享内存,其他情况下为0*/void*caller;/*调用vmalloc类的函数的返回地址*/};

全局变量vmlist是管理所有vmalloc对象的链表表头,每个vmalloc映射都要把它的映射结果即一个structvm_struct型的描述符加入链表中,成员next用于这个链表;addr指示这段vmalloc区的虚拟地址起始;size标识这段vmalloc区的长度;flags标识映射方式,在include/linux/文件中有明确的使用方式,像在__vmalloc_node调用就是VM_ALLOC:

defineVM_ALLOC0x00000002/*vmalloc()*/

defineVM_USERMAP0x00000008/*suitableforremap_vmalloc_range*/

catproc/vmallocinfo0xbf000000-0xbf0b3000733184module_alloc+0x54/0x60pages=178vmalloc0xd085e000-0xd08600008192__arm_ioremap_pfn+0x64/0x144ioremap0xd0861000-0xd0882000135168ubi_attach_mtd_dev+0x390/0x9c8pages=32vmalloc0xd0883000-0xd08aubi_attach_mtd_dev+0x3b0/0x9c8pages=32vmalloc0xd08a5000-0xd08ac00028672ubi_read_volume_table+0x178/0x8ccpages=6vmalloc0xd08b6000-0xd08b80008192__arm_ioremap_pfn+0x64/0x144ioremap0xd08ba000-0xd08bc0008192__arm_ioremap_pfn+0x64/0x144ioremap0xd08bd000-0xd08ce00069632lzo_init+0x18/0x30pages=16vmalloc0xd08cf000-0xd0912000274432deflate_init+0x1c/0xe8pages=66vmalloc0xd0913000-0xd093ubifs_get_sb+0x79c/0x1104pages=32vmalloc0xd0935000-0xd09370008192ubifs_lpt_init+0x30/0x428pages=1vmalloc0xd095d000-0xd095f0008192ubifs_lpt_init+0x30/0x428pages=1vmalloc0xd0960000-0xd096500020480__arm_ioremap_pfn+0x64/0x144ioremap0xd0966000-0xd0987000135168ubi_attach_mtd_dev+0x390/0x9c8pages=32vmalloc0xd0988000-0xd09a9000135168ubi_attach_mtd_dev+0x3b0/0x9c8pages=32vmalloc0xd09aa000-0xd09b100028672ubi_read_volume_table+0x178/0x8ccpages=6vmalloc0xd09ba000-0xd09db000135168ubifs_get_sb+0x79c/0x1104pages=32vmalloc0xd09dc000-0xd09fd000135168ubifs_get_sb+0x7b8/0x1104pages=32vmalloc0xd0a00000-0xd0b010001052672__arm_ioremap_pfn+0x64/0x144ioremap0xd0bd0000-0xd0bd20008192ubifs_lpt_init+0x220/0x428pages=1vmalloc0xd0bd3000-0xd0bfubifs_lpt_init+0x234/0x428pages=32vmalloc0xd0bf5000-0xd0bf800012288tpm_db_mod2_setup_jump_area+0x84/0x3ccpages=2vmalloc0xd0bf9000-0xd0bfb0008192tpm_db_mod2_setup_jump_area+0x100/0x3ccpages=1vmalloc0xd0bfc000-0xd0bfe0008192tpm_db_mod2_setup_jump_area+0x174/0x3ccpages=1vmalloc0xd0c00000-0xd0d010001052672__arm_ioremap_pfn+0x64/0x144ioremap0xd0d24000-0xd0d45000135168ubifs_mount_orphans+0x44/0x41cpages=32vmalloc0xd0d46000-0xd0d480008192tpm_db_mod2_setup_jump_area+0x1f4/0x3ccpages=1vmalloc0xd0d49000-0xd0d4b0008192tpm_db_mod2_setup_jump_area+0x270/0x3ccpages=1vmalloc0xd0d4c000-0xd0d4e0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d4f000-0xd0d510008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d52000-0xd0d540008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d55000-0xd0d570008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d58000-0xd0d5a0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d5b000-0xd0d5d0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d5e000-0xd0d600008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d61000-0xd0d630008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d64000-0xd0d660008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d67000-0xd0d690008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d6a000-0xd0d6c0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d6d000-0xd0d6f0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d70000-0xd0d720008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d73000-0xd0d750008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d76000-0xd0d780008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d79000-0xd0d7b0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d7c000-0xd0d7e0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d7f000-0xd0d810008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d82000-0xd0d840008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d85000-0xd0d870008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d88000-0xd0d8a0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d8b000-0xd0d8d0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d8e000-0xd0d900008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d91000-0xd0d930008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d94000-0xd0d960008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0d97000-0xd0d990008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0d9a000-0xd0d9c0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0d9d000-0xd0db000077824tpm_db_mod2_setup_chain_area+0x264/0x308pages=18vmalloc0xd0db1000-0xd0db400012288tpm_db_mod2_setup_jump_area+0x84/0x3ccpages=2vmalloc0xd0db5000-0xd0db70008192tpm_db_mod2_setup_jump_area+0x100/0x3ccpages=1vmalloc0xd0db8000-0xd0dba0008192tpm_db_mod2_setup_jump_area+0x174/0x3ccpages=1vmalloc0xd0dbb000-0xd0dbd0008192tpm_db_mod2_setup_jump_area+0x1f4/0x3ccpages=1vmalloc0xd0dbe000-0xd0dc00008192tpm_db_mod2_setup_jump_area+0x270/0x3ccpages=1vmalloc0xd0dc1000-0xd0dc30008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0dc4000-0xd0dc60008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0dc7000-0xd0dc90008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0dca000-0xd0dcc0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0dcd000-0xd0dcf0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0dd0000-0xd0dd20008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0dd3000-0xd0dd50008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0dd6000-0xd0dd80008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0dd9000-0xd0ddb0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0ddc000-0xd0dde0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0ddf000-0xd0de10008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0de2000-0xd0de40008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0de5000-0xd0de70008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0de8000-0xd0dea0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0deb000-0xd0ded0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0dee000-0xd0df00008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0df1000-0xd0df30008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0df4000-0xd0df60008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0df7000-0xd0df90008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0dfa000-0xd0dfc0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0dfd000-0xd0dff0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0e00000-0xd0f010001052672__arm_ioremap_pfn+0x64/0x144ioremap0xd0f02000-0xd0f040008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f05000-0xd0f070008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f08000-0xd0f0a0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f0b000-0xd0f0d0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f0e000-0xd0f100008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f11000-0xd0f130008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f14000-0xd0f2700077824tpm_db_mod2_setup_chain_area+0x264/0x308pages=18vmalloc0xd0f28000-0xd0f2b00012288tpm_db_mod2_setup_jump_area+0x84/0x3ccpages=2vmalloc0xd0f2c000-0xd0f2e0008192tpm_db_mod2_setup_jump_area+0x100/0x3ccpages=1vmalloc0xd0f2f000-0xd0f310008192tpm_db_mod2_setup_jump_area+0x174/0x3ccpages=1vmalloc0xd0f32000-0xd0f340008192tpm_db_mod2_setup_jump_area+0x1f4/0x3ccpages=1vmalloc0xd0f35000-0xd0f370008192tpm_db_mod2_setup_jump_area+0x270/0x3ccpages=1vmalloc0xd0f38000-0xd0f3a0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f3b000-0xd0f3d0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f3e000-0xd0f400008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f41000-0xd0f430008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f44000-0xd0f460008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f47000-0xd0f490008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f4a000-0xd0f4c0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f4d000-0xd0f4f0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f50000-0xd0f520008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f53000-0xd0f550008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f56000-0xd0f580008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f59000-0xd0f5b0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f5c000-0xd0f5e0008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f5f000-0xd0f610008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f62000-0xd0f640008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f65000-0xd0f670008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f68000-0xd0f6a0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f6b000-0xd0f6d0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f6e000-0xd0f700008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f71000-0xd0f730008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f74000-0xd0f760008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f77000-0xd0f790008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f7a000-0xd0f7c0008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f7d000-0xd0f7f0008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f80000-0xd0f820008192tpm_db_mod2_setup_chain_area+0xd4/0x308pages=1vmalloc0xd0f83000-0xd0f850008192tpm_db_mod2_setup_chain_area+0x150/0x308pages=1vmalloc0xd0f86000-0xd0f880008192tpm_db_mod2_setup_chain_area+0x1b0/0x308pages=1vmalloc0xd0f89000-0xd0f9c00077824tpm_db_mod2_setup_chain_area+0x264/0x308pages=18vmalloc0xd1000000-0xd11010001052672__arm_ioremap_pfn+0x64/0x144ioremap0xd1200000-0xd672__arm_ioremap_pfn+0x64/0x144ioremap

是不是非常清楚!

猜你喜欢
    不容错过