码迷,mamicode.com
首页 > 系统相关 > 详细

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

时间:2016-03-08 23:24:10      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

构造一个简单的Linux系统MenuOS

一、linux内核源代码简介

三大法宝(存储程序计算机、函数调用堆栈、中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场、进程上下文的切换)

1、在linux内核源码里面arch占有的代码量相当庞大。arch/x86目录下的代码是我们重点关注的。

2、内核启动相关的代码基本都在init目录下(main.c)。

  start_kernel是初始化linux内核的起点。

  start_kernel相当于c程序中的main函数

3、linux内核的核心代码在kernel目录中

二、构造一个简单的linux系统

init是第一个用户态进程,是1号进程。

技术分享

内核启动:

技术分享

三、跟踪调查linux内核的启动过程

1.使用gdb跟踪调试内核的方法

启动内核:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S/*在开始之前将CPU冻结*/

/*在1234端口上创建了一个gdb server -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项*/

另开一个shell窗口

  1. gdb
  2. (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表/*将带有符号表的内核镜像加载进来*/
  3. (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  4. (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后/*设置断点跟踪内核*/

当前状态被冻结:

技术分享

启动gdb:

技术分享

加载linux符号表,启动到start_lernel位置:

技术分享

 start_kernel向下的代码,另设断点:

技术分享

在start_kernel的尾部:

技术分享

2、简单分析一下start_kernel

main.c中的

asmlinkage __visible void __init start_kernel(void)
501{
502 char *command_line;
503 char *after_dashes;
504
505 /*
506 * Need to run as early as possible, to initialize the
507 * lockdep hash:
508 */
509 lockdep_init();
510 set_task_stack_end_magic(&init_task); /*定义&init_task全局变量,即手工创建的PCB,0号进程即最终的idle进程*/
511 smp_setup_processor_id();
512 debug_objects_early_init();
513
514 /*
515 * Set up the the initial canary ASAP:
516 */
517 boot_init_stack_canary();
518
519 cgroup_init_early();
520
521 local_irq_disable();
522 early_boot_irqs_disabled = true;
523
524/*
525 * Interrupts are still disabled. Do necessary setups, then
526 * enable them
527 */

 


所有的模块在初始化的时候都会通过init,都会通过start_kernel来调用模块进行初始化。

trap init:初始化一些中断向量

技术分享

设置中断门:

技术分享 

start_kernel最后一句rest init:

技术分享

init_process是linux系统的1号进程,是第一个用户态进程,默认是根目录下的程序。

kthreadd创建一个内核线程。

当系统没有进程需要执行时就调度到idel进程(0号进程

 

四、总结

  这一周学习的是构造一个简单的linux系统,在linux内核源码里面arch占有的代码量相当庞大,arch/x86目录下的代码是我们重点关注的,内核启动相关的代码基本都在init目录下,linux内核的核心代码在kernel目录中,我们主要了解start_kernel函数的执行过程。我们通过在实验楼里构造一个简单的linux系统来慎入料及构造过程。同时还学习到rest_init称为0号进程,从start_lernel起一直存在,在WINDOWS系统上称为system idel,0号进程创建了1号进程,还创建了其他服务的内核线程,这样系统就启动起来了,这就是内核的启动过程。

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

标签:

原文地址:http://www.cnblogs.com/20135132yoggie/p/5251382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!