一、向內核添加新功能
1.1 靜態加載法:
即新功能源碼與內核其它代碼一起編譯進uImage文件內
新功能源碼與Linux內核源碼在同一目錄結構下在linux-3.14/driver/char/目錄下編寫myhello.c,文件內容如下:#include <linux/module.h>
#include <linux/kernel.h>int __init myhello_init(void)
{printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");printk("myhello is running\n");printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");printk("#####################################################\n");return 0;
}void __exit myhello_exit(void)
{printk("myhello will exit\n");
}
MODULE_LICENSE("GPL");
module_init(myhello_init);
module_exit(myhello_exit);給新功能代碼配置Kconfig#進入myhello.c的同級目錄
cd ~/fs4412/linux-3.14/drivers/charvim Kconfig
#39行處添加如下內容:
config MY_HELLOtristate "This is a hello test"helpThis is a test for kernel new function給新功能代碼改寫Makefile#進入myhello.c的同級目錄
cd ~/fs4412/linux-3.14/drivers/charvim Makefile
#拷貝18行,粘貼在下一行,修改成:
obj-$(CONFIG_MY_HELLO) += myhello.omake menuconfig 界面里將新功能對應的那項選擇成<*>cd ~/fs4412/linux-3.14
make menuconfig
#make menuconfig如果出錯,一般是兩個原因:
#1. libncurses5-dev沒安裝
#2. 命令行界面太小(太矮或太窄或字體太大了)menuconfig01menuconfig02menuconfig03menuconfig04make uImagecp arch/arm/boot/uImage /tftpboot啟動開發板觀察串口終端中的打印信息myhello靜態
1.2 動態加載法:
即新功能源碼與內核其它源碼不一起編譯,而是獨立編譯成內核的插件(被稱為內核模塊)文件.ko
a、新功能源碼與Linux內核源碼在同一目錄結構下時
給新功能代碼配置Kconfig給新功能代碼改寫Makefilemake menuconfig 界面里將新功能對應的那項選擇成<M>make uImagecp arch/arm/boot/uImage /tftpbootmake modulesmake modules會在新功能源碼的同級目錄下生成相應的同名.ko文件(生成的ko文件只適用于開發板linux)注意此命令執行前,開發板的內核源碼已被編譯
b、新功能源碼與Linux內核源碼不在同一目錄結構下時
cd ~/fs4412
mkdir mydrivercode
cd mydrivercode
cp ../linux-3.14/drivers/char/myhello.c .
vim Makefile
make (生成的ko文件適用于主機ubuntu linux)
make ARCH=arm (生成的ko文件適用于開發板linux,注意此命令執行前,開發板的內核源碼已被編譯)
#file命令可以查看指定ko文件適用于哪種平臺,用法:
file ko文件
#結果帶x86字樣的適用于主機ubuntu linux,帶arm字樣的適用于開發板linux
c、主機ubuntu下使用ko文件
sudo insmod ./???.ko #此處為內核模塊文件名,將內核模塊插入正在執行的內核中運行 ----- 相當于安裝插件
lsmod #查看已被插入的內核模塊有哪些,顯示的是插入內核后的模塊名
sudo rmmod ??? #,此處為插入內核后的模塊名,此時將已被插入的內核模塊從內核中移除 ----- 相當于卸載插件
sudo dmesg -C #清除內核已打印的信息
dmesg #查看內核的打印信息
d、開發板Linux下使用ko文件
#先將生成的ko文件拷貝到/opt/4412/rootfs目錄下:
cp ???/???.ko /opt/4412/rootfs
#在串口終端界面開發板Linux命令行下執行
insmod ./???.ko #將內核模塊插入正在執行的內核中運行 ----- 相當于安裝插件
lsmod #查看已被插入的內核模塊有哪些
rmmod ??? #將已被插入的內核模塊從內核中移除 ----- 相當于卸載插件
內核隨時打印信息,我們可以在串口終端界面隨時看到打印信息,不需要dmesg命令查看打印信息