!address命令的介绍
!address命令用于显示内存描述符内信息的命令。
地址空间描述符----mm_struct
在Linux中有一种名为task_struct的结构体,专门负责记录进程的信息,因此他也被称为是进程描述符;不难想象,一个进程它拥有许许多多的信息,因此负责描述它的task_struct结构体也必然非常庞大,数一下大概有几百个字段吧,而这其中又有不少的指针成员,这些指针成员内存有的地址会指向对应的结构体。
在这些指针成员中有两个较为重要的指针,它们分别是mm和active_mm,这两个指针成员会指向一个名为mm_struct的结构体,mm_struct结构体也被称作是进程地址空间描述符 / 内存描述符,;在这个结构体里面记录了进程虚拟地址空间的信息;mm_struct结构体内的mmap指向的vm_area_struct结构体对记录进程虚拟地址空间的信息,起到了较为重要的作用。
mm_struct结构体基本工作原理:在mm_struct结构体内有一个名为pgd的指针(pgd_t *pgd),这个指针会指向页表,在操作系统执行进程的时候会通过该指针切换到页表内,在访问进程内的数据时,通过该页表进行“翻译”;切换别的进程时,当然就通过pdg切换到其他页表内了;这便使不同的进程拥有了自己的虚拟空间。
mm和actice_mm的区别:正常来讲操作系统的虚拟空间可以分成两大部分,分别是用户程序所使用的用户空间和内核程序所使用的内核空间,用户空间可以有好多个(不同进程之间拥有独立的虚拟空间的基本原理见上方),但内核空间只用一个,是公用的;mm会指向虚拟地址空间中的用户空间,并不会指向内核空间,因此对于内核程序而言,它的mm一定是空指针,这是因为内核程序不一定被那个用户程序所使用,因此内核程序不做其他操作,直接把mm设为空指针;actice_mm指向也是虚拟地址空间,不过是内核程序将上一个进程的mm存在了active_mm当中,这么做是因为内核需要知道用户程序的一些信息,因此把它保存下来。