kmalloc和vmalloc对比

1. kmalloc和vmalloc对比 以ARM64为例,不考虑高端内存。 1.1. 实现原理 kmalloc和vmalloc底层函数都是__alloc_pages。 kmalloc会根据申请大小是否大于KMALLOC_MAX_CACHE_SIZE来决定使用slab还是__alloc_pages,而slab最终也是调用__alloc_pages。 1.2. 初始化 默认情况下,kmalloc和vmalloc都不会对申请的内存做初始。 可以通过kzalloc或vzalloc申请内存并初始化为0。 1.3. 对齐 kmalloc按块分配,通常为2^n对齐,每次分配的大小也是2^n。根据实现,可能也支持96或者192字节。...

Linux中的栈

1. 内核栈 在每一个进程的生命周期中,必然会通过到系统调用陷入内核。在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先进程用户空间中的栈,而是一个单独内核空间的栈,这个称作进程内核栈。 1.1. init_task init_task,也就是bootcpu的swapper进程对应的task_struct,其内核栈是静态初始化的。 1/// init/init_task.c 2/* 3 * Set up the first task table, touch at your own risk!. Base=0, 4 * limit=0x1fffff (=2MB) 5 */ 6struct task_struct...

Linux使用ftrace进行boottime跟踪

1. 简介 要使用ftrace进行boottime追踪,可以使用内核参数(bootargs)或者bootconfig来进行配置。 关键的函数如下: 1+-- start_kernel 2/// ... ... 3| +-- setup_arch 4| +-- setup_boot_config 5| | +-- get_boot_config_from_initrd 6| | +-- xbc_get_embedded_bootconfig 7| | +-- xbc_init /// 解析bootconfig,创建树 8| +-- setup_command_line 9/// ... ... 10| +--...

trace-cmd实例

1. trace-cmd trace-cmd需要root权限。 1.1. 使用步骤 1# 保存成文件 2trace-cmd record 3trace-cmd report 1# 从tracefs读取 2trace-cmd start 3trace-cmd stop 4trace-cmd show 5 6trace-cmd clear 7trace-cmd restart 8trace-cmd show 1.2. 常见需要忽略的函数 1# 内存分配 2-n kmem_cache_alloc -n __kmalloc -n kmalloc_trace -n kfree -n kmalloc_slab -n...

用trace追踪Linux进程的一生

1. 简介 通常来说,shell要启动一个新的程序,会先fork一个新进程,然后执行exec系统调用将替换新进程的执行程序。posix规定了posix_spawn函数,封装了fork+exec的过程,提供了更加高效的接口。 2. 追踪进程 2.1. 一个比hello world还简单的程序 C语言编程通常会以printf("hello world\n");作为第一个程序。这里写一个简单的程序来演示进程的创建、执行和退出。 main函数的返回值会被作为进程的退出码传递给exit系统调用,如果使用void main(void),进程的退出值可能是不确定的,这里为了方便理解,使main函数的返回值为0。 1int main(void)...

Linux内核的通知链机制

1. 简介 Linux内核中的notifier_chain是一种用于跨模块通信的机制。当一个模块需要通知其他模块某些事件时,它可以使用notifier_chain将这些事件通知给其他模块。这种机制使得模块之间的耦合度降低,提高了代码的可维护性和可扩展性。 在Linux内核中,有四种类型的通知链: 原子通知链适用于对原子性要求高的中断上下文 阻塞通知链适用于进程上下文的复杂处理 原始通知链提供了最大的灵活性但需要谨慎使用 SRCU 通知链则在读写锁保护的场景中发挥作用 1/// include/linux/notifier.h 2/* 3 * Notifier chains are of four types: 4 * 5 *...

VMware和Hyper-V回收虚拟磁盘空间

1. 基本原理 文件系统未占用的空间数据写完全0,会被视为空闲空间,可以被虚拟机软件回收。 操作步骤: 虚拟机内,空闲空间数据写0。 关闭虚拟机 回收虚拟磁盘文件空间 2. 文件系统和磁盘空闲区间擦除 对于根文件系统,只能使用dd命令创建全零文件模拟擦除。 1df # 查看剩余空间大小 2dd if=/dev/zero of=zero.bin bs=1MiB count=1024 3sync 4rm -f zero.bin 其他可重新挂载的分区可以使用如下几种方式: 卸载或将文件系统挂为只读后,使用zerofree回收,注意zerofree只适用于ext2、ext3、ext4文件系统。 使用resize2fs压缩文件文件系统后,缩...

栈帧寄存器相关的编译选项

1. 编译选项 -fomit-frame-pointer表示在函数调用时不需要存储堆栈帧指针。此选项可减小生成的代码镜像大小, 一般在启用-On优化后会自动打开,也有的平台是默认打开的。 -fno-omit-frame-pointer表示将堆栈帧指针存储在寄存器中,帧指针是用来指示当前函数的栈帧(stack frame)的指针,在调试时可以帮助跟踪函数调用的堆栈信息。 在 AArch32 架构中,堆栈帧指针存储在寄存器R11A32代码)或寄存器R7T32代码)中. 在AArch64架构中,堆栈帧指针存储在寄存器X29中。作为帧指针使用的寄存器不能用作通用寄存器,但如果使用 -fomit-frame-pointer选项编译,则可用作...