简单的内核内存查看方法
有时候需要调试内核的内存,又不想搭建qemu调试环境的话,可以简单写一个内核模块,来测试一下。
直接看代码
注意:环境ub16
函数__get_free_page
不要用get_free_page
$ cat hello.c
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
unsigned char *pagemem;
unsigned char *kmallocmem;
unsigned char *vmallocmem;
int init_module(void)
{
pagemem = __get_free_page(0);
printk("<1>pagemem=%p\n",pagemem);
kmallocmem = kmalloc(100,0);
printk("<1>kmallocmem=%p\n",kmallocmem);
vmallocmem = vmalloc(1000000);
printk("<1>vmallocmem=%p\n",vmallocmem);
}
void cleanup_module(void)
{
printk("cleanup_module\n");
free_page(pagemem);
kfree(kmallocmem);
vfree(vmallocmem);
}
简单内核模块的编译方式
$ cat Makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
$(info "2nd")
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
$(info "1st")
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.symvers *.mod.c *.mod.o *.order
endif
然后make
一下就好了
$ sudo insmod hello.ko
$sudo dmesg
[183062.847067] <1>pagemem=ffff8800b918e000
[183062.847074] <1>kmallocmem=ffff88010445bd80
[183062.847403] <1>vmallocmem=ffffc9000270c000
[183062.847411] do_init_module: 'hello'->init suspiciously returned 30, it should follow 0/-E convention
do_init_module: loading module anyway...
[183062.847419] CPU: 1 PID: 26968 Comm: insmod Tainted: P OE 4.4.0-166-generic #195-Ubuntu
[183062.847423] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 05/19/2017
[183062.847427] 0000000000000286 17677df6d5fb8e3f ffff88007399fd08 ffffffff8140c6c1
[183062.847434] ffffffffc07b1000 000000000000001e ffff88007399fd30 ffffffff811992a3
[183062.847440] ffff88007399fea8 ffffffffc07b1050 0000000000000001 ffff88007399fe98
[183062.847445] Call Trace:
[183062.847459] [<ffffffff8140c6c1>] dump_stack+0x63/0x82
[183062.847469] [<ffffffff811992a3>] do_init_module+0x8d/0x1cf
[183062.847477] [<ffffffff8111373a>] load_module+0x16aa/0x1c50
[183062.847483] [<ffffffff8110fc40>] ? __symbol_put+0x60/0x60
[183062.847495] [<ffffffff81224040>] ? kernel_read+0x50/0x80
[183062.847502] [<ffffffff81113f24>] SYSC_finit_module+0xb4/0xe0
[183062.847509] [<ffffffff81113f6e>] SyS_finit_module+0xe/0x10
[183062.847519] [<ffffffff8186671b>] entry_SYSCALL_64_fastpath+0x22/0xcb
[183091.895768] cleanup_module //!!!sudo rmmod hello才会触发
至少知道vmalloc等分配内存大概是在内核内存布局的什么位置进行分配。