日期:2014-05-16  浏览次数:20722 次

Linux学习记录--内核|内核模块编译

内核|内核模块编译


(对于内核的知识觉得了解不够,等学习完LFS再来详细整理下这方面的知识)

 

内核:系统上面的一个文件,这个文件包含了驱动主机各项硬件的检测程序和驱动模块。

计算机真正工作的是硬件,内核是用来控制这些硬件工作的(主要通过硬件驱动),如果我们需要硬件来完成某项工作时需要内核的帮助才能完成

内核模块:编译成模块的驱动程序。既然内核中已经包括了驱动程序,那么为什么需要驱动模块呢?因为硬件发展很快,如果一有新的硬件出现,就需要重新编译内核就会很麻烦,因此将部分驱动编译成内核模块,在内核需要的时候加载,这样就既可以保证新硬件的使用,也可以保证内核不会一出现新硬件就重新编译

 

对于硬件驱动程序存在以下两种处理方式

1.      编译到内核

2.      编译成内核模块,内核需要时候进行加载

对于内核来说越简单越好,一些不常用的驱动可以独立成内核模块

 

内核的编译


1. 解压缩内核文件

[root@localhost shared]# tar -jxvf linux-3.12.2.tar.bz2-C /usr/src/kernels/

 

2. 打开内核配置菜单,开始配置内核

[root@localhost linux-3.12.2]# make menuconfig


配置项主要分为3中选择类型

<>:不参加编译

<*>参加编译

<M>以内核模块形式参加编译



3.      配置完毕后,会生成一个.config文件保存刚才的配置信息

[root@localhost linux-3.12.2]# ll -a
-rw-r--r--   1 root root 107133 04-03 15:08 .config

4.      清理上一次缓冲后开始编译内核

[root@localhost linux-3.12.2]# make clean
[root@localhost linux-3.12.2]# make bzImage
Setup is 15704 bytes (padded to 15872 bytes).
System is 2890 kB
CRC 4dc9f3fc
Kernel: arch/x86/boot/bzImage is ready  (#1)
[root@localhost linux-3.12.2]# ll  ./arch/x86/boot/bzImage 
-rw-r--r-- 1 root root 2974816 04-03 16:15 ./arch/x86/boot/bzImage
5. 编译在第2步选择的内核模块
[root@localhost linux-3.12.2]# make modules
[root@localhost ~]# ll /lib/modules/
drwxr-xr-x 3 root root 4096 04-03 12:57 2.6.30.3
=>编译完成内核模块但未安装,所以在/lib/modules/下并未产生任何内核模块
6. 安装内核模块,在/lib/modules/会产生对应版本的内核模块库
[root@localhost ~]# make modules_install
[root@localhost linux-3.12.2]# ll /lib/modules/
drwxr-xr-x 3 root root 4096 04-03 16:54 3.12.2
=>到处为止内核与内核模块已经编译安装完毕
7. 利用GRUB做一个多重引导,新的引导加载刚编好的内核
[root@localhost ~]# 
cp /usr/src/kernels/linux-3.12.2/arch/x86/boot/bzImage /boot/vmlinuz-3.12.2
8. 创建虚拟文件系统
[root@localhost ~]# mkinitrd -v /boot/initrd-3.12.2.img 3.12.2
[root@localhost ~]# ll /boot/initrd-3.12.2.img /boot/vmlinuz-3.12.2 
-rw------- 1 root root 2752740 04-04 08:53 /boot/initrd-3.12.2.img
-rw-r--r-- 1 root root 2974816 04-04 08:52 /boot/vmlinuz-3.12.2

9.      将内核配置信息保存以便下回使用