内存管理-page初始化,分配与回收
物理页面不一定就是物理内存页面,也可能是盘上物理页面
内核把叶作为内存管理的基本单位,物理内存和虚拟内存都分成大小相等的页(4K)
在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前正在使用的程序和数据块保留在内存中,而将内存容纳不了的信息保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换(怎么确定不用)程序和数据块
mm/init.c的作用:
内存布局:
内核被装载在2M(_text)开始处,结束_etext,紧接着是内核数据至_end
第0页用于保存BIOS检测的硬件信息
0x000a0000 to 0x000fffff保存BIOS例程,即640K到1M
ffff0000 BIOS rom 的首地址
machine_specific_memory_setup( ):内存状况表
检查
----------------------------------------------------------------------------物理
page_size
page_offset:0xC0000000
PMD_SHIFT 22
内存管理单元(MMU,管理内存把虚拟地址转换为线性地址的硬件)以页为单位进行处理
内核用struct page---include/linux/mm.h结构的代表每个物理页,即每个物理页一个(一段连续地址)
全局指针mem_map指向page数组,在数组里分成三个区
建立块(在到分区)
pglist_date:include/linux/mmzone.h
typedef struct pglist_data {
zone_t node_zones[MAX_NR_ZONES];指向三个zone分区
zonelist_t node_zonelists[GFP_ZONEMASK+1];分配策略
int nr_zones; // Number of zones in the node
struct page *node_mem_map;指向具体page节点
unsigned long *valid_addr_bitmap;
struct bootmem_data *bdata;
unsigned long node_start_paddr;
unsigned long node_start_mapnr;
unsigned long node_size;
int node_id;
struct pglist_data *node_next;
} pg_data_t;
分区:内核为了管理叶而进行的一种逻辑分区struct zone(linux/mmzone.h)
由于外围器件很多,速度多不同,基本上每个空间都有分区,因为同一分区内访问速度相同,即介质均匀,所以在zone之上有个节点即pglist,每个pglist再有分区
zone_DMA(<16)DMA只能访问内存的前16M
zone_NORMAL(16-896)
zone_HIGHMEM(>896)
typedef struct zone_struct {
spinlock_t lock;
unsigned long offset;该区在全局页表中的起始页号
unsigned long free_pages;
unsigned long pages_min, pages_low, pages_high;
int need_balance;
free_area_t free_area[MAX_ORDER];一组空闲区间队列,管理散的物理页面成块,保持伙伴系统的连续长度页面块 空闲,活跃
struct pglist_data *zone_pgdat;
struct page *zone_mem_map;
unsigned long zone
内存管理-page初始化,分配与回收
最新推荐文章于 2023-03-06 11:55:39 发布