本文共 1918 字,大约阅读时间需要 6 分钟。
LINUX系统调用mlock的代码分析-Read
LINUX系统调用mlock的代码分析
PAGE
PAGE 2
LINUX系统调用mlock的代码分析
林才学(9811533)
(本组其他成员:李颖、满世杰、陈晋大)
1999-5-20
目录
TOC \o "1-3" 一、LINUX内存管理简介 PAGEREF _Toc452175456 \h 1
1.1.LINUX的分页管理机制 PAGEREF _Toc452175457 \h 1
1.2.虚存段(vma)的组织和管理 PAGEREF _Toc452175458 \h 3
1.3 内存的共享和保护 PAGEREF _Toc452175459 \h 3
二、mlock系统调用简介 PAGEREF _Toc452175460 \h 5
2.1 mlock介绍 PAGEREF _Toc452175461 \h 5
2.2 mlock所用到的主要数据结构和重要常量 PAGEREF _Toc452175462 \h 6
三、mlock系统调用代码分析 PAGEREF _Toc452175463 \h 9
3.1 mlock系统调用结构和各个子函数结构、功能以及示意图。 PAGEREF _Toc452175464 \h 9
3.2 mlock系统流程及其它重要子函数程序流程 PAGEREF _Toc452175465 \h 15
3.3 核心态内存的申请与释放 PAGEREF _Toc452175466 \h 22
四、mlock系统调用与munlock、mlockall、munlockall的关系 PAGEREF _Toc452175467 \h 33
五、关键技术 PAGEREF _Toc452175468 \h 34
六、结束语 PAGEREF _Toc452175469 \h 35
LINUX系统调用mlock的代码分析
PAGE 34
LINUX内存管理简介
1.1.LINUX的分页管理机制
在LINUX中,每一个用户进程都可以访问4GB的线性虚拟内存空间。其中从0到3GB的虚拟内存地址是用户空间,用户进程可以直接对其进行访问。从3GB到4GB的虚拟内存地址为核心空间,存放仅供核心态访问的代码和数据,用户进程不可访问。当用户进程通过中断或系统调用对其访问时,就会触发处理器的特权级转换(从处理器的特权级3切换到特权级0),即从操作系统的用户态切换到核心态。
所有进程从3GB到4GB的虚拟空间映像都是一样的,LINUX以此方式让核心态进程共享代码段和数据段。
核心态虚拟空间从3GB到3GB+4M的一段(也就是进程页目录第768项所管辖的范围),被影射到物理空间0到4M段。因此,进程处于核心态时,只要通过访问虚拟空间3GB到3GB+4M段,即访问了物理空间0到4M段。
上述两种空间对用户进程来说都是透明的,用户进程所访问的内存地址都是连续的4GB线性虚拟地址。因此,我们首先关心的是LINUX是如何划分虚拟空间的。
LINUX采用“按需调页”(Demand Paging)技术管理虚拟内存。标准LINUX的虚存页表应为三级页表,依次为页目录(PGD,Page Directory)、中间页目录(PMD,Page Middle Directory)和页表(PTE,Page Table)。如图1-1所示。
PGD PMD PTE Page Frame
图1-1,LINUX的三级页表结构
在INTEL微机上,LINUX的页表结构实际为两级。80386体系结构之页管理机制中的页目录就是PGD,页表就是PTE。而PMD和PGD实际上是合二为一的。所有有关PMD的操作实际上是对PGD的操作。所以源代码中形如*_pgd_*()和*_pmd_*()的函数所实现的功能也是一样的。其实现方法是提供一组转换宏(/include/asm/pgtable.h),使得转换页表时不需要知道页表的入口格式。宏定义形如:
#define _PAGE_4M0x080/* 4 MB page */
/* PMD_SHIFT determines the size of the area a second-level page table can map */
#define PMD_SHIFT22
#define PMD_SIZE(1UL<
#define PMD_MASK(~(PMD_SIZE-1))
/* PGDIR_SHIFT determines what a third-level page table entry can map */
#define
转载地址:http://cxqll.baihongyu.com/