zoukankan      html  css  js  c++  java
  • 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和其他的一些服务进程
    }
    
  • 相关阅读:
    AUTOSAR-文档中所使用的UML文件
    开心一下-实现基于Java一个中文编程语言
    HDU 1026 Ignatius and the Princess I
    HDU 2553 (状压) N皇后问题 (2)
    UVa 11825 (状压DP) Hackers' Crackdown
    UVa 10891 (博弈+DP) Game of Sum
    LA 2965 Jurassic Remains
    HDU 2126 (背包方法数) Buy the souvenirs
    POJ 3984 迷宫问题
    POJ 3287 (基础BFS) Catch That Cow
  • 原文地址:https://www.cnblogs.com/20199304lbs/p/11627863.html
Copyright © 2011-2022 走看看