在loongnix 上编译内核模块及内核
$ cd /lib/modules/`uname -r`
$ ls -l
总用量 1812
lrwxrwxrwx 1 root root 53 9月 27 12:48 build -> /usr/src/kernels/3.10.84-22.fc21.loongson.10.mips64el
drwxr-xr-x 5 root root 4096 10月 16 16:35 extra
drwxr-xr-x 9 root root 4096 10月 16 16:35 kernel
-rw-r--r-- 1 root root 519076 10月 16 16:36 modules.alias
-rw-r--r-- 1 root root 514163 10月 16 16:36 modules.alias.bin
-rw-r--r-- 1 root root 418 9月 27 12:48 modules.block
-rw-r--r-- 1 root root 6392 9月 27 12:48 modules.builtin
-rw-r--r-- 1 root root 8122 10月 16 16:36 modules.builtin.bin
-rw-r--r-- 1 root root 103936 10月 16 16:36 modules.dep
-rw-r--r-- 1 root root 157036 10月 16 16:36 modules.dep.bin
-rw-r--r-- 1 root root 236 10月 16 16:36 modules.devname
-rw-r--r-- 1 root root 51 9月 27 12:48 modules.drm
-rw-r--r-- 1 root root 37 9月 27 12:48 modules.modesetting
-rw-r--r-- 1 root root 874 9月 27 12:48 modules.networking
-rw-r--r-- 1 root root 48044 9月 27 12:48 modules.order
-rw-r--r-- 1 root root 86 10月 16 16:36 modules.softdep
-rw-r--r-- 1 root root 199535 10月 16 16:36 modules.symbols
-rw-r--r-- 1 root root 246976 10月 16 16:36 modules.symbols.bin
lrwxrwxrwx 1 root root 5 9月 27 12:48 source -> build
drwxr-xr-x 2 root root 4096 9月 27 12:47 updates
查看kernel 包名
$ rpm -qa kernel
kernel-3.10.84-22.fc21.loongson.10.mips64el
下载kernel 源码
$ yumdownloader --source kernel-3.10.84-22.fc21.loongson.10.mips64el
解压源码
$ rpm2cpio kernel-3.10.84-22.fc21.loongson.10.src.rpm | cpio -dvi
$ sudo su
# tar xf linux-3.10.84.tar.gz -C /usr/src/kernel
模块文件
Makefile:
BASEINCLUDE ?= /lib/modules/`uname -r`/build
mytest-obj := my_test.o
obj-m:= my_test.o
all:
$(MAKE) -C $(BASEINCLUDE) M=$(PWD) modules
clean:
$(MAKE) -C $(BASEINCLUDE) SUBDIRS=$(PWD) clean;
rm -f *.ko
my_test.c:
#include <linux/module.h>
#include <linux/init.h>
static int __init my_sample_init(void)
{
printk("%s entry.\n", __func__);
return 0;
}
static void __exit my_smaple_exit(void)
{
printk("%s entry.\n", __func__);
}
module_init(my_sample_init);
module_exit(my_smaple_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("water");
MODULE_DESCRIPTION("my test kernel module");
MODULE_ALIAS("mytest");
# make
error: not find .../generated/autoconf.h no such file
产生 generated/autoconf.h 文件
# cd /usr/src/kernel/3.10.0
# cp /boot/config .
# make -j4
# insmod my_test.ko
insmod: ERROR: could not insert module module_test.ko: Invalid module format
$ modinfo my_test.ko
filename: /home/loongson/rlk_test/lesson1/my_test.ko
alias: mytest
description: my test kernel module
author: water
license: GPL
rhelversion: 7.4
depends:
vermagic: 3.10.0 SMP preempt mod_unload modversions LOONGSON3 64BIT
$ cd /lib/modules/`uname -r`/kernel/drivers/char
$ modinfo lp.ko
filename: /lib/modules/3.10.84-22.fc21.loongson.10.mips64el/kernel/drivers/char/lp.ko
license: GPL
alias: char-major-6-*
rhelversion: 7.4
depends: parport
intree: Y
vermagic: 3.10.84-22.fc21.loongson.10.mips64el SMP preempt mod_unload modversions LOONGSON3 64BIT
parm: parport:array of charp
parm: reset:bool
对比发现vermagic 值不同。
修改内核version
# uname -r
3.10.84-22.fc21.loongson.10.mips64el
# cd /usr/src/kernel/3.10.0
# yum install ncurses-devel
# make menuconfig
General setup ---> Local version - append to kernel release
# make -j4
重新编译模块
$ modinfo my_test.ko
filename: /home/loongson/rlk_test/lesson1/my_test.ko
alias: mytest
description: my test kernel module
author: water
license: GPL
rhelversion: 7.4
depends:
vermagic: 3.10.0.fc21.loongson.10.mips64el SMP preempt mod_unload modversions LOONGSON3 64BIT
$ insmod my_test.ko
$ dmesg | tail
[ 11.398437] IPv6: ADDRCONF(NETDEV_UP): virbr0: link is not ready
[ 11.488281] virbr0: port 1(virbr0-nic) entered disabled state
[ 21.429687] EMC1412: No valid reference.
[ 56.042968] device virbr0-nic left promiscuous mode
[ 56.042968] virbr0: port 1(virbr0-nic) entered disabled state
[ 56.078125] IPv6: ADDRCONF(NETDEV_UP): virbr0-nic: link is not ready
[ 1971.406250] EXT4-fs (sda6): mounted filesystem with ordered data mode. Opts: (null)
[ 4502.976562] my_test: loading out-of-tree module taints kernel.
[ 4502.976562] my_sample_init entry.
[ 4515.906250] my_smaple_exit entry.
安装使用自编译的内核
# cd /usr/src/kernel/3.10.0
# make install //这个只是为验证自己编译安装内核用的
install: 无法获取"vmlinuz" 的文件状态(stat): 没有那个文件或目录
arch/mips/Makefile:332: recipe for target 'install' failed
make: *** [install] Error 1
原因是没有生成vmlinuz, 只生成了vmlinux。修改压缩算法为 gzip, 之后重新编译。
# make menuconfig
Gernral setup ---> Kernel compression mode
安装内核模块文件, 会安装在 /lib/modules 下
# make modules_install
制作ram disk
# mkinitrd initr.3.10.0.img 3.10.0
制作 initramfs(推荐用这个)
# cd /boot
# dracut initramfs-3.10.0.img 3.10.0
现在的发行版基本上都是用initramfs 代替 ram disk。
修改grub.cfg 文件,添加新的启动项(参照旧的复制,改名即可)。
参考链接:
https://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/
https://mirrors.edge.kernel.org/pub/linux/utils/boot/dracut/dracut.html