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

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

第一讲 函数调用堆栈

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

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

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

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

  3. 进入实验楼环境之后,输入 cd LinuxKernel进入该文件夹;
  4. 输入quem...直接启动kernel。其中 -initrd rootfs指明一个根文件系统,rootfs是含有init函数的文件,生成的是rootfs.img;
  5. 使用参数 -s -S冻结CPU(从图中可以看到CPU在初始化之前就停止了);
  6. 用水平分割另外打开一个shell窗口之后,启动gdb调试,并使用Linux-3.18.6中的文件;
  7. 进行调试。调试练习主要是设置断点以及观察函数停留的位置;
    • 第一处断点设置在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号进程是所有内核线程的祖先),新内核的核心代码已经优化的相当干净了。

《Linux内核分析》第三周的更多相关文章

  1. Linux内核及分析 第三周 Linux内核的启动过程

    实验过程: 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootf ...

  2. 2019-2020-1 20199303 《Linux内核原理分析》 第一周作业

    2019-2020-1 20199303 <Linux内核原理分析> 第一周作业 1. 环境准备 在众多的Linux发行版中,Ubuntu,小红帽还有类Unix系统的BSD系统,我选择了目 ...

  3. Linux内核及分析 第八周 进程的切换和系统的一般执行过程

    学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-boun ...

  4. 20135316王剑桥Linux内核学习笔记第三周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...

  5. Linux内核及分析 第七周 可执行程序的装载

    实验步骤 1. 更新menu,用test.c覆盖test_exec.c 2. 把init 和 hello 放到了rootfs.img目录下,执行exec命令的时候自动加载了hello程序 3. 执行e ...

  6. Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程

    实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vm ...

  7. Linux内核及分析 第五周 扒开系统调用的三层皮(下)

    实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...

  8. Linux内核读书笔记第三周 调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  9. linux内核分析第三周

    20135103王海宁 linux内核分析第三周 http://mooc.study.163.com/course/USTC-1000029000  按照课堂提供的方法,命令行一行行敲上去,我是手机缓 ...

  10. LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

    LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163. ...

随机推荐

  1. NoSQL——not onlySQL不仅仅是SQL

    数据有很大一部分是由关系数据库管理系统(RDBMS)来处理. 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large ...

  2. 【转】1.2 CDN的基本工作过程

    1.2  CDN的基本工作过程 使用CDN会极大地简化网站的系统维护工作量,网站维护人员只需将网站内容注入CDN的系统,通过CDN部署在各个物理位置的服务器进行全网分发,就可以实现跨运营商.跨地域的用 ...

  3. Inter exchange Client Address Protocol (ICAP)- 互换客户端地址协议

    https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-(ICAP) Transferring fun ...

  4. 记一次MyBatis的错误

    错误信息:java.lang.StackOverflowError 关于这个错误的深度解析,大家可以参考这篇博文,比较详细:https://blog.csdn.net/zc375039901/arti ...

  5. python argparse模块:命令行选项及参数解析

    位置参数:给一个例子: import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") ...

  6. linux找到目录下所有目录文件

    想要删除掉该目录下的所有文件类型是目录的文件? 这样运行: $ ls -F | grep /$ | xargs rm -rf ls 中F参数,作用是能把目录文件的名字后边加上一个斜杠/ 然后匹配以斜杠 ...

  7. 快速在Ubuntu安装PHP网站

    快速安装使用的是tasksel,tasksel是Debian / Ubuntu的工具,安装多个相关软件包作为一个协调的“任务”到你的系统.这个lamp-server^跟taskel这个程序有关.下面是 ...

  8. Dozer 使用小结

    这篇文章是本人在阅读Dozer官方文档(5.5.1版本,官网已经一年多没更新了)的过程中,整理下来我认为比较基础的应用场景. 本文中提到的例子应该能覆盖JavaBean映射的大部分场景,希望对你有所帮 ...

  9. 02-Maven安装配置

    1.Maven下载 2.Maven依赖 3.安装Maven 4.Maven目录

  10. Centos7 搭建Go语言编译环境

    1.准备工作 下载Go:https://studygolang.com/dl 2.安装Go [root@node2 local]# .linux-amd64.tar.gz -C /usr/local/ ...