Linux如何映射物理内存到内核空间

转载 2011年01月13日 19:22:00
在setup_arch()中:
 
1. parse_cmdline(): 根据uboot传递的mem信息,调用early_mem()通过arm_add_memory()把物理内存信息添加到meminfo结构体中。
 
2. paging_init(): 这个就是关键的初始化页表的函数,在里面会调用bootmem_init()->bootmem_init_node()->map_memory_bank(),在这里会根据meminfo的信息调用create_mapping()来为物理内存建立内核空间的映射,一般是从0xc0000000开始。下面是arm linux的虚拟地址映射表:
 
Start       End     Use
--------------------------------------------------------------------------
ffff8000 ffffffff   copy_user_page / clear_user_page use.
ffff1000 ffff7fff   Reserved.
    
ffff0000 ffff0fff CPU vector page.
    The CPU vectors are mapped here if the  CPU supports vector relocation (control
    register V bit.)
 
ffc00000 fffeffff DMA memory mapping region.  Memory returned by the dma_alloc_xxx functions will be dynamically mapped here.
 
ff000000 ffbfffff Reserved for future expansion of DMA mapping region.
 
VMALLOC_END feffffff Free for platform use, recommended.
    VMALLOC_END must be aligned to a 2MB
    boundary.
 
VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
    Memory returned by vmalloc/ioremap will
    be dynamically placed in this region.
    VMALLOC_START may be based upon the value
    of the high_memory variable.
 
PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region.
    This maps the platforms RAM, and typically
    maps all platform RAM in a 1:1 relationship.
 
TASK_SIZE PAGE_OFFSET-1 Kernel module space
    Kernel modules inserted via insmod are
    placed here using dynamic mappings.
 
00001000 TASK_SIZE-1 User space mappings
    Per-thread mappings are placed here via
    the mmap() system call.
 
00000000 00000fff CPU vector page / null pointer trap
    CPUs which do not support vector remapping
    place their vector page here.  NULL pointer
    dereferences by both the kernel and user
    space are also caught via this mapping.
虽然后面这个表我不知道什么意思,但是上面的对我还是蛮有用的,至少我知道了,物理内存是如何映射到内核空间的。

相关文章推荐

linux高端内存映射

1 内核空间和用户空间   用户空间:在Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚存地址是用户空间,通过每个进程自己的页目录、页表,用户进程可以直接访问。 内...

Linux内存映射——mmap

一 mmap系统调用 1.内存映射 所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数...
  • hustfoxy
  • hustfoxy
  • 2013年03月23日 17:00
  • 19455

Linux用户空间与内核空间

A.INTRODUCTION     (32位系统)      Linux 简化了分段机制,使得虚拟地址(逻辑地址)与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G(2^32)。   ...

linux设备驱动归纳总结(五):1.在内核空间分配内存

一般的,用户空间使用函数malloc在堆上分配内存空间,同样的,在内核空间同样有一套类似的函数来分配空间。下面的知识会涉及页式管理的内存机制,如果不懂的要先复习一下,在S3C2440数据手册的MMU部...

linux内核空间的内存映射

linux内核空间的内存映射       逻辑地址(Logical Address) (即虚拟地址)是指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(...

Linux内核空间到用户空间的共享内存映射

当内核空间和用户空间存在大量数据交互时, 共享内存映射就成了这种情况下的不二选择; 它能够最大限度的降低内核空间和用户空间之间的数据拷贝, 从而大大提高系统的性能.   以下是创建从内核空间到用户...

Linux用户空间与内核空间内存映射

inux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据...
  • Fybon
  • Fybon
  • 2014年01月09日 16:30
  • 2819

Linux用户空间与内核空间内存映射

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数...

CMA连续物理内存用户空间映射---(一)

背景: 在多媒体和图像处理等应用中,经常用到大块内存,尤其是硬件编解码,需要内核分配大块的物理连续内存。 这里希望通过把从内核分配的连续物理内存映射到用户空间,在用户空间经过处理,又可以入队到驱动...

CMA连续物理内存用户空间映射---(二)

摘要: 相对于上一篇测试程序CMA连续物理内存用户空间映射---(一) 增加功能: 1、分配和映射统一放在IOCTL,一次完成,可以连续多次分配并映射到用户空间,提高操作性; 2、驱动增加链表,使分配...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux如何映射物理内存到内核空间
举报原因:
原因补充:

(最多只允许输入30个字)