- 博客(7)
- 收藏
- 关注
原创 创建内核线程机制分析
_kthread_create_on_node函数中将create节点加入到kthread_create_list链表,并唤醒kthreadd内核线程进行处理,kthreadd线程会创建新内核线程,并将新线程的task_struct保存在create->result,最后对线程设置线程名,调度策略,以及cpu亲和性结束。kthread函数先获取到锁(xchg返回不为NULL)的情况下,__kthread_create_on_node不管是等待中被杀,还是一直等待,都能创建内核线程成功。
2025-12-02 18:06:27
336
原创 hungtask机制分析
hungtask的作用就是定期(hung_task_check_interval_secs)循环检测系统上的所有线程,如果发现有线程在一段时间(hung_task_timeout_secs秒)内状态一直是D(TASK_UNINTERRUPTIBLE)状态,就认为进程异常,从而进行相应的告警(设置了hung_task_warnings)和让系统panic(设置了sysctl_hung_task_panic)nvcsv主动上下文切换的情况:IO阻塞,锁等待,主动调用schedule等。
2025-11-25 17:04:56
275
原创 oom机制分析
oom_kill_process函数处理选中的进程,如果进程正在退出,让oom_reaper现成去回收内存,否则让__oom_kill_process函数处理。可以看到oom_reaper函数是死循环,等待oom_reaper_list不为空的事件发生时被唤醒,从队列拿出一个task交给oom_reap_task处理。wake_oom_reaper函数将受害者进程加入oom_reaper_list队列,唤醒oom_reaper内核线程。task_will_free_mem函数判断进程是否可以立刻释放内存。
2025-11-24 18:44:28
272
原创 内核日志限速功能分析
在[begin, begin+interval]时间内,并且打印消息次数没超过burst,则函数返回1,表示允许打印消息,否则对missed计数,在[begin, begin+interval]之外,并且missed有计数的情况下,才打印一次消息被抑制信息,然后重新设置下一个时间段的[begin, begin+interval]进行限速。上面代码表示如果__ratelimit(&oom_rs)返回非0,允许dump_header打印日志,返回0不允许打印,日志被限速了。
2025-06-25 12:39:43
779
原创 内核对申请虚拟内存的处理策略overcommit
0: heuristic overcommit (this is the default) 默认值,只检测申请的内存页是否超过物理内存页和交换页之和,没超过则允许。避免每次统计提交申请内存页数都增加到全局fbc->count,只有当前cpu上统计达到batch之后才增加到fbc->count,提高性能。vm_commit_limit函数计算策略值为OVERCOMMIT_NEVER(2)的时候,初始允许申请的内存上限。vm_acct_memory用来累加申请的虚拟内存页数。
2025-06-19 16:26:14
210
原创 SystemV 消息队列收发流程分析
发送和接收函数都在ipc/msg.c文件中for循环中的主要处理逻辑是通过msg_fits_inqueue判断是否加入新消息会导致消息队列满1:消息队列未满,则跳出for循环,继续发送流程处理;
2024-10-16 17:37:14
700
原创 【openEuler上使用qemu调试linux内核】
打开DEBUG_INFO,会编译出带调试信息的vmlinux,后续用gdb vmlinux调试。没有命令的话通过 yum install qemu-system-x86_64 -y 安装。这三个模块编译进内核能让内核在启动时识别到我们制作的rootfs.img系统盘为sda。设置BLK_DEV_SD=y 将sd_mod.ko模块编译进内核。设置ATA_PIIX=y 将ata_piix.ko编译进内核。-S #在启动时冻结cpu,类似于启动时打了一个断点。设置ATA=y 将libata.ko编译进内核。
2024-07-14 12:40:01
2119
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅