内核通识——Linux内核源码的目录结构(2.6.35.7版本)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

目录

一、如何获取内核源码?

二、重要的文件

2.1 /Kbuild文件

2.2 /Makefile文件

2.3 /initrd.img.cpio文件

三、重要的文件夹

3.1 /arch文件夹

3.1.1 /arch/arm/mach-xxx目录

3.1.2 /arch/arm/plat-xxx目录

3.1.3 /arch/arm/include目录

3.1.4 补充说明

3.2 /block文件夹

3.3 /crypto文件夹

3.4 /Documentation文件夹

3.5 /drivers文件夹

3.6 /firmware文件夹

3.7 /fs文件夹

3.8 /include文件夹

3.9 /init文件夹

3.10 /ipc文件夹

3.11 /kernel文件夹

3.12 /lib文件夹

3.13 /mm文件夹

3.14 /net文件夹

3.15 /scripts文件夹

3.16 /security文件夹

3.17 /sound文件夹

3.18 /tools文件夹

3.19 /usr文件夹

3.20 /virt文件夹


一、如何获取内核源码?

我们使用2.6.35.7版本的内核。这个版本的内核有三种:第一种是www.kernel.org的官方版本,第二种是三星为SMDKV210开发板移植过的版本,第三种是九鼎为X210开发板移植过的版本。

我们分析时主要使用第三种内核来讲解,后面的移植实验使用第二种内核来移植。

1、获取www.kernel.org官方版本

Linux内核官网是www.kernel.org,Linux内核下载地址是Index of /pub/

2、获取三星为SMDKV210开发板移植的内核源码

这个版本的内核源码见链接

3、获取九鼎为X210开发板移植的内核源码

这个版本的内核源码见链接,即X210V3S_B/linux/QT4.8/bsp/qt_x210v3s_160307.tar.bz2文件中的kernel目录,包括以下内容:

根据与移植工作的相关程度,这些内核源码可以分为三类:

(1)/arch目录:该目录下是与CPU体系架构有关的代码。

(2)/drivers目录:该目录下全是硬件的驱动。

(3)其他内容:与硬件无关(因此系统移植和驱动开发时,几乎不用关注这些代码)。 

二、重要的文件

2.1 /Kbuild文件

Kbuild,即“kernel build”(内核编译),此文件是(Linux内核特有的)内核编译体系所需的文件。

#
# Kbuild for top-level directory of the kernel
# This file takes care of the following:
# 1) Generate bounds.h
# 2) Generate asm-offsets.h (may need bounds.h)
# 3) Check for missing system calls

#####
# 1) Generate bounds.h

bounds-file := include/generated/bounds.h
//省略部分代码

2.2 /Makefile文件

此文件是Linux内核的总Makefile文件,记录着各个模块之间的关系,编译器根据该文件编译内核。

2.3 /initrd.img.cpio文件

这个好像是根文件系统的压缩包?

三、重要的文件夹

3.1 /arch文件夹

arch是architecture的缩写,意思是CPU体系架构。

该目录下的每个目录分别表示一种CPU体系架构,比如/arch/arm目录表示arm体系架构,/arch/x86目录表示X86这种体系架构:

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch# ls
alpha  avr32     cris  h8300  Kconfig  m68k       microblaze  mn10300  powerpc  score  sparc  x86
arm    blackfin  frv   ia64   m32r     m68knommu  mips        parisc   s390     sh     um     xtensa
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch# 

因为X210开发板采用ARM芯片,所以这里研究/arch/arm目录,其内容如下所示:

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm# ls
boot           mach-ebsa110     mach-loki      mach-orion5x   mach-s5pv210    oprofile
common         mach-ep93xx      mach-mmp       mach-pnx4008   mach-sa1100     plat-iop
configs        mach-footbridge  mach-msm       mach-pxa       mach-shark      plat-mxc
include        mach-gemini      mach-mv78xx0   mach-realview  mach-shmobile   plat-nomadik
Kconfig        mach-h720x       mach-mx1       mach-rpc       mach-spear3xx   plat-omap
Kconfig.debug  mach-integrator  mach-mx2       mach-s3c2400   mach-spear6xx   plat-orion
Kconfig-nommu  mach-iop13xx     mach-mx25      mach-s3c2410   mach-stmp378x   plat-pxa
kernel         mach-iop32x      mach-mx3       mach-s3c2412   mach-stmp37xx   plat-s3c24xx
lib            mach-iop33x      mach-mx5       mach-s3c2416   mach-u300       plat-s5p
mach-aaec2000  mach-ixp2000     mach-mxc91231  mach-s3c2440   mach-ux500      plat-samsung
mach-at91      mach-ixp23xx     mach-netx      mach-s3c2443   mach-versatile  plat-spear
mach-bcmring   mach-ixp4xx      mach-nomadik   mach-s3c24a0   mach-vexpress   plat-stmp3xxx
mach-clps711x  mach-kirkwood    mach-ns9xxx    mach-s3c64xx   mach-w90x900    plat-versatile
mach-cns3xxx   mach-ks8695      mach-nuc93x    mach-s5p6440   Makefile        tools
mach-davinci   mach-l7200       mach-omap1     mach-s5p6442   mm              vfp
mach-dove      mach-lh7a40x     mach-omap2     mach-s5pc100   nwfpe
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm# 

3.1.1 /arch/arm/mach-xxx目录

可见/arch/arm/目录下有许多mach-xxx目录,每个mach-xxx目录中又有许多mach-yyy.c文件,每个mach-yyy.c文件定义了一个采用xxx这个芯片作为CPU的具体开发板。

比如/arch/arm/mach-s5pv210目录中,包含mach-smdkc110.c、mach-smdkv210.c、mach-x210.c等文件,它们对应着三个具体的开发板,这三个开发板都采用s5pv210作为CPU。

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm# cd mach-s5pv210/
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/mach-s5pv210# ls mach-*
mach-aquila.c  mach-goni.c  mach-herring.c  mach-smdkc110.c  mach-smdkv210.c
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/mach-s5pv210# 

3.1.2 /arch/arm/plat-xxx目录

plat是platform的缩写,含义是平台。

plat可以理解为SoC,这个plat目录下都是SoC里面的一些硬件(内部外设)相关的代码。

在内核中,这些SoC内部外设相关的硬件操作代码,就叫做平台设备驱动。

比如/arch/arm/plat-s5p目录下,都是与s5pv210这款SoC有关的内部外设相关的代码。

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm# cd plat-s5p/
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/plat-s5p# ls
bootmem.c  cpu.c      devs.c      hr-time-rtc.c  irq.c       irq-eint-group.c  Kconfig   pm.c         systimer-s5p.c
clock.c    dev-mfc.c  dev-uart.c  include        irq-eint.c  irq-pm.c          Makefile  setup-mfc.c
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/plat-s5p# 

3.1.3 /arch/arm/include目录

该目录中的所有代码,都是与CPU体系架构相关的头文件。

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm# cd include/
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/include# ls
asm
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/include# cd asm/
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/include/asm# ls
a.out-core.h   cputype.h            floppy.h    kdebug.h       msgbuf.h         proc-fns.h     socket.h          topology.h
a.out.h        current.h            fpstate.h   kexec.h        mtd-xip.h        procinfo.h     sockios.h         traps.h
asm-offsets.h  delay.h              ftrace.h    kgdb.h         mutex.h          ptrace.h       sparsemem.h       types.h
#省略部分内容
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/arch/arm/include/asm

3.1.4 补充说明

(1)不同版本的内核,某个文件存放的位置可能不同。

(2)文件名为“include”的头文件目录有好几个,使用时要注意具体是哪个。

//内核通用头文件
/include  
      
//架构相关的头文件
/arch/arm/include        
/arch/arm/include/asm
/arch/arm/include/asm/mach
/arch/arm/mach-s5pv210/include/mach
/arch/arm/plat-s5p/include/plat

(3)注意头文件包含时的格式。

#include <linux/kernel.h>    // /include/linux/kernel.h
#include <asm/mach/arch.h>   // /arch/arm/include/asm/mach/arch.h
#include <asm/setup.h>       // /arch/arm/include/asm/setup.h
#include <plat/s5pv210.h>    // /arch/arm/plat-s5p/include/plat/s5pv210.h

(4)当我们需要包含某个头文件时,有时候并不是直接包含这个头文件,而是包含一个(包含着这个头文件的)头文件。
 

3.2 /block文件夹

在Linux中,block表示块设备(以块为单位来整体访问)。

比如SD卡、iNand、Nand和硬盘等都是块设备,你几乎可以认为块设备就是存储设备。

/block目录中存放的是Linux存储体系中关于块设备管理的代码,是逻辑层面的代码。

3.3 /crypto文件夹

这个目录中存放的是一些常见的加密与压缩算法的C语言代码,比如crc32、md5、sha1等。

3.4 /Documentation文件夹

这个目录存放的是内核各部分功能的解释文档。

3.5 /drivers文件夹

这个目录里面分门别类地列出了Linux内核支持的所有硬件设备的驱动源代码。

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/drivers# ls
accessibility  char         eisa      ieee1394    mca       nubus     pps        sh         usb
acpi           clocksource  firewire  ieee802154  md        of        ps3        sn         uwb
amba           connector    firmware  infiniband  media     oprofile  rapidio    spi        vhost
ata            cpufreq      gpio      input       memstick  parisc    regulator  ssb        video
atm            cpuidle      gpu       isdn        message   parport   rtc        staging    virtio
auxdisplay     crypto       hid       Kconfig     mfd       pci       s390       switch     vlynq
base           dca          hwmon     leds        misc      pcmcia    sbus       tc         w1
block          dio          i2c       lguest      mmc       platform  scsi       telephony  watchdog
bluetooth      dma          ide       macintosh   mtd       pnp       serial     thermal    xen
cdrom          edac         idle      Makefile    net       power     sfi        uio        zorro
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/drivers# 

3.6 /firmware文件夹

这个文件夹存放的是固件。

固件其实也是软件,不过这个软件是固化到IC里面运行的,就像s5pv210里的iROM代码。

3.7 /fs文件夹

这个是文件系统目录,里面列出了Linux支持的各种文件系统的实现。

root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/fs# ls
9p                  bio-integrity.c      ecryptfs        generic_acl.c   locks.c      openpromfs    stack.c
adfs                block_dev.c          efs             gfs2            logfs        partitions    stat.c
affs                btrfs                eventfd.c       hfs             Makefile     pipe.c        statfs.c
afs                 buffer.c             eventpoll.c     hfsplus         mbcache.c    pnode.c       super.c
aio.c               cachefiles           exec.c          hostfs          minix        pnode.h       sync.c
anon_inodes.c       ceph                 exofs           hpfs            mpage.c      posix_acl.c   sysfs
attr.c              char_dev.c           exportfs        hppfs           namei.c      proc          sysv
autofs              cifs                 ext2            hugetlbfs       namespace.c  qnx4          timerfd.c
autofs4             coda                 ext3            inode.c         ncpfs        quota         ubifs
bad_inode.c         compat_binfmt_elf.c  ext4            internal.h      nfs          ramfs         udf
befs                compat.c             fat             ioctl.c         nfs_common   readdir.c     ufs
bfs                 compat_ioctl.c       fcntl.c         ioprio.c        nfsctl.c     read_write.c  utimes.c
binfmt_aout.c       configfs             fifo.c          isofs           nfsd         read_write.h  xattr_acl.c
binfmt_elf.c        cramfs               file.c          jbd             nilfs2       reiserfs      xattr.c
binfmt_elf_fdpic.c  dcache.c             filesystems.c   jbd2            nls          romfs         xfs
binfmt_em86.c       dcookies.c           file_table.c    jffs2           no-block.c   select.c      yaffs2
binfmt_flat.c       debugfs              freevxfs        jfs             notify       seq_file.c
binfmt_misc.c       devpts               fscache         Kconfig         ntfs         signalfd.c
binfmt_script.c     direct-io.c          fs_struct.c     Kconfig.binfmt  ocfs2        smbfs
binfmt_som.c        dlm                  fs-writeback.c  libfs.c         omfs         splice.c
bio.c               drop_caches.c        fuse            lockd           open.c       squashfs
root@ubuntu:/home/xjh/iot/embedded_basic/kernel/samsung_kernel/android-kernel-samsung-dev/fs# 

3.8 /include文件夹

这是存放头文件的目录,各种CPU架构共用的头文件都放在这里。

每种CPU架构特有的一些头文件在/arch/arm/include目录及其子目录下。

3.9 /init文件夹

这个目录存放的是Linux内核启动时初始化内核的代码,包含内核启动的main()函数

3.10 /ipc文件夹

ipc就是inter process commuication,进程间通信。

这个目录存放的是Linux支持的IPC的代码实现。

3.11 /kernel文件夹

该目录存放着内核本身需要的代码文件,包括进程调度、内存管理等内容,是内核最核心的代码。

3.12 /lib文件夹

这个目录里存放的是一些公用的库函数。

注意这里的库函数和C语言的库函数不一样的。在内核编程中是不能用C语言标准库函数,因此这里的/lib目录中的库函数就是用来替代那些标准库函数的。比如在内核中要把字符串转成数字,需要使用atoi,但是内核编程中只能用/lib目录下的atoi函数,不能用标准C语言库中的atoi;又比如在内核中打印信息时不能用printf,而要用printk,这个printk就定义在这里的/lib目录中。

3.13 /mm文件夹

mm是memory management,内存管理。

该目录存放着独立于CPU体系结构的的内存管理代码,不同平台的代码在该目录下有相应的子目录。

3.14 /net文件夹

该目录存放着网络相关的代码,比如TCP/IP协议栈有关代码都在这个目录中。

3.15 /scripts文件夹

这个目录中全部是脚本文件。

这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。

我们并不会详细这个目录中的脚本,而是通过外围来重点学会配置和编译linux内核即可。

3.16 /security文件夹

这个目录存放着安全相关的代码,一般不需要去理会。

3.17 /sound文件夹

这个目录存放着与音频处理相关的代码。

3.18 /tools文件夹

这个目录存放着LinuxI系统中会用到的一些有用的工具。

3.19 /usr文件夹

这个目录存放着与 initramfs 相关的代码,和Linux内核的启动有关。暂时不用理会。

3.20 /virt文件夹

这个目录存放着与内核虚拟机相关的代码,暂时不用理会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值