首页 > 编程语言 >内核源码解读基础

内核源码解读基础

时间:2023-04-25 11:07:25浏览次数:40  
标签:__ attribute ...... 解读 init 源码 内核 initcall define


module_init宏的定义

第一段代码:

typedef int (*initcall_t)(void);
......
#define  __define_initcall(level,fn,id)\
static initcall_t  __initcall_##fn##id __attribute_used_ \
__attribute__((__section__(".initcall" level ".init"))) = fn
......
#define device_initcall(fn)  __define_initcall("6",fn,6)
......
#define __initcall(fn) device_inicall(fn)
......
#define module_init(x) __initcall(x)

第二段代码:

#define INITCALLS 
*(.initcall0.init) \
*(.initcall0s.init) \
......
*(.initcall7.init) \
*(.initcall7s.init)

第三段代码:

.initcall.init :AT(ADDR(.imitcall.init) - LOAD_OFFSET){//这段代码依然不理解
__initcall_start = .;
INITCALLS
__initcall_end = .; 
}

第四段代码:

static void __init do_initcalls(void)
{
initcall_t *call;
int count = preempt_count();
for (call = __initcall_start;call < __initcall_end;call++){
......
result = (*call)();
......
}
flush_sheduled_work();
}

第五段代码:

typedef int (*initcall_t)(void);
......
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{return initfn;}
int init_module(void) __attribute__((alias(#initfn)));

天书一样的代码,但毕竟还是可以理解的,只不过需要一些内核知识和良好的c语言基础。

c语言代码中的"#"与"##"的用法:

(1)"#"的使用

eg:

#define PrintfStr(arg) printf("%s",#arg)
PrintfStr(output) ->prinf("%s","output")

eg:

#define show(var) 
show(number) -> printf("number = %d\n",var);

(2) "##"的使用

eg:

#define join(a,b) a##b
strlen_s(join(var,123),sizeof(join(var,123)))->strlen_s(var123,sizeof(var123))
gcc中的attrbute()
__attribute__可以设置函数属性,变量属性,类型属性
__attribute__的section子项使用方式:
__attribute__((section("section_name")))将作用的函数或数据放入指定名为"section_name"的段
通过__attribute__((alias(#initfn)))为函数定义一个别名



当从内核态返回到用户态的时候,要检查是否进行调度,而调度要看两个条件:


1.preempt_count是否为0



2.rescheduled是否置位



未完待续




标签:__,attribute,......,解读,init,源码,内核,initcall,define
From: https://blog.51cto.com/u_16087831/6223570

相关文章

  • vue2源码-十四、computed和watch的区别
    computed和watch的区别computed和watch的相同点。底层都会创建一个watcher(用法的区别:computed定义的属性可以在模板中使用,watch不能在视图中使用)computed默认不会执行只有取值的时候才会执行内部会维护一个dirty属性,来控制依赖的值是否发生变化。默认计算属性需要同......
  • Python学习笔记--json序列化时间报错-改源码
    问题:转换时间报错执行代码为:importjsonfromdatetimeimportdate,datetimed={"time1":date.today(),"time2":datetime.today()}res=json.dumps(d)#报错  TypeError:ObjectoftypedateisnotJSONserializable方案1:手动转换str()方案2:继承类......
  • 开源外卖系统源码解析:如何快速搭建属于自己的订餐平台?
    随着外卖市场的日益壮大,许多商家和个人都在考虑如何搭建一个属于自己的订餐平台。而在这个过程中,开源外卖系统源码无疑是一项不可或缺的资源。本文将以“开源外卖系统源码解析:如何快速搭建属于自己的订餐平台?”为主题,向您介绍外卖系统的相关内容,帮助您更好地了解如何利用现有的开源......
  • 一文详解RocketMQ-Spring的源码解析与实战
    摘要:这篇文章主要介绍SpringBoot项目使用rocketmq-springSDK实现消息收发的操作流程,同时笔者会从开发者的角度解读SDK的设计逻辑。本文分享自华为云社区《RocketMQ-Spring:实战与源码解析一网打尽》,作者:勇哥java实战分享。RocketMQ是大家耳熟能详的消息队列,开源项目......
  • 视频直播源码,android动画小飞机旋转效果
    视频直播源码,android动画小飞机旋转效果 //小飞机旋转动效果publicclassPlaneViewextendsView{  privatePaintpaint;  privateintwidth;  privateintheight;  privatefloatcurLength;  privatefloatallLength;  privatefloatmAnimato......
  • FutureTask源码分析
    1、Callable与FutureTask介绍1.1、Callable创建线程有两种方式,一种是继承Thread类,一种是实现Runnable接口重写run方法。其实Thread也实现了Runable接口。在Runable接口中,仅有一个无参无返回结果的run方法。Runable接口详情:1@FunctionalInterface2publicinterfa......
  • Map - TreeSet & TreeMap 源码解析
    Java7-TreeSet&TreeMap总体介绍前者仅仅是对后者做了一层包装,也就是说TreeSet里面有一个TreeMap(适配器模式)。因此本文将重点分析TreeMap。JavaTreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natu......
  • Map - LinkedHashSet&Map源码解析
    上篇文章讲了HashMap。HashMap是一种非常常见、非常有用的集合,但在多线程情况下使用不当会有线程安全问题。大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会......
  • 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refres
    学习Spring源码的建议阅读Spring官方文档,了解Spring框架的基本概念和使用方法。下载Spring源码,可以从官网或者GitHub上获取。阅读Spring源码的入口类,了解Spring框架的启动过程和核心组件的加载顺序。阅读Spring源码中的注释和文档,了解每个类和方法的作用和用法。调试Spring源码,可以......
  • vue2源码-十三、nextTick在哪里使用?原理是什么?
    nextTick在哪里使用?原理是什么?nextTick内部采用了异步任务进行包装(多个nextTick调用会被合并成一次,内部会合并回调)最后在异步任务中批处理。主要应用场景就是异步更新(默认调度的时候就会添加一个·nextTick任务)用户为了获取最终的渲染结果需要在内部任务执行之后再执行用户逻......