1、1 Linux内核简介,1,1.1 Unix的历史,1969年 诞生 贝尔实验室1973年 C语言重写(移植)1977年 Unix System III1977年 BSD系列1994年 伯克利Unix系统4.4BSD(开放性许可)20世纪8090年代 Digital Tru64、HP HP-UX、IBM AIX、SUN Solaris/SunOS,2,Unix的特点,简洁,设计明确所有东西都被当作文件对待C语言开发,移植能力强进程创建快,fork()系统调用进程间通信简单、稳定支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP,3,1.2 Linux简介,1991年,Linus
2、Torvalds在Intel 80386上开发了Linux广泛移植到Alpha、ARM、PowerPC、X86-64等体系结构上应用范围:嵌入式系统,桌面环境,服务器 Linux是类Unix操作系统,借鉴并实现 Unix的API Linux内核是自由(公开)软件,遵循GNU的GPL Linux系统的基础:内核、C库、工具集和系统的基本工具,如登录程序和Shell,4,1.3 操作系统和内核简介,操作系统定义:指在整个系统中负责完成最基本功能和系统管理的那些部分。这些部分应该包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。,5,内核:操
3、作系统核心,其组成: 中断服务程序:负责响应中断 调度程序:负责管理多个进程分享处理器时间 内存管理程序:负责管理进程地址空间 系统服务程序:负责管理网络、进程间通信,6,内核空间:内核处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护起来的内存空间,统称为内核空间。 用户空间:应用程序在用户空间执行,只能使用部分系统及特定的系统功能,不能直接访问硬件、内核划分给别人的内存范围。,7,应用程序、内核和硬件,8,应用程序与内核通信:系统调用,系统调用:应用程序用来与内核通信的接口。应用程序通常通过调用库函数,再由库函数通过系统调用,让内核代其完成各种不同的任务。应用程序
4、被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中。,9,应用程序通过系统调用与内核通信:,10,库函数举例: printf():提供数据缓存和格式化,调用write()将数据写到控制台 open():直接对应系统调用open() strcpy(): 不需要系统调用,11,内核管理硬件设备:中断,中断机制:内核还要管理系统的硬件机制。当硬件设备想和系统通信的时候,首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。中断通常对应着一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。,12,中断机制举例:,13,处理器在指定时间点上的活
5、动概括为:运行于用户空间,执行用户进程运行于内核空间,处于进程上下文,代表某个特定的进程执行运行内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断,14,现代计算机系统的基本结构,操作系统的体系结构,15,Linux体系结构,16,17,1.4 Linux内核和传统Unix内核的比较,单内核和微内核单内核:把它从整体上作为一个单独的大过程来实现,同时也运行在一个单独的地址空间上。可直接调用函数,大多unix基于单内核微内核:功能被划分为多个独立的过程,每个过程叫做一个服务器。所有服务器独立运行在各自的地址空间上。通过消息传递处理微内核通信,系统采用了进程间通信(IPC),Window
6、s NT基于微内核,18,Linux是单内核,内核运行于单独的内核地址空间上。但借鉴微内核,采用模块化设计、抢占式内核、支持内核线程及动态装载内核模块的能力,所有事情都运行在内核态,直接调用函数,无需消息传递。,19,Linux与Unix的差异:,Linux动态加载内核模块:模块动态卸除和加载部分内核代码Linux支持对称多处理(SMP)机制Linux内核支持抢占:允许在内核运行的任务优先执行的能力,unix里只有Solaris和IRIX支持抢占支持线程,但不区分线程和进程Linux提供具有设备类的面向对象的设备模型、热插拔事件及用户的设备文件系统(sysfs)忽略Unix的某些拙劣特性自由,
7、20,1.5 Linux内核版本,Linux内核分为:稳定和处于开发中的,2.6.26.1,主版本号,从版本号,修订版本号,修订版本号,稳定版本号,Kernel版本命令规则,21,从版本号为偶数时,代表内核为稳定版;为奇数时,为开发版。例:2.6.30.1,其从版本号为6,则为稳定版。2.6内核的第一个版本为2.6.0,第二个版本为2.6.1头两个数据描述了“内核系列”,例中为2.6内核系列,22,23,获取内核:http:/www.kernel.org,24,2.1 获取内核源代码,2.1.1 GIT的使用,Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管
8、理。 Git获取最新提交到Linux版本树的一个副本: $git clone git:/git.kernel.org/pub/scm/linux/kernel /git/torvalds/linux-2.6.git 说明:Git本身的源代码你既可以用 git:/ 协议来访问,也可用 http协议访问 下载代码后,可更新分支到Linux的最新分支 $git pull,25,手动安装内核源代码,代码压缩形式:GNU zip(gzip)和bzip2(首选)例:linux-x.y.z.tar.bz2解压缩:$tar xvjf linux-x.y.z.tar.bz2$tar xvzf linux-x.y
9、.z.tar.gz内核代码存储:/usr/src/linux(保持不动,不能用于开发),27,使用补丁,补丁可发布对代码的修改,也可接收其他人做的修改。增量补丁可作为版本转移的桥梁,无需下载庞大的内核源码,只需打个增量补丁$patch pl /patch-x.y.z,28,内核源码树,现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,具体参见Linux内核版本号及源代码目录树结构.pdf,29,arch:存放各种与硬件体系结构相关的代码,每种体系结构一个相应的目录,每个目录下都包括了该体系结构相关的代码,包括内存管理,启动代码,
10、浮点数仿真等等。 block:部分块设备驱动程序。 crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。 Documentation:关于内核各部分的通用解释和注释。 drivers:设备驱动程序,每个不同的驱动占用一个子目录。 fs:提供对各种文件系统的支持。 include:内核相关的头文件。以及与各体系结构相关的头文件也都放在这个目录下的各个体系结构目录中。,30,init:内核初始化代码。包括main函数也是在这个目录下实现的。 ipc:进程间通信的代码。 kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/
11、kernel目录下。 lib:各种库文件代码,通用内核函数。 mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。 net:网络相关代码,实现了各种常见的网络协议。 scripts:用于配置内核文件的脚本文件。 security:主要是一个SELinux的模块。 sound:常用音频设备的驱动程序等。 usr:用户的代码。,31,编译、配置内核的目的,为了正确、合理地设置内核编译配置选项,从而只编 译系统需要的功能的代码,一般主要有下面4个考虑:尺寸小。自己定制内核可以使代码尺寸减小,运行将 会更快。节省内存。由于内核部分代码永远占用物理内存,定制内核可以使系统拥有更多的可
12、用物理内存。减少漏洞。不需要的功能编译进入内核可能会增加被系统攻击者利用的机会。动态加载模块。根据需要动态地加载或者卸载模块,可以节省系统内存。但是,将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。,32,33,配置内核,Linux内核源代码支持二十多种体系结构的处理器,还有各种各样的驱动程序等选项。因此,在编译之前必须根据特定平台配置内核源代码。Linux内核有上千个配置选项,配置相当复杂,所以,Linux内核源代码组织了一个配置系统。 配置系统主要包含Makefile、Kconfig和配置工具。它可以生成内核配置菜单,方便内核配置。配置界面是通过工具来生成的,工具通过Makef
13、ile编译执行,选项则是通过各级目录的Kconfig文件定义。,顶层目录的Makefile是整个内核配置编译的核心文件,整体管理Linux内核的配置编译,负责组织目录树中子目录的编译管理,其定义了配置和编译的规则,还可以设置体系结构和版本号等。 Kconfig文件是Linux2.6内核引入的配置文件,是内核配置选项的源文件。内核源码中的Documentation/ kbuild/kconfig-language.txt文档有详细说明。对内核进行配置的方法有好几种,而且配置时需要对许多选项进行选择。不管用哪种方法来配置,或者选择哪些配置选项,在配置好之后,内核都会产生.config文件,这个文件
14、包含了所有设定选项的全部细节,34,.config文件示例,35,36,常用的内核配置主要有以下四种方法:, make config通过命令界面,依次要求设定每个选项,并会根据.config 配置文件设定各选项的预设值。 make oldconfig通过命令界面,自动载入.config 配置文件。当遇到先前没有设定过的选项时,才会要求你手动设定(而make config 却会要求你手动设定所有的选项)。 make menuconfig显示配置菜单的形式。同make config一样,会根据.config文件来设定预设值。在2.4.X 以及以前版本中xconfig菜单是基于TCL/TK的图形库的
15、。 make xconfig 显示X Window配置菜单。同样会根据.config文件来设定预设值,37,实例:图形化内核配置,在Linux源码的顶层目录运行make menuconfig,便会出现如下图所示的图形化配置菜单:,内核配置选项主菜单,38,内核配置选项子菜单,39,make config,40,编译内核,内核配置完成后,使用make命令进行编译$make 相对于Linux 2.4内核,Linux 2.6内核配置编译过程要简单一些,不再需要make dep; make zImage; make modules的命令。配置好内核之后,只要执行make就可以编译内核映像和模块。 内核
16、编译完成以后,将生成几个重要的文件。它们是vmlinux、vmlinuz和System.map。 (1)vmlinux:是在内核源码顶层目录生成的内核映像。 (2)vmlinuz:是可引导的、压缩的内核映像,也就是zImage。 (3)System.map:是一个特定内核的内核符号表,它包含内核全局变量和函数的地址信息。,41,安装新内核,具体过程与体系结构和启动引导工具(boot loader) 有关,例如,使用grub的X86系统上,需要把arch/i386 /boot/bzImage拷贝到/boot目录下,并且编辑etc/grub/ grub.conf文件,为新内核建立一个新的启动项。使用LILO启动的系统应当编辑/etc/lilo.conf,然后运行lilo保证随时有一个或两个可以启动的内核,以防新编译的内核出现问题。,42,2.4 内核开发的特点,1)内核编译时不能访问C库; 2)内核编程时必须使用GNU C 3)内核编程时缺乏像用户空间那样的内存保护机制 4)浮点数很难使用; 5)内核只有一个定长堆栈; 6)注意同步和并发。,43,