实验程序
// memoryMsg.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/sched.h>
static pid_t pid;
/*向模块传递参数,文件的权限为0644*/
module_param(pid,int,0644);
int print_vma(void){
struct task_struct *task;
struct mm_struct *mm;
struct vm_area_struct *vma;
printk("\n\n\n\n\n\n\n\n\n\n");
printk("begin to print virtual address space...\n");
printk("\n");
task = pid_task(find_vpid(pid),PIDTYPE_PID);
mm = task->mm;
/*task_struct*/
printk("ececutable name:%s pid:%d\n",task->comm,task->pid);
printk("\n");
/*mm_struct*/
/*.text && .data*/
printk("start_code:0x%lx end_code:0x%lx\n",mm->start_code,mm->end_code);
printk("start_data:0x%lx end_data:0x%lx\n",mm->start_data,mm->end_data);
printk("\n");
/*heap*/
printk("start_brk:0x%lx end_brk:0x%lx\n",mm->start_brk,mm->brk);
printk("\n");
/*stacl*/
printk("start_stack:0x%lx\n",mm->start_stack);
printk("\n");
/*vm_area_struct*/
/*由于进程的虚拟空间以及其下属的虚拟空间有可能在不同的上下文中受到访问,而这些访问有必须互斥*/
down_read(&mm->mmap_sem);
/*vma is a linklist*/
for(vma = task->mm->mmap;vma;vma=vma->vm_next){
printk("Ox%lx - Ox%lx ",vma->vm_start,vma->vm_end);
if(vma->vm_flags & VM_READ){
printk("r");
}else{
printk("-");
}
if(vma->vm_flags & VM_WRITE){
printk("w");
}else{
printk("-");
}
if(vma->vm_flags & VM_EXEC){
printk("x");
}else{
printk("-");
}
if(vma->vm_flags & VM_SHARED){
printk("s");
}else{
printk("p");
}
printk("\n");
}
up_read(&mm->mmap_sem);
return 0;
}
static int __init print_vma_init(void){
print_vma();
return 0;
}
static void __exit print_vma_exit(void){
printk("good bye,kernel!\n");
}
module_init(print_vma_init);
module_exit(print_vma_exit);
MODULE_LICENSE("GPL");
Makefile文件
obj-m:=memoryMsg.o
CURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
实验过程
make #将memoryMsg.c编译为模块,.ko后缀
sudo insmod memoryMsg.ko pid=${进程号} #该模块需要传入要查看进程的进程号
sudo rmmod memoryMsg # 卸载模块
dmesg #查看内核的日志,因为内核模块的输出不会直接在终端显示,故需要执行该命令查看