Ubuntu下编译linux内核

1.概念解释

      vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令make bzImage创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。

vmlinux  编译出来的最原始的内核文件,未压缩。

zImage   是vmlinux经过gzip压缩后的文件。

bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。

uImage   U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。

vmlinuz  是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。

initrd   是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

2.编译选项

在内核源代码目录下执行以下步骤:

1."make mrproper", 清理源代码目录, 对于刚下载的内核, 可省略该步骤

2."make menuconfig", 直接保存默认配置即可(一般默认配置就是发行版的默认配置), 也可根据需要修改相关配置.

3."make dep", 检查模块间的依赖关系

4."make bzImage", 编译内核

5."make modules", 编译模块

6."sudo make modules_install", 安装模块 //将编译好的内核模块从内核源代码目录copy到/lib/modules下,可以查看Makefile文件看其究竟做了什么事情

7."sudo make install", 安装内核

8."sudo mkinitramfs 2.6.32.56+drm33.22 -o /boot/initrd.img-2.6.32.56+drm33.22", 安装initramfs; "2.6.32.56+drm33.22"为内核版本号

9.修改grub启动设置, 在ubuntu上, 如无特殊需求, 执行"sudo update-grub"即可; 也可手动修改/boot/grub/menu.lst文件或/boot/grub/grub.cfg文件.

3.具体编译与启动步骤

①去www.kernel.org 下载源码并解压,我下载的是3.12.68版本,最近更新日期是2016.11.29,能满足需求。我是通过共享文件夹的方式让Ubuntu虚拟机与win7共享源码,这样既可以直接在虚拟机中编译,又可以在win7上用sourceinsight阅读与修改源码。共享文件夹默认挂在在/mnt/hgfs/xxx下。

②如果已经安装了必须的库(见我另一篇博文点击打开链接),则make menuconfig可以正常看到配置界面。为了节约时间,将当前正在使用的Linux的配置文件拷贝到源码目录下,并改名为.config。

cp /boot/config-3.11.0-15-generic ./

        mv config-3.11.0-15-generic .config


有了.config文件之后,执行make menuconfig,然后Load目录下的.config文件,如果想要自己定制一些模块,则可以进行修改,修改选项有Y 、N 和M,可以只把Linux内核启动必需的模块编译到内核中,其它的可以选择M或N。其中:

   y: 模块驱动编译到内核中,启动时自动加载

   m:模块会被编译,但是不会被编译到内核中,只是生成.o文件,我们可以收集这些.o文件做到Linux的文件系统中,然后用insmod实现动态加载。

(3)make -j4 进行编译

        make命令默认的执行的是:make bzlmage和make modules

    模块的编译

   模块一般用来支持那些不经常使用的功能。例如,通常情况下你仅使用拨号网络,因此网络功能并不是任何时候都需要的,那么就应该使用可装入的模块来提供 这个功能。仅在你进行拨号联接的时候,该模块才被装入。而在你断掉连接的时候它会被自动卸下。这样会使内核使用内存的量最小,减小系统的负荷。 
  当然,那些象硬盘访问这样时时刻刻都需要的功能,则必须作在内核里。如果你搭一台网络工作站或web服务器,那么网络功能是时刻都需要的,你就应该考 虑把网络功能编译到内核里。另外一个方法是在启动的时候就装入网络模块。这种方法的优点是你不需要重新编译内核。而缺点是网络功能不能特别高效。 

 如果要以手工的方式加载模块, 建议最好使用 modprobe, 因为它可以解决模块之间的依赖性问题。

 关于精简内核可以查看menuconfig配置解析

(4)安装

       make modules_install   安装模块,会在/lib/modules下生成3.12.68的文件夹,里面存放着新内核的所有可加载模块,这一步不可缺少,否则后面的make install会有问题。

     make install   安装内核,复制内核目录内的.config,vmlinuz,initrd.img,System.map文件到系统/boot目录、更新grub。


     重启系统即发现grub启动项中有了刚刚编译生成的linux系统了。需要注意Linux发行版与内核的关系,我们在上面将不同的Linux内核都安装到了/boot下,但是他们使用的是同一套发行版即Ubuntu12.04LTS,内核是系统核,发行版是每个社团增加了外围资源(比如用户界面,系统安装,程序更新),所以发行版和内核是可以任意搭配的,但发行版采取的各种用户应用方式可能不同,其实本质是一样的,就是内核定制+驱动定制+应用定制,版本号只是用来标识而已。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值