Linux的内存管理(二)

Linux的内存管理(二)

6.Linux数据结构

pg_data_t的主要数据结构

作用
node_zones保存该节点所拥有的管理区描述符, DMA、NORMAL、HIGHMEM
node_zonelists内存管理区的分配策略, 当调用free_area_init_core()时,由build_zonelists()函数设置
nr_zonesnode中的zone的数量, 1到3个之间
node_mem_mapnode中的第一个page
bdata仅用于boot 的内存分配
node_start_pfnpfn是page frame number的缩写, 用于表示node中的开始那个page在物理内存中的位置的
node_present_pagesnode中的真正可以使用的page数量
node_spanned_pagesnode中所有存在的Page的数量, 包括可用的、mem_map所占用的及dma所占用的区域
node_idnode的NODE ID, 从0开始
kswapd_waitnode的等待队列
  

zone的主要数据结构

作用
lowmem_reserve保留的低地址区域的内存
pagesetpage管理的数据结构对象, 内部有一个page的列表(list)来管理. 每个CPU维护一个
list用于避免自旋锁的冲突, 其大小和NR_CPUS有关, 编译时确定
lock对zone并发访问的保护的自旋锁
free_area页面使用状态的信息, 以每个bit标识对应的page是否可以分配
pages_scanned上次回收page后, 扫描过的page的数量
wait_table等待一个page释放的等待队列哈希表. 会被wait_on_page(),unlock_page()函数使用
wait_table_hash_nr_entries哈希表中的等待队列的数量
zone_pgdat指向这个zone所在的pglist_data对象
zone_start_pfn同node_start_pfn, 用于表示zone中的开始那个page在物理内存中的位置
present_pages和node中的类似的成员含义一样
spanned_pages和node中的类似的成员含义一样
  

page的主要数据结构

作用
flags状态的标志信息, 有大量宏用于设置清楚、检测flag成员中的各个位所表示的状态信息
_count访问计数. 当为0说明page是空闲的, 大于0说明一个或多个进程使用或者kernel用于在等待I/O
index根据page的使用的目的有2种可能的含义。第一种情况:如果page是file mapping的一部分,它指明在文件中的偏移。如果page是交换缓存,则它指明在address_space所声明的对象:swapper_space(交换地址空间)中的偏移。第二种情况:如果这个page是一个特殊的进程将要释放的一个page块,则这是一个将要释放的page块的序列值,这个值在__free_page_ok()函数中设置
mapping当文件或设备需要内存映射,文件或设备的inode对象有一个address_space类型的成员。如果page属于这个文件或设备,mapping将指向inode中这个成员。如果page不属于任何文件或设备,但是 mapping被设置了,则mapping指向了一个address_space类型的swapper_space对象,则page用于管理交换地址空间(swap address space)了
lrupage交换调度策略使用。page可能被调度到active_list或者inactive_list队列里。就是使用lru这个list_head
private保存了一些和mapping(文件mapping到内存)有关的一些特定的信息。如果page是一个buffer page,则它就保存了一个指向buffer_head的指针
virtual不再用于将high memory的映射到ZONE_NORMAL区域的作用了,除了一些其他的体系结构会用到外
  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

7.进程内存管理

内存管理中MMU的存在使得进程之间相互隔离,进程访问的空间均为虚拟地址空间
Linux中用struct mm_struct来描述一个进程的虚拟地址空间,也通常称为内存描述符
每个进程只有一个mm_struct结构,但可能有多个虚拟内存区间(struct vm_area_struct),通常用vma表示,不同vma代表着进程空间的各个区域,比如堆、栈、代码区、数据区、各种映射区、等等
   对这些vma的组织方式有两种
     - 当虚拟区间较少时, 采用单链表,由mmap指针指向这个链表,
     - 当虚拟区间多时, 采用"红黑树(red_black tree)”结构,由mm_rb指向这颗树。
mmap_cache 用来保存最近一次用到的虚拟区间,因为程序中用到的地址常常具有局部性
pgd 指向该进程的页目录(每个进程都有自己的页目录,区别于内核页目录)
mmap_sem/page_table_lock 是互斥访问虚拟区间的信号量
mm_user/mm_count 指明了此虚拟地址空间的用户/引号。主要用于进程间共享

特殊的内存描述符: 同init_task一样,init_mm为内核进程服务。
init_mm

http://blog.csdn.net/tommy_wxie/article/details/7426580

http://blog.csdn.net/ryder001/article/details/7825710

http://www.chinaunix.net/old_jh/4/1003872.html

http://www.linuxidc.com/Linux/2011-12/50480.htm


Linux mips内存初始化分析

参考:
linux内存管理浅析
专栏:Linux内存管理
内存管理的那些事儿

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值