2019-2020-1 20199304《Linux内核原理与分析》第四周作业

第三章 MenuOs的构造

一.前情回顾

计算机的三大法宝:

 -存储程序计算机
 -函数调用堆栈
 -中断

操作系统的两把宝剑:

 -中断上下文的切换(保存现场和恢复现场)
 -进程上下文的切换

二.3.1 Linux内核源代码简介

Linux内核的版本号按照A,B,C的方式命名:

 -A代表大幅度转变的内核
 -B代表重大修改的内核
 -C指轻微修改的内核(C是内核的真实版本)
 -D是安全补丁和bug修复

Linux内核源代码的根目录:

三.跟踪分析Linux内核启动过程

实验过程

1.通过以下代码内核启动,完成后进入 menu程序。

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img


2.使用gdb跟踪调试内核,添加-s(在1234端口上创建一个gdb-server,可以再另外打开一个窗口用gdb把带有符号表的内核镜像加载进来,然后连接gdb srever 设置断点追踪内核)和-S(在CPU开始之前把他冻结起来)两个参数。

$ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 

# 关于-s和-S选项的说明:
# 1. -S
#   -S freeze CPU at startup (use ’c’ to start execution)
# 2. -s
#   -s shorthand for -gdb tcp::1234 
# 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

内核被冻结。

3.再打开一个窗口,启动gdb,加载内核,建立连接。
在gdb中输入以下命令

file linux-3.18.6/vmlinux 
target remote:1234
break start_kernel 
c //按c让qemu上的Linux继续运行

实验问题

当再打开一个窗口启动gdb的时候,在gdb界面中targe remote之前加载符号表的时候出现了问题:系统提示“linux-3.18.6/vmlinux:没有那个文件或目录”
-解决方法:
-首先查看同学发布的博客查找相似问题的解决方法,例如杨蕾新同学也出现过此类问题,其原因是在上一步启动内核的时候把QEMU的窗口关闭导致。(经过检查,不是此类操作原因)
-经过思考,发现是失误没有进入LinuxKernel目录,遂解决问题。

分析start_kernel函数

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);// init_task即手工创建的PCB,0号进程即最终的idle进程
    smp_setup_processor_id();
    debug_objects_early_init();
    // ...
    trap_init();                          // 中断向量的初始化
    mm_init();                            // 内存模块的初始化
    sched_init();                         // 调度模块的初始化
    // ...
    rest_init();                          // rest_init是0号进程(是使用宏初始化的),它创建1号进程init和其他的一些服务进程
}

猜你喜欢

转载自www.cnblogs.com/20199304lbs/p/11627863.html
今日推荐