PE文件的虚拟内存空间一般是从0x00400000开始的,假设code段的起始地址是0x00401000这个地址怎么分配物理内存的,系统是怎么做映射的?
------解决思路----------------------
你是什么系统的内存系统啊?
Windows or Linux?
------解决思路----------------------
获得虚拟地址,肯定需要对MMU操作了,不过如果是Linux系统,直接调用ioremap()就可实现
我在iTOP-4412开发板上也遇到类似问题,共同努力
------解决思路----------------------
这个"descriptor"是什么?你说的"冲突"指的是什么类型的冲突?“实模式”是什么?
------解决思路----------------------
“线性地址”是什么?
------解决思路----------------------
楼主的理解已经无限接近真相了,只是要记住一条,这里所谈到的所有虚拟地址,物理地址,不是处于无政府状态的随便乱转的,这里有一个操作系统的内存管理模块在居中调度。操作系统会小心的维持所有的进程,让他们相信自己独占了所有的4G内存(这里姑且认为是4G吧)。内存管理模块会清楚的track每一块虚拟内存真真映射到了哪块物理内存上去,肯定内存会不够用,那就会出现所谓的page fault,触发缺页中断,做换页。。。说远了,不过整体上来说,你谈到的转换机制是没错的,但是武器是要有使用者的,对吧?
------解决思路----------------------
虚拟地址和线性地址其实是一个概念。
MIPS处理器支持多个地址空间,每个地址空间有ASID(Address Space ID),放在EntryHi寄存器中。对应到linux,每个用户态进程,以及内核态,都有自己的ASID。进程空间切换的时候,需要修改这个寄存器。
虚拟地址到物理地址的转换,需要CPU的MMU和TLB模块的协助。注意,这两个模块是CPU内部的,是硬件模块,而不是软件模块。
cpu工作在用户态模式时,取虚拟地址,经MMU,读寄存器取ASID,配合虚拟地址的VPN(virtual page number),查TLB缓存。如果命中,直接向MMU返回物理地址。如果没有,触发一个异常,由cpu的异常处理流程完成TLB缓存的重填(也即查内核中该进程的多级页表),再返回给MMU物理地址。如果物理地址不存在,则还会触发一个缺页异常,让相应异常处理流程完成内存页的换入。
内核态也有虚拟地址,用于vmalloc分配逻辑上连续,但物理上不连续的内存。工作模式和用户态的进程类似。
------解决思路----------------------
根据intel 的手册。
MMU通过CR3寄存器所指向的页表进行虚拟地址到线性地址的转换。
而线性地址通过CS段寄存器,和GDT(全局描述符表)转换为物理地址。(多数情况,线性地址==物理地址)
整个转换过程,我只会写代码,不是很会说。
所以传送门: http://book.51cto.com/art/200812/103231.htm
这个说了个大概,如果你不进行内核编程懂这些就够了。