Linux内核学习
Linux内核学习基础
内核简介
Linux系统的构成:用户空间、内核空间
思考:为什么划分为两个层次?
目的其实是为保护操作系统,防止应用程序的异常导致操作系统崩溃。
内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。
那么Linux的内核由哪些构成呢?如下图所示:
- VFS(虚拟文件系统)隐藏各种文件系统的具体细节,为文件操作提供统一的接口(不同的文件系统的接口是不一样的)。
- linux内核中有大量代码都在设备驱动程序中,它们控制特定的硬件设备
内核源代码
代码下载地址:linux kernel
根目录 | 目录 | 说明 |
---|---|---|
aaaaaaa | aaaaaa | |
/ | ||
arch | arch是architecture的缩写,内核所支持的每种CPU体系,在该目录下都有对应的子目录。每个CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等。 | |
block | 部分块设备驱动程序 | |
crypto | 加密,压缩,CRC校验算法 | |
documentation | 内核的文档 | |
drivers | 设备驱动程序 | |
fs | 存放各种文件系统的实现代码,每个子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统vfs。 | |
include | 内核所需要的头文件,与平台无关的头文件在include/linux子目录下,与平台有关的头文件则放在相应的子目录中。 | |
lib | 库文件代码 | |
mm | mm目录中的文件用于实现内存管理中与与体系结构无关的部分 | |
net | 所支持的网络协议实现 | |
scripts | 配置内核的脚步 | |
security | SELinux的模块 | |
sound | 应聘设备的驱动程序 | |
usr | cpio命令实现 | |
virt | 内存虚拟机 |
linux内核配置与编译
3.1 定制linux内核
- 清楚临时文件、中间文件和配置文件
- make clean
remove most generated files but keep the config - make mrproper
remove all generated files + config files - make distclean
mrproper + remove editor backup and pathch files
- 确定目标系统的软硬件配置情况,比如CPU的类型、网卡的型号,所需要支持的网络协议等。
- 使用如下命令之一配置内核:
- make config
基于文本模式的交互式配置 - make menuconfig
基于文本模式的菜单型配置(推荐使用),选项*代表需要编译链接,M代表只编译不链接,空代表不编译 - make oldconfig
使用已有的配置文件(.config),但是会询问新增的配置选项。
- 编译内核
- make zlmage
- make bzlmage
区别:在x86平台,zlmage只能用于小于512k的内核
如需要获取详细编译信息,可使用:
make zlmage V=1 make bzlmage V=1
编译好的内核位于arch//boot/目录下
- 编译内核模块
make modules - 安装内核模块
make modules_install
将编译好的内核模块从内核源代码目录copy至/lib/modules下 - 制作init ramdisk
mkinitrd initrd-$version(自行取名) $version(跟当前版本一致,可以通过查询/lib/modules/下的目录得到)
例如:
mkinitrd initrd-2.6.29 2.6.29
3.2 内核安装
- cp arch/x86/boot/bzlmage /boot/vmlinuz-$version
- cp $initrd /boot/
- 修改/etc/grub.conf或者 /etc/lilo.conf
$version为所编译的内核版本号
交叉工具链
进行嵌入式开发前,首先需安装交叉工具链,步骤如下:
- 解压工具链到某一目录
例如:tar zxvf arm-linux-gcc-XXX -C 目的目录 - 修改/etc/profile,添加
pathmunge 目的目录 - 执行source /etc/profile
之后便可以在#下敲命令行 # arm-linux-gcc hello.c -o hello
工具 | 说明 | 举例 |
---|---|---|
arm-linux-gcc | 编译 | arm-linux-gcc hello.c -o hello |
arm-linux-objdump | 反汇编工具 | arm-linux-objdump -D -S hello >log(输出到log文件中去) |
arm-linux-readelf | ELF文件查看工具 | arm-linux-readelf -all hello arm-linux-readelf -d hello(查看hello使用的动态库) |