物理内存组织结构


系统调用mmap

  1. 系统调用mmap用来创建内存映射,把创建内存映射主要工作委托给do_mmap函数,内核源码文件处理 :mm/mmap.c
  2. 虚拟内存区域使用其实地址和结束地址描述,链表按起始地址递增排序。
  3. 红黑树是自动平衡二叉树好处有1.查询方便,2.插入的时候避免全链表扫描
  4. 区别 在于: mmap 指定便宜的单位是字节,而mmap2 指定的单位是页。ARM64架构实现系统调用mmap

    sys_mmap 过程如下: 检查偏移是不是页的整数倍(如果偏移不是页的整数倍,直接返回-EINVAL,如果偏移是页的整数倍,那么把偏移转成页为单位的偏移,然后调用下面函数sys_mmap_pgof

Read more

内存映射原理


内存映射原理

内存映射的原理

创建内存映射时,在进程的用户虚拟地址空间中分配一个虚拟内存区域。内核采用延迟分配物理内存的策略,在进程第一次访问虚拟页的时候,产生缺页异常。如果是文件映射,那么分配物理页,把文件指定区间的数据读到物理页,然后再页表中把虚拟页映射到物理页,如果匿名映射,就分配物理页,然后在页表中把虚拟页映射到物理页

内存映射即在进程的虚拟地址空间中创建一个映射,分为两种:

  1. 文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件
  2. 匿名映射:没有文件支持的内存映射,把物理内存映射到里程的虚拟地址空间,没有数据源。

物理地址空间

物理地址是处

Read more

虚拟地址空间布局架构


虚拟地址空间布局架构

内存管理子系统架构可以分为:用户空间,内核空间以及硬件部分3个层面。

  1. 用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源
  2. 内核空间:内核总是驻留在内存中,是操作系统的一部分,内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。
  3. 硬件:处理器包含一个内存管理单位( Memory Management Unit ,MMU)的部件,负责把虚拟地址转换为物理地址。

Linux内核只是操作系统当中的一部分,对下管理系统所有硬件设备;对上通过系统调用向Library Routine 或(或者其他应用程序提供的API接口)

Read more

内核数据结构


内核数据结构

链表和红黑树

Linux 内核源码中,常用的数据结构为链表和红黑树。如链表主要解决元素可以动态创建并删除和插入,每个元素离散存放 不需要占据连续的内存

链表在Linux 内核数据结构如下:

struct list_head {
    struct list_head *next, *prev;
};
struct hlist_head{
    struct hlist_node *first;
}

链表静态和动态初始化操作:

#define LIST_HEAD_INIT(name) { &(name),&(name)}
#define LIST_HEAD(

Read more

内核内存布局和堆管理


Linux 内核内存布局

64位Linux 一般使用48位来表示虚拟地址空间,45(有的是44 或者 46)位表示物理地址,通过命令:cat /proc/cpuinfo 输出地址大小,具体的其他选项参数: vendor_id : GenuineIntel //厂商 cpu family : 6 //CPU产品代号 mode : 79 //cpu 属于其系列的具体代号 mode name: Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz stepping : 1//cpu 属于制作更新版本 cpu MHz

Read more