Linux主要采用分页机制来实现虚拟内存管理。内存页的大小为PAGE_SIZE字节,而不是4 KB。在不同的平台上,页大小范围可以是4 KB到64 KB。
关于页号和页内偏移量有关的三个个宏如下:
(1) PAGE_SHIFT 宏
#define PAGE_SHIFT
#define PAGE_SHIFT
#define PAGE_SHIFT
#define PAGE_SHIFT
…………………
作用:PAGE_SHIFT的作用是通过对地址右移PAGE_SHIFT得到一个地址所在页的页号。
(2) PAGE_SIZE 宏
#define PAGE_SIZE
我们以 #define
PAGE_SHIFT
1UL << PAGE_SHIFT 即:0x0000
0001<<12
页面的大小即为4K。
#define PAGE_MASK
我们以PAGE_SHIFT=12为例来说明PAGE_MASK的值,当PAGE_SHIFT=12时,PAGE_SIZE =4K = 0x0000 1000.
PAGE_SIZE -1 = 0x0000 1000 -1 = 0x0000 0FFF
~(PAGE_SIZE-1) = ~0x0000 0FFF = 0xFFFF F000
也就是说,任何地址与上PAGE_MASK,结果为这个地址所在的页面的页面号。PAGE_MASK用于屏蔽掉偏移量域的所有位,而只剩下页面号域。
总之,得到一个地址所在页面的页号有两种方法,一种方法就是用这个地址与PAGE_MASK相与,相与得到的结果就是页号;第二种方法就是把这个地址右移PAGE_SHIFT,移位的结果就是页号。
本文介绍了Linux操作系统中如何通过分页机制管理虚拟内存,重点关注了与页号和页内偏移量相关的三个宏:PAGE_SHIFT、PAGE_SIZE和PAGE_MASK。PAGE_SHIFT用于计算页号,PAGE_SIZE确定页面大小(例如4KB),而PAGE_MASK则用于获取地址对应的页号。通过与PAGE_MASK按位与或右移PAGE_SHIFT可获得页号。
1156

被折叠的 条评论
为什么被折叠?



