实现了对主内存区内存页面的动态分配和回收操作。对于内核代码和数据所占区域之外(即1MB之外),内核使用了一个字节数组mem_map[]进行管理,0表示未使用,100表示高速缓冲区。
以4KB为单位即2^12字节来管理。
mem_init对管理数组进行初始化;
get_free_page()和free_page()管理主内存区中物理内存的占用和空闲情况;
copy_page_tables()和free_page_tables()则以一个页表对应的物理内存块(4M)为单位,复制或释放指定线性地址和长度(页表个数)对应的物理内存页块。
put_page()用于将一指定的物理内存页面映射到指定的线性地址处。
do_wp_page()和do_no_page()是页异常中断的过程,和对应调用缺页处理函数。
get_empty_page()用于取得一页空闲物理内存并映射到指定线性地址处。
重点:int copy_page_tables(unsigned long from, unsigned long to, long size);复制指定线性地址和长度内存对应的页目录项和页表项,从而被复制的页目录和页表对应的原物理内存页面被两套页表映射而共享使用。直到有一个进程执行写操作时,内核才会为写操作进程分配新的物理内存页。参数:from,to是线性地址,size需要复制的长度,单位字节