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

你可能感兴趣的文章
oracle 限制用户并行,insert /*parallel */ 到不同用户,并行起不来的问题
查看>>
oracle--用户,权限,角色的管理
查看>>
Oracle-定时任务-JOB
查看>>
oracle00205报错,Oracle控制文件损坏报错场景
查看>>
Oracle10g EM乱码之快速解决
查看>>
Oracle10g下载地址--多平台下的32位和64位
查看>>
Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
查看>>
oracle11g dataguard物理备库搭建(关闭主库cp数据文件到备库)
查看>>
Oracle11G基本操作
查看>>
Oracle11g服务详细介绍及哪些服务是必须开启的?
查看>>
Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
查看>>
oracle12安装软件后安装数据库,然后需要自己配置监听
查看>>
Oracle——08PL/SQL简介,基本程序结构和语句
查看>>
Oracle——distinct的用法
查看>>
Oracle、MySQL、SQL Server架构大对比
查看>>
oracle下的OVER(PARTITION BY)函数介绍
查看>>
Oracle中DATE数据相减问题
查看>>
Oracle中merge into的使用
查看>>
oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
查看>>
oracle中sql的case语句运用--根据不同条件去排序!
查看>>