1、入口INIT
struct mm_struct init_mm = {
.mm_rb = RB_ROOT,
.pgd = swapper_pg_dir,
.mm_users = ATOMIC_INIT(2),
.mm_count = ATOMIC_INIT(1),
.write_protect_seq = SEQCNT_ZERO(init_mm.write_protect_seq),
MMAP_LOCK_INITIALIZER(init_mm)
.page_table_lock = __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
.arg_lock = __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),
.mmlist = LIST_HEAD_INIT(init_mm.mmlist),
.user_ns = &init_user_ns,
.cpu_bitmap = CPU_BITS_NONE,
INIT_MM_CONTEXT(init_mm)
};
这段代码定义了一个名为 init_mm 的 mm_struct 结构体变量,并初始化了该变量的各个成员变量。下面是各个成员变量的含义:
.mm_rb: 红黑树的根节点,用于存储 vm_area_struct 结构体,表示当前进程的虚拟地址空间。
.pgd: 指向当前进程的页表目录指针。
.mm_users: 表示使用该 mm_struct 的用户数量,该成员变量使用原子变量进行初始化。
.mm_count: 表示该 mm_struct 的引用计数,该成员变量使用原子变量进行初始化。
.write_protect_seq: 用于记录页表项的写保护计数,该成员变量使用 SEQCNT_ZERO 宏进行初始化。
.page_table_lock: 用于保护页表的自旋锁。
.arg_lock: 用于保护进程的参数列表的自旋锁。
.mmlist: 用于将该 mm_struct 结构体添加到进程链表中。
.user_ns: 指向该 mm_struct 所属的用户命名空间。
.cpu_bitmap: 表示该 mm_struct 用于哪些 CPU,使用 CPU_BITS_NONE 宏进行初始化。
INIT_MM_CONTEXT(init_mm): 初始化该 mm_struct 的上下文信息,包括进程的状态、信号处理等信息。
总之,这个结构体定义了一个进程的内存管理信息,包括虚拟地址空间、页表、锁等。
2、虚拟地址的作用
虚拟地址是指操作系统中每个进程所使用的地址空间,它是一种抽象的地址,不是实际的物理地址,而是在程序中使用的地址。操作系统通过将虚拟地址映射到物理地址来实现进程的内存管理。
虚拟地址的作用主要有以下几个方面:
1、提供了一种方便的方式来访问内存。程序员可以使用虚拟地址来引用内存,而不用考虑实际的物理地址。
2、提高了内存的使用效率。虚拟地址空间允许多个进程同时运行,每个进程都有自己的独立虚拟地址空间。这样,操作系统可以将进程所使用的虚拟地址映射到实际的物理地址,从而实现内存共享和动态分配,提高了内存使用效率。
3、提高了系统的安全性。虚拟地址空间使得操作系统可以将进程的内存隔离开来,从而保护进程不受其他进程或系统的干扰。如果一个进程试图访问另一个进程的虚拟地址空间,操作系统会立即中断该进程的运行,从而保证系统的安全性。
因此,虚拟地址在操作系统中扮演了重要的角色,它不仅提高了内存的使用效率,还保证了系统的安全性。