linux混混之牢骚:
今年工作这么难找?小黄同志要努力啊········咱可不能拖社主义的后退啊·····
linux的分页:
linux将物理内存分成每个4K大小的页,来进行管理。
linux中 号称 PFN, 是 page frame number的缩写。 取值范围是 0----(memory size >> 12)。
但是由于物理内存映射的关系,物理内存的0地址对应到到系统上并不是物理地址的0。 例如:s3c2440上,内存的地址是从0x30000000开始的。当连接ram后,ram的0地址在s3c2440看来,就是0x30000000. 所以在系统中 pfn的值 应该等于 (physical address - memory base address) >> 12 。
但是linux中,用的又都是虚拟地址,所以要先将 virtual address转换成 physical address 才行。 所以在linux中有个宏定义 将内核线性空间的虚拟地址和pfn转换:
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) //__pa() 将虚拟地址转化成物理地址
#define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
所以pfn在linux内核中应该对应的是页帧号。可以通过简单的转换找到对应的物理地址。
每个物理上的页,内核给与之分配了一个描述符来描述: page。 pfn可以和page进行转换:
#define page_to_pfn __page_to_pfn
#define pfn_to_pa