一、Linux内核介绍
Linux是一个*的、免费的,源码开放的操作系统。一些厂商将Linux系统内核与应用程序个文档包装起来,并提供一些安装界面和系统设定管理工具的一个软件包的集合,例如RedHat,Debian、Ubuntu、Novell/SuSE等。Ubuntu版本号由该次发布的年份和月份组成,半年发布一次。首次发布是在2004年10月,因此该版本为4.10。于2009年4月23发布,因此该版本号为9.04。RedHat操作系统更多的应用于服务器,而Ubuntu操作系统更多应用于个人电脑。
Linux内核是一个Linux操作系统的核心,如下图所示,Linux内核只是Linux操作系统一部分。对下,它管理系统的所有硬件设备;对上,它通过系统调用,向Library Routine(例如C库)或者其他应用程序提供接口。
二、Linux内核源代码的目录结构
Linux内核源代码包括三个主要部分:
1、内核核心代码,包括各个子系统和子模块,以及其他的支撑子系统,例如电源管理、Linux初始化等。
2、其他核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其他的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等。
3、编译脚本、配置文档、帮助文档、版权说明等辅助性文件。
include/------ 内核头文件,需要提供给外部模块使用
kernel/------- Linux内核的核心代码,包含了进程调度子系统,以及和进程调度相关的模块。
mm/---------- 内存管理系统
fs/------------ VFS子系统
net/---------- 不包括网络设备驱动的网络子系统
ipc/---------- IPC进程间通信子系统
arch/-------- 体系结构相关的代码,例如 arm x86等等。
arch//mach 具体的machine/board相关的代码
arch//include/asm 体系结构相关的头文件
arch//boot/dts 设备树文件
init/--------- Linux系统启动初始化相关的代码
block/------ 提供块设备的层次
sound/----- 音频相关的驱动及子系统,可以看作“音频子系统”。
drivers/----- 设备驱动
Lib/---------- 实现需要在内核中使用的库函数,例如 CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相兰的库凼数。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虚拟机技术(KVM 等)的支持。
usr/ ---- 用亍生成 initramfs 的代码。
firmware/ ---- 保存用于驱动第三方设备的固件。
samples/ ---- 一些示例代码。
tools/ ---- 一些常用工具,如性能刨析、自测试等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。
开发平台 u-boot 跑起来后,想进入 Linux,则需要三大法宝:
Linux image(uImag or zImag)
Device tree image
文件系统(Linux app 都是存储在文件系统里的)
下面会介绍如何产生这三个文件。
三、Linux内核源码编译
下载内核的压缩包 , 解压缩 , 然后定位到交叉编译器目录 , 编译后产生uImag 镜像文件 。
四、设备树Device tree的编译
FDT(扁平化设备树)是一种描述硬件的数据结构,ARM Linux3.0以后大多数硬件设备直接通过FDT传递给Linux,而不需要plat-xxx和mach-xxx大量冗余的代码。
设备树的描述在.dts 文件(device tree source)里,它是一种 ASCII 文本格式,此文本格式非常人性化,适合人类的阅读习惯。基本上,在 ARM Linux 在,一个.dts 文件对应一个 ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。在此目录下我们可以看到我们开
发板的设备树 AX7010.dts(AX7020 开发板为 AX7020.dts)。
下面我们对.dts 设备树文件 迕行编译生成.dtb 格的设备树文件。编译前必须下载安装设备树编译器工具,因为我们已经在前面 u-boot 的编译的时候安装了设备树编译器。
五、文件系统
有了 Image/uImage, 和 devicetree.dtb,最后还需要文件系统。Linux 内核启动阶段,
待所有的驱动和外设都初始化好了以后,最后要加载一种文件系统(基于flash 的jffs2 或者基
于RAM 的ramdisk 或者基于网络的NFS 等等),Linux 才可以正常启动。(我们在进行 Linux应用程序开发式时,会编写 Linux app,然后编译,执行;编译出来的 Linux app 就是放在文件系统某个目录如:/home/root 下,然后进入/home/root 去执行;)
ZYNQ7000 开发平台支持三种类型文件系统:
- ubuntu 文件系统,我们实验中使用的文件系统为:
linaro-precise-ubuntu-desktop-20121124-560.tar.gz - 基于 RAM 的文件系统 ramdisk8M.image.gz
- 基于 NFS 的网络文件系统(NFS 文件系统一直是调试 Linux app 最佳方法,AX7010/AX7020 开发平台 Linux kernel image 默认提供此项功能)
返里我们把 ubuntu的文件系统 linaro-precise-ubuntu-desktop-20121124-560.tar.gz
拷贝到 Ubuntu 操作系统的 Downloads 目录下:
到此为止,我们的Linux 的内核镜像文件、设备树文件和操作系统文件系统都准备好了,
接下去我们就是准备 Linux 操作系统在 AX7010/AX7020 开发板上运行了。