linux课程第三周实验及总结

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

  • 使用gdb跟踪调试内核从start_kernel到init进程启动
  • 使用实验楼的虚拟机打开shell
  1. cd LinuxKernel/
  2. qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

内核启动完成后进入menu程序(《软件工程C编码实践篇》的课程项目),支持三个命令help、version和quit,您也可以添加更多的命令,对选修过《软件工程C编码实践篇》的童鞋应该是a piece of cake.

  • 使用gdb跟踪调试内核
  1. qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
  2. # -S freeze CPU at startup (use ’c’ to start execution)
  3. # -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项
  • 另开一个shell窗口
  1. gdb
  2. (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
  3. (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  4. (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

实验过程分析

  • Linux内核的启动过程

启动Linux内核的三个参数:

  • kernel
  • initrd
  • root所在分区、目录
qemu -kernel (文件名) -initrd (rootfs.img)
  1. qemu相当于打开一个虚拟机
  2. kernel启动一个内核,位置由其后的文件名指定。如果在当前目录下,可以直接输入文件名,如果不是,则需要输入该内核的全路径。
  3. initrd指令是挂了一个ramdisk虚拟硬盘,是内核的重要补充,rootfs.img就是这个虚拟硬盘,内有分区,然后启动的其实是其中的init文件,这个文件是由之前的menuOS编译而成,gcc -o命名为init。

0号进程
有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。

init_process 是默认的一号进程

  • 实验截图

    1. 运行截图

    2. 第一个断点,start_kernel

    3. 实验目录

      • arch目录
        占有相当庞大的空间
        arch/x86目录下的代码是需要重点关注的。
        arch下其他目录可以删掉。

      • init目录
        内核启动相关的基本代码基本都在init目录下。
        main.c 文件中有一个start_kernel函数,初始化Linux内核的起点,这个函数相当于普通c程序的main函数。

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

      • 其他
        Documentation 文档
        drivers 驱动
        fs-filesystem 文件系统
        include
        ipc 进程间通信

      • README:
        INSTALLING 怎样安装内核源代码——怎么解压怎么打补丁
        make mrproper 把生成的中间代码清理干净
        menuconfig

    4. GDB使用
          gdb(gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表 (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行 (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后
         (gdb)c # 系统开始启动,启动到start_kernel(gdb)list # 可以看到start_kernel上下的代码(gdb)break rest_init(gdb)c # 当前系统执行到rest_init (gdb)list # 可以看到rest_init是在start_kernel的尾部调用的。
 5.实验函数

trap_init() 初始化一些中断向量
mm_init() 内存管理模块
sched_init() 调度模块

rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS),kernel_init中有run_init_process,创建了一号进程,默认路径下的程序。

二、课程总结

1、Linux内核启动过程

  • 计算机的启动过程概述

    • x86 CPU启动的第一个动作CS:EIP=FFFF:0000H(换算为物理地址为000FFFF0H,因为16位CPU有20根地址线),即BIOS程序的位置。
    • BIOS例行程序检测完硬件并完成相应的初始化之后就会寻找可引导介质,找到后把引导程序加载到指定内存区域后,就把控制权交给了引导程序。这里一般是把硬盘的第一个扇区MBR和活动分区的引导程序加载到内存(即加载BootLoader),加载完整后把控制权交给BootLoader。
    • 引导程序BootLoader开始负责操作系统初始化,然后起动操作系统。启动操作系统时一般会指定kernel、initrd和root所在的分区和目录,比如root (hd0,0),kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4M.img
    • 内核启动过程包括start_kernel之前和之后,之前全部是做初始化的汇编指令,之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。
    • 一般分两阶段启动,先是利用initrd的内存文件系统,然后切换到硬盘文件系统继续启动。
      • initrd文件的功能主要有两个:
      • 1、提供开机必需的但kernel文件(即vmlinuz)没有提供的驱动模块(modules)
      • 2、负责加载硬盘上的根文件系统并执行其中的/sbin/init程序进而将开机过程持续下去

2、怎么编译内核?

  • 最简单的是make config,但是这个需要的时间很长
  • make menuconfig,是图形化的界面,比上面更为方便
  • make allnoconfig,所有能选no的都选no,简单粗暴。
  • Makefile和config
    这两个和在一起能够决定内核中哪些需要被编译,哪些不会被编译。

参考链接:

详细实验过程介绍及分析:http://www.cnblogs.com/20135202yjx/p/5262907.html

转载于:https://www.cnblogs.com/20135302wei/p/5273142.html

20135302魏静静——linux课程第三周实验及总结相关推荐

  1. 20135302魏静静——linux课程第六周实验及总结

    linux课程第六周实验及总结 实验及学习总结 1.进程描述符task_struct数据结构 进程的作用: 将信号.进程间通信.内存管理和文件系统联系起来 操作系统的三大功能: 进程管理.内存管理.文 ...

  2. 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)

    文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...

  3. 吴恩达深度学习 | (12) 改善深层神经网络专项课程第三周学习笔记

    课程视频 第三周PPT汇总 吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第二部分改善深层神经网络专项的第三周课程:超参数调试.Batch Normalization和深度学习框架. 目录 1. ...

  4. 研一Python基础课程第三周课后习题分享(下)(含源代码)

    这里分享剩余的八道题,比起前八道,后面八道题相对容易很多! 一.题目分享 第九题:计算圆周率--无穷级数法 描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬ ...

  5. 吴恩达深度学习课程-第三周

    1.神经网络概述和表示 在下图中,上标 [ 1 ] . [ 2 ] [1].[2] [1].[2]表示当前神经网络的层数,并不是前面提到的样本个数. a [ 1 ] a^{[1]} a[1]表示第一层 ...

  6. 5233杨光--第三周实验报告

    信息的表示和处理 一.数字表示 1. 无符号数:编码基于传统的二进制表示法表示大于或等于零的数字. 2. 补码:编码是表示有符号整数的最常见方法,可以是正或者是负的数字. 3. 浮点数:编码是表示实数 ...

  7. 20135213 20135231 信息安全系统设计基础课程第三次实验报告

    链接:http://www.cnblogs.com/20135231hj/ 转载于:https://www.cnblogs.com/20135213lhj/p/5061652.html

  8. 第三周实验题目2——robots协议

    Robots协议起不到阻止爬虫的作用,是爬虫的"君子协定" 格式好像是这样的: https://www.jd.com/robots.txt 现在题里面给了一个靶机的IP: 大概用I ...

  9. 三周的 软件工程实践课 课程安排建议

    不少学校想在暑期安排软件工程实践课, 在这么短的时间内要做到软件生命周期的完整体验是有很多挑战的,下面是一个建议: 软件工程课程设计 - 三周计划,10 次授课,10 次学生报告. 第一周,准备: 在 ...

最新文章

  1. 六月开发语言排行榜出炉 ActionScript回前20
  2. Npm 包版本知识总结
  3. ppt讲解html,HTML讲解解读.ppt
  4. defer与async的认识
  5. mysql dal_Entity Framework连接Mysql数据库并生成Model和DAL层
  6. 在RHEL6.2上,将一个分区开机自动挂载
  7. 50个linux初学者必须掌握的命令
  8. 1009. clion调试段错误
  9. fortran语言能用matlab,Fortran语言转matlab语言
  10. 自动化测试元素查找利器firepath介绍
  11. Golang 网络爬虫框架gocolly/colly
  12. 提起海洋和通海水域污染损害赔偿诉讼主体的几个层面
  13. 2018级《程序设计基础(B)II》期末上机考试( 题解)
  14. win10下局域网不同电脑间如何实现文件共享?
  15. 网络大厂与加州大学分校开发出Actor-Critic算法
  16. 七月算法机器学习笔记1 微积分与概率论
  17. 嵌入式计算机 硬盘录像机,嵌入式操作系统 8路工业级硬盘录像机
  18. 网络安全技术与黑客攻击威胁
  19. CXF3.0.2+Spring3.2.14 Web Service入门实例二
  20. ZT android -- 蓝牙 bluetooth (四)OPP文件传输

热门文章

  1. Node.js webpack vue组件
  2. WHAT IS PYTORCH
  3. python compile
  4. 1.6 Dropout 正则化
  5. pandas.Series.quantile
  6. python log
  7. php 防止url输入,php防止伪造数据从地址栏URL提交的方法
  8. 转:VCSA 6.7 升级到VCSA7.0
  9. Kotlin学习总结(1)——Kotlin快速入门
  10. Linux学习总结(12)——Linux必须学会的60个命令