先是原理简单的介绍下:
Linux把物理内存分为了固定统一大小的块,称为page[页],一般为4KB,并且每个页都有一个编号 [page frame number]。 这样一个512M大小的内存将包括128K个页。page table的作用就是将进程操作的地址[虚拟地址]转换成物理地址。
Linux Memory Model ================== ---------------------------------------------- process 1 +----------+ page table +--------+ page table | | +--------+ +-->| PFN 3 | +--------+ +----------+ |--------| | +--------+ |--------| | VPFN 100 |--->|--------| | | PFN 2 | |--------| +----------+ | ... |--+ +--------+ |--------| | ... | +--------+ | PFN 1 |<----| ... |<--+ +----------+ +--------+ +--------+ | | PFN 0 | | +--------+ process 2 +---------+ | | +---------+ Physical memory is broken into fix-sized pages, each page is assigned a number, known as Page Frame Number (PFN). Corresponding to the physical pages, process address space can also be broken into pages, known as virtual pages. And which virtual pages are actually loaded into physical frames is the job of VM demand paging algorithm. The virtual memory address is composed of two parts: 0-11 bit is page offset 12-31 is virtual page frame number (VPFN) VPFN is the index into page table, if such page entry has a valid flag, then processor take its page table entry and get physical page frame number, multiply by its page size to get the page's base address. Add offset to this base address, you get the physical address you are looking for.