首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核驱动编写

大家好,又见面了,我是你们朋友全栈君。 # 前言 开发过单片机小伙伴可以看一下我之前一篇文章从单片机开发到linux内核驱动,以浅显易懂方式带你敲开Linux驱动开发大门。...# 正文 用户空间每个函数(用于使用设备或者文件),在内核空间中都有一个对应功能相似并且可将内核信息向用户空间传递函数。 下表为几种设备驱动事件和它们在内核用户空间对应接口函数。...liyongjun@Box:~/project/c/DRIVERS/memory$ cat /dev/memory aliyongjun@Box:~/project/c/DRIVERS/memory$ insmod作用是将模块手动地加载到内核中...但是模块加载到内核中,还是不能用,得有具体设备才能用。 如果驱动模块中有实现自动生成当前设备文件节点代码,那么会使用热拔插相关代码脚本,自动在/dev下面生成对应设备文件。...当然最终都要运行mknod命令,它会根据你传进去主次设备号类型。在内核维护设备驱动列表中寻找你在驱动模块中注册设备驱动

7.2K21

Linux内核设备驱动Linux内核基础笔记整理

Linux内核驱动模块机制 静态加载, 把驱动模块编进内核, 在内核启动时加载 动态加载, 把驱动模块编为ko, 在内核启动后,需要用时加载 2....编写内核驱动 #include #include static int __init test_init(void) { return...0; //返回0表示成功, 返加负数退出加载模块 } //__init 当内核驱动初始化完后, 释放此函数代码指令空间 static void __exit test_exit(void) { ....驱动模块Makefile obj-m += test.o //源码文件为test.c modules:make -C 内核源码目录 M=驱动代码所在目录 modules modules install...console_loglevel级别时, 则可以输出, 否则不输出 修改级别输出echo 8 > /proc/sys/kernel/printk 总结 以上就是这篇文章全部内容了,希望本文内容对大家学习或者工作具有一定参考学习价值

1.9K51
您找到你想要的搜索结果了吗?
是的
没有找到

谈谈Linux内核驱动coding style

最近在向Linux内核提交一些驱动程序,在提交过程中,发现自己代码离Linux内核coding style要求还是差很多。...当初自己对内核文档里CodingStyle一文只是粗略浏览,真正写代码时候在很多细节上会照顾不周。不过, 在不遵守规则程序员队伍里,我并不是孤独。...如果去看drivers/staging下代码,就会发现很多驱动程序都没有严格遵守内核coding style,而且在很多驱动程序TODO文件里,都会把"checkpatch.pl fixes"作为自己目标之一...在Linux内核coding style里,switchcase要求有相同缩进。本例代码很少,错误也只有这一个,手动修改很方便。如果类似的缩紧错误很多怎么办?...比如,Linux内核coding style要求,行尾不能有空格(包括Tab),去除这些空格就可以借助sed。 我自己习惯很差,经常在代码行尾留下一些空格。

1.7K10

linux内核驱动模型详解_arduino驱动安装

转载请标明出处floatercsdn blog,http://blog.csdn.net/flaoter Linux SPI驱动分为核心层,控制器驱动设备驱动层。...核心层是LinuxSPI核心部分,提供了核心数据结构定义,总线、设备驱动注册、注销管理等,提供与上层统一接口。...linux将I2C、SPI、USB等总线驱动隔离成控制器驱动设备驱动,使两者相对独立。 本文以qcomspi控制器为例,对spi控制器驱动进行解析。kernel代码版本是3.18。...linux驱动与设备是一对多关系,在spi_master设备注册时,控制器结构体信息会提供给spi_master作为私有数据。...总线传输涉及到几个重要结构体,队列,内核工作线程厂商总线传输实现几个方面。

11.1K40

Linux 内核之字符设备驱动

支持阻塞IO驱动demo Linux设备类型可以大概分为以下几种: 字符设备:以字节为单位传输,传输率低,不支持随机访问,常见设备有鼠标,键盘,触摸屏等 块设备: 以块位单位传输,常见就是磁盘...先看下字符设备结构 struct cdev { struct kobject kobj; // 用于linux设备驱动模型 struct module *owner; // 字符设备驱动所在内核模块对象指针...const struct file_operations *ops; // 字符设备驱动中最关键一个操作函数,在应用程序交互过程中起枢纽作用 struct list_head list...再介绍下misc 设备,linux 内核将一些不符合预先确定字符设备划分为杂项设备,使用数据结构如下; struct miscdevice { int minor; const char...提到多路复用,就是linux中著名poll,epoll,select机制,在内核中对应文件方法就是: __poll_t (*poll) (struct file *, struct poll_table_struct

4.9K40

Linux内核设备驱动内核调试技术笔记整理

/****************** * 内核调试技术 ******************/ (1)内核源代码中一些与调试相关配置选项 内核配置选项中包含了一些与内核调试相关选项,都集中在...包括: CONFIG_DEBUG_KERNEL 使其他调试选项可用,应该选中,其本身不会打开所有的调试功能。 具体调试选项说明可参见驱动一书,或通过menuconfighelp说明查看。...(2)如何通过宏对printk调试语句进行全局控制 通过Makefile配合,可以在c文件中定义属于我们自己调试语句。...在某些情况下,oops会导致内核混乱,而混乱结果就是死机,这些情况可能包括: *oops发生在持有锁代码中 *oops发生在硬件设备通讯过程中 *oops在中断上下文中发生 *oops发生在idle...debug_check){ printk(KERNEL_DEBUG "provide some info\n"); dump_stack(); } 总结 以上就是这篇文章全部内容了,希望本文内容对大家学习或者工作具有一定参考学习价值

2.1K41

Linux内核驱动开发EXPORT_SYMBOL

简介 本文主要来讲讲Linux内核驱动中,EXPORT_SYMBOL()宏定义用法。 在阅读Linux内核驱动源码时候,我们会发现很多函数带有EXPORT_SYMBOL()宏定义。...从这个宏定义理解为输出符号。那么他究竟有什么作用。...EXPORT_SYMBOL()宏定义作用 EXPORT_SYMBOL宏定义定义函数或者符号将对内核代码公开,不用修改内核代码就在其他内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号方式导出给其他模块使用...extern int rice_func(void); 先加载定义该函数模块,然后再加载调用该函数模块,先后顺序必须注意。...实验 编写代码 编写两个模块:rice_export.ko rice_import.ko,其中: rice_export.ko:导出定义函数 rice_import.ko:调用导出函数 导出函数模块代码

2.6K20

Linux内核LED设备驱动框架【转】

驱动框架概念 内核驱动部分维护者针对每个种类驱动设计一套成熟、标准、典型驱动实现,并把不同厂家同类硬件驱动中相同部分抽出来自己实现好,再把不同部分留出接口给具体驱动开发工程师来实现,这就叫驱动框架...因此,Linux中LED驱动框架把所有LED设备共性给实现了,把不同地方留给驱动工程师去做。...内核在启动过程中,内核需要按照先后顺序去进行初始化操作。因此,内核给是给启动时要调用所有初始化函数归类,然后每个类按照一定次序去调用执行。...详见Linux设备管理:sysfs文件系统功能及其应用。 led_class_attrs结构体数组设置了leds设备类属性,即led硬件操作对象方法。...对应操作规则有读写,即showstore。

2.5K10

Linux 内核中 Kconfig 文件作用添加 menuconfig 项方法

便于需要时查找 Ref: Linux内核中Kconfig文件作用 本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。...---------- Kconfig作用 Kconfig就是服务于menuconfig一个配置文件。在对应目录下配置Kconfig文件,就是在配置对应menuconfig项目。...有很多种配置方式,这里我暂时只是给一种简单,也就是yesno方式。...完成了make menuconfig之后,内核会生成.config文件,就在Linux代码树根目录下。这个文件制定了各个模块是否会被编译,由Makefile读取并在编译过程中配置内核。...然后,专心添加你.c.h文件就行了。由于是二态选项,所以你代码要么就直接被包含在内核中,要么就压根不存在。不像三态,还有一个“M”选项。三态配置参见参考资料吧。

3.2K50

Linux内核设备驱动内核时间管理笔记整理

/****************** * linux内核时间管理 ******************/ (1)内核时间概念 时间管理在linux内核中占有非常重要作用。...相对于事件驱动而言,内核中有大量函数是基于时间驱动。 有些函数是周期执行,比如每10毫秒刷新一次屏幕; 有些函数是推后一定时间执行,比如内核在500毫秒后执行某项任务。...要区分: *绝对时间相对时间 *周期性产生事件推迟执行事件 周期性事件是由系统系统定时器驱动 (2)HZ值 内核必须在硬件定时器帮助下才能计算管理时间。...带来好处有: *内核定时器能够以更高频率更高准确度运行 *依赖定时器执行系统调用,比如poll()select(),运行精度更高 *提高进程抢占准确度 (缩短了调度延时,如果进程还剩2ms...总结 以上就是这篇文章全部内容了,希望本文内容对大家学习或者工作具有一定参考学习价值,谢谢大家对ZaLou.Cn支持。如果你想了解更多相关内容请查看下面相关链接

2.6K31

Linux内核模块

Linux内核作用 ? 管理内存 提高效率,管理可用内存方式,以及物理虚拟映射所使用硬件机制。 调度任务 某些机制执行从用户空间到内核函数调用。...管理进程 内核通过 SCI 提供了一个应用程序接口(API)来创建一个新进程,停止进程(kill、exit),并在它们之间进行通信同步。...管理I/O 给设备提供驱动,让设备注册I/O,完成中断及中断处理等。 管理安全 selinux、md5、sha1等。...arch 表示各种各样平台 crypto 安全加密 drivers 驱动各种各样硬件 fs 文件系统 lib 各种各样库 net 网络功能 sound 声卡 查看所有模块 lsmod...详细学习可参考官网: http://www.tldp.org/LDP/tlk/tlk.html https://mirrors.edge.kernel.org/pub/linux/ ?

2.1K30

Linux内核学习(一)之Linux内核源码目录

我们今天文章分享不是拿最新版本来作为学习,往往在刚开始学习时候,都会拿比较经典linux版本来作为入门学习,入门了后,后面版本学习就好办了。...内核版本 .mailmap: 这个文件主要是记录了一些大神维护内核名字mail COPYING: 主要是介绍Linux内核版权问题 CREDITS: 主要是感谢一些社区大神贡献 Kbuild:...drivers:驱动目录,里面分门别类列出了linux内核支持所有硬件设备驱动源代码。 firmware:固件。什么是固件?...tools:linux中用到一些有用工具 usr:目录下是initramfs相关linux内核启动有关 virt:内核虚拟机相关 小结:大家看了这么文件目录,不要吓到了(要选择性学习),跟我们关系很紧密就是...其实linux里面的文件配置现如今IotOS(传统说就是rtos)配置都是借鉴了linux这套思路方法,有接触过IotOS小伙伴就知道了,里面一些配置文件写法风格linux很像,学会了linux

10.8K51

Linux内核学习(一)

前言: 大家好,今天给大家分享一下我个人学习Linux内核总结,由于新内核版本太过于庞大,说实话,啃不动,然借鉴前人建议,故开始从早期Linux0.11版本开始学习。...为了鲜明对比早期版本精简后期版本复杂,我们大体从它目录来做一个对比就可知了: 0.01版本内核目录: 0.11版本内核目录: 前期版本差别不大,但随着时代发展,内核功能也扩展越来越多...,所以就变复杂起来了: 2.6内核版本目录 上面内核版本源码可以从下面下载: 在线浏览早期内核源码: http://lxr.linux.no/linux-old 0.11版本内核源码下载: https...0.11版本Linux内核组成: 在0.11版本Linux,它主要是由五个模块组成: 进程调度模块 进程间通信模块 内存管理模块 文件系统模块 网络接口模块 图片参考Linux内核0.11完全注释...总结: 好了,今天我们先大体分享这么多,后面具体源代码模块机制,我再花时间总结。

1.1K10

Linux内核修炼之道》 之 高效学习Linux内核

就像我们任志强先生前阵子演讲卖房子 方法时,就因为太像一场忽悠,从而被听众扔了鞋。 接下来我就通过自己一些感悟,抛砖引玉来介绍一下如何比较高效学习 linux 内核。...意思就是我们在学习内核前首先要会用 linux ,依照一个由上至下循序渐进过程,在能够熟练使用 Linux 操作系统之后再去研究内核实现。这也是 linus 本人观点。...这句话当然可以借鉴运用到内核学习上,不过需要做些改动,不是分解为多个简单小问题,而是将内核学习这么一件很复杂事情划分为由低到高多个不同层次,每一层次都有自己需要达到目标要求。...在我们内核学习过程中,内核源码本身就是最好参考资料,其他任何经典或非经典书最多只是起到个辅助作用,不能也不应该取代内核代码在我们学习过程中主导地位。...但是这些辅助作用也是不可忽视,我们需要以内核源码为中心,坚持各种学习资源长期建设不动摇。 除了这里八句话,其他可能会对大家有帮助感悟或者方法还有很多 。

9.9K30

Linux内核平台总线设备驱动模型浅析

复习总线设备驱动模型,做了一点小笔记,大牛略过。 一、Linux系统驱动框架基础很大一部分是围绕着总线设备驱动模型展开。...*p; }; 其中,struct subsys_private包含一个设备链表(struct klist klist_devices)一个驱动链表(  struct klist klist_drivers..., pci_dev,usb_device,i2c_device, spi_device等)都包含一个struct device结构体,当这些驱动内核注册各式各样设备时,其实最终都会调用到: intdevice_register...等)都包含一个structdevice_driver结构体,当这些驱动内核注册各式各样驱动时,最终都会调用到: int driver_register(structdevice_driver *drv...(drv); } 无论是调用driver_register()注册驱动, 还是用device_register注册设备, 内核都会调用总线match函数来探测是否有合适device_driverdevice

1.9K30

Linux驱动开发-内核定时器

内核定时器介绍 内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数一种机制,相关函数位于 kernel/timer.c 文件中...每当时钟中断发生时,全局变量jiffies(一个32位unsigned long 变量)就加1,因此jiffies记录了linux系统启动后时钟中断发生次数,驱动程序常利用jiffies来计算不同事件间时间间隔...如果编内核时不支持 SMP(多处理器), del_timer_sync() del_timer()等价 函数参数 timer:对应定时器结构体 函数返回值 返回0:成功 函数定义文件 \linux-...); /*驱动入口--安装驱动时候执行*/ module_exit(tiny4412_linux_timer_cleanup); /*驱动出口--卸载驱动时候执行*/ MODULE_LICENSE...内核提供延时函数 Linux 内核中提供了进行纳秒、微秒毫秒延迟。

2.8K50

Linux驱动开发-内核共享工作队列

内核工作队列 工作队列常见使用形式是配合中断使用,在中断服务函数里无法调用会导致休眠相关函数代码,有了工作队列机制以后,可以将需要执行逻辑代码放在工作队列里执行,只需要在中断服务函数里触发即可,...;内核使用这个结构来描述一个工作,一个工作简单理解就是对应于一个函数,可以通过内核调度函数来调用work_struct中func指针所指向函数。...如果工作用于中断底部代码,则在中断顶部调度。... /*文件操作集合头文件*/ #include /*使用copy_to_usercopy_from_user*/ #...内核分配给设备主设备号设备名字 /*动态分配cdev结构体,返个cdev结构;如果执行失败,将返回NULL。

2K50
领券