Nano Code扩展之!address命令

本文详细介绍了Linux中!address命令的作用,以及地址空间描述符mm_struct的结构和工作原理。mm_struct作为进程地址空间描述符,其pgd指针用于切换页表,mmap则指向vm_area_struct链表,记录虚拟地址信息。文章还讨论了mm与active_mm的区别,并讲解如何实现!address命令,包括如何遍历vm_area_struct结构体,以及如何根据vm_page_prot和vm_flags展示权限信息和虚拟地址空间类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

!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当中,这么做是因为内核需要知道用户程序的一些信息,因此把它保存下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值