内核模块编程——打印一个进程的vm_area_struct
来源:互联网 发布:java 英文日期转换 编辑:程序博客网 时间:2024/06/05 00:11
本文是一个小程序,目的是打印一个进程的vm_area_struct结构体变量,进一步加深对mm_struct和vm_area_struct结构体的理解。
那我们首先来理解一下吧。
mm_struct主要是用来描述一个进程的虚拟内存,它的结构体定义如下:
- struct mm_struct {
- int count;
- pgd_t * pgd;
- unsigned long context;
- unsigned long start_code, end_code, start_data, end_data;
- unsigned long start_brk, brk, start_stack, start_mmap;
- unsigned long arg_start, arg_end, env_start, env_end;
- unsigned long rss, total_vm, locked_vm;
- unsigned long def_flags;
- struct vm_area_struct * mmap;
- struct vm_area_struct * mmap_avl;
- struct semaphore mmap_sem;
- };
我们可以看到,这个结构体当中有许多的unsigned long类型的变量,这些变量的目的主要是用来记录地址的,比如start_code:代码段的开始地址,end_code:代码段的结束地址,等等。
这个结构体当中还有一个比较关键的地方就是vm_area_struct结构体变量,关于虚拟内存管理的最基本的管理单元就是vm_area_struct了,它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。
小结:一个进程的虚拟地址空间主要由两个数据结构来描述,一个是高层次的mm_struct,一个是较高层次的vm_area_struct。mm_struct描述了一个进程的整个虚拟地址空间,vm_area_struct描述了虚拟地址空间的一个区。每一个进程只有一个mm_struct。
下面的这个内核模块程序是用来打印当前进程的mm_struct和vm_area_struct的程序。
- #include <linux/init.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/sched.h>
- #include <linux/mm.h>
- MODULE_LICENSE("Dual BSD/GPL");
- MODULE_AUTHOR("Sunny");
- static int __init print_mm_init(void)
- {
- struct mm_struct *mymm = (&init_task)->mm;
- struct vm_area_struct *pos = NULL;
- printk("current process:%s %d\n", current->comm, current->pid);
- for(pos = mymm->mmap; pos; pos = pos->vm_next) {
- printk("0x%lx-0x%lx\t", pos->vm_start, pos->vm_end);
- if(pos->vm_flags & VM_READ) {
- printk("r");
- } else {
- printk("-");
- }
- if(pos->vm_flags & VM_WRITE) {
- printk("w");
- } else {
- printk("-");
- }
- if(pos->vm_flags & VM_EXEC) {
- printk("x");
- } else {
- printk("-");
- }
- printk("\n");
- }
- return 0;
- }
- static void __exit print_mm_exit(void)
- {
- printk(KERN_ALERT"Goodbye,world\n");
- }
- module_init(print_mm_init);
- module_exit(print_mm_exit);
这个小程序可以作一下变化,比如把current的这个符号换成&init_task这个进程,并且打印这个,可以仔细观察结果的~~
0
上一篇:vim的一个配置文件
下一篇:云计算项目中遇到erlang的几个小问题
相关热门文章
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 内核模块编程——打印一个进程的vm_area_struct
- 写自己的内核模块——获取一个进程的物理地址
- 关于写个内核模块打印进程链表的一些信息的程序
- struct vm_area_struct内核数据结构
- Linux——内核模块编程
- Linux内核编程(一) —— 内核模块加载
- 内核模块消息打印
- 一个菜鸟的内核学习——Win7内核隐藏进程
- Linux内核分析——分析Linux内核创建一个新进程的过程
- 编写内核模块遍历进程的PID
- 通过模块参数进程PID打印进程的虚存区
- 内核模块遍历进程
- vm_area_struct
- vm_area_struct
- vm_area_struct
- vm_area_struct
- vm_area_struct
- vm_area_struct
- 有关sizeof()的实现
- c++派生类对象赋值给基类对象
- 快速幂取模の子函數
- vim的一个配置文件
- MPAndroidChart 图表柱状图,折线图,和组合图
- 内核模块编程——打印一个进程的vm_area_struct
- 关于4G直播的运用,手机app直接控制编码器物联方式简化编码器的操作
- 怎么用CDR X8做出胶片效果
- 云计算项目中遇到erlang的几个小问题
- C++ MFC string转Cstring详解
- erlang源程序文件的注释
- 从5900到65535之间随机分配一个数字——erlang实现
- C++ 无条件转移控制
- erlang gen_fsm编程框架
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
抽油烟机止回阀
手纸盒
妇洗器
油烟机风轮
橱柜多高
五金配件网
橱柜配件
女浴室
油烟机油盒
扶手
卫生间毛巾架
浴室镜
烟道止逆阀
小五金
烟道止逆阀安装图解
卡美多
油烟机止回阀图片
止逆阀怎么安装
油烟机烟道止回阀
乔伟
乔伦
钻石乔兹
乔兹
乔兹加点
乔军
乔力跑步机
乔叟
乔司
乔司二手房
乔司吧
乔司中学
乔司在哪里
乔司年沈从梨
乔司管道疏通
乔司地铁站
杭州乔司房价
乔司镇
杭州乔司
乔司医院
乔四
乔四毛阿敏