构造一个简单的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(),而后一号线程负责执行内核的部分初始化工作及进行系统配置

最新文章

  1. sql一对多的两个表的update
  2. 解决为什么每次打开Eclipse新的workspace需要更新nexus-maven-repository-index问题
  3. 正则中的lastIndex属性
  4. 3ds max移除几何体的线段
  5. Codeforces Round #378 (Div. 2) C D
  6. Vue.2.0.5-过渡效果
  7. 在windows下配置pthread
  8. iOS获取汉字的拼音
  9. jstl if条件判断字符串代码
  10. How to fix “Duplicate sources.list entry …” issue
  11. 如何通过C#操作Access,本人亲测通过
  12. Python爬虫(1):基础知识
  13. QT之uic、moc、rcc命令生成相应的cpp文件
  14. redis集群学习
  15. 分布式事务?咱先弄明白本地事务再说 - ACID
  16. ionic2引入cordova插件时提示 no provider for * 错误
  17. BZOJ2095:[POI2010]Bridges(最大流,欧拉图)
  18. 在 JS 对象中使用 . 和 [] 操作属性的区别
  19. 内存管理 初始化(四)mem_init bootmem 迁移至伙伴系统
  20. Android Webview 和Javascript交互,实现Android和JavaScript相互调用

热门文章

  1. JavaScipt创建函数的方法
  2. 读者来信 | 设置HBase TTL必须先disable表吗?(已解决)
  3. 【WPF学习】第六十二章 构建更复杂的模板
  4. 《Three.js 入门指南》3.1.1 - 基本几何形状 - 平面(PlaneGeometry)
  5. redis持久化(RDB、AOF、混合持久化)
  6. pip 安装 request 失败
  7. go 编译protobuf
  8. Python常见数据结构-List列表
  9. 在OS X环境下MySQL启动时报错
  10. 传智博客2015年最新版iOS基础视频_最适合初学者入门