kernel相关宏定义

本文深入解析了GCC的__packed__和__weak__属性,以及Linux内核中的typecheck、preempt_disable、task_cpu、smp_wmb、list操作等核心函数的用法与实现原理。
摘要由CSDN通过智能技术生成

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之typeoftypeof和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的区别

在内核中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()的原则就是内核会根据指定的物理地址新建映射页表,物理地址和虚拟地址的关系就由这些页表来搭建!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值