一、向内核添加新功能
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命令查看打印信息