搜索
热搜: ROHM 模拟 车载
查看: 2075|回复: 2

Linux内核模块编译

  [复制链接]

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2019-1-23 13:53:11 | 显示全部楼层 |阅读模式

Linux内核模块是一种可被动态加载和卸载的可执行程序。通过内核模块可以扩展内核功能,内核模块通常用于设备驱动、文件系统等。如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等步骤。


内核空间中不止一个程序试图访问驱动程序模块,导致一个内核块在没有被调用完毕之前又被其他程序调用,这称之炒代码的重入。因此在设计驱动模块的数据结构时要考虑数据结构在多线程环境下不被其他线程破坏,对于共享的数据应该采取加锁的方法保护。


可以把内核比喻成一个很长的火车,每个车厢就是一个内核模块,内核在运行这个火车就会一直在开动,但是我们想在火车开动的情况下增加新的车厢,这个时候就需要insmod,意思就是往这个长长的火车车厢增加一个内核模块。





下载当前版本的Linux源代码

#uname -a







用apt-cache search linux-source 命令对应的linux内核版本


用apt-get install linux-source-4.4.0 下载对应的linux内核源码


下载的源码在  /usr/src/


tar -jxv -f linux-source-4.4.0.tar.bz2 -C /data/weiqifa/


把源码解压到我的用户目录下







2、编写模块的Makefile和内核模块代码


ifneq ($(KERNELRELEASE),)  

  

obj-m :=hello.o  

  

else  

KDIR:= /lib/modules/4.4.0-62-generic/build/  

  

all:  

    make -C $(KDIR) M=$(PWD) modules   

clean:  

    rm -f *.ko *.o *.mod.o *.mod.c .symvers  

  

endif





hello.c代码



#include <linux/module.h>  

#include <linux/init.h>  

  

MODULE_LICENSE("GPL");  

MODULE_AUTHOR("DAVID");  

MODULE_DESCRIPTION("Hello world module");  

  

static int __init hello_init(void)  

{  

    printk(KERN_ERR "hello world!\n");  

    return 0;  

}  

static void __exit hello_exit(void)  

{  

    printk(KERN_EMERG "hello exit!\n");  

}  

  

module_init(hello_init);  

module_exit(hello_exit);

3、编译




编译后生成如下文件







4、执行命令







5、日志打印


         输入dmesg可以看到内核日志






回复

使用道具 举报

该用户从未签到

1153

主题

5959

帖子

0

精华

论坛元老

最后登录
2021-2-19
发表于 2019-3-22 12:26:42 | 显示全部楼层
看看了
回复

使用道具 举报

该用户从未签到

2384

主题

9837

帖子

0

精华

论坛元老

最后登录
2024-4-23
发表于 2019-3-22 14:49:29 | 显示全部楼层
Linux内核模块编译
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-5-8 11:12 , Processed in 0.103202 second(s), 13 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表