• Linux内核设计第三周——构造一个简单的Linux系统


    Linux内核设计第三周——构造一个简单的Linux系统

    一、知识点总结

    1.Linux内核源代码简介

    • arch目录:代码量大,使我们重点关注的(如其中的X86)。

    • document:文档;

    • fs:文件系统

    • init:内核启动相关的代码都在init目录下(start_kernel函数相当于普通C程序的main函数。)

    • ipc:进程间通信;

    • kernel目录:Linux内核的核心代码在此目录下

    • lib:库文件

    • mm:内存管理

    • net:网络管理

    2.简单分析一下start_kernel

    计算机三个法宝:

    1. 存储程序计算机
    2. 函数调用堆栈
    3. 中断
    

    操作系统两把宝剑:

    1.中断上下文的切换
    2.进程上下文的切换
    

    跟踪内核的启动过程:

    1. 找到init目录下的main.c

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

    3. 不管分析内核的哪一部分都会涉及到start_kernel,因为:所有的模块都是初始化都是通过start_kernel调用完成的。

    【trap_init:涉及到中断的一些调用、陷阱门】
    【mm_init:内存管理模块】
    【rest_init:是一个0号进程,创建了1号进程kernel_init当系统内有进程需要执行时就调度到idle进程】
    enter description here

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

    命令:

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s-S
    

    【s选项的说明:

    • -S:在CPU初始化之前冻结起来

    • -s:在-gdb tcp::1234端口上创建了一个gdb server。】
      #构造一个简单的linux系统MenuOS

    1. 编译内核

    2. 制作根文件系统(init是第一个用户态进程,是1号进程)

    3. 启动MenuOS

    二、实验过程

    1.打开shell

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

    2.使用gdb进行调试

    3.将断点设置到start_kernal

    三、实验分析及总结

    1.实验分析

    本次实验在做的时候并不是特别明白,通过老师上课讲解之后,对于实验的过程和每部分的作用有了相对清晰地认识。

    2.实验总结

    内核启动过程:start_kernel内核启动后,rest_init()作为一个0号进程就一直存在;然后这个0号进程就创建了1号进程kernel_init,接下来还创建了其他的一些服务类的内核线程。

    在参考文件里还有一些可参考的内容,列在这里,以便查阅:

    1. 系统的启动和初始化
      在基于Intel的系统上,当 loadlin.exe 或 LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看arch/i386/kernel/head.S ,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。

    2. 内存管理
      内存管理的代码主要在/mm,但特定结构的代码在arch/*/mm。缺页中断处理的代码在mm/memory.c ,而内存映射和页高速缓存器的代码在mm/filemap.c。缓冲器高速缓存是在mm/buffer.c 中实现,而交换高速缓存是在mm/swap_state.c 和 mm/swapfile.c中实现。

    3. 内核
      内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,task_struct 数据结构在 include/linux/sched.h中。

    4. PCI
      PCI 伪驱动程序在 drivers/pci/pci.c ,其定义在include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS 代码, Intel的在arch/alpha/kernel/bios32.c。

    5. 进程间通信
      所有System V IPC 对象权限都包含在 ipc_perm 数据结构中,这可以在 include/linux/ipc.h中找到。 System V 消息是在 ipc/msg.c中实现, 共享内存在 ipc/shm.c中,信号量在 ipc/sem.c中,管道在 ipc/pipe.c中实现。

    6. 中断处理
      内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在 arch/i386/kernel/irq.c中,其定义子在 include/asm-i386/irq.h中。

    7. 设备驱动程序
      Linux内核源代码的很多行是设备驱动程序。Linux设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为:

    • /block
      块设备驱动程序如ide(在ide.c)。如果你想看包含文件系统的所有设备是如何被初始化的,你应当看drivers/block/genhd.c中的device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装nfs文件系统时,它也初始化网络。块设备包含了基于IDE和SCSI的设备。

    • /char
      这是看字符设备(如tty,串口及鼠标等)驱动程序的地方。

    • /cdrom
      Linux的所有CDROM代码都在这儿,如在这儿可以找到Soundblaster CDROM的驱动程序。注意ide CD的驱动程序是 ide-cd.c,放在drivers/block,SCSI CD的驱动程序是scsi.c,放在drivers/scsi。

    • /pci
      这是PCI伪驱动程序的源代码,在这里可以看到PCI子系统是如何被映射和初始化的。

    • /scsi
      在这里可以找到所有的SCSI代码及Linux所支持的scsi设备的所有设备驱动程序。

    • /net
      在这里可以找到网络设备驱动程序,如DECChip 21040 PCI 以太网驱动程序在tulip.c中。

    • /sound
      这是所有声卡驱动程序的所在地。

    1. 文件系统
      EXT2 文件系统的源代码全部在 fs/ext2/ 目录下,而其数据结构的定义在 include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虚拟文件系统的数据结构在 include/linux/fs.h中描述,而代码是在fs/*中。 缓冲区高速缓存与更新内核的守护进程的实现是在 fs/buffer.c中 。

    2. 网络
      网络代码保存在/net中,大部分的include文件在include/net下,BSD套节口代码在net/socket.c中,IP 第4版本的套节口代码在net/ipv4/af_inet.c。一般的协议支持代码(包括sk_buff 处理例程)在net/core下,TCP/IP联网代码在net/ipv4下,网络设备驱动程序在/drivers/net下。

    3. 模块
      内核模块的代码部分在内核中,部分在模块包中,前者全部在kernel/modules.c中,而数据结构和内核守护进程kerneld的信息分别在include/linux/module.h和include/linux/kerneld.h 中。如果你想看ELF目标文件的结构,它位于include/linux/elf.h中。

    四、参考文献

    1. 深入分析Linux内核源码 http://www.kerneltravel.net/kernel-book/深入分析Linux内核源码.html

    2. Linux - Linux内核分析 - 实验楼 https://www.shiyanlou.com/courses/195#

    3. Linux内核分析 - 网易云课堂 http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/hw?id=2001372006

  • 相关阅读:
    [LeetCode]78. Remove Nth Node From end of List删除链表中倒数第N个节点
    [LeetCode]77. Reverse Linked List反转链表
    [LeetCode]76. Permutation Sequence全排列序列
    [LeetCode]75. Pow(x,n)幂运算
    粘连字符分割初探~~
    验证码识别学习~~
    用VS2010编C#程序扫盲 2
    用VS2010编C#程序扫盲
    验证码降噪方法汇总~~~~~
    新生活......
  • 原文地址:https://www.cnblogs.com/suzhengsheng/p/5272640.html
Copyright © 2020-2023  润新知