Linux内核 编辑 请登陆,再编辑

简介

Linux内核(英语:Linux kernel),是Linux操作系统的内核,以C语言写成,符合POSIX标准,以GNU通用公共许可证发布。Linux最早是由芬兰黑客林纳斯·托瓦兹为尝试在英特尔x86架构上提供自由免费的类Unix系统而开发的。该计划开始于1991年,林纳斯·托瓦兹当时在Usenet新闻组comp.os.minix登载帖子,这份著名的帖子标示着Linux计划的正式开始。

在计划的早期有一些Minix黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。

技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。

Linux内核是在GNU通用公共许可证第2版之下发布的(加上一些非自由固件、blob与各种非自由许可证)。

贡献者遍布世界各地,日常开发在Linux内核邮件列表。

源代码

Linux内核源代码位于/usr/src/linux目录下。

 /include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。

/init 子目录包含了内核的初始化代码,这是内核工作的开始的起点。

/arch子目录包含了所有硬件结构特定的内核代码。如:i386,alpha

/drivers子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。

/fs子目录包含了所有的文件系统的代码。如:ext2,vfat等。

/net子目录包含了内核的连网代码。

/mm子目录包含了所有内存管理代码。

/ipc子目录包含了进程间通信代码。

/kernel子目录包含了主内核代码。

内核程序

编译完成新内核后,会生成几个文件,这些文件是内核启动所需要的,这里简单介绍一下。

vmlinux,编译出来的最原始的内核文件,没有压缩,位于源码根目录下。该内核文件不能用来启动系统。

vmlinuz,这个就是我们要引导的内核,它一般是一个链接文件,位于根目录下。真正的文件位于/boot文件夹下。z表示压缩的内核,vm表示virtual memory的意思。linux支持虚拟内存,可利用硬盘空间作为虚拟内存使用。在编译内核时,通过make zImage或make bzImage生成zImage或bzImage原始压缩内核文件,这些内核文件位于/usr/src/linux-2.6.23.9/arch/i386/boot#目录下;接着我们会把它拷贝到/boot目录下并改名为vmlinuz;最后在根目录下创建一个到该文件的同名链接文件。bzImage表示big zImage的意思,zImage是老式的内核文件格式,在新的内核版本中已不使用了,现在生成的内核是bzImage格式的内核文件。这两种内核文件的区别是,zImage解压缩内核到低端内存中(第一个640K),bzImage解压缩内核到高端内存中(1M以上) 这两个内核文件都是使用gzip软件压缩的,但文件头部内嵌有gzip解压缩代码,能在启动时自动解压缩内核。使用gzip是不能正常解压内核的。

在源码根目录生成的vmlinux是一个没有压缩的内核文件。

如果在/boot目录下存在多个版本的内核文件,则可用vmlinuz-xxxx的方式命名。但根目录下的vmlinuz链接文件名一般不变。

initrd-x.x.x.img,initrd是"initial ramdisk"的简写。作用是在内核引导前加载相应的硬件模块,为内核引导做准备。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd可使用mkinitrd工具创建。

System.map,内核符号映射文件,位于/boot目录下,与内核名要对应。内核编译完成后,在源码根目录下就会生成一个System.map文件。我们要把它拷贝到/boot目录下并改成相关的名称。如内核名为vmlinuz-2.6.23.9,则这个内核符号映射文件就应该命名为System.map-2.6.23.9。

运行空间

Linux系统由用户空间和内核空间两部分组成。

内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。 用户空间分为:

User Applications(用户应用程序)

GNU C Library (glibc即c运行库)

内核空间分为:

System Call Interface(系统调用接口)

Kernel(内核)

Architecture Dependent Kernel Code(架构体系内核代码)

子系统

Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。

进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

内存管理(MM):允许多个进程安全的共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

虚拟文件系统(VFS):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

网络接口(NET):提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

进程间通讯(IPC):支持进程间各种通信机制。处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。

安装

本页面主要介绍Linux内核的安装与配置.Linux内核的安装主要有以下两种方式:

-安装已经编译好的通用内核DEB包(包括内核核心文件-linux-image,内核头文件-linux-headers,内核通用头文件-linux-common三个文件)

-下载源代码,按照个人需求编译安装.

内核相关文件解释:

-linux-image-内核核心文件:Linux内核核心文件。

-linux-headers- 内核头文件: Linux 的内核开发头文件,包含内核函数和接口等的声明和定义。

注意:升级内核,请务必卸载闭源显卡驱动后再操作,否则新内核将无法使用!!

安装与配置

安装内核DEB包

由于此方法是安装源内已经编译好的通用内核DEB包(内核核心文件和内核头文件),因此次安装方式不存在配置方法,以下以安装Linux内核4.4.0-1版本为例。

32位用户,终端执行:

sudo apt-get install linux-image-4.4.0-1-686 linux-headers-4.4.0-1-686

64位用户,终端执行:

sudo apt-get install linux-image-4.4.0-1-amd64 linux-headers-4.4.0-1-amd64

注释:此方法能快速的安装自己需要版本的内核,而且内核较为稳定,缺点是内核不够精简,效率不够高,此方法适合Linux普通用户.如果你是Linux进阶用户,可以尝试下面的编译安装。

编译安装

针对本机器,配置编译的内核能不同程度的提高Linux系统的性能和稳定性,而且对学习Linux有一定的帮助,因此编译内核是Linux爱好者的基本技能~

下载内核源代码

自行下载Linux内核源代码,点此进入Linux内核官网

安装编译环境

编译前需要安装make ,gcc, make-kpkg,运行xconfig等和编译内核相关的工具。终端执行:

 sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot

解压源代码

注意:很多教程上说应该解压到 /usr/src, 但是实际上解压到任何目录上都可以。/usr/src下面需要root权限反而容易出问题。

命令操作,终端执行:

tar jfx linuxxxx.tar.bz2 -C ~/linus ##自行替换linuxxxx.tar.bz2为你下载内核的文件名字.~/linus表示解压到家目录下的linus文件夹
cd ~/linus ##进入~/linus目录

图形操作,解压Linux内核源代码到/home下的任何一目录(为了方便操作),在解压Linux内核源代码后的路径右键打开终端,进入该目录

打内核补丁

下载好内核补丁(.patch文件),同样也可以放在自己的根目录下。然后终端执行:

patch -p1 < ~/src/xxx.patch (xxx.patch为内核补丁文件)

注意:给内核打补丁不是必须的,一般选择跳过此步骤! 打补丁的作用是升级内核源代码.例如3.5版本的内核下一个版本是3.6.可通过适合3.5的内核补丁将代码更新成3.6

准备工作

首先,清理以前编译时留下的临时文件,如果需要终端执行:

 make mrproper

注意:如果是刚刚解压的内核压缩包,请忽略此步骤!

配置内核

配置内核一般分手工配置,载入当前内核配置(载入内核模块和载入当前内核配置)

新手推荐使用载入当前内核配置

载入内核模块(推荐)

从linux-2.6.32开始可以使用make localmodconfig自动精简内核, 菜鸟也能轻松精简内核到十几MB.

注意: 该方法会自动去掉一些从开机到当前没用使用的模块(主要是驱动模块), 所以你可以使用一下你的摄像头, 挂载一下iso文件.....以保证需要的模块不会被精简掉, 否则使用新内核时会发现不能挂载iso文件, 不能使用某些外设等等. 终端执行:

make localmodconfig  ##载入当前模块配置内核

然后出现简单的内核参数选择,.可以长按回车键选择默认选项节省时间。

终端执行:

make menuconfig ##检查一下是否有自己需要的模块没有选上,初学者可以忽略这个步骤

卸载内核

如果需要卸载指定的内核,请终端执行:

sudo apt-get --purge  remove linux-image-    ##双击tab键补全,卸载有问题的内核文件
sudo apt-get --purge  remove linux-headers-  ##双击tab键补全,卸载有问题的内核头文件

相关链接

Linux内核介绍

百度百科:内核模块

Ubuntu中文论坛:ubuntu环境下编译内核详解