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

学号:20135114

姓名:王朝宪

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

一、调试步骤如下:

  • 使用gdb跟踪调试内核

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:
    // -S freeze CPU at startup (use ’c’ to start execution) cpu初始化之前把它冻结起来
    // -s shorthand for -gdb tcp::1234 在1234端口上建立了一个gdb server
    若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口

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上下的代码

二、Linux内核的启动过程

  • 启动Linux内核的三个参数:

    • kernel
    • initrd
    • root所在分区、目录

最重要的一行代码:

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

所以就是要启动一个内核,挂一个硬盘,然后再运行一个init即1号进程。
也就是说,init中main.c中有一个start_kernel函数
在start_kernel函数的尾部调用了一个rest_init
0号进程
有一个全局变量init_task,即手工创建的PCB,0号进程,即最终的idle进程。0号进程一直存在,系统没有进程需要执行时调度到0号进程。

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

三、实验截图

  1. 运行截图

  2. 第一个断点,start_kernel

  3. 简单分析一下start_kernel

    init_task即手工创建的PCB,0号进程即最终的idle进程

    不管分析内核的哪一部分都会涉及到start_kernel

    trap_init():初始化一些中断

    当系统没有进程需要执行时就调度到idle进程

    我们查看linux-3.18.6的内核代码。这里有很多个文件目录。

    其中arch包括了所支持的多种CPU体系结构,这里我们只关心里面的x86文件夹就好了。

    其他还有如drivers为驱动相关代码。fs为文件系统相关内核代码,ipc是进程相关代码,mm是存储管理代码,net是和网络相关的内核代码等等。

    init为初始化相关的模块,在init/main.c/start_kernel中之后开始C代码的操作系统初始化,最后执行第一个用户态进程init。。

    在start_kernel函数中可以看到很多_init相关函数,涉及到操作系统启动相关的多种初始化操作。

    这里的init_task为相当于0号进程的pcb。   还有sched_init();为进程调度相关初始化。trap_init();为中断相关的内核代码。

    这里看到start_kernel 最后一句 rest_init().

    当操作系统为空闲时,就会执行这个idle程序。

  4. 实验总结:

    当计算机系统开始,BIOS代码被调用执行,然后开始调用执行Linux内核初始化代码,在平台相关的汇编代码执行完毕后会跳转到start_kernel()函数,开始真正的内核初始化,其中init_task创建了0号进程,即最终的idle进程,随后rest_init()函数创建了init进程,即1号进程,以及kthreadd进程,即2号进程,系统正常工作。

实验三:跟踪分析Linux内核的启动过程的更多相关文章

  1. Linux内核分析实验三----跟踪分析Linux内核的启动过程

    一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_ker ...

  2. 跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点

    跟踪分析Linux内核的启动过程 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.stud ...

  3. 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...

  4. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程

    Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...

  5. 跟踪分析Linux内核的启动过程小解

    跟踪分析Linux内核的启动过程 “20135224陈实  + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  6. 20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

    回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录 ...

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

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  8. linux内核分析第三周-跟踪分析Linux内核的启动过程

    一.实验流程 1.打开环境 执行命令:cd LinuxKernel/ 执行命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...

  9. Linux内核分析之跟踪分析Linux内核的启动过程

    一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...

随机推荐

  1. centos7.4安装redis以及配置外网访问

    一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@VM_34_108_c ...

  2. Wifi NAT Driver

    最近遇点奇葩问题,最开始以为被种马了经检测发现不是,分享下以后大家出现类似也好解决:同时列出尝试过程以便大家以后自行排除自己网络问题: 症状: 网络连接右下角图标显示为网卡无线网卡和有线均禁用状态,查 ...

  3. 20155211课下测试ch10补交

    20155211课下测试ch10补交 1.假设下面代码中的foobar.txt中有6个ASCII字母,程序的输出是() A.c = f B.c = o C.c = b D.c = 随机数 答案:A 解 ...

  4. 小白日记53:kali渗透测试之Web渗透-SSL、TLS中间人攻击(SSLsplit,Mitmproxy,SSLstrip),拒绝服务攻击

    SSL.TLS中间人攻击 SSL中间人攻击 攻击者位于客户端和服务器通信链路中 利用方法: ARP地址欺骗 修改DHCP服务器 (存在就近原则) 手动修改网关 修改DNS设置 修改HOSTS文件[高于 ...

  5. 05-session-会话跟踪技术

    1.session简介 Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie Session是服务器端技 ...

  6. 很详细的SpringBoot整合UEditor教程

    很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529    版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...

  7. 利用BlockingCollection实现生产者和消费者队列,实现写文本

    最近开发几个小项目,需要把结果写到txt文件里面,并且按照时间进行分文件,由于对于效率要求较高,所以采用 生产者和消费者 模型来进行写出文本,线程中只需要添加队列就立即返回,而不需要等待写文件的时间 ...

  8. 模拟UNIX(linux)文件系统

    操作系统课程设计 一.实验内容 1. 题目:模拟UNIX(linux)文件系统                [问题描述] 在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟U ...

  9. 浅谈__dict__

    类的 __dict__ 先看一个例子: > class A(object): pass > ... > A.__dict__ dict_proxy({'__dict__': < ...

  10. rabbitMQ的三种路由模式

    rabbitMQ工作流程: 1.声明交换机 2.声明消息队列 3.绑定交换机和队列 4.生产者往交换机里发送新消息 5.交换机根据所选的模式和routingKey决定消息发往哪条消息队列 6.一个消费 ...