linux内存分页机制视频,Linux内存映射与分页机制

一,linux系统处理的地址类型

1,用户虚拟地址:

这是用户空间程序见到的常规地址。每个进程都有自己的虚拟地址空间

2,物理地址

物理地址用于处理器和系统内存之间

3,总线地址

总线地址在外围总线和内存这间使用

4,内核逻辑地址

内核逻辑地址组成了内核的常规地址空间。它一对一的映射部分或全部系统内存。

在大多数架构中,内核逻辑地址与物理地址的不同,仅是它们之间存在一个固定的偏移。

kmalloc 分配的就是逻辑地址,__get_free_pages?

5,内核虚拟地址。

它与内核逻辑地址的不同这处在于,内核虚拟地址不是一一对应到物理地址。

内核虚拟地址空间是连续,但其映射的物理地址可以是离散的。内核逻辑地址是连续的,其它映射的物理地址也是连续的。

vmalloc,kmap返回的是内核虚拟地址。

内核逻辑地址都

是内核虚拟地址,但不是所有内核虚拟地址都是内核逻辑地址。

二,页

物理地址被分成离散单元,每个单元称为一页。页的大小,由宏PAGE_SIZE来表示

三,PAGE_SHIFT,页帧号

内核地址,无论是虚拟的还物理的,其都由两部分组成。往往是高N位是页号,低M位是页内的偏移量。

当我们将地址中的低M位偏移量抛弃不用,高N位的页号,移到右端,得到这个结果称页帧号。

移动位以在页帧数和地址之间转换是一个常用操作。宏PAGE_SHIFT,

告诉我们要右移多少位得到页帧号。

a4c26d1e5885305701be709a3d33442f.png

Linux主要采用分页机制来实现虚拟内存管理。内存页的大小为PAGE_SIZE字节,而不是4 KB。在不同的平台上,页大小范围可以是4

KB到64 KB。

关于页号和页内偏移量有关的三个个宏如下:

(1) PAGE_SHIFT 宏

#define

PAGE_SHIFT 12

#define

PAGE_SHIFT 13

#define

PAGE_SHIFT 14

#define

PAGE_SHIFT 15

…………………

作用:PAGE_SHIFT的作用是通过对地址右移PAGE_SHIFT得到一个地址所在页的页号。

(2) PAGE_SIZE 宏

#define

PAGE_SIZE (1UL

<< PAGE_SHIFT)

我们以 #define

PAGE_SHIFT 12为例来说明PAGE_SIZE的大小。

1UL <<

PAGE_SHIFT 即:0x0000

0001<<12 = 0x0000

1000 = 212 = 4K

页面的大小即为4K。

UL表示unsigned

long,在32位机器中占用32bit,在64位机器占用64bit,此处为32bit,用0x16进制数表示就是0x0000

0000,1UL就是0x0000 0001,右移12位相当于16进制中右移3,所以是0x0000 1000

(3) PAGE_MASK宏

#define

PAGE_MASK (~(PAGE_SIZE-1))

我们以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,移位的结果就是页号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值