以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
目录
一、如何获取内核源码?
我们使用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文件夹
这个目录存放着与内核虚拟机相关的代码,暂时不用理会。