linux内核中虚拟内存是怎样映射到物理内存的

chen245250566 2012-10-18 12:27:28
linux内核中虚拟内存是怎样映射到物理内存的
...全文
530 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen245250566 2013-03-19
  • 打赏
  • 举报
回复
谢谢,理解了一点
honpey 2012-11-13
  • 打赏
  • 举报
回复
32位系统下:所谓的虚拟内存就是线性地址,线性地址到物理地址最主要的就是一张页表。 比较容易混淆的是这三个地址:逻辑地址,线性地址,物理地址。所谓的“程序的地址空间”中的“地址”指的是线性地址,线性地址是这三个地址中最有说头的地址。每时每刻都仅有一个进程在执行,我们可以简单地认为整个电脑中就这么一个进程,进程中产生的地址都是线性地址,也就是说对于程序员,我们面对的是线性地址编程,然后线性地址通过页表转化成物理地址。同时追加一句,c编程中,我们用到的地址也都是线性地址。
贝贝麻麻 2012-11-11
  • 打赏
  • 举报
回复
__pa把内核空间的虚地址映射到物理地址。而用户空间的地址映射通过分页机制完成的。比较复杂。
风划雪月 2012-11-11
  • 打赏
  • 举报
回复
上面的是i-386的,因为内存管理和架构是密切相关的,mm.h这个头文件里的include <asm/page.h>这个路径就是通过对不同的架构建立asm软连接指向具体架构目录实现的。
风划雪月 2012-11-11
  • 打赏
  • 举报
回复
这个这真不是一句俩句能说清的...物理内存分成4KB或者4MB的块,每个块对应一个类型为page的结构,定义在include/linux/mm.h中。这些块分成了三类,DMA,NORMAL,HIGHMEM 在说逻辑地址的分配,地址空间的第四个G是kernel可见的逻辑地址,分配如下0-15MB,都留给DMA,16MB-895留给NORMAL,896MB-1023MB用于HIGHMEM。 下面是page接口的定义,你要的东西应该在这个结构里 struct page { unsigned long flags; /* Atomic flags, some possibly * updated asynchronously */ atomic_t _count; /* Usage count, see below. */ atomic_t _mapcount; /* Count of ptes mapped in mms, * to show when page is mapped * & limit reverse map searches. */ union { struct { unsigned long private; /* Mapping-private opaque data: * usually used for buffer_heads * if PagePrivate set; used for * swp_entry_t if PageSwapCache; * indicates order in the buddy * system if PG_buddy is set. */ struct address_space *mapping; /* If low bit clear, points to * inode address_space, or NULL. * If page mapped as anonymous * memory, low bit is set, and * it points to anon_vma object: * see PAGE_MAPPING_ANON below. */ }; #if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS spinlock_t ptl; #endif }; pgoff_t index; /* Our offset within mapping. */ struct list_head lru; /* Pageout list, eg. active_list * protected by zone->lru_lock ! */ /* * On machines where all RAM is mapped into kernel address space, * we can simply calculate the virtual address. On machines with * highmem some memory is mapped into kernel virtual memory * dynamically, so we need a place to store that address. * Note that this field could be 16 bits on x86 ... ;) * * Architectures with slow multiplication can define * WANT_PAGE_VIRTUAL in asm/page.h */ #if defined(WANT_PAGE_VIRTUAL) void *virtual; /* Kernel virtual address (NULL if not kmapped, ie. highmem) */ #endif /* WANT_PAGE_VIRTUAL */ };
bullbat 2012-11-11
  • 打赏
  • 举报
回复
分页、分段机制,建议看看Intel 手册
Franklin 2012-10-25
  • 打赏
  • 举报
回复
通过硬件实现的mmu模块,
0xAC 2012-10-25
  • 打赏
  • 举报
回复
分段单元把逻辑地址转换成线性地址
分页单元将线性地址转换成物理地址
wjb_yd 2012-10-25
  • 打赏
  • 举报
回复
页表加mmu,具体的看书吧,一句两句根本不可能说清楚。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧