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

  • 跟踪调试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 


在gdb模式下按c继续

在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的内核线程。

原文地址:https://www.cnblogs.com/20199321zjy/p/11622830.html