一、为什么要学习内核?
有些人要学习内核,而有些人则可以不学习它。你若果之后要从事系统研制或驱动开发的话,就要学习内核。
刚才接触内核,主要学习内核的插口函数。不要深入的去读内核,由于你读也读不懂,内核代码庞大如野兽通常不可驾驭。
学习内核主要把握层次学习法,即从头开始学习,一环紧扣一环。
内核学习的四步学习法:1、核心理论学习-概念与函数原型2、范例程序剖析3、思维导图设计4、亲自编撰代码
二、linux内核简介
1、linux体系结构
分为两部份:用户空间和内核空间
2、linux为何要分为用户空间和内核空间
现代CPU一般实现了不同的工作模式,以ARM为例,实现了7中工作模式。X86实现了4中不同的级别:Ring0-Ring3.Ring0下可以执行特权指令,可以访问IO设备等,在Ring3则有好多限制。linux系统借助CPU的这一特点,使用了其中两个级别分别运行linux内核与应用程序,这样使操作系统本身得到充分的保护。诸如:假如使用X86linux设备驱动开发详解 源码,用户代码运行在Ring3,内核代码运行在Ring0.内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断才能完成从用户空间到内核空间的转移。
3.linux的内核架构
系统调用插口
SCI层为用户空间提供了一套标准的系统调用函数来访问Linux内核,搭起了用户空间到内核空间的桥梁。
进程管理(PM)是创建进程,停止进程,并控制它们之间的通讯。进程管理还包括控制活动进程怎么共享CPU,即进程调度。
显存管理(MM)的主要作用是控制多个进程安全地共享显存区域。
网路合同栈(NetworkStack)为linux提供了丰富的网路合同实现。
虚拟文件系统(VFS)隐藏各个文件系统的具体细节,为文件操作提供统一的插口。
设备驱动(DD):linux内核中有大量代码都在设备驱动程序中,它们控制特定的硬件设备。
三、linux内核源代码结构
1、下载源代码地址
2、linux内核源代码采用树状结构进行组织,十分合理地把功能相关的文件都置于同一个子目录下,致使程序更具可读性。
arch目录:arch是architecture的简写。内核所支持的每种CPU体系linux格式化命令,在该目录下都有对应的子目录。每位cpu的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,显存管理,系统调用等。/*X86英特尔cpu与之相兼容体系结构的子目录:boot引导程序compressed内核解压缩tools生成压缩内核映像的程序kernel相关内核特点实现方法,如讯号处理、时钟处理lib硬件相关工具函数*/
documentation内核文档
drivers设备驱动文档
include内核所须要的头文件。与平台无关的头文件在include/linux子目录下,与平台有关的头文件则置于相应的子目录中。
fs目录储存各类文件系统的实现代码。每位子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统vfs
"|--devpts是/dev/pts虚拟文件系统
||--ext2是第二扩充文件系统
||--fat是MS的fat32文件系统
||--isofs是IsO9660光碟cd-rom上的文件系统
net是网路合同的实现代码
||--802802无线通信合同核心支持代码
||--appletalk与苹果系统连网的合同
||--ax25AX25无线INTERNET合同
||--bridge桥接设备
||--ipv4IP合同族V4版32位轮询模式
||--ipv6IP合同族V6版
四、linux内核的配置和编译
代码是怎样转化为烧录或安装到硬件平台中的系统映像文件的?
1、为什么要配置内核
选出须要的,除去不要的!1、硬件的需求2、软件的需求
下载内核后要在linux中解压缩,不要在windows下解压缩由于windows下不分辨大小写linux怎么读,而linux操作系统分辨大小写。
步入内核的文件下:
2、内核的配置:
makeconfig:基于文本模式的交互式配置
makemenuconfig:基于文本模式的菜单型配置
文件经过编译由.c文件到.o文件,最后链接压缩为内核镜像,它储存在显存。
内核模块,同上经过编译后会把.o文件安装到硬碟。
表示不选择该功能
配置结果文件是隐藏文件,可以用ls-a在内核文件下查看.configversion
前面介绍的是一种方式,不过作为初学者我们常常是在一个已有的配置文件基础上,通过更改得到新的配置文件linux设备驱动开发详解 源码,linux内核提供了一系列可供参考的内核配置文件,坐落Arch/cpu/configs
接出来,我们借助虚拟机上的linux系统的配置文件来创建自己的升级版内核,并在虚拟机上运行该内核。
图:
3、编译内核(编译内核、编译内核模块、制作ramdisk)
3.1、编译内核
makezImage只能编译大于512K的内核
makebzImage我们通常会使用这些方式编译内核
如需获取详尽编译信息,可使用:
makezImageV=1
makebzImageV=1
编译好的内核坐落arch/cpu/boot/目录下***
3.2编译内核模块
makemodules编译内核模块
makemodules_install将编译好的内核模块,从内核源代码目录复制到/lib/modules下**,为打包做好打算
经过第一步编译后,飘散在各个文件下的.ko文件为显存模块。须要集中联通到/lib/modules这个就由makemodules_install来完成
3.3制做initramdisk
方式:mkinitrdinitrd-$version$version
比如:mkinitrdinitrd-2.6.322.6.32
通过uname-r获得正在运行的内核版本
*$version可以通过查询/lib/modules下的目录得到
4、安装内核
1、cparch/x86/boot/bzImage
/boot/vmlinuz-$version
2、cpinitrd-$version/boot/
3、修改/etc/grub.conf的后四行
5、清理内核
makeclean清除编译内核生产的.o文件
makedistclean清除编译内核生产的.o文件和.config$version
记忆几个命令
rpm-qa|grepkernel找到内核包信息
rpm-ekernel-内核包名