本文主要记录常见的 Linux 命令,特别是那些经常遇到但是容易忘记的命令用法。
- Research11
- JAVA8
- Others7
- Algorithm6
- Android6
- Python5
- Server5
- Linux5
- Frontend5
- Projects5
- Kernel5
- Arm4
- Cloud4
- Database4
- Frameworks3
- Networks3
- Tools3
- Computer Architecture1
- JVM1
概览
Binder 内存管理指的是:管理 binder mmap 映射的这块缓冲区。其中有两个关键的数据结构:
binder_alloc:缓冲区分配器,对每个使用 binder 进行 IPC 通信的进程,事先建立一个缓冲区;
binder_buffer: 描述缓冲区的数据结构
本文先对这两个关键的数据结构进行研究,然后再逐一分析使用这些数据结构的相关函数和算法。
数据结构分析
binder_alloc
Abstract
本文研究 tick, 在 kernel 的 idle 流程中,会出现对 tick 的调用,用于进行 idle 状态时钟的控制等。由于其机制复杂,代码量大,故将其单独进行研究。
本文主要针对于 idle 流程中涉及到的 tick 进行简单研究。
tick_nohz_idle_stop_tick
当出现需要处理的中断时,CPU 将从无操作系统状态恢复到正常运行状态,并执行 tick_nohz_idle_stop_tick
函数来重新启用时钟事件处理器。
tick_nohz_stop_tick
的作用类似。
RCU
什么是 RCU 状态?
在Linux内核中,RCU(Read-Copy-Update)是一种读取数据不加锁的机制,它通过使用复制而不是传统的互斥量机制来实现对共享数据结构的并发安全。
也就是说 RCU 是一种同步机制,其可以支持一个写操作和多个读操作同时进行。对比而言,读写锁是一种排他锁,写的同时不允许其他读的操作。
❗本文为了研究清楚 idle, 故针对 idle 流程中的 RCU 进行研究。
🔗 名词解释
- Grace period: 宽限期
- Quiescent state: 静止态
Abstract
本文主要研究 kernel 中的 idle 机制以及代码实现。
Function Flow
我们先对大体上的函数调用栈进行一个简单的示意图总结:
cpuidle_enter_state() 之后的流程可以参考 tick_broadcast_oneshot_control() 的分析。
cpu_startup_entry
笔者在实际的业务场景中抓取过 idle 函数的调用栈,大概如下所示:
[] [pid:0,cpu6,swapper/6,0] show_stack+0x14/0x1c
[] [pid:0,cpu6,swapper/6,1] dump_stack_lvl+0xb8/0x108
[] [pid:0,cpu6,swapper/6,2] dump_stack+0x14/0x1c
[] [pid:0,cpu6,swapper/6,3] cpuidle_select+0x20/0x54
[] [pid:0,cpu6,swapper/6,4] 0xffffffe55f4d072c
[] [pid:0,cpu6,swapper/6,5] cpu_startup_entry+0x20/0x24
[] [pid:0,cpu6,swapper/6,6] secondary_start_kernel+0x1e8/0x208
[] [pid:0,cpu6,swapper/6,7]CPU: 6 PID: 0 Comm: swapper/6 VIP: 00
[] [pid:0,cpu6,swapper/6,8]TGID: 0 Comm: swapper/6
[] [pid:0,cpu6,swapper/6,9]Hardware name: xxx (DT)