簡單的核心記憶體檢視方法

2021-10-01 10:01:48 字數 2269 閱讀 6771

有時候需要除錯核心的記憶體,又不想搭建qemu除錯環境的話,可以簡單寫乙個核心模組,來測試一下。

直接看**

注意:環境ub16

函式__get_free_page不要用get_free_page

$ cat hello.c

#include #include #include unsigned char *pagemem;

unsigned char *kmallocmem;

unsigned char *vmallocmem;

int init_module(void)

void cleanup_module(void)

簡單核心模組的編譯方式

$ 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] dump_stack+0x63/0x82

[183062.847469] do_init_module+0x8d/0x1cf

[183062.847477] load_module+0x16aa/0x1c50

[183062.847483] ? __symbol_put+0x60/0x60

[183062.847495] ? kernel_read+0x50/0x80

[183062.847502] sysc_finit_module+0xb4/0xe0

[183062.847509] sys_finit_module+0xe/0x10

[183062.847519] entry_syscall_64_fastpath+0x22/0xcb

[183091.895768] cleanup_module //!!!sudo rmmod hello才會觸發

至少知道vmalloc等分配記憶體大概是在核心記憶體布局的什麼位置進行分配。

核心記憶體的分配

當使用者態程序需要額外記憶體的時候,可以從核心所維護的空閒頁幀鍊錶中獲取頁,該鍊錶通常由頁替換演算法來更新,這些頁幀通常分散在物理記憶體當中,如果使用者只需要乙個位元組的記憶體,那麼會產生記憶體碎片,這是因為程序會得到整個頁幀 核心記憶體的分配通常是從空閒記憶體池中獲取的,而並不是從滿足普通使用者模...

linux下的記憶體檢視

下面是自己的一些嘗試。首先是top命令 其中,virt是程序1虛擬記憶體 virt 的大小 實際需要的記憶體容量?為48428kb 約50mb 實際占用的記憶體 res,resident的縮寫 為5612kb 約5mb 共享記憶體 shr 為3720kb 約3mb 然後再看一下ps命令 ps u p...

linux的記憶體檢視命令 free

我們一般用free命令 root scs 2 tmp free total used free shared buffers cached mem 3266180 3250004 16176 0 110652 2668236 buffers cache 471116 2795064 swap 204...