有時候需要除錯核心的記憶體,又不想搭建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...