博客
关于我
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/

你可能感兴趣的文章
NSJSON的用法(oc系统自带的解析方法)
查看>>
nslookup 的基本知识与命令详解
查看>>
NSNumber与NSInteger的区别 -bei
查看>>
NSOperation基本操作
查看>>
NSRange 范围
查看>>
NSSet集合 无序的 不能重复的
查看>>
NSURLSession下载和断点续传
查看>>
NSUserdefault读书笔记
查看>>
NS图绘制工具推荐
查看>>
NT AUTHORITY\NETWORK SERVICE 权限问题
查看>>
NT symbols are incorrect, please fix symbols
查看>>
ntelliJ IDEA 报错:找不到包或者找不到符号
查看>>
NTFS文件权限管理实战
查看>>
ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
查看>>
ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
查看>>
ntp server 用法小结
查看>>
ntpdate 通过外网同步时间
查看>>
ntpdate同步配置文件调整详解
查看>>
NTPD使用/etc/ntp.conf配置时钟同步详解
查看>>
NTP及Chrony时间同步服务设置
查看>>