在loongnix 上編譯內核模塊及內核

在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

 

 

 

 

 

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章