[linux内存]伙伴系统学习笔记(二)--内存系统初始化

1,本文大部分来自:http://blog.csdn.net/vanbreaker/article/details/7611585

2,在start_kernel()-->paging_init()-->zone_sizes_init()-->free_area_init_nodes()-->free_area_init_node()-->free_area_init_core()-->init_currently_empty_zone()->zone_init_free_lists()中,free_area的相关域都被初始化

[cpp] view plaincopy

  1. static void __meminit zone_init_free_lists(struct zone *zone)
  2. {
  3. int order, t;
  4. for_each_migratetype_order(order, t) {
  5. /*链表初始化为空链表*/
  6. INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);
  7. /*内存块数量初始化为0*/
  8. zone->free_area[order].nr_free = 0;
  9. }
  10. }

start_kernel()-->mm_init()-->mem_init(),负责统计所有可用的低端内存和高端内存,并释放到伙伴系统中

在free_area_init_core()-->memmap_init()(-->memmap_init_zone() )-->set_pageblock_migratetype(),将每个pageblock的起始页框对应的struct zone当中的pageblock_flags代表的位图相关区域标记为可移动的,表示该pageblock为可移动的,也就是说内核初始化伙伴系统时,所有的页都被标记为可移动的

在内核首先通过setup_arch()-->paging_init()-->zone_sizes_init()来初始化节点和管理区的一些数据项其中核心函数为free_area_init_node(),用来针对特定的节点进行初始化

至此,节点和管理区的关键数据已完成初始化,内核在后面为内存管理做得一个准备工作就是将所有节点的管理区都链入到zonelist中,便于后面内存分配工作的进行内核在start_kernel()-->build_all_zonelist()中完成zonelist的初始化

时间: 2024-08-01 10:46:33

[linux内存]伙伴系统学习笔记(二)--内存系统初始化的相关文章

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

Linux System Programming 学习笔记(二) 文件I/O

1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情况下,子进程会获得其父进程文件表的完整拷贝 2.打开文件 open系统调用必须包含 O_RDONLY,O_WRONLY,O_RDWR 三种存取模式之一 注意 O_NONBLOCK模式 int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644

[linux内存]伙伴系统学习笔记(一)——概念

1,伙伴系统的作用: 伙伴系统主要是为了高效使用物理内存,尽量减少内存碎片的产生 2,伙伴系统的概念: 系统中的内存总是两两分组,每组中的两个内存块称为伙伴 3,伙伴系统的原理:  伙伴系统是相对于struct zone而言,将每个zone的空闲内存分为最多11个数组,比如第一个数组里管理着2^0页的内存,所有这些2^0的页以struct page的lru域的双向链表相连接,第二个数组管理着2^1页的内存,所有这些2^0的页以struct page的lru域的双向链表相连接,以此类推,.....

[linux内存]伙伴系统学习笔记(三)--分配器API

1,分配器API http://blog.csdn.net/kickxxx/article/details/9287003 伙伴系统只能分配2的整数幂个页.因此申请时,需要指定请求分配的阶. 2,分配页, 所有分配伙伴系统的函数分配页最终都会调用到alloc_pages_nodemask()函数 static inline struct page*alloc_pages_nodemask(int nid,gfp_t gfp_mask,unsigned int order)nid:指的是从哪一个节

Linux学习笔记<二十>——系统裁剪之二

在系统裁剪之一的基础上,给系统添加挂载文件系统.关机重启.设置主机名.运行对应级别的服务脚本.启动终端.装载网卡驱动并启用网络等功能. 挂载文件系统 ①重新挂载根文件系统为可读写 vim 编辑/mnt/sysroot/etc/rc.d/rc.sysinit添加以下行 echo "Remount rootfs..." mount -n -o remount,rw / ②vim 编辑/mnt/etc/fstab /dev/sdb2       /       ext3    default

linux sheel编程学习笔记(二) --- grep命令

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户. grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板.如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名.搜索的结果被送到标准输出,不影响原文件内容. grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成

<Bootstrap> 学习笔记二. 栅格系统的使用

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="bootstrap/css/bootstrap.css"> <link rel="stylesheet&

linux kernel学习笔记-5内存管理(转)

http://blog.sina.com.cn/s/blog_65373f1401019dtz.htmllinux kernel学习笔记-5 内存管理1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易.内核使用了页和区两种数据结构来管理内存: 1.1 页 内核把物理页作为内存管理的基本单位.尽管CPU的最小可寻址单位通常为字(甚至字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L