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

你可能感兴趣的文章
PCB设计十条黄金法则
查看>>
SpringSecurity框架介绍
查看>>
PCI Express学习篇:Power Management(二)
查看>>
pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)
查看>>
pcm转wav的方法及代码示例
查看>>
PC史上最悲剧的16次失败
查看>>
PC端恶意代码分析Lab1.1-5.1,从零基础到精通,收藏这篇就够了!
查看>>
PC端稳定性测试探索
查看>>
PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
查看>>
PDB文件:每个开发人员都必须知道的
查看>>
springMVC学习(二)
查看>>
Pdfkit页眉和页脚
查看>>
PDF中的Pandoc语法突出显示不起作用
查看>>
pdf从结构新建书签_在PDF文件中怎样创建书签
查看>>
pdf做成翻页电子书_第一弹:常见BOOX电子书阅读器问题解答,这些技能你都会吗?...
查看>>
PDF工具箱-分割提取合并
查看>>
pdf打印骑缝章
查看>>
PDF文字识/编辑?这个工具真的很强大!
查看>>
pdf文档出现乱码如何修改
查看>>
pdf根据模板导出
查看>>