嵌入式Linux驱动笔记-基本知识一

原创 2013年12月04日 22:14:50

一、驱动是硬件操作+内核编程(设备驱动)

1.字符设备驱动

2.访问控制(互斥)阻塞、唤醒

3.轮询异步通知,中断处理延时、内存分配、设备模型。

4.简单的字符设备驱动编写——基于子系统的驱动(I2C/SPI)

5.块设备驱动/网络设备驱动框架


二、说明:

内核模块(module):内核运行时可动态添加/删除的代码


内核的配置:< >为不编译;< * >为静态方式编译进内核(如:*.c --> *.o --> zImage);< M >为动态编译 (如:*.c --> *.o --> *.ko)


内核编译命令: make zImage 直接编译 和 make module模块动态方式编译.


以模块方式动态编译的优点

1.没有编译进内核 ,这样可以使内核更加高效的运行 

2.采用模块方式编译方便、灵活 

3.模块不编译进内核不必遵守GPL协议所以保护知识产权。


模块和一般的c程序比较:

1.每个c程序都有一个mian()函数入口点;模块也有入口点 ,它的入口在模块加载函数开始 init_module(),这是调用内核的函数;

2.一般的C应用程序结束后系统会自动回收资源,但模块要自己申请资源回收,不然会一直运行运行直到系统重新运行。


模块的分类:驱动模块、文件系统模块、网络模块、个协议模块。


三、编写模块的三要素

1.模块的声明MODULE_LICENSE("GPL"),内核若不声明此语句许可会导致整个模块的函数不能调用。

2.模块的加载函数(加载模块时执行)

内核API :int init_module(void);作用是申请资源。

3.模块卸载函数

内核API:void cleanup_module(void),其作用是释放资源。

模块编写所需头文件:#include <linux/module.h>

此头文件是放在内核源码的头文件中。


四、模块的相关命令

1.lsmod,用来查看系统已加载的模块信息。

2.insmod + xxx.ko,用于加载模块。

3.dmesg,查看内核打印的信息,可加 选项 “-c”,此选项只有管理员才能执行。

4.rmmod + xxx 或 xxx.ko,用于模块的卸载。

5.make clean,清楚中间编译生成的文件。


五、模块的编译条件

1.需要一个经过配置和编译的内核(源码)

2.模块编译所用内核版本和加载内核版本必须一致


六、模块编译

1.内部模块(internal_module)

2外部模块(external_modele)

注:源码考到内核中编译时叫内部模块,否则叫外部模块。


3.内部模块的编译: a.模块源码拷贝到内核源码相关目录下 

b.修改kconfig(修改添加配置选项)

c.配置选项 d.修改Makefile  

e.编译所以模块,命令“make modules”


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux驱动之:模块基本知识

linux中的模块的写法及使用

嵌入式Linux驱动学习笔记(六)------浅析input输入子系统框架

你好!这里是风筝的博客, 欢迎和我一起多多交流。 基于设备驱动分层的思想,其实理解了platform总线,输入子系统也是可以很好理解的。 以kernel  4.8.17为例: input...

嵌入式Linux驱动学习笔记(七)------浅析tty与uart框架

你好!这里是风筝的博客, 欢迎和我一起多多交流。 看一个驱动模型,先从注册函数看起。 先看下设备文件: 在init.c(arch/arm/plat-samsung)函数,有: stat...

嵌入式Linux驱动学习笔记(四)------USB键盘驱动程序

你好!这里是风筝的博客,欢迎和我一起交流。 如果本篇博客对您有帮助,或许可以在下方评论给我留个言。 Kernel版本为4.4.17. 编写USB键盘的驱动,可以参考Kernel里的usbkb...

嵌入式Linux驱动学习笔记(一)------第一个LED驱动程序

你好!这里是风筝的博客,欢迎和我一起交流。 如果本篇博客对您有帮助,或许可以在下方评论给我留个言。 //应用程序: #include #include #include #inclu...

嵌入式Linux驱动学习笔记(三)------LCD驱动程序

你好!这里是风筝的博客,欢迎和我一起交流。 如果本篇博客对您有帮助,或许可以在下方评论给我留个言。 开发板为JZ2440, Linux Kernel 4.4.18 在Kernel...

基于S3C2440的嵌入式Linux驱动——SPI子系统解读(一)

转载自:http://blog.csdn.net/yj4231/article/details/7746643 本文将介绍SPI子系统。内核版本为2.6.30。如有错误欢迎指正。 ...

mini2440:最简单的嵌入式Linux驱动程序模块

第一种方式:编译进内核,共6步 第1步:建立源码树 解压安装Linux 内核源代码在工作目录/opt/FriendlyARM/mini2440 中执行: #cd /opt/FriendlyARM...

最简单的嵌入式Linux驱动程序模块

注意:开发Arm平台的驱动,需要Arm平台的源码树; 注意:ARM平台的linux内核源码需要先编译,否则无法编译驱动; 一、第一种编译驱动方式,共6步 第1步:建立源码树 解压安装Linux...

嵌入式linux驱动模块编写

注意:开发Arm平台的驱动,需要Arm平台的源码树; 注意:ARM平台的linux内核源码需要先编译,否则无法编译驱动; 一、第一种编译驱动方式,共6步 第1步:建立源码树 解压安装Linux...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)