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

你可能感兴趣的文章
MySQL高级-视图
查看>>
MySQL:判断逗号分隔的字符串中是否包含某个字符串
查看>>
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos配置中心集群原理及源码分析
查看>>
nacos配置自动刷新源码解析
查看>>
Nacos集群搭建
查看>>
nacos集群搭建
查看>>
Navicat for MySQL 查看BLOB字段内容
查看>>
Neo4j电影关系图Cypher
查看>>
Neo4j的安装与使用
查看>>
Neo4j(2):环境搭建
查看>>
Neo私链
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>