20135313吴子怡.北京电子科技学院

chapter1 知识点梳理

一、Linux内核源代码简介

(视频中对目录下的文件进行了简介,记录如下)

  1. arch目录

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

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

    Linux内核的核心代码在kernel目录中
  4. 其他

    Documentation 文档
    drivers 驱动
    fs-filesystem 文件系统
    include
    ipc 进程间通信
  5. README:

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

二、构造一个简单的Linux系统

  • 使用实验楼的虚拟机打开shell,命令如下:

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

内核启动完成后进入menu程序,支持三个命令help、version和quit。

  • 通过gdb跟踪内核的启动

  • 使用自己的Linux系统环境搭建MenuOS的过程

    下载内核源代码编译内核

    cd ~/LinuxKernel/
    wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
    xz -d linux-3.18.6.tar.xz
    tar -xvf linux-3.18.6.tar
    cd linux-3.18.6
    make i386_defconfig
    make

    制作根文件系统

    cd ~/LinuxKernel/
    mkdir rootfs
    git clone https://github.com/mengning/menu.git # 如果被墙,可以使用附件menu.zip
    cd menu
    gcc -o init linktable.c menu.c test.c -m32 -static –lpthread # 系统会默认启动init,即第一个用户态进程,1号进程
    cd ../rootfs
    cp ../menu/init ./
    find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img # 镜像

    启动MenuOS系统

    cd ~/LinuxKernel/
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
  • 重新配置编译Linux使之携带调试信息
  1. 在原来配置的基础上,make menuconfig选中如下选项重新配置Linux,使之携带调试信息(由于在实验楼中操作,因此省略个别步骤)

  2. make重新编译

  • 使用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之前,也可以在之后

三、跟踪调试Linux内核的启动过程

1.使用gdb跟踪调试内核的方法

除了前半部分提及的,以下部分为补充:

(gdb)c # 系统开始启动,启动到start_kernel
(gdb)list # 可以看到start_kernel上下的代码
(gdb)break rest_init
(gdb)c # 当前系统执行到rest_init
(gdb)list # 可以看到rest_init是在start_kernel的尾部调用的。

chapter2 实践实验过程

①构建Menu系统的过程

②使用gdb进行调试

③将断点设置到start_kernal

④将断点设置到rest_init

chapter3  简单分析一下start_kernel(作业)

①在init目录下main.c里找到start_kernel函数

②全局变量init_task,即手工创建的PCB,0号进程即最终的idle进程。

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

③一些简要提及的函数

trap_init() 初始化一些中断向量
mm_init() 内存管理模块
sched_init() 调度模块
rest_init()中有kernel_thread(kernel_init,NULL,CLONE_FS),kernel_init中有run_init_process,创建了一号进程,默认路径下的程序。

注意:init_process是一号进程。

④创建kthread(一个内核线程来管理系统的资源)。
启动后,进入了一个cpu_idle,cpu_idle_loop,即一个while(0)的无限循环,或者说是idle进程,它作为0号进程适中存在于系统中。
当系统没有进程需要执行时就需要调度idle进程。

chapter4 总结

阐明对“Linux系统启动过程”的理解。

sched_init()初始化函数内对0号进程,即idle进程进行初始化。然后rest_init()其他初始化函数,函数内将创建1号进程,即init进程。随后rest_init实际上就是start_kernel内核一启动的时候会一直存在,这个就叫0号进程;0号进程创建了1号进程kernel_init和其他服务线程。这就是内核的启动过程。

chapter5 附录

作者:吴子怡

学号:20135313

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

Linux内核分析——第三周学习笔记的更多相关文章

  1. Linux内核分析第三周学习笔记

    linux内核分析第三周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  2. 20135320赵瀚青LINUX内核分析第三周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...

  3. Linux内核分析——第三周学习笔记20135308

    第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...

  4. 《Linux内核分析》第二周学习笔记

    <Linux内核分析>第二周学习笔记 操作系统是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  5. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  6. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  7. 《Linux内核分析》第一周学习笔记

    <Linux内核分析>第一周学习笔记 计算机是如何工作的 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/c ...

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

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

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

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

随机推荐

  1. Terminal Service 终端链接

    2008 64位前有这项服务,之后就与远程管理合并了 如果要设置他的连接数可以去 桌面 --> 管理工具 --> 远程桌面服务 最大数设置成1个好了

  2. 【Android自动化】Subprocess.check_output()简单用法

    # -*- coding:utf-8 -*- import os import sys import subprocess from uiautomator import device as d cm ...

  3. JS内置对象-String对象、Date日期对象、Array数组对象、Math对象

    一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义 ...

  4. 关于Netty Pipeline中Handler的执行顺序问题

    原文地址:http://blog.csdn.net/wgyvip/article/details/25637651 最近在学习Netty框架,根据官网的教程学着做了几个小测试,都成功了,后面开始试着写 ...

  5. Scala学习之路 (三)Scala的基本使用

    一.Scala概述 scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性.scala运行在虚拟机上,并兼容现有的Java程序.Scala源代码被编译成java字节码,所以运行在JV ...

  6. QGIS里的编程模型

    项目(QgsProject) 用于读写项目状态 图层分组(QgsLayerTreeGroup) 项目树的分组节点,用来存放图层节点. 图层节点(QgsLayerTreeLayer) 项目树的图层节点. ...

  7. 解决Matlab当中for循环运行慢的问题

    做量化操作的时候经常需要使用到matlab编写策略或者计算多因子,for循环非常慢,自己找了一些matlab中for循环的优化方法,for的部分每处理一个大矩阵都要花费大量的时间,这是不可避免需要遇到 ...

  8. GitHub上最火的74个Android开源项目(三)

    此前,推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“GitHub上最火的40个Android开源项目(一).(二)中,我们也相继盘点了40个GitHub上最受欢迎的A ...

  9. CAN总线学习系列之二——CAN总线与RS485的比较

    CAN总线学习系列之二——CAN总线与RS485的比较 上 一节介绍了一下CAN总线的基本知识,那么有人会问,现在的总线格式很多,CAN相对于其他的总线有什么特点啊?这个问题问的好,所以我想与其它总线 ...

  10. 2019年北航OO第2单元(电梯模拟)总结

    1 三次作业的设计策略 经过了上一单元的训练,我也积累了一些设计策略上的经验.在这一单元的一开始,我便尽可能地把问题中的各个功能实体区分开来,分别封装成类,以便于随后作业中新需求的加入.与此同时,我也 ...