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 内核中物理内存分配函数(kernel api)分析

在网上查资料时看到几篇介绍 linux driver 编写的文章,其中提到 kmalloc()与 __get_free_page()返回地址的问题,我们都知道 kmalloc() 与 __get_fr...
  • qq160816
  • qq160816
  • 2014年07月01日 15:29
  • 576

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

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

linux kernel内存映射实例分析

引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex A9 + 1GB DDR似乎已经跟不上主流配置了。虽说硬件是王道,可我们还是不禁还怀疑这么强大的硬件配置得到充分...
  • michaelcao1980
  • michaelcao1980
  • 2013年10月25日 15:28
  • 4331

e820与kernel物理内存映射

http://deltamaster.is-programmer.com/posts/37297.html 我们都对操作系统如何管理内存有一定的了解,然而,在操作系统开始管理内存之前,首先要获取...
  • hshl1214
  • hshl1214
  • 2013年05月19日 08:59
  • 1147

Linux内核空间映射到用户空间

****************************************************************************************************...
  • imxiangzi
  • imxiangzi
  • 2015年08月31日 16:57
  • 333

IO空间的静态映射基本过程

1、前言 IO端口与IO内存的概念:外设中的寄存器称为是IO端口,外设中的内存称为是IO内存。二者统称为IO空间。Linux内核是通过虚拟地址访问外设的。所以需要先将虚拟地址映射到相应外设的物理地址...
  • joqian
  • joqian
  • 2014年05月29日 12:04
  • 1087

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

在setup_arch()中: 1. parse_cmdline(): 根据uboot传递的mem信息,调用early_mem()通过arm_add_memory()把物理内存信息添加到meminfo...
  • ywf861029
  • ywf861029
  • 2011年01月13日 19:22
  • 1669

Linux 内存管理 -- 高端内存的映射方式

http://blog.csdn.net/chenziwen/article/details/5932396   Linux 内存管理 -- 高端内存的映射方式 分类: server开发...
  • zdy0_2004
  • zdy0_2004
  • 2014年11月07日 00:47
  • 725

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

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

linux内存布局及页面映射

在Linux系统中,以32bit x86系统来说,进程的4GB内存空间(虚拟地址空间)被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G。  用户进程通常情况下,只能访问用...
  • sinat_16790541
  • sinat_16790541
  • 2014年12月29日 20:58
  • 1923
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux如何映射物理内存到内核空间
举报原因:
原因补充:

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