内核模块添加功能及使用(静态、动态)

一、向内核添加新功能

1.1 静态加载法:

即新功能源码与内核其它代码一起编译进uImage文件内

  1. 新功能源码与Linux内核源码在同一目录结构下

    在linux-3.14/driver/char/目录下编写myhello.c,文件内容如下:

    #include 
    #include 
    
    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);
    
  2. 给新功能代码配置Kconfig

    #进入myhello.c的同级目录
    cd  ~/Linux_4412/kernel/linux-3.14/drivers/char
    
    vim Kconfig
    #39行处添加如下内容:
    config MY_HELLO
    	tristate "This is a hello test"
    	help
    		This is a test for kernel new function
    
  3. 给新功能代码改写Makefile

    #进入myhello.c的同级目录
    cd  ~/Linux_4412/kernel/linux-3.14/drivers/char
    
    vim Makefile
    #拷贝18行,粘贴在下一行,修改成:
    obj-$(CONFIG_MY_HELLO)     += myhello.o
    
  4. make menuconfig 界面里将新功能对应的那项选择成<*>

    cd  ~/Linux_4412/kernel/linux-3.14/linux-3.14
    make menuconfig
    #make menuconfig如果出错,一般是两个原因:
    #1. libncurses5-dev没安装
    #2. 命令行界面太小(太矮或太窄或字体太大了)
    
    

内核模块添加功能及使用(静态、动态)_第1张图片

内核模块添加功能及使用(静态、动态)_第2张图片

内核模块添加功能及使用(静态、动态)_第3张图片

内核模块添加功能及使用(静态、动态)_第4张图片

  1. make uImage

  2. cp arch/arm/boot/uImage /tftpboot

  3. 启动开发板观察串口终端中的打印信息

    内核模块添加功能及使用(静态、动态)_第5张图片

1.2 动态加载法:

即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko

a、新功能源码与Linux内核源码在同一目录结构下时

  1. 给新功能代码配置Kconfig

  2. 给新功能代码改写Makefile

  3. make menuconfig 界面里将新功能对应的那项选择成

  4. make uImage

  5. cp arch/arm/boot/uImage /tftpboot

  6. make modules

    make modules会在新功能源码的同级目录下生成相应的同名.ko文件(生成的ko文件只适用于开发板linux)

    注意此命令执行前,开发板的内核源码已被编译

b、新功能源码与Linux内核源码不在同一目录结构下时

  1. cd ~/Linux_4412/kernel/linux-3.14
  2. mkdir mydrivercode
  3. cd mydrivercode
  4. cp …/linux-3.14/drivers/char/myhello.c .
  5. vim Makefile
  6. make (生成的ko文件适用于主机ubuntu linux)
  7. make ARCH=arm (生成的ko文件适用于开发板linux,注意此命令执行前,开发板的内核源码已被编译)
#file命令可以查看指定ko文件适用于哪种平台,用法:
file  ko文件
#结果带x86字样的适用于主机ubuntu linux,带arm字样的适用于开发板linux

Makefile文件模板

ifeq ($(KERNELRELEASE),)

ifeq ($(ARCH),arm)
KERNELDIR ?= /home/linux/fs4412/linux-3.14
ROOTFS ?= /opt/4412/rootfs
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_install

clean:
	rm -rf  *.o  *.ko  .*.cmd  *.mod.*  modules.order  Module.symvers   .tmp_versions

else
obj-m += myhello.o


endif


二、使用 .ko 文件

c、主机ubuntu下使用ko文件

sudo insmod ./???.ko  #此处为内核模块文件名,将内核模块插入正在执行的内核中运行 ----- 相当于安装插件
lsmod #查看已被插入的内核模块有哪些,显示的是插入内核后的模块名
lsmod | grep myhello   #可以单独查看已插入的内核模块(myhello)
sudo rmmod ??? #,此处为插入内核后的模块名,此时将已被插入的内核模块从内核中移除 ----- 相当于卸载插件

sudo dmesg -C  #清除内核已打印的信息
dmesg #查看内核的打印信息

d、开发板Linux下使用ko文件

#先将生成的ko文件拷贝到/opt/4412/rootfs目录下:
cp ????/???.ko  /opt/4412/rootfs

#在串口终端界面开发板Linux命令行下执行
insmod ./???.ko  #将内核模块插入正在执行的内核中运行 ----- 相当于安装插件
lsmod #查看已被插入的内核模块有哪些
rmmod ??? #将已被插入的内核模块从内核中移除 ----- 相当于卸载插件

内核随时打印信息,我们可以在串口终端界面随时看到打印信息,不需要dmesg命令查看打印信息

你可能感兴趣的:(驱动开发)