从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中若是那些地方有问题还请各位大神为我讲解。linux
今天咱们会分析到如下内容:git
1. Linux体系结构简介网络
2. Linux内核源码简介架构
3. Linux内核配置、编译、安装post
1. Linux体系结构(linux系统构成)url
Linux能够分为两部分,分别为用户空间和内核空间具体以下图:spa
a) 用户空间包括:用户的应用程序、C库操作系统
b) 内核空间包括:系统调用接口、内核(狭义内核)、平台架构相关的代码
2. 为何要分为内核空间和用户空间
咱们在分析u-boot的时候就说到过,咱们的cpu在不一样的工做模式下能够访问的寄存器是不同的,因此为了保护咱们的操做系统,避免用户程序将内核搞崩,因此进行了内核空间和用户空间的划分。
a) Arm处理器工做模式划分:usr、FIQ、IRQ、svc、abt、und、sys(具体介绍在http://www.cnblogs.com/wrjvszq/p/4199682.html)
b) X86处理器工做模式划分:Ring0—Ring3,Ring0下能够执行特权指令,能够访问IO设备,Ring3则有不少的限制
注:咱们能够经过系统调用和硬件中断来完成用户空间到内核空间的转移
3. Linux内核结构(广义内核)
Linux内核由七个部分构成,具体以下图:
a) 系统调用接口(SCI):open、read、write等系统调用
b) 进程管理(PM):建立进程、删除进程、调度进程等
c) 内存管理(MM):内存分配、管理等
d) 虚拟文件系统(VFS):为多种文件系统提供统一的操做接口
e) 网络协议栈:提供各类网络协议
f) CPU架构相关代码(Arch):为的是提升至移植性
g) 设备驱动程序(DD):各类设备驱动,占到内核的70%左右代码
l Linux内核源码简介
1. 源码获取
Linux内核获取有两种方法,一种是在www.kernel.org 直接获取,另外一种是使用git获取(具体方法参考网络)。
2. 源码目录简介
其源码主要有如下目录(介绍重要目录):
a) Arch目录:存放处理器相关的代码。下设子目录,分别对应具体的CPU,每一个子目录有boot,mm,以及kernel三个子目录,分别对应系统引导以及存储管理,和系统调用
b) Include目录:内核所须要的大部分头文件目录。与平台无关的在include/linux子目录下,与平台相关的则放在include相应的子目录中。
c) fs目录:存放各类文件系统的实现代码。
d) init目录:init子目录包含核心的初始化代码(不是系统的引导代码)。其包含两个文件main.c和version.c,能够用来研究核心如何工做。
e) ipc目录:包含核心进程间的通讯代码。
f) kernel目录:包含内核管理的核心代码。与硬件相关代码放在arch/*/kernel目录下。
g) mm目录:包含了全部的内存管理代码。与硬件相关的内存管理代码位于arch/*/mm目录下。
h) scripts目录:包含用于配置核心的脚本文件。
i) lib目录:包含了核心的库代码,与硬件相关的库代码被放在arch/*/lib/目录下
l Linux内核配置、编译、安装
1. X86配置
Linux内核的编译有两种方法,具体以下:
a) 交互式:在内核顶层的目录下运行make config,按照提示一步一步的按照本身的需求对内核进行配置。
b) 菜单式:在内核顶层的目录下运行make menuconfig,菜单式的按照本身的需求对内核进行配置。
2. X86编译
Linux内核的编译要通过如下步骤,具体以下:
1. 内核编译:linux内核的编译有如下两种方法。
n make zImage:编译出的内核小于512k(老版本内核)
n make bzImage:通用编译命令
注:在以上两个命令中加V=1可查看编译过程当中的详细信息
2. 内核模块编译:执行make modules编译内核模块。
3. 内核模块安装:执行make modules_install将编译好的内核模块复制到当前系统的/lib/modules下的**目录下。
4. 内核模块打包:执行mkinitrd initrd-$version $version对内核模块进行打包,其中initrd-$version表示要打包为的文件的名字,$version表示要打包的目录即咱们上一步生成的目录。
3. X86安装
Linux内核的安装要通过如下步骤,具体以下:
a) 拷贝内核:复制1编译出来的内核映像到启动目录cp arch/$cpu/boot/bzImage(1编译出来的bzimage)/boot/vmlinuz-$version
b) 拷贝内核模块文件:执行cp initrd-$version(4生成的文件) /boot/ 将4生成的文件拷贝到boot下
c) 修改启动配置文件:修改/etc/grub.conf文件