当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]Linux内核是整体性结构,各个子系统紧密联系,上接用户控件,下接硬件,作为一个大程序在内核控件运行。

如果将所有的设备驱动和内核功能都集成在内核中,则内核会不断的庞大,对我们的内核裁剪也会带来更大的挑战,为了解决这个问题,Linux内核引入内核模块机制,通过动态加载内核模块,从而实现在运行过程中扩展内核的功能。

内核模块是什么?

1 内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。

2 内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。

3 如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。这还意味着一个臃肿的内核。

模块机制的优点:

1 减小内核映像尺寸,增加系统灵活性;

2 节省开发时间;修改内核,不必重新编译整个内核。

3 模块的目标代码一旦被链入内核,作用和静态链接的内核目标代码完全等价。

模块机制的缺点:

1 对系统性能有一定损失;

2 使用不当时会导致系统崩溃;

接下来通过介绍一下内核模块的实现:

首先先附上模块的代码(hello_world.c)

1 #include

2 #include

3 #include

4

5 static int hello_init(void)

6 {

7 printk("hello world module! ");

8 return 0;

9 }

10

11 static void hello_exit(void)

12 {

13 printk("good bye module! ");

14 }

15

16 module_init(hello_init);

17 module_exit(hello_exit);

18

19 MODULE_LICENSE("GPL");

内核模块至少包含两个函数:

入口函数->初始化函数(xxx_init()):模块加载时,被调用

出口函数->卸载函数(xxx_exit()):模块卸载时,被调用

模块的入口函数名和出口函数名可以任意命名,通过宏module_init()申明入口函数,通过宏module_exit()申明出口函数。模块需要包含头文件:#include

内核模块证书:2.4内核后,引入识别代码是否在GPL许可下发布的机制 。在使用非公开的源代码产品时会得到警告。通过宏MODULE_LICENSE(“GPL”),设置模块遵守GPL证书,取消警告信息。

内核模块的构建:

管理模块源码方法: ① 模块源码加入到内核源码树中。② 模块源码饭仔内核源码树之外。

注:本文介绍的是放在内核源码树外编译。

接下来是Makefile的实现:

首先附上Makefile的源码

1 KERNEL_DIR = /home/FAN/linux-kernel

2

3 all:

4 make -C $(KERNEL_DIR) M=`pwd` modules

5 clean:

6 make -C $(KERNEL_DIR) M=`pwd` modules clean

7 rm -rf modules.order Module.symvers

8

9 obj-m += hello_world.o

其中:

1、KERNEL_DIR:参数,赋值内核的位置,例如我的内核源码的路径:/home/fan/linux-kernrl

2、当终端执行make时,会运行make -C $(KERNEL_DIR) M=`pwd` modules,其中M=`pwd`指向是模块所在的路径。

3、当终端执行make clean时,会运行下面两条命令,将编译生成的文件删除

make -C $(KERNEL_DIR) M=`pwd` modules clean

rm -rf modules.order Module.symvers

4、obj-m += hello_world.o:其中 –m 表示将hello_world.c编译成模块

–y 表示将hello_world.c编译进内核镜像中

编译生成文件:

在终端运行make,则会生成hello_world.ko文件.

 

 

将hello_world.ko发送到板子上,然后在板子上运行insmod hello_world.ko, 会调用hello_init()函数运行rmmod hello_world.ko,会调用hello_exit()函数

下图为运行结果:

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

双系统将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对双系统的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 双系统 Windows Linux

安装Linux操作系统并不复杂,下面是一个大致的步骤指南,以帮助您完成安装。1. 下载Linux发行版:首先,您需要从Linux发行版官方网站下载最新的ISO镜像文件。

关键字: Linux 操作系统 ISO镜像

计算机是由一堆硬件组成的,为了有限的控制这些硬件资源,于是就有了操作系统的产生,操作系统是软件子系统的一部分,是硬件基础上的第一层软件。

关键字: Linux 操作系统 计算机

Linux操作系统是一套免费使用和自由传播的类Unix操作系统,通常被称为GNU/Linux。它是由林纳斯·托瓦兹在1991年首次发布的,并基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Lin...

关键字: Linux 操作系统

所谓进程间通信就是在不同进程之间传播或交换信息,它是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息;还可以让一个程序能够在同一时间里处理许多用户的需求。

关键字: Linux 进程通信 编程接口

串口通信作为一种最传统的通信方式,在工业自动化、通讯、控制等领域得到广泛使用。

关键字: Linux 串口通信 通讯

2023年11月16日: MikroElektronika(MIKROE) ,作为一家通过提供基于成熟标准的创新式硬软件产品来大幅缩短开发时间的嵌入式解决方案公司,今天宣布推出一款基于单线设备的软硬件开源解决方案Cli...

关键字: 嵌入式 Linux 操作系统

Linux是一种免费使用和自由传播的类Unix操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布。它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CP...

关键字: Linux 操作系统

本文中,小编将对嵌入式予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 嵌入式 Linux

在这篇文章中,小编将为大家带来嵌入式 Linux的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 Linux
关闭
关闭