• kernel 目录 解析


    核心源码的顶层是/usr/src/linux目录,在此目录下你可以看到大量子目录:

    arch
     这个子目录包含了所有体系结构相关的核心代码。它还包含每种支持的体系结构的子目录,如i386。
    include
      这个目录包括了用来重构核心的大多数include文件。对于每种支持的体系结构分别有一个子目录。此目录中的asm子目录中是对应某种处理器的符号连接,如include/asm-i386。要修改处理器结构则只需编辑核心的makefile并重新运行Linux核心配置程序。
    init
     此目录包含核心启动代码。
    mm
     此目录包含了所有的内存管理代码。与具体体系结构相关的内存管理代码位于arch/*/mm目录下, 如arch/i386/mm/fault.c 。
    drivers
     系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,如block。
    ipc
     此目录包含了核心的进程间通讯代码。
    modules
     此目录仅仅包含已建好的模块。
    fs
     所有的文件系统代码。它也被划分成对应不同文件系统的子目录,如vfat和ext2。
    kernel
     主要核心代码。同时与处理器结构相关代码都放在arch/*/kernel目录下。
    net
     核心的网络部分代码。
    lib
     此目录包含了核心的库代码。与处理器结构相关库代码被放在arch/*/lib/目录下。
    scripts
     此目录包含用于配置核心的脚本文件(如awk和tk脚本)。

    从哪里入手,如何入手

    阅读象Linux核心代码这样的复杂程序令人望而生畏。它象一个越滚越大的雪球。阅读核心某个部分经常要 用到好几个其他的相关文件,不久你将会忘记你原来在干什么。本小节将给出一些提示。

    系统启动与初始化

    在 基于intel的系统上,Linux可以通过loadlin.exe或者LILO将核心载入内存并将控制传递给它。这部分程序位于arch/i386/kerneld/head.S。此文件完成一些处理器相关操作并跳转到init/main.c中的main()例程。

    内存管理

    这 部分代码主要位于mm目录中但其处理器结构相关部分被放在arch/*/mm中。页面出错处理代码位于mm下的 memory.c文件中而内存映射与页面cache代码位于filemap.c中。buffer cache则在mm/buffer.c中实现, swap cache位于mm/swap_state.c和mm/swapfile.c中。

    核心

    大 多数通用代码位于kernel目录下而处理器相关代码被放在arch/*/kernel中。调度器位于kernel/sched.c 而fork代码位于kernel/fork.c中。底层部分处理代码位于include/linux/interrupt.h中。task_struct 的 描叙则在/linux/sched.h中可以找到。

    PCI

    PCI伪设备驱动位于drivers/pci/pci.c且其系统通用定义放在include/linux/pci.h中。每个处理器结构 具有特殊的PCI BIOS代码,Alpha AXP的位于arch/alpha/kernel/bios32.c中。

    进程间通讯

    所 有这些代码都在ipc目录中。系统V IPC对象都包含一个ipc_perm结构,它在include/linux/ipc.h中描叙。系统V消息在ipc/msg.c中实现,共享内存在ipc/shm.c而信号灯位于ipc/sem.c中。管道在ipc/pipe.c中实现。

    中断处理

    核心的中断处理代码总是与微处理器结构相关。Intel系统的中断处理代码位于arch/i386/kernel/irq.c中, 其定义位于include/asm-i386/irq.h中。

    设备驱动

    Linux核心源码的大多数都是设备驱动。所有Linux的设备驱动源码都放在drivers目录中并分成以下几类:


    /block
      块设备驱动包括IDE(在ide.c中)驱动。如果你想寻找这些可包含文件系统的设备的初始化过程则应该在drivers/block/genhd.c中的device_setup()。当安装一个nfs文件系统时不但要初始化硬盘还需初始化网络。块设备包括IDE与SCSI设备。


    /char
     此目录包含字符设备的驱动,如ttys,串行口以及鼠标。


    /cdrom
      包含所有Linux CDROM代码。在这里可以找到某些特殊的CDROM设备(如Soundblaster CDROM)。 IDE接口的CD驱动位于drivers/block/ide-cd.c中而SCSI CD驱动位于drivers/scsi/scsi.c中。


    /pci
     它包含了PCI伪设备驱动源码。这里可以找到关于PCI子系统映射与初始化的代码。另外位于 arch/alpha/kernel/bios32.c中的Alpha AXP PCI补丁代码也值得一读。


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


    /net
     包含网络驱动源码,如tulip.c中的DECChip 21040 PCI以太网驱动。


    /sound
     所有的声卡驱动源码。

    文件系统

    EXT2 文件系统的源码位于fs/ext2中,其数据结构定义位于include/linux/ext2_fs.h, ext2_fs_i.h 以及 ext2_fs_sb.h中。虚拟文件系统数据结构在include/linux/fs.h中描叙且其代码在fs/*中。buffer cache 和update核心后台进程在fs/buffer.c中实现。

    网络

    网 络代码位于net目录而大多数包含文件位于include/net中。BSD套接口代码位于net/socket.c中。IPV4的 INET套接口代码位于net/ipv4/af_inet.c中。通用协议支撑代码(包括sk_buff处理过程)位于net/core中,同时TCP/IP网络代码位于net/ipv4中。网络设备驱动位于drivers/net中。

    模块

    核 心模块代码部分位于核心中部分位于modules包中。核心代码位于kernel/modules.c且其数据结构与核心后台进程kerneld消息位于include/linux/module.h和include/linux/kerneld.h目录中。同时必要时需查阅 include/linux/elf.h中的ELF文件格式。

    只是介绍如何去学习kernel .具体的代码学习,我们一起共同吧!

    天不会黑
  • 相关阅读:
    《C++标准程序库》 第6章 STL Container
    《C++语言99个常见编程错误》
    单例模式
    《C++标准程序库》 第7章 Iterator Adapters
    Shell颜色封装(C++)
    《改善C++程序的150个建议》
    OpenCV之图片的创建、保存和复制
    XMLDOM对象方法:对象事件
    三国中最精辟的十句话
    中国十大名茶及鉴别方法
  • 原文地址:https://www.cnblogs.com/yuanfang/p/1920895.html
Copyright © 2020-2023  润新知