在阅读Linux Driver源码时,我们常常会在文件的结尾处看到诸如:MODULE_AUTHOR.MODULE_DESCRIPTION.MODULE_LICENSE等宏定义,这些宏主要是定义了一些模块信息. 但这些模块信息详细是怎么加到模块里的?就须要深入分析一下这些宏定义详细是怎么定义的.以下我们以MODULE_AUTHOR为例.来详细分析一下有关module信息的宏. 首先,我门来看一下MODULE_AUTHOR()宏的定义: #define MODULE_AUTHOR(_author)…
1. CMEM--高速缓存一致性问题的解决多核设计中,共享的二级高速缓存之间数据可能不一致,不同CPU内核的私有高速缓存也可能存在数据不一致,称为高速缓存的一致性问题.解决一致性问题的方法从整体上分可以分成软件方法和硬件方法两种,各有其优势.Davinci采用软件解决方案. 1) 数据完整性.CE中的CMEM模块是用来做共享内存分配的,因为应用程序是运行在MVista Linux上的,在应用程序里malloc到的buffer都是虚拟地址,实际的物理空间不一定连续,当把这个指针传递给算法的时候,数…
我们在内核中经常遇到初始化函数是这样定义的:static int __init init_func(); ,与普通函数相比,定义中多了__init.那么,__init是什么意思呢?还有与其匹配的__exit呢? __init* macro __init定义在:include/linux/init.h #define __init __attribute__ ((__section__ (".init.text")))#define __initdata __attribute__ ((…
现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用程序交互,应用程序通过向设备文件传递一个由空格分隔的字符串,将每一个被空格隔开的子字符串看作一个单词,然后从设备文件读出来的是该字符串包含的单词个数.在编写此Linux驱动程序前需要做一些准备工作,先使用命令 “# mkdir -p /root/drivers/ch06/word_count # c…
一.内核模块的概念 Linux模块(module)是一些可以作为独立程序来编译的函数和数据类型的集合.内核模块给我们带来的便利是模块本身并不被编译进内核文件,可在内核运行期间动态的安装或卸载.因为如果将模块编译进内核的话,一是生产的内核文件过大,二是如果要添加或删除某个组件要重新编译整个内核. Linux模块可以通过静态或动态地加载到内核空间,静态加载是指在内核启动过程中加载:动态加载是指在内核运行的过程中随时加载.我采用的是动态加载的方法. 一个模块被加载到内核中时,它就成为内核代码的一部分,…
目录(?)[+] Linux设备驱动Hello World程序介绍 如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方式分别是: printk(),/proc文件,/dev下的设备文件. 准备:安装内核模块的编译环境 一个内核模块kernel module是一段能被内核动态加载和卸载的内核代码,因为内核模块程序是内核的一个部分,并且和内核紧密的交互,所以内核模块不可能脱离内核编译环境, 至少,它需要内核的头文件和用…
知乎链接:https://zhuanlan.zhihu.com/p/58087261 Linux内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树. 链表 Linux内核代码大量使用了链表这种数据结构.链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构.链表所包含的元素可以动态创建并插入和删除.链表的每个元素都是离散存放的,因此不需要占用连续的内存.链表通常由若干节点组成,每个节点的结构都是一样的,由有效数据区和指针区两部分组成.有效数据区用来存储有效数据信息,而指针区用来…
一.编写Linux驱动程序的步骤 第1 步:建立Linux 驱动骨架(装载和卸载Linux 驱动) 骨架部分主要是Linux驱动的初始化和退出函数,代码如下: #include <linux/module.h>#include <linux/init .h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/miscdevice.h>#include <asm/uacc…
linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和Linux API进行应用软件的编写: 从事这方面的开发工作,主要需要学习:符合linux posix标准的API函数及系统调用,linux的多任务编程技巧:多进程.多线程.进程间通信.多任务之间的同步互斥等,嵌入式数据库的学习,UI编程:QT.miniGUI等. (2)Linux固件工程师(Fir…
设备与模块 关于设备驱动和设备管理,四种内核成分. 设备类型:在所有Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系. sysfs :表示系统中设备树的一个文件系统. 17 .1 设备类型 在Linux 以及所有Unix 系统中,设备被分为以下三种类型 块设备 字符设备 网络设备 块设备通常缩写为blkdev,它是可寻址的,寻址以块为单位,块大小随设备不同…
转自:http://blog.chinaunix.net/uid-29507718-id-4314013.html Linux下I2C接口触摸屏驱动分析  分类: LINUX linux下触摸屏驱动的移植主要包括这几个步骤: (1)确定触摸屏IC接口,了解对应接口的API函数,注册设备并加入到相应总线上 (2)关联设备与驱动,并编写具体的驱动代码 (3)熟悉linux 输入设备驱动,在驱动代码中分配一个输入设备并初始化相应数据结构,在驱动实现中引用 这里对应上面几部分,分析I2C接口下触摸屏驱动…
自古以来,学习一门新编程语言的第一步就是写一个打印“hello world”的程序(可以看<hello world 集中营>这个帖子供罗列了300个“hello world”程序例子)在本文中,我们将用同样的方式学习如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方式分别是: printk(),/proc文件,/dev下的设备文件. 准备:安装内核模块的编译环境 一个内核模块kernel module是一段能被内…
/****************************************************************************** * IMX6 OTG set as slave device hacking * 声明: * 1. 本代码解析使用了倒序的方式跟踪内核驱动代码,从驱动反推需求: * 2. 代码解析的目标是找到OTG设置成Host.Slave设备的宏定义: * 3. 根据2中的宏定义,看make menuconfig中是否存在可直接裁剪的选项. * * 2…
一.设备与模块 1.设备类型 块设备:随机访问设备中的内容,通过块设备结点访问,通常被挂载为文件系统 字符设备:不可寻址,仅提供数据的流式访问,通过字符设备结点访问,应用程序通过直接访问设备节点与字符设备交互 网络设备:通过套接字API来访问 除了物理设备外还有些驱动设备是虚拟的(伪设备),仅提供访问内核功能.如内核随机数发生器.空设备.零设备.满设备.内存设备. 2.模块 (1)Linux内核是模块化的,允许内核在运行时动态地向其中插入或从中删除代码.这些代码被组合在一个单独的二进制镜像中,即…
Hello World 模块 #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "hello_world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT…
1. Linux 内核的整体结构非常庞大,其包含的组件也非常多,使用这些组件的方法有两种: ① 直接编译进内核文件,即zImage或者bzImage(问题:占用内存过多) ② 动态添加 * 模块本身并不被编译进内核文件 * 根据需求,在内核运行期间动态安装或卸载 2. 内核模块动态安装与卸载 ①安装 insmod 例:insmod /home/dnw_usb.ko ②卸载 rmmod 例:rmmod dnw_usb ③查看 lsmod 例: lsmod 3. 模块声明 ① MODULE_LICE…
1.前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器.在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数. 2.常用API接口 在Linux内核中使用全局变量jiffies来记录系统从启动以来的系统节拍数,当系统内核启动的时候,会将该jiffies初始化为0,该定义在kernel/include/linux/jiffies.h文件中,如下: extern u64 __jiffy_data jiffies_64;…
Compile-kernel-module 1. 内核模块编程1.1 简介1.2 加载内核模块1.3 最简单的模块1.4 模块必要信息1.4.1 内核模块必须至少包含的头文件:1.4.2 内核模块必须至少有两个功能:1.4.3 printk()日志记录1.4.4 优先级1.4.5 许可和模块文档1.5 编译内核模块1.6 实战1.6.1 源代码文件: hello.c1.6.2 Makefile文件: Makefile1.6.3 使用make编译1.6.4 使用modinfo查看新的模块文件1,6…
Linux kernel 源码添加可选项 闲来无事,顺便记录一篇在Linux kernel make menuconfig 内添加一个可选项. 说不定将来就要用到这个东西呢. linux kernel 的配置系统由以下三个部分组成. Makefile: 分布在Linux 内核源代码中,定义Linux kernel的编译规则. 配置文件:(kconfig) 给用户提供配置选择的功能. 配置工具:包括配置命令解析器和配置用户界面.这些配置工具使用的都是脚本语言,如Perl. 最常使用的,我们一般使用…
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理&思考 1.什么是模块?为什么需要模块?它和设备有什么关系? 首先,一个操作系统(这里以Linux系统为例)会关联很多设备,从大家比较熟悉的键盘.打印机,到硬盘.光盘,再到比较专业的一些电路板设备.机械设备以及其他设备:操作系统必须能够向这些设备发出有效指令以便于操控,同时还要根据各个设备能接受的指令差…
一  编写Linux驱动程序 1.建立Linux驱动骨架 Linux内核在使用驱动时需要装载与卸载驱动 装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化 卸载驱动:删除设备文件.释放内存地址空间等:module_exit函数处理退出 包含这两个函数的两个宏的C程序文件也可看做是Linux驱动的骨架 2.注册和注销设备文件 任何一个Linux驱动都需要有一个设备文件,否则应用程序将无法与驱动程序交互. 建立设备文件:在第一步编写的处理Linux初始化工作的函数…
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M  (4片K4T1G164Q ) Nand flash: 512M (K9F4G08) 以太网芯片: SMSC LAN9220 工具介绍 仿真器: 暂无 电缆: 串口线,USB线 Windows 操作系统软件环境 ADS编译工具: 暂无 仿真器软件:暂无 调试软件: 终端(ADB).eclipse…
目录 . 进程相关数据结构 ) struct task_struct ) struct cred ) struct pid_link ) struct pid ) struct signal_struct ) struct rlimit . 内核中的队列/链表对象 ) singly-linked lists ) singly-linked tail queues ) doubly-linked lists ) doubly-linked tail queues . 内核模块相关数据结构 ) st…
尽管LDD3中说对多数程序员掌握设备驱动模型不是必要的,但对于嵌入式Linux的底层程序员而言,对设备驱动模型的学习非常重要. Linux设备模型的目的:为内核建立一个统一的设备模型,从而又一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要新添加设备或驱动提供一般性的统一接口,这使得驱动程序的开发变得更简单了,而程序员只需要去学习接口就行了. 在正式进入设备驱动模型的学习之前,有必要把documentatio…
概述: 字符设备驱动程序: 是按照字符设备要求完成的由操作系统调用的代码. 重点理解以下内容:  1. 驱动是写给操作系统的代码,它不是直接给用户层程序调用的,而是给系统调用的  2. 所以驱动要向系统注册.  3. 注册的时候,要求驱动必须符合一定的规范,否则系统就会不认识.这就是程序架构.  4. 字符设备驱动对应一个cdev 结构, 需要向系统注册或申请设备号,注册cdev设备,     完成cdev 设备需要的操作,诸如读,写,ioctl操作等.  5. 系统下驱动以模块的形式而存在  …
编写驱动程序,首先要了解是什么类型的设备.linux下的设备分为三类,分别为:字符设备,块设备和网络设备.字符设备类型是根据是否以字符流为数据的交换方式,大部分设备都是字符设备,如键盘,串口等,块设备则是以块为单位进行管理的设备,如,磁盘.网络设备就是网卡等. 其次要了解应用程序和驱动程序的区别,两者的主要区别分为以下三点: 1入口函数的任务不相同,应用程序完成一个任务,驱动只完成初始化工作,比如中断 申请,寄存器设置,定时器设置. 2运行时的cpu模式不相同,驱动具有很高的权限,应用程序是在用…
转自:https://blog.csdn.net/u014134180/article/details/86563754 版权声明:本文为博主原创文章,未经博主允许不得转载.——Wu_Being https://blog.csdn.net/u014134180/article/details/86563754文章目录基本理解Linux 内核事件通知链1. TP 驱动相关代码2. LCM 背光相关代码3. 运行结果深入探究Linux 内核事件通知链1. 通知链的引入2. 四种通知链的类型原子通知链…
写一个main.c gcc -c -g main.c objdump -S main.o > b.txt arm-none-linux-gnueabi-gcc -c -g a.c arm-none-linux-gnueabi-objdump -S a.o > c.txt 这样就可以查看到c和汇编同时产生 demo1: obj-m := kmod-demo1.oMAKEOPT := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-#CFLAGS :=…
Proc文件系统是提供一个接口给用户,让用户可以查看系统运行的一些状态信息,让用户修改内核的一些参数,比方说printk的打印级别就可以通过proc去修改 Sysfs文件系统, Sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them t…
在Android 2.3(Gingerbread) 系统的时候,我写过一篇关于“Android 震动马达系统“的文章,当时的Linux内核还是2.6版本的.写那篇文章的目的,是想彻底的了解从硬件到驱动,再到应用的运作流程.完成了之后,文章一直仍在草稿箱里面没发表:今天看到,决定整理一下,重新发表.目的是想和大家分享自己对Android系统的一点认识:以马达为代表,来考究“Android是如何一步步工作的.它从硬件设计,到Linux驱动,再到HAL,再到JNI,再到Framework,最后到被应用…