linux 单独编译模块,单独编译Linux内核中的某一模块

转自:

最近阅读Linux-2.6.32的jbd模块代码,为了弄清楚jbd的执行流程,我在jbd模块的导出函数的入口处加了printk输出。然后就

需要重新编译Linux的内核代码。大家知道,完全编译Linux整个内核代码需要的时间比较长。由于jbd是一个单独的模块,那能不能将这个模块进行单独编译呢?

当然可以!方法如下:

1.首先将jbd的代码(在Linux源码/fs/jbd目录)整个拷贝出来;

2.将jbd代码中的Makefile进行修改:

原Makefile的内容如下:

#

# Makefile for the journaling routines.

#

obj-$(CONFIG_JBD) += jbd.o

jbd-objs := transaction.o commit.o recovery.o checkpoint.o revoke.o journal.o

修改后的Makefile如下:

# Makefile for jbd

TARGET = jbd

OBJECT = transaction.o commit.o recovery.o checkpoint.o revoke.o journal.o

ifneq ($(KERNELRELEASE),)

#kbuild syntax.

obj-m += $(TARGET).o

$(TARGET)-objs := $(OBJECT)

else

PWD := $(shell pwd)

KERNEL_DIR := /lib/modules/`uname -r`/build

all : modules

modules:

$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

install:

install ./$(TARGET).ko /usr/local/lib

/sbin/insmod ./$(TARGET).ko

uninstall:

rm -f /usr/local/lib/$(TARGET).ko

/sbin/rmmod $(TARGET).ko

insmod:

/sbin/insmod ./$(TARGET).ko

rmmod:

/sbin/rmmod $(TARGET).ko

clean:

rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.markers modules.order Module.symvers

endif

3.编译模块:

$ make

4.加载模块:

$sudo make insmod

5.卸载模块:

$sudo make rmmod

模块一般用来支持那些不经常使用的功能。例如,通常情况下你仅使用拨号网络,因此网络功能并不是任何时候都需要的,那么就应该使用可装入的模块来提供这个功能。仅在你进行拨号联接的时候,该模块才被装入。而在你断掉连接的时候它会被自动卸下。这样会使内核使用内存的量最小,减小系统的负荷。 当然,那些象硬盘访问这样时时刻刻都需要的功能,则必须作在内核里。如果你搭一台网络工作站或 web服务器,那么网络功能是时刻都需要的,你就应该考虑把网络功能编译内核里。另外一个方法是在启动的时候就装入网络模块。这种方法的优点是你不需要重新编译内核。而缺点是网络功能不能特别高效。 按照以上的原则,我们首先列出一张清单,看看 kernel 哪些选项是非有不可的,也就是说,这些东西是必须被编译内核的。将那些非必需的模块剔除到内核以外。 第一个是root所在的硬盘配置。 哪果您的硬盘是IDE接口,就把 ide 的选项标记下来。如果是SCSI接口,请把您的接口参数及 SCSI id 记标下来。 第二个是选择使用哪一个文件系统Linux的默认文件系统是是 ext2 ,那么就一定要把它标记下来。如果机器还其它的操作系统,如win98或windows NT,您还会可能选择FAT32或NTFS的支持,不过后面你可以通过手工加载的方式来加入新的模块支持。 第三个是选择Linux所支持的可执行文件格式。这里有两种格式可供选择: elf:这是当前Linux普遍支持的可执行文件格式,必须编译内核 。 a.out: 这是旧版的Linux的可执行文件各函数库的格式,如果你确认肯定用不到这种格式的可执行文件,那么就可以不把它编译内核。 以上这些内容,是必须要编译内核的。其它的内容凡是所有选项m提示的,都选择m,这样可以通过手工的方式添加该模块。 ** Loadable module support*Enable loadable module support (CONFIG_MODULES) [Y/n/?]Set version information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?]Kernel daemon support (e.g. autoload of modules) (CONFIG_KERNELD) [Y/n/?] 分别回答 Y,N,Y 。其 CONFIG_KERNELD 的 default 值是 N, 所以要注意选择Y。 make config 完后,仍旧是 make dep; make clean。 接下来要 make zlilo 或 make zImage。 然后 make modules ; make modules_install 。完成之后,就编译一个没有调入多余模块一个“干净的”内核映像文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值