1.idle()函数的三种可能实现:
1.default_idle():执行hlt指令;
2.poll_idle():如果核心参数上定义了"idle = poll",则pm_idle会指向poll_idle(),它将need_resched设置为-1,反复循环直到不为-1,比default_idle()效率高。
3.电源管理相关的idle过程:如APM和ACPI模块中定义的idle过程;
2.内存屏障
关于内存屏障__asm__volatile__("":::“memory”)
#define set_mb() _____
#define rmb() ______
…
追踪到底rmb(),set_mb(),mb()…都是
asm__volatile("":::“memory”)指内存屏障,
__asm__volatile__用于只是编译器此处插入汇编语句;
“:::”用于告诉编译器此处的汇编语句严禁组合优化;
“memory”强制gcc编译器假设RAM所有的内存单元均被汇编指令修改,这样CPU中的register和cache中已缓存的内存单元中的数据将作废。
3.BUG_ON和WARN_ON的理解
都是内核用来调试用的,调用BUG_ON()时会引发oops(即打印一些提示信息),导致栈的回溯和错误信息的打印。因为大部分体系结构把BUG_ON()定义成某种非法操作,这样自然会产生需要的oops;
而WARN_ON()则是调用dump_stack(),打印堆栈信息,不会oops,且与中断相关。
4.need_sched
表示cpu从系统空间返回到用户空间前要进行一次调度;一般设定值为1;
idle线程有特定的函数来决定need_sched轮询状态;
1.基于TS_POLLING,用thread_info(线程描述符).status;
2.基于TIF_POLLING_NRFLAG,用thread_info.flags
5.thread_info
linux对每个进程都会单独分配内存区域,放入两个数据结构,一个是内个态的进程堆栈,一个是紧挨着进程描述符的thread_info(线程描述符)。