parent
64849f5a8b
commit
8761d8b2b6
|
@ -86,6 +86,8 @@ Linux 保留内核空间最顶部 FIXADDR_TOP~4GB 的区域作为保留区,
|
|||
1. 每个 CPU 占用一块空间.
|
||||
2. 在每个 CPU 占用的那块空间中,又分为多个小空间,每个小空间大小是 1 个 page,每个小空间用于一个目的,这些目的定义在 kmap_types.h 中的 km_type 中。
|
||||
|
||||
通过 kmap_atomic() 可实现固定内存的临时映射。该函数可以用在中断处理函数和可延迟函数的内部,从不阻塞。
|
||||
|
||||
### 永久内存映射区
|
||||
|
||||
接下来,如果系统配置了永久内存映射区,则位于固定内存映射区之下的就是一段永久内存映射区,其范围为 PKMAP_BASE~FIXADDR_START,定义如下:
|
||||
|
@ -103,6 +105,8 @@ Linux 保留内核空间最顶部 FIXADDR_TOP~4GB 的区域作为保留区,
|
|||
|
||||
通常情况下,这个空间是 4M 大小,因此仅仅需要一个页表即可,内核通过 pkmap_page_table 来寻找这个页表。通过 kmap(),可以把一个 page 映射到这个空间来。由于这个空间是 4M 大小,最多能同时映射 1024 个 page。因此,对于不使用的的 page,及应该时从这个空间释放掉(也就是解除映射关系),通过 kunmap() ,可以把一个 page 对应的线性地址从这个空间释放出来。
|
||||
|
||||
可用 alloc_pages() 函数获得永久内存映射。
|
||||
|
||||
### 动态内存映射区
|
||||
|
||||
在物理区和高端映射区之间为动态内存映射区(VMALLOC_START~VMALLOC_END),用于 vmalloc() 函数,它的前部与直接映射区有一个隔离带,后部与高端映射区也有一个隔离带,vmalloc() 区域定义如下:
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 71 KiB |
Loading…
Reference in New Issue