1、_weak
_weak是一个宏,和__packed是同一种东西都是gcc的扩展属性:
#define __packed __attribute__((packed))
#define __weak __attribute__((weak))
如果这个关键字用在函数定义上面,一般情况下和一般函数没有两样。但是当有一个同名函数但是不带__weak被定义时,
所有对这个函数的调用都是指向后者(不带__weak那个), 如果有两个一样的函数都用了__weak,那么真正调用那个,就要看连接器了。
2、linux kernel c 类型检查
#define typecheck(type,x) ({type __dummy; \
typeof(x) __dummy2; \
(void)(&__dummy == &__dummy2); \
1; })
ex:unsinged int flag; typecheck(unsigned int, flag);
3、preempt_disable() 禁止内核抢占
4、task_cpu()
获取当前运行的cpu编号,实现在/inlcude/linux/sched.h中,当不是SMP(CONFIG_SMP)是直接返回0;
#define task_thread_info(task)((struct thread_info *)(task)->stack)
#ifdef CONFIG_SMP
static inline unsigned int task_cpu(const struct task_struct *p)
{
return task_thread_info(p)->cpu;
}
#else
static inline unsigned int task_cpu(const struct task_struct *p)
{
return 0;
}
#endif /* CONFIG_SMP */
相关链接:点击打开链接;
5、smp_wmb()
不熟悉,先记着,相关解释链接:点击打开链接;
6、list操作 详细见:list操作;
linux kernel链表:深入分析 Linux 内核链表,浅析Linux Kernel中的那些链表
7、C typeof用法
关键字typeof用于获取表达式的数据类型,详见:例解GNU C之typeof,typeof和container_of的理解,GCC typeof在kernel中的使用——C语言的“编译时多态”
8、find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns)
通过pid查询struct task_struct结构信息;实现文件在kernel/pid.c中。
pid相关知识介绍:点击打开链接;
9、asmlinkage
相关解释:点击打开链接;
10、uboot传递参数
1.__setup解析 相关解释:__setup解析
2.init_tags
struct init_tags结构体组成和字段含义见:Linux内核参数传递Tag(init_tags),
init_tags在kernel启动时解析见:u-boot到kernel的参数传递,执行setup_arch()函数;
11、MACHINE_START
各个BSP文件都必须定义的宏,kernel启动是调用,宏定义见:uboot Linux machine_arch_type辨析;
12、ioremap和phys_to_virt的区别
#ifndef __virt_to_phys
#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET)
#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)
#endif
ioremap()的原则就是内核会根据指定的物理地址新建映射页表,物理地址和虚拟地址的关系就由这些页表来搭建!