lv13 内核模块静态添加功能 5

2023-12-26 23:26:07

一、向内核添加新功能(把程序添加到内核启动)

1.1 静态加载法:

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

  1. 新功能源码与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);
    
    /*
    这是一个Linux内核模块,用于向Linux内核添加新的功能或驱动程序。
    在这个例子中,模块名为"myhello",使用了GPL授权协议。函数module_init()和module_exit()分别是在模块加载时和卸载时执行的初始化和退出函数。
    在myhello_init()函数中,打印了一些日志信息,表示模块已经成功加载运行起来了。
    在myhello_exit()函数中,打印了一条日志信息,表示模块即将被卸载。
    */
  2. 给新功能代码配置Kconfig

    #进入myhello.c的同级目录
    cd  ~/fs4412/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  ~/fs4412/linux-3.14/drivers/char
    ?
    vim Makefile
    #拷贝18行,粘贴在下一行,修改成:
    obj-$(CONFIG_MY_HELLO) ? ? += myhello.o
    
    #在CONFIG_后面添加与.c文件名同名函数名称
  4. make menuconfig 界面里将新功能对应的那项选择成<*>

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

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

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

1.2 练习

?如何实现静态加载展示?

1 在新功能源码与Linux内核源码在同一目录结构下
如:在linux-3.14/driver/char/目录下编写.c文件
2 给新功能配置Kconfig
3 因为添加了源码,所以改写makefile,编译
4 make menuconfig里选中添加得新功能
5 重新make uImage

文章来源:https://blog.csdn.net/m0_60718520/article/details/135231402
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。