Linux内核2.6.13.2源代码剖析:启动与进程创建
需积分: 10 191 浏览量
更新于2024-07-30
收藏 420KB PDF 举报
"Linux_源代码分析,关注Linux内核2.6.13.2版本的启动过程和关键代码解析"
在Linux操作系统中,源代码分析对于理解其工作原理至关重要。本文主要探讨了Linux内核启动阶段的部分源码,特别是针对2.6.13.2版本的细节。首先,系统启动是从汇编代码head.S开始的,这个阶段的主要任务是设置CPU的状态初始值,并创建第一个进程——进程0。
1. 系统启动
在启动过程中,CPU的寄存器被设置以初始化进程0的堆栈。`movq init_rsp(%rip), %rsp`这一指令将`init_rsp`定义的地址设为进程0的堆栈底部,`init_rsp`的值是`init_thread_union+THREAD_SIZE-8`。`init_thread_union`是在`arch/x86_64/kernel/init_task.c`中定义的,它是一个包含线程信息的联合体,用于存储进程0的相关数据。
`INIT_THREAD_INFO`宏在`include/asm-x86_64/thread_info.h`中定义,用来初始化`init_thread_union`的`task`字段为`&init_task`。`init_task`是`struct task_struct`类型的变量,也在`init_task.c`中初始化,其中包含了进程0的所有信息,如`mm`、`active_mm`和`comm`等字段。`init_task.mm`和`init_task.active_mm`分别被设为NULL和`INIT_MM(init_mm)`,`INIT_MM`会初始化`pgd`(页全局目录)为`swapper_pg_dir`,即`init_level4_pgt`,这是进程0的页表。
2. 进入C代码执行
完成基本的CPU和进程0的设置后,系统通过以下汇编代码切换到C函数执行:
```assembly
movl %esi, %edi // 传递函数参数
movq initial_code(%rip), %rax
jmp *%rax
```
`initial_code`指向`x86_64_start_kernel`函数,该函数位于`arch/x86_64/kernel/head64.c`中,标志着C语言代码的开始,进一步进行系统的初始化,包括内存管理、设备驱动、调度器等核心组件的设置。
通过这段源代码分析,我们可以看到Linux内核启动时如何从汇编过渡到C,以及如何构建和初始化第一个进程——"swapper"进程。这些知识对于深入理解Linux内核的运行机制、系统调用、进程管理、内存管理和硬件交互等方面都有极其重要的意义。通过对源代码的详细解读,开发者可以更好地调试、优化和定制Linux内核,以适应特定的硬件平台和应用场景。
2022-07-15 上传
2021-10-03 上传
2023-04-29 上传
2023-04-29 上传
2023-08-15 上传
2023-11-30 上传
2023-03-16 上传
2023-08-01 上传
juxianlong1985
- 粉丝: 1
- 资源: 12
最新资源
- 实现在Sparton-3E板卡上的按键及开关的控制.7z
- 假设检验【实验代码+实验报告】
- cookbook:一个使用Ruby MVC表示食谱的简单应用
- ODE for Java-开源
- 三重数字
- IGSI-Game-Jam-2021:游戏Jam IGSI Tahun 2021,Tema非常规武器
- react:React练习
- 线下学习系列图标下载
- Github
- 汽车主动悬架控制.zip
- lagrange插值多项式和Newton插值多项式【三个实验代码加一个实验报告】
- suffix-automaton-vis:交互式应用程序,用于可视化如何构建后缀自动机O(n)
- i18n:Dojo 2-国际化图书馆
- Api-node-express-mariadb
- Intangible-capital-stocks:无形资本积累的参数和无形库存数据(Ewens,Peters和Wang(2020))
- speedbumps:小麻烦的收集