• 《Linux内核分析》第三周


    【李行之原创作品 转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    《Linux内核分析》 之 构造一个简单的Linux系统MenuOS

    第一讲 函数调用堆栈

    1.操作系统的两把宝剑(上一讲)

    1. 中断上下文的切换
    2. 进程上下文的切换

    第二讲 构造一个简单的Linux系统MenuOS

    1.(实验楼环境下)实验步骤详述【注:因为电脑充电线损坏导致电脑上的Linux虚拟机无法使用,本周我的实验任务跟随20135216同学共同完成】

    1. 进入实验楼环境之后,输入 cd LinuxKernel进入该文件夹;

    2. 输入quem...直接启动kernel。其中 -initrd rootfs指明一个根文件系统,rootfs是含有init函数的文件,生成的是rootfs.img;

    3. 使用参数 -s -S冻结CPU(从图中可以看到CPU在初始化之前就停止了);

    4. 用水平分割另外打开一个shell窗口之后,启动gdb调试,并使用Linux-3.18.6中的文件;

    5. 进行调试。调试练习主要是设置断点以及观察函数停留的位置;

      • 第一处断点设置在start_kernel函数处,也就是说输入c之后函数执行会停止在第501行(start_kernel开始的地方)

      • 第二处断点设置在reat_init函数处,输入c之后看到函数执行停留在396行

    第三讲 简单分析一下start_kernel

    1.计算机启动过程

    1. x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置;

    2. BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序;

    3. 引导程序BootLoader开始负责操作系统初始化,然后启动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录;

    4. 内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init(这里和讲解中以及实际的代码main.c是一致的);

    5. 一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。initrd文件的功能主要有两个:

      1. 提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)
      2. 负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去

    2.init进程详解

    1. Linux内核中的init_task进程和idle进程是“从无到有”的关键
      • 道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三个进程),三生万物(1号进程是所有用户态进程的祖先,2号进程是所有内核线程的祖先),新内核的核心代码已经优化的相当干净了。
  • 相关阅读:
    在Swift中定义属于自己的运算符
    计算型属性 vs 懒加载
    swift- mutating
    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
    微信授权登录-微信公众号和PC端网站
    PHP实现购物车的思路和源码分析
    PHP实现图片的等比缩放和Logo水印功能示例
    PHP实现IP访问限制及提交次数的方法详解
    Laravel 队列发送邮件
    laravel 定时任务通过队列发送邮件
  • 原文地址:https://www.cnblogs.com/shadow135211/p/5259476.html
Copyright © 2020-2023  润新知