zoukankan      html  css  js  c++  java
  • 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的内核线程。
    

  • 相关阅读:
    索引脚本实例1
    哈尔滨理工大学2016新生赛A题
    拒绝从入门到放弃_《Openstack 设计与实现》必读目录
    生成四位随机数,用于登录验证码制作。
    Python多线程学习(一、线程的使用)
    为什么在 React 16 版本中 render 阶段放弃了使用递归?
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    【推荐】开源项目ElasticAmbari助力 ElasticSearch、Kibana、ambari服务高效运维管理
    nginx反向代理配置去除前缀
    LNMP架构部署(附:部署Discuz社区论坛Web应用)
  • 原文地址:https://www.cnblogs.com/20199321zjy/p/11622830.html
Copyright © 2011-2022 走看看