Linux内核学习

内核简介

Linux系统的构成:用户空间、内核空间
思考:为什么划分为两个层次?
目的其实是为保护操作系统,防止应用程序的异常导致操作系统崩溃。
Linux内核学习
内核空间与用户空间是程序执行的两种不同状态,通过系统调用硬件中断能够完成从用户空间到内核空间的转移。
那么Linux的内核由哪些构成呢?如下图所示:
Linux内核学习

  • VFS(虚拟文件系统)隐藏各种文件系统的具体细节,为文件操作提供统一的接口(不同的文件系统的接口是不一样的)。
    Linux内核学习
  • 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内核

  1. 清楚临时文件、中间文件和配置文件
  • 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
  1. 确定目标系统的软硬件配置情况,比如CPU的类型、网卡的型号,所需要支持的网络协议等。
  2. 使用如下命令之一配置内核:
  • make config
    基于文本模式的交互式配置
  • make menuconfig
    基于文本模式的菜单型配置(推荐使用),选项*代表需要编译链接,M代表只编译不链接,空代表不编译
  • make oldconfig
    使用已有的配置文件(.config),但是会询问新增的配置选项。
  1. 编译内核
  • make zlmage
  • make bzlmage
    区别:在x86平台,zlmage只能用于小于512k的内核

如需要获取详细编译信息,可使用:
make zlmage V=1 make bzlmage V=1
编译好的内核位于arch//boot/目录下

  1. 编译内核模块
    make modules
  2. 安装内核模块
    make modules_install
    将编译好的内核模块从内核源代码目录copy至/lib/modules下
  3. 制作init ramdisk
    mkinitrd initrd-$version(自行取名) $version(跟当前版本一致,可以通过查询/lib/modules/下的目录得到)
    例如:
    mkinitrd initrd-2.6.29 2.6.29

3.2 内核安装

  1. cp arch/x86/boot/bzlmage /boot/vmlinuz-$version
  2. cp $initrd /boot/
  3. 修改/etc/grub.conf或者 /etc/lilo.conf
    $version为所编译的内核版本号

交叉工具链

进行嵌入式开发前,首先需安装交叉工具链,步骤如下:

  1. 解压工具链到某一目录
    例如:tar zxvf arm-linux-gcc-XXX -C 目的目录
  2. 修改/etc/profile,添加
    pathmunge 目的目录
  3. 执行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使用的动态库)