2019-2020-20199303《Linux内核原理与分析》第四周作业
2024-10-09 01:09:38
构造一个简单的Linux内核
Linux是一种开源电脑操作系统内核,它是一个用C语言写成。主要子系统:
1.系统调用接口
2.进程管理
3.内存管理
4.虚拟文件系统
qemu是一个开源模拟处理器,在实验中
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
qemu需要创建窗口,它在纯命令系统下无法工作,需要使用图形化界面的虚拟机。qemu仿真kernel,bzImage是vmLinux经过gzip压缩后的文件,此即为压缩后的内核镜像。vmLinux是编译出来最原始的ELF文件。如下图所示的即是使用实验楼的虚拟机搭建环境调试的过程:
打开另一个shell窗口,启动gdb进行断点调试,如图所示:
设置断点在start_kerenl()和 rest_init()处,按c继续执行,结果如图所示:
start_kernel()相当于c语言的main函数,是除了汇编语言的程序执行的起点
start_kernel()几乎涉及了内核的所有模块:
trap_init():中断向量的初始化
mm_init():内存管理的初始化
sched_init(): 调度模块的初始化
init_task()(0号进程),是进程描述符,使用宏进行初始化,而后对其他模块进行初始化
代码如下:
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
char *after_dashes;
/*
*Need to run as early as possible, to initialize the
*lockdep hash:
*/
lockdep_init();
set_task_stack_end_magic(&init_task);
smp_setup_processor_id();
debug_objects_early_init();
/*
*Set up the initial canary ASAP
*/
boot_init_early();
local_irg_disable();
early_boot_irgs_disabled=TRUE;
}
总结:0号进程在创建init进程后调用cpu_idle(),而后一号线程负责执行内核的部分初始化工作及进行系统配置
最新文章
- sql一对多的两个表的update
- 解决为什么每次打开Eclipse新的workspace需要更新nexus-maven-repository-index问题
- 正则中的lastIndex属性
- 3ds max移除几何体的线段
- Codeforces Round #378 (Div. 2) C D
- Vue.2.0.5-过渡效果
- 在windows下配置pthread
- iOS获取汉字的拼音
- jstl if条件判断字符串代码
- How to fix “Duplicate sources.list entry …” issue
- 如何通过C#操作Access,本人亲测通过
- Python爬虫(1):基础知识
- QT之uic、moc、rcc命令生成相应的cpp文件
- redis集群学习
- 分布式事务?咱先弄明白本地事务再说 - ACID
- ionic2引入cordova插件时提示 no provider for * 错误
- BZOJ2095:[POI2010]Bridges(最大流,欧拉图)
- 在 JS 对象中使用 . 和 [] 操作属性的区别
- 内存管理 初始化(四)mem_init bootmem 迁移至伙伴系统
- Android Webview 和Javascript交互,实现Android和JavaScript相互调用