在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