这里不只是讲怎样编译、安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件。最后还利用学到的编译、安装Linux内核去修改Linux的01调度变成随机调度。如果你只是需要编译、安装内核的几条指令,那么翻到文章中后部分吧。如果有哪里写错或者写得不太清楚的请指正。谢谢你的阅读!

内核嘛,就是Linux的核心,如果你用Linux只是为了听听歌,看看电影,上上网,那么我想Linux是不太适合你的。但能打开这篇文章,那么你应该就是对Linux有兴趣了。这里我们一起编译下这个世界上IT里最完美的艺术品!----Linux内核

编译前先来看看Linux内核的源码目录结构。有助于认识Linux内核,熟悉了她,就不会再有恐惧与无助的感觉。

内核源码录目结构:

1)    Documentation    这里没有代码,有的只是一些各种各样文档,但可以给我们足够多的帮助。

2)    arch    所有与体系结构有关的源代码都在这里,还有在include/asm-*/目录里。所支持的体系结构都在arch目录下有对应的子目录,而且最少都包含3个子目录。

kernel:支持体系结构特有的如信号处理、SMP等的实现。

lib:体系结构特有的对strlen、memcpy之类的通用函数的实现。

mm:很明显啦,这个是体系结构相关的内存管理的实现。

大多数的子目录都包含boot这个子目录,在硬件平台上启动内核的所使用的部分或全部代码。

3)    drivers    这里有显卡、scsi适配器pic总线、usb总线和其他的linux支持的外围设备和总线的驱动程序。是内核中最大的一个目录。

4)    fs    文件系统。这里有VFS、各个不同文件系统的代码都在这里。

5)    include    包含了内核中大部分的头文件。

6)    ipc    进程间通信,包含了信号量、共享内存和其他形式的ipc的代码。

7)    kernel    包括了进程的调度、创建、撤销和平台相关的的另一部分的核心代码。是内核最核心的部分。

8)    init    内核初始化部分的代码。包括main.c及创建早期用户空间的代码等。

9)    lib    库代码

10)    mm    与体系结构无关的内存管理部分的代码。

11)    net    网络部分的实现代码,常见的协议如TCP/IP、IPX。

12)    scripts    这里没有代码,只有一些用来配置内核的脚本文件。当我们编译内核的时候,运行make menuconfig 之类的命令时我们就是与这个目录下的脚本在交互。

13)    block    block层的实现。

14)    security    linux安全模型的代码。

15)    crypto。    内核本身的加密API,实现了常用的加密算法和散列算法,和一些压缩、CRC校验算法。

16)    sound    声卡驱动及其他声音相关的代码。

17)    usr    用于打包的与压缩的cpio等。

各个文件如图:

到这里,当你打开linux源代码时就不会再觉得那么无助了。下面我们继续。

下面介绍几个重要文件。

1)    vmlinuz  内核引导文件

vmlinuz是可引导的压缩内核,“vm”代表“Virtual Memory”。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz不是可执行 的Linux内核(网上说是可以执行的内核,可能有误。因为是压缩的,要执行必须解压。望大神指教!),因此在启动阶段首要的工作就是自解压内核映像,它位于/boot/vmlinuz,它一般是一个软链接。zImage(vmlinuz,小内核小于512kb)和bzImage(vmlinuz,大内核大于512kb)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。

2)    vmlinux

vmlinuz 是vmlinux的压缩版。

vmlinuz结构如图:

3)    initrd.img

initrd.img,即"initrd RAM disk",是一个小的映象,包含一个最小的linux系统。通常的步骤是先启动内核,对vmlinuz内核文件解压后但在真正根文件系统启动前,initrd.img文件会被加载到内存中。内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init。如果没有initrd.img,那么内核就试图直接挂载root分区。

linux的根文件系统可以存储在很多的介质上,如SCSI、IDE、USB等,如果将这些驱动都编译进了内核,那么内核将会变得非常臃肿、庞大啊!所以linux的kernel只保留了最基本的启动代码,而把各种的硬件设备的支持以模块的形式放在了initrd.img中。这样的好处是在启动的过程中可以从initrd所挂载的根文件系统中装载所需要的模块,从而可以在kernnel不变的情况下,修改initrd的内容达到灵活地支持不同的硬件。在启动完成的最后阶段,根文件系统重新挂载到其他设备上去。

举个例子,你的硬盘是SCSI接口但你的内核又不支持这种接口,你的内核就没有办法访问硬盘,也就没法加载硬盘上的文件系统,这个怎么办呢?? initrd.img是个ram disk的映像文件。ram disk是占用一部分的内存模拟成磁盘,让我们的操作系统访问。ram disk是标准内核文件认识的设备(/dev/ram0)文件系统也是标准内核认识的文件系统。内核加载这个ram disk作为根文件系统并开始执行其中的某个文件--init(2.6以上的内核是 init文件,位于/sbin/)来加载各种模块,服务等。经过一些配置和运行后,就可以去物理磁盘加载真正的root分区了,然后又是一些配置等,最后启动成功。

所以initrd.img的作用就是将一些驱动程序和命令工具打包到img里从而简化内核,这完全符合linux的设计思想和linux的哲学思想啊!

4)    system.map,内核符号表,位于/boot/System.map 。当你编译一个新的内核的时候,内核的各个符号的地址就会变化,旧的内核符号表的信息对于新的内核来说是错误的,如果还用旧的内核符号表就会出错,所以会产生一个新的内核符号表即system.map

编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装相关推荐

  1. 连接服务器用xshell还是linux,【linux☞5】xshell 连接服务器的简单介绍

    前言 linux连接工具有很多,但所有终端工具使用的目的都是为了连接上服务器,从而方便自己在终端工具上直接使用命令来操作想要做的事情.这里我就简单介绍一下xshell这款终端工具安装过程. xshel ...

  2. 嵌入式linux 硬盘录像机,嵌入式硬盘录像机技术的简单介绍

    支持的视音频通道数多,可同时进行几路.十几路.甚至几十路同时录像:记录的时间取决于存储设备的容量,一般可达几百小时:记录图像质量不会随时间的推移而变差:功能更为丰富,不像传统的模拟录像机那么单一. 不 ...

  3. linux内核编译选项ccl,Linux下用C语言读取配置文件

    Linux下用ccl库可以直接读取配置文件.下面是ccl库的安装和使用方法简单介绍: 一.安装 cd /data0/software/ wget http://files.sbooth.org/ccl ...

  4. Analyzing the Linux boot process-分析Linux启动过程

    本文翻译自Analyzing the Linux boot process. 箴言:了解运行良好的系统是将来处理不可避免的故障的很好准备 开源软件领域中流行的最为古老笑话:"the code ...

  5. linux命令图片,使用Linux命令行查看图像的方法有哪些

    今天小编要跟大家分享的文章是关于使用Linux命令行查看图像的方法有哪些?在 Linux 中有很多 GUI 应用程序可以查看图像,但是这对经常使用命令行来工作的人可能会觉得很繁琐.今天小编要为大家介绍 ...

  6. linux的命令vim,Linux命令:vi | vim命令

    vim - vi 增强版.文本编辑器 格式:vim [options] [file ..] 说明:如果file存在,文件被打开并显示内容,如果文件不存在,当编辑后第一次存盘时创建它 [options] ...

  7. linux fg 参数,Linux的bg和fg命令简单介绍

    我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的 ...

  8. 在Ubuntu上下载、编译和安装Android 4.2 最新内核源代码(Linux Kernel)

    根据http://blog.csdn.net/luoshengyang/article/details/6564592博客内容对android4.2的编译 从源代码树下载下来的最新Android源代码 ...

  9. 修改linux编译配置文件,Porting:linux内核编译、配置、修改配置文件、添加.c文件到内核...

    一.linux内核 $:'uname -a $:'uanme -r // 查看linux内核版本,开发板上进入linux后是一样的命令. 早起常常使用的版本:linux 2.6.x 开发板上使用的版本 ...

最新文章

  1. 【vue】vue-znly
  2. 强化学习大规模应用还远吗?Youtube推荐已强势上线
  3. 更改zabbix-server的端口
  4. 电脑分屏软件_Fcpx分屏插件 41组视频分割可自定义分屏动画效果插件 可分9屏 Split Pop...
  5. ADO.NET Entity Framework 深入分析, Part 5
  6. css 首字下沉 错位,css+div错位问题的修复小结
  7. 3亿Docker容器部署的挑战及应对方案
  8. java基础面试题整理(BAT)
  9. 二、SpringMVC 注解式开发学习笔记
  10. close_wait过多服务器无响应,记一次大量CLOSE_WAIT连接导致的服务宕机
  11. android 获取控件高度_安卓开发入门教程UI控件_ProgressBar
  12. 将Fortran程序转化成大写[cwp]
  13. 负载均衡集群介绍LVS介绍LVS调度算法LVS NAT模式搭建
  14. c语言起点到目的地方法数,最短路径动态规划问题及C语言实现探讨
  15. Linux ERROR: configuration failed for package ‘rgeos’
  16. 社区垃圾分类AI盒子
  17. 【git学习】解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.
  18. 服务器隔离虚拟机,筛选Hyper-V提供的虚拟机隔离选项
  19. 支持OnVif协议的摄像头直播推流php
  20. List 集合对象比较大小

热门文章

  1. 孙鑫老师VC笔记(转)
  2. 基于JAVA个人交友网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署mp4
  3. h0043. 奇怪的汉诺塔
  4. 备战面试日记(2.4) - (JVM.GC算法)
  5. frame切换/窗口切换
  6. 通信感知一体化技术思考
  7. acer 服务器装系统,acer重装系统图文教程
  8. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
  9. 在计算机应用中用于描述算法的是,计算机应用基础习题
  10. ACPC2015 K 树的直径