2019-2020-1 20199321《Linux内核原理与分析》第四周作业

第一部分 学习笔记

  • 操作系统两把宝剑:中断切换上下文、进程切换上下文
  • linux内核源的关键目录
    • arch是与体系结构相关的子目录列表,存放了许多CPU体系结构相关的代码,主要作用是使linux内核支持不同的CPU体系结构。
    • block存放Linux存储体系中关于块设备管理的代码。
    • crypto存放常见的加密算法的C语言代码。
    • fs文件系统,里面列出了Linux支持的各种文件系统的实现。
    • init存放Linux内核启动时的初始化代码。
    • kernel存放内核本身需要的一些核心代码文件。
    • Net存储网络相关的代码,譬如TCP/IP协议栈等。
  • init目录下有main.c源文件,它是整个Linux内核启动的起点,但它的起点不是main函数,而是start_kernel函数,start_kernel函数是初始Linux 内核启动的起点,start_kerne前的代码使用汇编语言来进行硬件初始化。
  • 配置Linux内核的关键步骤
    • 编译安装内核大概步骤
      安装开发组包
      下载源码文件
      .config: 准备配置文件
      make menuconfig: 配置内核选项
      make[-j#]
      make modules_install: 安装模块
      make install:安装内核相关文件
      安装bzImage 为 /boot/vmlinuz-VERSION-RELEASE
      生成initramfs
      编辑grub的配置文件。
    • 编译配置选项
    (1)配置内核选项
    (2)支持“更新”模式进行配置:make help
    Make config:基于命令行以遍历的方式去配置内核中可配置的每个选项。
    Make menuconfig:基于命令行以遍历的方式去配置内核中可配置的每个选项。
    Make gconfig:基于GTK(GNOME)环境窗口界面。
    Make xconfig: 基于QT(KDE)环境的窗口界面。
    (3)支持“全新配置”模式进行配置
    Make defconfig:基于内核为目标平台提供的“默认”配置进行配置。
    Make allyesconfig:所有选项均回答为“yes”。
    Make allnoconfig:所有选项均回答为“no”。
    • 编译
    全编译:make[-j#]

    第二部分 实验报告

  • 构造一个简单的Linux内核
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

2019-2020-1 20199321《Linux内核原理与分析》第四周作业_第1张图片

  • 跟踪调试Linux内核的启动过程
    另开一个shell窗口
# 打开 GDB 调试器
$ gdb
# 在 GDB 中输入以下命令:
# 在gdb界面中targe remote之前加载符号表
(gdb)file linux-3.18.6/vmlinux 
# 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
(gdb)target remote:1234
# 断点的设置可以在target remote之前,也可以在之后
(gdb)break start_kernel 

2019-2020-1 20199321《Linux内核原理与分析》第四周作业_第2张图片
在gdb模式下按c继续
2019-2020-1 20199321《Linux内核原理与分析》第四周作业_第3张图片

在rest_init()处设置断点并继续

start-kernel():main.c中没有main函数,相当于C语言中的main函数。start_kernel是一切的起点。
set_task_stack_end_magic(&init_task):init_task(0号进程)是task_struct类型,是进程描述符,使用宏INIT_TASK对其进行初始化。接下来就是对各模块的初始化。init_task是唯一的没有通过fork方式产生的进程。
通过rest_init()新建kernel_init和kernel_thread()内核线程。调用kernel_thread()创建1号内核线程。
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);这行代码调用kernel_thread执行kthreadd,创建PID为2的内核线程。

2019-2020-1 20199321《Linux内核原理与分析》第四周作业_第4张图片

你可能感兴趣的:(2019-2020-1 20199321《Linux内核原理与分析》第四周作业)