zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209307《Linux内核原理与分析》第四周作业

    一、Linux内核源代码简介

    1、计算机三大法宝

      存储程序计算机

      函数调用堆栈

      中断机制

    2、操作系统两把宝剑

      中断上下文的切换

      进程上下文的切换

    3、函数目录

      Linux-3.18.6/arch/x86

      内核启动相关的代码基本都存在init目录中。

      start_kernel函数相当于普通C程序的main函数。

      Linux内核的核心代码在kernel目录中。

    二、实验三:跟踪分析Linux内核的启动过程

    构造一个简单的Linux系统MenuOS,使用如下命令打开MenuOS

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

     

    完成了一个简单的内核搭建后使用gdb进行调试

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

     

    gdb
    (gdb)file linux-3.18.6/vmlinux  
    (gdb)target remote:1234 #用1234端口进行连接
    (gdb)break start_kernel  #断点的设置为内核启动的起点
    

     

    按c键继续执行到start_kernel()函数,然后我们可以使用list命令查看停止断点的源代码。

    再设置一个断点rest_init,重复上述操作

    三、简单分析一下start_kernel

    在init目录下的main.c中,全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程,不管分析内核的哪一部分都会涉及到start_kernel。

    trap_init();初始化中断向量

    mm_init();内存管理模块

    sched_init();系统调度模块

    start_kernel中的最后一句是rest_init,内核启动完成后,有一个call_cpu_idle,当系统中没有进程需要执行时就调用idle进程,rest_init是0号进程,它创建了1号进程init和其他的一些服务进程。

    main.c中没有main函数,start_kernel()相当于C语言中的main函数,是一切的起点,在此函数被调用之前内核代码主要是用汇编语言写的,完成初始化工作。

  • 相关阅读:
    java 算法最长连续递增子序列
    java 算法最长连续递增序列
    最大连续子数组和(Java)
    mysql时间序列与窗口函数
    CSS控制br高度
    小知识随手记(九):兄弟选择器(~和+)区别
    VUE组件递归实现自定义目录及拖拽效果
    VUE的插件解析
    VUE的mixin混入解析
    VUE高阶组件解析
  • 原文地址:https://www.cnblogs.com/wzyxiaowang/p/13910337.html
Copyright © 2011-2022 走看看