精华内容
下载资源
问答
  • 前提:Linux内核中对内存的管理是以页为单位进行的,所以分配内存是以页为单位,起始地址都是页的开始地址。 现在记录关于DMA的一些内存大小,地址问题的解决,下面问题的分析在普通内存分配映射也是有效的。 ...

    关于DMA的基础知识有空的时候在详细总结一下。

    前提:Linux内核中对内存的管理是以页为单位进行的,所以分配内存是以页为单位,起始地址都是页的开始地址。

    现在记录关于DMA的一些内存大小,地址问题的解决,下面问题的分析在普通内存分配和映射也是有效的。

    上面的图展示的是同一个内存地址空间映射到用户进程空间和内核空间,映射的范围不同。看到系统物理地址上面的地址数据,0x8eb60000是物理地址起始位置,映射到虚拟地址0xb6d75000等位置。

    在内核中,内存分配是以页面来作为单位进行的,所以地址的低12位是0,DMA分配的地址起始位置也是在页的起始位置。

    DMA地址映射到用户空间虚拟地址,和将普通的物理地址映射到用户空间虚拟地址一样,都是使用mmap函数。

    上面图片展示的是映射地址偏移后的关系,而且映射的偏移量必须是页面的倍数。在驱动程序的mmap函数中,物理地址加上偏移的页面数量后,在传入remap_pgn_range(---)函数中的pgn参数中。

    linux采用的是页式管理机制。对于用mmap()映射普通文件来说,进程会在自己的地址空间新增一块空间,空间大小由mmap()的len参数指定,注意,进程并不一定能够对全部新增空间都能进行有效访问。进程能够访问的有效地址大小取决于文件被映射部分的大小。简单的说,能够容纳文件被映射部分大小的最少页面个数决定了进程从mmap()返回的地址开始,能够有效访问的地址空间大小超过这个空间大小,内核会根据超过的严重程度返回发送不同的信号给进程。可用如下图示说明:(来自https://kenby.iteye.com/blog/1164700

                        

    总结一下就是, 文件大小, mmap的参数 len 都不能决定进程能访问的大小, 而是容纳文件被映射部分的最小页面数决定

     

    使用dma的分配函数例子

    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/module.h>
    #include <asm/page.h>
    #include <linux/dma-mapping.h>
    
    #define THIS_DMA_SIZE (2*PAGE_SIZE)
    
    dma_addr_t dma_addr=0;
    unsigned int addr_virt;
    
    static int __init malloc_and_mmap_init(void){
    	//获取DMA地址
    	addr_virt = (unsigned int)dma_alloc_coherent(NULL,THIS_DMA_SIZE,&dma_addr,GFP_KERNEL);
    
    	printk(KERN_INFO"addr_virt=%0#X,dma_addr=%0#X",addr_virt,(unsigned int)dma_addr);
    	
    	return 0;
    }
    
    static void __exit malloc_and_mmap_exit(void){
    	dma_free_coherent(NULL,THIS_DMA_SIZE,(void*)addr_virt,dma_addr);
    }
    
    MODULE_LICENSE("GPL");
    module_init(malloc_and_mmap_init);
    module_exit(malloc_and_mmap_exit);
    
    

    结果如下:

    可以看到dma_addr低12位是0。

    帧缓冲设备中的mmap函数分析:

    //虚拟地址以页的大小映射到物理内存,物理内存不需要。
    //即当5000字节大小的物理内存需要映射,就要虚拟内存空间2个页面对应物理地址
    static int
    fb_mmap(struct file *file, struct vm_area_struct * vma)
    __acquires(&info->lock)
    __releases(&info->lock)
    {
    	int fbidx = iminor(file->f_path.dentry->d_inode);
    	struct fb_info *info = registered_fb[fbidx];
    	struct fb_ops *fb = info->fbops;
    	unsigned long off;
    	unsigned long start;
    	u32 len;
    
    //vma->vm_pgoff是以PAGE_SIZE为单位的偏移量
    	if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
    		return -EINVAL;
    //偏移的页数量,如vma->vm_pgoff=1时,表示1<<PAGE_SHIFT==一页的大小
    //off是页面地址,低12位=0
    	off = vma->vm_pgoff << PAGE_SHIFT;
    	if (!fb)
    		return -ENODEV;
    	if (fb->fb_mmap) {
    		int res;
    		mutex_lock(&info->lock);
    		res = fb->fb_mmap(info, vma);
    		mutex_unlock(&info->lock);
    		return res;
    	}
    //上面的该部分表示vm_area_struct链表中一个连续虚拟地址区间的页面数量
    
    	mutex_lock(&info->lock);
    
    	/* frame buffer memory */
    	start = info->fix.smem_start;//物理地址
    //len表示物理地址页面长度,PAGE_MASK=0xfffff000
    //PAGE_ALIGN是将地址向下取整的宏
    //但是低12位=0,~PAGE_MASK=0x00000fffs
    	len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.smem_len);
    //off>=len表示物理地址超过可DMA传输的内存地址
    //这种情况就直接映射I/O内存,包括了寄存器的地址
    //off表示偏移长度,len表示缓存区长度
    	if (off >= len) {
    		/* memory mapped io */
    		off -= len;
    		//info->var.accel_flags已经过时,看fb_info的flags
    		if (info->var.accel_flags) {
    			mutex_unlock(&info->lock);
    			return -EINVAL;
    		}
    		start = info->fix.mmio_start;//找到作为内存的寄存器地址
    //页对齐,向上取整,start & ~PAGE_MASK) + info->fix.mmio_len
    //start & ~PAGE_MASK)低十二位取0,表示获得内存所在页地址
    //info->fix.mmio_len偏移
    //len是页地址偏移个数,低12位=0
    		len = PAGE_ALIGN((start & ~PAGE_MASK) + info->fix.mmio_len);
    	}
    	mutex_unlock(&info->lock);
    	start &= PAGE_MASK;//start页面起始地址
    //(vma->vm_end - vma->vm_start + off)是加上偏移地址后的地址长度
    //不能超过len。内存映射,映射的虚拟地址的区间要全部或者部分在物理区间内部,不能比物理地址区间多。
    	if ((vma->vm_end - vma->vm_start + off) > len)
    		return -EINVAL;
    //off的值是在用户程序中调用mmap时传入进来的最后一个参数,表示对于要映射的物理地址需要偏移的大小
    	off += start;//指定的映射地址
    	vma->vm_pgoff = off >> PAGE_SHIFT;//页帧号
    	/* This is an IO map - tell maydump to skip this VMA */
    	vma->vm_flags |= VM_IO | VM_RESERVED;
    	fb_pgprotect(file, vma, off);
    	//映射,off >> PAGE_SHIFT=页帧号
    	if (io_remap_pfn_range(vma, vma->vm_start, off >> PAGE_SHIFT,
    			     vma->vm_end - vma->vm_start, vma->vm_page_prot))
    		return -EAGAIN;
    	return 0;
    }

     

    展开全文
  • Linux下内存分配与映射之一

    千次阅读 2013-05-05 18:32:26
    地址类型: ...内核逻辑地址:内存的部分或全部映射,大多数情况下,它物理地址仅差一个偏移量。如Kmalloc分配的内存。 内核虚拟地址:内核空间的地址映射到物理地址上,但映射不必是线性的。所有

    地址类型:

    32位的cpu,共4G空间,其中0-3G属于用户空间地址,3G-4G是内核空间地址。

    用户虚拟地址:用户空间程序的地址

    物理地址:cpu与内存之间的使用地址

    总线地址:外围总线和内存之间的使用地址

    内核逻辑地址:内存的部分或全部映射,大多数情况下,它与物理地址仅差一个偏移量。如Kmalloc分配的内存。

    内核虚拟地址:内核空间的地址映射到物理地址上,但映射不必是线性的。所有的逻辑地址都是内核虚拟地址,如Vmalloc分配到的地址。

    1、内存分配与释放

    kmalloc一般用于分配小于128KB的内存。

    Vmalloc分配的内存空间是一片连续的虚拟内存,但映射到物理内存却不一定连续。

    2、用户态和内核态内存交互

    copy_from_user

    copy_to_user

    access_ok

    在访问用户空间的内存时,必须先检查用户控件的指针是否合法。使用access_ok函数。

    3、物理地址到虚拟地址的映射

    CPU对外设I/O端口物理地址的编址方式分I/O映射方式和内存映射方式。在x86平台上,为外设专门实现了与RAM内存地址不同的一个单独的地址空间I/O方式。而在ARM、MIPS、PowerPC上外设I/O端口具有与内存相同的物理地址。

    ioremap函数用来将I/O内存资源的物理地址映射到核心地址空间(3G-4G)中。

    ioremap取消ipremap所做的映射。

    读写I/O的函数包括:

    _raw_writeb,_raw_writew,_raw_writel

    _raw_readb,_raw_readw,_raw_readl

    4、内核空间到用户空间的映射

    想在用户空间访问内核地址,可以采用mmap方法。

     映射一个设备意味着使用户空间的一段地址关联到设备内存上,这使得如果程序在分配的地址范围内进行读取或者写入,实际上就是对设备的访问


    展开全文
  • Linux下内存分配与映射之二

    千次阅读 2013-05-24 21:25:01
    Linux下内存管理 进程是运行于虚拟地址空间的一个程序。任何在Linux系统下运行的程序都是进程。大多数进程都需要虚拟内存。Linux支持虚拟内存,就是使用磁盘作为RAM的扩展,时可用内存相应的扩大。用作虚拟内存的...

    Linux下内存管理

    进程是运行于虚拟地址空间的一个程序。任何在Linux系统下运行的程序都是进程。大多数进程都需要虚拟内存。Linux支持虚拟内存,就是使用磁盘作为RAM的扩展,时可用内存相应的扩大。用作虚拟内存的这部分磁盘叫做交换空间(SWAP)。

    Linux操作系统采用请求式分页虚拟存储管理方法。系统为每个进程提供了4GB的虚拟存储空间。,各个进程的虚拟存储空间彼此独立。

    虚拟内存提供的功能包括:

           . 地址空间(0-4G)

           . 进程的保护

           . 内存映射

           . 公平的物理内存分配

           . 共享虚拟内存

     

    一 页

           内核把物理页作为内存管理的基本单位;内存管理单元(MMU)把虚拟地址转换为物理

    地址,通常以页为单位进行处理。MMU以页大小为单位来管理系统中的页表。

           32位系统:页大小4KB

           64位系统:页大小8KB

    内核用相应的数据结构表示系统中的每个物理页:

      <linux/mm_types.h>

      struct page {}

    内核通过这样的数据结构管理系统中所有的页,因此内核判断一个页是否空闲,谁有拥有这个页

    ,拥有者可能是:用户空间进程、动态分配的内核数据、静态内核代码、页高速缓存……

    系统中每一个物理页都要分配这样一个结构体,进行内存管理。

    二 区

           Linux内存寻址存在问题:

    一些硬件只能用某些特定的内存来执行DMA(直接内存访问)

    一些体系结构其内存的物理寻址范围必须你寻址范围大得多。这样导致一些内存不能永久映射到内核空间上。

           通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。当内核模块代码或线程访问内存时,

    代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射。因此内核空间地址为3~4G,

    最多只能映射到1G空间的内存,超出1G大小的内存将如何去问呢!

           由于存在上述条件的限制。Linux将内核空间地址划分为三个区:

    ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。

           ZONE_HIGHMEM即为高端内存,这就是内存高端内存概念的由来。

     

    在x86结构中,三种类型的区域如下:

      ZONE_DMA        内存开始的16MB

      ZONE_NORMAL       16MB~896MB

      ZONE_HIGHMEM       896MB ~ 结束

    同样每个区包含众多页,形成不同内存池,按照用途进行内存分配。

    用相应的数据结构来表示区:

      <linux/mmzone.h>

      struct zone {}

    三 获取页/内存

    static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)

    该函数分配2的order次方个连续的物理页,返回指向第一个页的page结构体指针。

     

    void *page_address(const struct page *page)

    返回指向给定物理页当前所在的逻辑地址

    extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);

    extern unsigned long get_zeroed_page(gfp_t gfp_mask);

    释放:

    extern void __free_pages(struct page *page, unsigned int order);

    extern void free_pages(unsigned long addr, unsigned int order);

     

    内存的分配可能失败,内存的释放要准确!

     

    1 kmalloc

    kmalloc()函数与用户空间malloc一组函数类似,获得以字节为单位的一块内核内存。

    void *kmalloc(size_t size, gfp_t flags)

    void kfree(const void *objp)

     

    分配内存物理上连续。

    gfp_t标志:表明分配内存的方式。如:

    GFP_ATOMIC:分配内存优先级高,不会睡眠

    GFP_KERNEL:常用的方式,可能会阻塞。

     

    2 vmalloc    

     

    void *vmalloc(unsigned long size)

    void vfree(const void *addr)

    vmalloc()与kmalloc方式类似,vmalloc分配的内存虚拟地址是连续的,而物理地址则无需连续,与用户空间分配函数一致。

    vmalloc通过分配非连续的物理内存块,在修正页表,把内存映射到逻辑地址空间的连续区域中,虚拟地址是连续的。

           是否必须要连续的物理地址和具体使用场景有关。在不理解虚拟地址的硬件设备中,内存区都必须是连续的。

           通过建立页表转换成虚拟地址空间上连续,肯定存在一些消耗,带来性能上影响。

    所以通常内核使用kmalloc来申请内存,在需要大块内存时使用vmalloc来分配。

     

    四 slab层

           内核中经常进行内存的分配和释放。为了便于数据的频繁分配和回收,通常建立一个空

     

    闲链表——内存池。当不使用的已分配的内存时,将其放入内存池中,而不是直接释放掉。

           Linux内核提供了slab层来管理内存的分配和释放。

    频繁分配和回收必然导致内存碎片,缓存他们.

    slab层得设计实现

           slab层把不同的对象划分为所谓的高速缓存组。每个高速缓存组存放不同类型的对象。高速缓存划分为slab,

    slab由一个或多个物理上连续的页组成。每个slab处于三种状态之一:满,部分满,空。

    高速缓存,slab,对象之间的关系:

         图  1. slab 分配器的主要结构

     

     

           与传统的内存管理模式相比, slab 缓存分配器提供了很多优点。首先,内核通常依赖于对小对象的分配,

    它们会在系统生命周期内进行无数次分配。slab 缓存分配器通过对类似大小的对象进行缓存而提供这种功能,

    从而避免了常见的碎片问题。slab 分配器还支持通用对象的初始化,从而避免了为同一目而对一个对象重复

    进行初始化。最后,slab 分配器还可以支持硬件缓存对齐和着色,这允许不同缓存中的对象占用相同的缓存行,

    从而提高缓存的利用率并获得更好的性能。

     

    slab数据结构和接口:

    每个高速缓存用kmem_cache结构来表示:

           struct kmem_cache {

                  struct kmem_list3 **nodelists;

                  ……

           }

    缓存区包含三种slab:满,未满,空闲

    struct kmem_list3 {

           struct list_head slabs_partial; /* partial list first, better asm code */

           struct list_head slabs_full;

           struct list_head slabs_free;

           ……

    };

    每一个slab包含多个对象:

    struct slab {

                  struct list_head list;

                  unsigned long colouroff;

                  void *s_mem;            /* including colour offset */

                  unsigned int inuse;     /* num of objs active in slab */

                  kmem_bufctl_t free;

                  unsigned short nodeid;

    };

     

    相关接口:mm/slab.c

                  内核函数 kmem_cache_create 用来创建一个新缓存。这通常是在内核初始化时执行的,或者在首次加载内核模块时执行。

    struct kmem_cache *kmem_cache_create (

      const char *name,

      size_t size,

      size_t align,

      unsigned long flags,

      void (*ctor)(void *))

          

    name 参数定义了缓存名称,proc 文件系统(在 /proc/slabinfo 中)使用它标识这个缓存。

    size 参数指定了为这个缓存创建的对象的大小,

    align 参数定义了每个对象必需的对齐。

    flags 参数指定了为缓存启用的选项:

      kmem_cache_create 的部分选项(在 flags 参数中指定)

      SLAB_RED_ZONE    在对象头、尾插入标志,用来支持对缓冲区溢出的检查。

      SLAB_POISON  使用一种己知模式填充 slab,允许对缓存中的对象进行监视(对象属对象所有,不过可以在外部进行修改)。

      SLAB_HWCACHE_ALIGN      指定缓存对象必须与硬件缓存行对齐。

    ctor 和 dtor 参数定义了一个可选的对象构造器和析构器。构造器和析构器是用户提供的回调函数。当从缓存中分配新对象时,可以通过构造器进行初始化。

        要从一个命名的缓存中分配一个对象,可以使用 kmem_cache_alloc 函数。

     

    void kmem_cache_alloc( struct kmem_cache *cachep, gfp_t flags );

    这个函数从缓存中返回一个对象。注意如果缓存目前为空,那么这个函数就会调用 cache_alloc_refill 向缓存中增加内存。

    kmem_cache_alloc 的 flags 选项与 kmalloc 的

    cachep:所建立的缓存区

    flags参数:

      GFP_USER 为用户分配内存(这个调用可能会睡眠)。

      GFP_KERNEL    从内核 RAM 中分配内存(这个调用可能会睡眠)。

      GFP_ATOMIC   使该调用强制处于非睡眠状态(对中断处理程序非常有用)。

      GFP_HIGHUSER      从高端内存中分配内存。

     

    五 高端内存的映射

    永久映射:可能会阻塞

      映射一个给定的page结构到内核地址空间:

      void *kmap(struct page *page)

      解除映射:

      void kunmap(struct page *page)

     

    临时映射:不会阻塞     

    void *kmap_atomic(struct page *page)

     

    六 分配函数的选择

      l  连续的物理页:kmalloc或者低级页分配器

      l  高端内存分配:alloc_pages 指向page结构指针,不是逻辑地址指针。再通过kmap()把高端地址内存映射到内核的逻辑地址空间。

      l  无需连续物理地址:vmalloc 虚拟地址连续物理地址可能不连续,相对存在性能损失

      l  频繁创建和销毁很多较大数据结构:建立slab缓存区,提高对象分配和回收性能

     

     

    展开全文
  • 发一下牢骚和主题无关:  地址类型:  32位的cpu,共4G间空,其中0-3G属于用户间空地址,3G-4G是内核间空地址。  用户虚拟地址:用户间空程序的地址  物理地址:cpu内存之间的用...如Kmalloc分配的内存。...

    发一下牢骚和主题无关:

        地址类型:

        32位的cpu,共4G间空,其中0-3G属于用户间空地址,3G-4G是内核间空地址。

        用户虚拟地址:用户间空程序的地址

        物理地址:cpu与内存之间的用使地址

        总线地址:外围总线和内存之间的用使地址

        内核逻辑地址:内存的分部或全体射映,大多数情况下,它与物理地址仅差一个偏移量。如Kmalloc分配的内存。

        内核虚拟地址:内核间空的地址射映到物理地址上,但射映不必是线性的。有所的逻辑地址都是内核虚拟地址,如Vmalloc分配到的地址。

        1、内存分配与释放

        kmalloc一般于用分配小于128KB的内存。

        Vmalloc分配的内存间空是一片连续的虚拟内存,但射映到物理内存却不必定连续。

        2、用户态和内核态内存交互

        copy_from_user

        copy_to_user

        access_ok

        在拜访用户间空的内存时,必须先检查用户控件的指针是不是法合。用使access_ok函数。

        3、物理地址到虚拟地址的射映

        CPU对设外I/O口端物理地址的编址方法分I/O射映方法和内存射映方法。在x86平台上,为设外专门现实了与RAM内存地址不同的一个独单的地址间空I/O方法。而在ARM、MIPS、PowerPC上设外I/O口端拥有与内存同相的物理地址。

        ioremap函数用来将I/O内存源资的物理地址射映到心核地址间空(3G-4G)中。

        ioremap消取ipremap所做的射映。

        读写I/O的函数包含:

        _raw_writeb,_raw_writew,_raw_writel

        _raw_readb,_raw_readw,_raw_readl

        每日一道理
    青春是用意志的血滴和拼搏的汗水酿成的琼浆——历久弥香;青春是用不凋的希望和不灭的向往编织的彩虹——绚丽辉煌;青春是用永恒的执著和顽强的韧劲筑起的一道铜墙铁壁——固若金汤。

        4、内核间空到用户间空的射映

        想在用户间空拜访内核地址,可以采取mmap方法。

         射映一个设备意味着使用户间空的一段地址关联到设备内存上,这使得如果程序在分配的地址范围内行进读取或者入写,实际上就是对设备的拜访

        

    文章结束给大家分享下程序员的一些笑话语录: 与女友分手两月有余,精神萎靡,面带菜色。家人介绍一女孩,昨日与其相亲。女孩果然漂亮,一向吝啬的我决定破例请她吃晚饭。
    选了一个蛮贵的西餐厅,点了比较贵的菜。女孩眉开眼笑,与我谈得很投机。聊着聊着,她说:“我给你讲个笑话吧。”“ok”
      “一只螳螂要给一只雌蝴蝶介绍对象,见面时发现对方是只雄蜘蛛。见面后螳螂问蝴蝶‘如何?’,‘他长的太难看了’,‘别看人家长的丑,人家还有网站呢’。”
      “呵呵………”我笑。忽然她问:“你有网站吗?”  

    展开全文
  • 作者:罗道文的私房菜来源:http://luodw.cc/2016/08/13/linux-cache/前言之前在实习时,听了 OOM 的分享之后,就对 Linux 内核内存管理充满兴趣,但是这块知识非常庞大,没有一定积累,不敢写下,担心误人子弟,...
  • 日期 内核版本 架构 作者 GitHub ...1 前景回顾1.1 内核映射区尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途.重要
  • Win2Linux 线程管理映射

    2009-08-13 13:26:00
    尽管Linux系统内核对象在实现和结构上Windows有很大的不同。但Linux系统调用提供了和Windows的API相似的对内核对象操作的接口。在进程控制,线程管理,调度优先级,同步以及IPC的实现都存在着映射关系。以下一一...
  • 一、内存映射 1. 通常所说的内存容量,指的是物理内存。进程是不能直接访问物理内存的。 Linux 内核给每个进程都提供一个独立的虚拟地址空间,这个地址空间是连续的。(也就是虚拟内存) 2.虚拟地址空间的内部又被...
  • 需要注意的是mmap并不分配物理内存,它所做的最重要的工作就是为进程映射区的虚拟地址 建立页表项,从图中可以看出进程的虚拟地址空间是由多个虚拟内存区域构成的,如图txt数据 段,初识数据段,bss数据段,堆和栈都是一个...
  • 为什么要进行页面回收 操作系统管理内存中的物理页面,同时也担任着内存分配的职责。...所以,对于无法被主动释放的物理页面来说,操作系统就需要提供相应的功能去释放它们,Linux 中提供页面回收算法这样一种机制进
  • 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现 注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全...
  • 因此,对于内存页面的管理,通常是先在虚存空间中分配一个虚存区间,然后才根据需要为此区间分配相应的物理页面并建立映射,先分配虚存区间,再分配物理页面。 1、页描述符 内核用struct page结构表示系统中的每个...
  • 将172.16.0.100服务器下的/opt/robot/,映射为本地端的/home/×××/server_linux/ 步骤1:分别在服务器和本地端安装nfs、rpcbind sudo apt-get install rpcbind sudo apt-get install nfs-common sudo apt-get ...
  • 操作系统管理内存中的物理页面,同时也担任着内存分配的职责。应用程序可以通过内存分配函数向操作系统申请物理页面;在使用完这些物理页面之后,应用程序可以通过相应的内存释放函数释放这些物理页面。但是,对于...
  • 直接映射的物理内存末端、高端内存的始端所对应的线性地址存放在high_memory变量中,在x86体系结构上,高于896MB的所有物理内存的范围大都是高端内存,它并不会地或自动地映射到内核地址空间,尽管x86处理器能够...
  • Linux中动态内存的分配与回收

    千次阅读 2018-05-16 20:10:20
    1.malloc 和free的原理(http://m.blog.csdn.net/article/details?id=39496057)从操作系统角度来看,进程分配内存有两种...2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 330
精华内容 132
关键字:

linux分配与映射

linux 订阅