__init在驱动程序module_init和内核的其他函数中,内核中有许多调用实例.我怀疑的是内核如何确定__init调用的顺序.更重要的是,它如何确定驱动程序module_init调用的顺序?
可能重复:
int的大小是否取决于编译器和/或处理器?
Integer的大小是依赖于编译器还是依赖于OS或处理器?如果我在32位机器或64位机器上运行的32位操作系统或64位操作系统上使用gcc怎么办(在这种情况下只有64位操作系统).
我正在浏览driver/cpufreq/cpufreq.c以了解它是如何工作的.我遇到了一段我无法理解的代码.
在cpufreq_core_init:
for_each_possible_cpu(cpu) {
per_cpu(cpufreq_policy_cpu, cpu) = -1;
init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
}
Run Code Online (Sandbox Code Playgroud)
当我浏览定义的宏时,
#define for_each_possible_cpu(cpu) for_each_cpu((cpu), cpu_possible_mask)
#define per_cpu(var, cpu) \
(*SHIFT_PERCPU_PTR(&(var), per_cpu_offset(cpu)))
#define init_rwsem(sem) \
do { \
static struct lock_class_key __key; \
\
__init_rwsem((sem), #sem, &__key); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
我的问题:
for_each_possible_cpu扩展?#defines在里面打电话?per_cpu输出等于-1?在研究工作队列时,我遇到了内核中定义的工作队列标志和常量。我有以下疑问,我无法理解。
排水和救援人员在这里到底是什么意思?
WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */
WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */
Run Code Online (Sandbox Code Playgroud)为未绑定工作队列定义的 CPU 数量是 4。如果我有一个八核处理器会怎样。无界 wq 将如何绑定到 cpus。他们如何决定运行哪些 CPU,因为他们现在有 8 个 cpu 而不是 4 个 cpu。是这样,它们可以在 8 个或仅 4 个特定 cpu 中的任何一个上运行吗?
WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */
我想知道当我尝试在没有交换分区或交换文件的运行Linux的嵌入式主板上运行新进程时会发生什么.通常对于PC上的Linux,它会从RAM中换出页面,从而为新进程释放内存.现在,嵌入式主板(例如任何开发板),运行没有交换的Linux想要运行一个新的进程,RAM完全满了,它如何运行一个新的进程?
这些电路板将具有寿命有限的闪存,因此即使我们实施交换也不能频繁交换.