博客
关于我
linux内核C阶段分析(一)
阅读量:750 次
发布时间:2019-03-22

本文共 1832 字,大约阅读时间需要 6 分钟。

今天开始就进入C语言阶段了。接下来,我将从一些关键的C语言预处理器指令和内核初始化模块探讨技术细节,助力我们更深入地理解内核开发。

首先,考虑到函数的前向声明问题,C语言提供了asmlinkage这个预处理器指令。它可以有两种用法:如果编译器支持C++,那么asmlinkage前缀会生成extern "C",确保函数可以在C和C++混合编译环境下使用;如果不支持C++,则默认无任何影响。这使得asmlinkage成为C语言中的一个重要的前向声明标记。

除此之外,asmlinkage还有另一种定义方式:可以添加__attribute__((regparm(0))),这意味着函数不使用寄存器传递参数,而是强制让参数通过堆栈进行传递。这在内核编程中尤为重要,目的是为了维护稳定性和避免潜在的缓冲区溢出问题。

接下来,让我们深入探讨内核初始化过程中的几个关键模块。

第一个关键模块是__init宏,位于kernel-3.4.39\include\linux\init.h。这个宏的作用是标记代码块仅供初始化使用。编译器会识别这些标记并将相关代码放置在.init.text段中。在系统启动后,这些段被执行用来初始化整个系统。

另一个重要模块是lockdep_init(),定义在kernel-3.4.39\include\linux\lockdep.h。这个函数主要用于检测内核中的死锁情况。它通过初始化一些全局变量,如obj_hashobj_static_pool,为后续的死锁检测奠定基础。

此外,在深入内核初始化过程中,我们还能找到一些与多线程相关的初始化步骤。例如,smp_setup_processor_id()函数,位于kernel-3.4.39\arch\arm\kernel\setup.c,用于判断内核执行环境是否在多处理器体系。这种信息对于调试和性能优化都是不可或缺的。

在内核的早期初始化阶段,debug_objects_early_init()也是一个重要模块。这一函数位于kernel-3.4.39\include\linux\debugobjects.h,充分诠释了其作用:在早期初始化阶段初始化对象追踪器的基础设施。这对于开发和调试内核对象管理模块至关重要。

除此之外,内核的安全性和稳定性也是关键考虑因素。例如,boot_init_stack_canary(),位于kernel-3.4.39\include\linux\stackprotector.h,主要用于初始化栈溢出保护机制。该函数通过设置一个“金丝雀”值,防御潜在的栈溢出攻击。

再来看资源管理模块的初始化,cgroup_init_early()函数位于kernel-3.4.39\kernel\cgroup.c,负责在系统启动时初始化控制组。cgroups(Control Groups)是内核中的资源管理机制,允许对任务集合的资源分配进行限制,这对于多任务环境下的资源竞争尤为重要。

在内核启动过程的底层,我们还可以看到与中断相关的初始化操作,例如local_irq_disable()early_boot_irqs_disabled。前者用于临时屏蔽当前CPU的所有中断,而后者则用于调试和错误报告,以帮助开发者跟踪内核启动过程中的异常情况。

最后,在内核的基础架构设置中,tick_init()bootcpu_init()也是关键一步。tick_init()位于kernel-3.4.39\kernel\time\tick-common.c,带来了一颗时间管理的内核控制器,也就是定期 ServiceException的触发者。bootcpu_init()位于kernel-3.4.39\init\main.c,用于设置第一个CPU作为初始活动核。

此外,内核的内存管理和系统服务的初始化也不容忽视。mm_init_owner()位于kernel-3.4.39\kernel\fork.c,确保每个任务有自己的内存空间。mm_init_cpumask()位于kernel-3.4.39\include\linux\mm_types.h,负责处理虚拟内存的CPU掩码设置。

这些初始化步骤不仅是内核运行的基石,也是开发者理解和修改内核代码的重要起点。通过仔细研究这些模块的实现,我们可以更深入地掌握Linux内核的工作原理,并为后续的学习和开发打下坚实的基础。

转载地址:http://vilwk.baihongyu.com/

你可能感兴趣的文章
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
Netty事件注册机制深入解析
查看>>
Netty原理分析及实战(四)-客户端与服务端双向通信
查看>>
Netty客户端断线重连实现及问题思考
查看>>
Netty工作笔记0006---NIO的Buffer说明
查看>>
Netty工作笔记0007---NIO的三大核心组件关系
查看>>
Netty工作笔记0011---Channel应用案例2
查看>>
Netty工作笔记0013---Channel应用案例4Copy图片
查看>>
Netty工作笔记0014---Buffer类型化和只读
查看>>
Netty工作笔记0020---Selectionkey在NIO体系
查看>>
Vue踩坑笔记 - 关于vue静态资源引入的问题
查看>>
Netty工作笔记0025---SocketChannel API
查看>>
Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0057---Netty群聊系统服务端
查看>>
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>
Netty工作笔记0063---WebSocket长连接开发2
查看>>
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>