malloc出虚拟地址
时间: 2023-09-03 09:11:27 浏览: 53
malloc()函数是用于在堆内存中动态分配指定字节数的内存空间。它返回一个指向分配内存的指针。虚拟地址是指在程序中使用的地址,而不是物理内存中的实际地址。
当调用malloc()函数时,它会在堆内存中找到一块足够大小的空闲内存,并返回一个指向该内存的指针。这个指针是一个虚拟地址,因为它指向的是程序中的内存地址空间。
虚拟地址可以通过指针变量来访问和操作分配的内存空间。但需要注意的是,虚拟地址不能直接用于访问物理内存,而是需要经过操作系统的地址转换机制将其映射到物理内存中的实际地址。
总结来说,malloc()函数分配的是虚拟地址空间,而不是物理地址空间。虚拟地址需要经过操作系统的映射机制转换为物理地址才能访问实际的内存。
相关问题
malloc申请的连续空间是指在虚拟地址空间中连续还是在物理地址空间中连续
malloc函数在申请内存时,是在虚拟地址空间中连续分配内存,而不是在物理地址空间中连续分配。虚拟地址空间是操作系统给进程分配的抽象地址空间,它可以与物理地址空间进行映射,从而让进程能够访问实际的物理内存。
当你使用malloc函数申请一块连续的内存时,操作系统会在虚拟地址空间中找到一块足够大的连续空间来满足你的需求。这块虚拟地址空间是连续的,但并不意味着对应的物理内存地址也是连续的。
实际上,操作系统可能会将这块连续的虚拟地址空间映射到不连续的物理内存页面上。这是因为操作系统使用了虚拟内存管理技术,将虚拟地址空间分割成若干个页面,每个页面可能映射到不同的物理内存页面上。这样可以更高效地利用物理内存,并提供更灵活的内存管理功能。
linux malloc vmalloc
malloc和vmalloc都是在Linux内核中用于分配内存的函数。malloc用于分配用户空间的内存,而vmalloc用于分配内核空间的内存。两者的区别在于内存的连续性和使用的上下文。
malloc函数保证分配的内存在物理上是连续的,适用于需要进行DMA访问的情况。而vmalloc函数则在虚拟地址空间上连续,但物理地址不一定连续。vmalloc一般用于分配较大的顺序缓冲区,当没有足够大的连续物理空间可供分配时,可以使用vmalloc来分配非连续的虚拟地址空间。
由于vmalloc需要建立新的页表,所以它的开销要比kmalloc和__get_free_pages函数大。另外,vmalloc不能在原子上下文中使用,因为它的内部实现使用了标志为GFP_KERNEL的kmalloc函数。
尽管在某些情况下需要物理上连续的内存块,但在实际内核编程中,很多代码都使用kmalloc来分配内存,而不是vmalloc。这主要是出于性能的考虑。因为vmalloc需要将物理上不连续的页转换为虚拟地址空间上连续的页,所以必须建立专门的页表项。由于通过vmalloc获得的页是物理上不连续的,需要一个个进行映射,这会导致比直接内存映射更大的TLB抖动。因此,vmalloc通常只在必要时才会使用,例如在需要获得大块内存时。