Linux技术研究-基础篇(内核,模块)

编译内核的目的
对现有内核添加新的功能 就是向内核添加新模块
对现有系统添加新的内核
对现有内核进行升级
选择内核版本
以次版本号为偶数的为准,奇数版属于测试版或开发版 不稳定
新内核可以去 http://www.kernel.org/ 下载

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

微内核和单内核
微内核是将所有功能独立出来,内核只负责通信(消息传递),优点是灵活,缺点是消息传递过多影响性能,可自由加载卸载模块
单内核是将所有功能换成一体,内核可直接调用函数,无需消息传递.优点简单高效,缺点不好维护
,不能独立卸载与加载新的模块,WINDOWS NT与MAC OS则是典型的单内核
linux则是他们的混合物,汲取双方的优点于一身.既可直接调用函数 又可随时按需加载卸载模块

1.升级内核

安装检查 需要安装开发库和开发工具里的包
[root@stu32 ~]# rpm -qa | grep "ncurses"
ncurses-devel-5.5-24.20060715
ncurses-5.5-24.20060715


下载 linux-2.6.29.tar.gz
[root@stu32 src]# tar xvjf linux-2.6.29.tar.gz
内核帮助文档
Documentation/
介绍 devices.txt
# ll /dev/sda
brw-r----- 1 root disk 8, 0 06-04 07:45 /dev/sda
# rm -rf /dev/sda
# mknod -m 640 /dev/sda b 8 0
# man mknod
# chown :disk /dev/sda
# ll /dev/sda
brw-r----- 1 root disk 8, 0 06-04 10:10 /dev/sda
#

   cd /usr/src/linux-2.6.29
   make mrproper    # 清理代码数(会将.o和.ko删除)
   make menuconfig # 配置内核模块 会自动从/boot/config-version加载现机器的内核配置
   make      # 开始编译
   make modules_install # 安装模块 模块的位置 /lib/modules/KERNEL-VERSION/kernel
   maks install     # 安装内核及相关文件到 /boot/ 下 并修改启动菜单


2.模块
lsmod   查看系统中已加载的模块

     管理模块
rmmod   卸载模块
insmod 加载模块
加载模块要写模块的绝对路径
modinfo 查看模块的详细信息
   -l 查看所有模块
   modprobe --show-depends lp 查依赖关系
  
模块有依赖性
卸载一个模块必须先将依赖着它的模块先卸载掉 加载模块也必须先加载依赖关系
# modinfo lp | grep depends
depends:        parport
# modinfo parport_pc | grep depends
depends:        parport
#
# rmmod parport
ERROR: Module parport is in use by lp,parport_pc
# rmmod lp
# rmmod parport_pc
# rmmod parport
#
        让系统自动来完善依赖关系(只能在加载时,卸载无效,还需手动)
# lsmod | grep -e lp -e parport
# modprobe lp
# lsmod | grep -e lp -e parport
parport_pc             29157 1
lp                     15849 0
parport                37513 2 parport_pc,lp
#
# modprobe -r parport
FATAL: Module parport is in use.
modprobe 是通过 /lib/modules/2.6.18-53.el5/modules.* 来维护依赖关系的
当这些文件丢失或新添了模块时 可以手动重新产生依赖关系
depmod

3.为原内核添加新模块的方法:
安装前的检查
[root@stu32 ~]# rpm -qa | grep "ncurses\|rpm-build"
ncurses-devel-5.5-24.20060715
ncurses-5.5-24.20060715
rpm-build-4.4.2-47.el5
[root@stu32 ~]#


# rpm -ivh kernel-2.6.18-53.el5.src.rpm

# cd /usr/src/redhat/SPECS

# rpmbuild -bp --target=$(uname -m) kernel-2.6.spec

# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.i686


# uname -r
2.6.18-53.el5

# head -n 5 Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
#EXTRAVERSION = -prep
EXTRAVERSION = -53.el5

# make menuconfig

# make M=fs/ntfs/

错误1

ERROR: Kernel configuration is invalid.
         include/linux/autoconf.h or include/config/auto.conf are missing.
         Run 'make oldconfig && make prepare' on kernel src to fix it.

解决方法
# make oldconfig && make prepare

再次编译模块
# make M=fs/ntfs/

错误2
/bin/sh: scripts/mod/modpost: 没有那个文件或目录
make[1]: *** [__modpost] 错误 127
make: *** [modules] 错误 2
解决方法
# make scripts

# make M=fs/ntfs/
Building modules, stage 2.
MODPOST
CC      fs/ntfs/ntfs.mod.o
LD [M] fs/ntfs/ntfs.ko

# cp fs/ntfs/ntfs.ko /lib/modules/2.6.18-53.el5/kernel/fs/ntfs/

# depmod -a
# modprobe ntfs
# lsmod | grep ntfs
ntfs                  187284 0