简单的内核内存查看方法

简单的内核内存查看方法

有时候需要调试内核的内存,又不想搭建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等分配内存大概是在内核内存布局的什么位置进行分配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值