node : pg_data_t
typedefstructpglist_data {zone_t node_zones[max_nr_zones]; zonelist_t Node_zonelists[nr_gfpindex]; structPage *Node_mem_map; unsignedLong*Valid_addr_bitmap; structBootmem_data *bdata; unsignedLongnode_start_paddr; unsignedLongNODE_START_MAPNR; unsignedLongnode_size; intnode_id; structPglist_data *Node_next;} pg_data_t;
All nodes are maintained by the list pgdat_list, all nodes are in the linked list, and the nodes are initialized by the function Init_bootmem_core.
admin area: struct zone_t
typedefstructzone_struct {/** commonly accessed fields:*/spinlock_tLock; unsignedLongoffset; unsignedLongfree_pages; unsignedLonginactive_clean_pages; unsignedLonginactive_dirty_pages; unsignedLongpages_min, Pages_low, Pages_high; /** Free areas of different sizes*/ structList_head inactive_clean_list; free_area_t Free_area[max_order]; /** Rarely used fields:*/ Char*name; unsignedLongsize; /** Discontig memory support fields. */ structPglist_data *Zone_pgdat; unsignedLongzone_start_paddr; unsignedLongZONE_START_MAPNR; structPage *Zone_mem_map;} zone_t;
Pages: Page
typedefstructPage {structList_head list; structAddress_space *mapping; unsignedLongindex; structPage *Next_hash; atomic_t count; unsignedLongFlags/*atomic Flags, some possibly updated asynchronously*/ structList_head LRU; unsignedLongAge ; wait_queue_head_t wait; structPage * *Pprev_hash; structBuffer_head *buffers; void*Virtual;/*Non-null if kmapped*/ structZone_struct *Zone;} mem_map_t;
Linux physical memory-related data structures