
Linux内核与设备驱动
文章平均质量分 69
__ever
业精于勤,荒于嬉;行成于思,毁于随
展开
-
API(库函数)和系统调用的差别
文章来源:http://soft.chinabyte.com/os/258/12424258.shtmlLinux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式转载 2016-08-17 09:51:54 · 658 阅读 · 0 评论 -
Linux设备驱动程序--学习笔记(1)
1.设备文件是OS对硬件设备的抽象,用户操作设备文件其实是内核调用驱动程序去操作实际硬件 ,实际的硬件设备通过驱动程序和内核交互2.驱动程序跟内核和硬件交互,设备文件跟OS和用户交互,所以说驱动可以不用管设备文件的东西3.模块初始化函数的任务就是为以后调用模块函数预先做准备4.模块卸载前会调用模块的退出函数,退出函数必须撤销初始化函数所做的一切5.内核函数头文件包含在usr/src原创 2016-08-25 10:42:07 · 725 阅读 · 0 评论 -
学习makefile时的笔记总结
makefile学习笔记(2016-8-16):一下内容有一些是自己总结的,一些是网上的,因为不知道哪里是出处所以不贴明了。。。1.在makefile 中’\’是换行的意思2.目标文件包含:执行文件和中间目标文件(*.o)3.依赖文件就是冒号后面的那些.c文件和.h文件4.*.o文件是可执行文件的依赖文件5.make伪目标 执行在终端中执行伪目标的命令6.$(变量名原创 2016-08-16 22:12:21 · 854 阅读 · 0 评论 -
DMA驱动程序解析
1、DMA的具体工作过程:(1)外设向DMA发出请求(2)DMA通过HOLD向CPU发出总线请求(3)CPU响应释放三总线,并且发应答HLDA(4)DMA向外设发DMA应答(5)DMA发出地址、控制信号,为外设传输数据(6)传送完规定的数据后,DMA撤销HOLD信号,CPU也撤销HOLD信号,并且恢复对三总线的控制2、驱动程序编写 在本驱动程序中,我们打算在内转载 2016-09-17 09:11:33 · 4498 阅读 · 0 评论 -
pwm设备驱动--platform总线
文章来源:http://blog.youkuaiyun.com/zqixiao_09/article/details/50888795采用设备模型的概念,总线,设备,驱动。先将设备(驱动)挂载到总线上,等待另一个同名的驱动(设备),用match函数进行匹配。如果找到了就调用driver的probe函数将设备和驱动绑定在一起;当设备拔出时,driver调用remove函数清除一些相关的操作d转载 2016-09-18 08:13:12 · 933 阅读 · 0 评论 -
linux第一个驱动模块编译
文章来源:http://zhidao.baidu.com/link?url=yXHr3X4kxqi5LQxU14snOpWB0TgPx4zyOoJc5SJRAf79ThOu37dvzSoHqz8eEF0PBKZlWuzCH0wa7qLwCeJ4vMivvi5NJ_vfU_ZTadkAdtK在编译内核模块时,如有Makefile文件如下: ifneq ($(KERNELRELE原创 2016-08-19 09:32:36 · 1091 阅读 · 0 评论 -
Linux内核源码树目录
arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。block:部分块设备驱动程序。crypto:常用加密和散列算法(如AES、SH转载 2016-09-22 15:31:12 · 1911 阅读 · 0 评论 -
A/D驱动程序
设备树中的节点编写:fs4412-adc{ compatible = "fs4412,adc"; reg = ; interrupt-parent = ; interrupts = ;};驱动编写:driver.c#include#include#include#include#include#include#include#in转载 2016-09-19 16:41:44 · 535 阅读 · 0 评论 -
中断处理的tasklet机制
文章来源:http://blog.youkuaiyun.com/u010481276/article/details/51093864中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的转载 2016-09-27 11:01:54 · 340 阅读 · 0 评论 -
Linux驱动的并发机制
文章来源:http://blog.youkuaiyun.com/zqixiao_09/article/details/50898854Linux 设备驱动中必须要解决的一个问题是多个进程对共享的资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也常常设计出包含并发问题bug 的驱动程序。一、基础概念1、Linux 并发相关基础概念a转载 2016-09-27 14:37:50 · 1848 阅读 · 0 评论 -
linux新增系统调用
说明: 系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源,可以通过系统调用来完成。 在linux中,系统调用是用户空间访问内核的一种手段,除异常和中断外,他们是进入内核的合法入口。系统调用的数量很少,在i386上只有大概300个左右。 应用程序员通过C库中的应用程序接口(API)而不是直接通过系统调用来编程。 C库中的函数可以不调用系统调用,也可以转载 2016-10-13 10:50:06 · 820 阅读 · 0 评论 -
总线,设备,驱动的设备模型
Kobject,kset是设备模型的基本结构体,设备模型使用这两个结构体来完成设备的层次关系,但在实际的设备驱动编写中,我们基本上用不到kobject,kset这些结构体,是因为这些结构体又被嵌入到更大的结构体中,原因在于kobject,kset结构体只能表征设备的层次关系,但是一个设备的驱动,并不是简单的一个层次关系而已,因此,必需要把kobject,kset结构体嵌入到更大的结构体中,使用ko转载 2016-09-28 09:21:47 · 299 阅读 · 0 评论 -
Linux学习路线指南
文章来源:http://os.51cto.com/art/201211/365047.htm多同学接触Linux不多,对Linux平台的开发更是一无所知。而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段。下来我将会结合自己的几年的个人开发经验,及对 Linux,更是类UNIX系统,及开源软件文化,谈谈Lin转载 2016-09-29 09:09:37 · 452 阅读 · 0 评论 -
Ubuntu12.04(64bit)编译Android4.4源码和kernel
因为之前没编译过android源码,make时各种错误让我痛苦了好几天的时间。。。1.到oracle的官网上下载1.6的JDK(切记一定要是1.6的,其他版本的会出错;如果你的ubuntu是64位的选择x64的版本,32位的就选择i586版本的JDK)2.下载android源码,这里我用repo下载了几次都没有成功,所以用了网上别人下好的4.4源码,再此感谢3.硬件环境:3原创 2016-10-23 21:27:47 · 1725 阅读 · 0 评论 -
SPI的时钟极性和相位
文章来源:转来转去的不知道是谁的了。。SPI由于接口相对简单(只需要4根线),用途算是比较广泛,主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。即一个SPI的Master通过SPI与一个从设备,即上述的那些Flash,ADC等,进行通讯。而主从设备之间通过SPI进行通讯,首先要保证两者之间时钟SCLK要一致,互相要商量好了,要匹配,否则,就转载 2016-12-05 23:41:41 · 3066 阅读 · 1 评论 -
Linux设备驱动程序--学习笔记(2)
1.fprintf(stdout,"hello");fprintf(stderr,"world");这样会在屏幕上输出 world hello 因为stdout有缓冲,而stderr无缓冲;如果将含有这两个函数的可执行文件(假设test)./test > abc.c那么stdout中的"hello"会输出到abc.c,而stderr中的"world"会输出到屏幕2.用户CPU+系统C原创 2016-08-31 17:38:21 · 463 阅读 · 0 评论 -
Linux设备驱动程序--学习笔记(3)
1.使用命令"cat /proc/interrupts"可以查看中断的中断号,中断次数,irq_desc.chip名,中断名。2.sizeof()函数返回值是unsigned long int类型3.假设int str[]={1,2,3,4,5};int *ptr=str;那么sizeof(str)的大小是20个字节,而sizeof(ptr)是8个字节(如果你的计算机是32原创 2016-09-05 08:25:33 · 425 阅读 · 0 评论 -
ubuntu12.04配置apue.2e环境
文章原地址:http://www.linuxidc.com/Linux/2013-01/77467.htm在Ubuntu 12.04系统下配置apue2环境。0、为了操作方便,建议使用root权限。1、下载源码包,解压至某个目录,比如:/home/yhf/apue.2e。 # tar -zxvf apue.tar.gz -C /home/yhf--------转载 2016-08-17 22:22:37 · 369 阅读 · 0 评论 -
自动创建设备节点时遇到的BUG
之前写的字符类设备驱动,没有自动创建设备节点,因为只使用了register_chrdev()函数,只是注册了这个设备。然后在系统启动后,就要自己创建设备节点mknod,这样虽然是可行的,但是比较麻烦。于是想在__init函数里面,自动创建设备节点。 经过查阅资料,发现创建设备节点使用了两个函数 class_create()和class_device_create(),当然在__exit转载 2016-08-30 11:31:57 · 580 阅读 · 0 评论 -
自己对shell,终端的一点理解
shell可以看成是一个带有编程语言的命令解释器,用于将用户输入的命令送到内核去执行,虚拟终端应该是用来承载shell的;ubuntu下可以通过【ALT】+【CTRL】+【F1--F6】进入字符界面的终端(tty1--6)PS:通过ssh协议可以远程链接到一台Linux机器,比如使用secureCRT和putty工具,此时进入的就是字符界面的终端。而用【ALT】+【CTRL】+【T】打开的原创 2016-08-31 09:53:49 · 358 阅读 · 0 评论 -
ubuntu12.04编译内核
为了学习驱动,所有要构造个内核,下面是从网上搜集的比较简单的方法(难的地方主要体现在配置内核选项)先在终端下sudo su获得root权限1、apt-cache search linux-source (执行用这条命令系统会提示你安装适合你内核版本的内核源码)或者在http://www.kernel.org/下载内核源码2、apt-get install linux-sou原创 2016-08-22 10:56:33 · 321 阅读 · 0 评论 -
Linux驱动头文件位置的说明
参考文章:http://blog.youkuaiyun.com/wanghanjiett/article/details/6791593在不同版本的内核源码上,头文件所在的位置是不同的,比如说在#include#include同样是regs-gpio.h,是在比较低的版本(比如2.6.25)上位于arch/arm/include/asm中,而mach/regs-gpio.h转载 2016-09-02 08:29:28 · 1056 阅读 · 0 评论 -
守护进程klogd和syslogd
我们可以看到LINUX系统信息日志的途径基本有以下2种:1>dmesg查看----这个命令比较常见2>/var/log/下的文件那下面我们就从这个2个途径着手,一步步的走下去.首先,我们来看dmesg这个常见的命令背后隐藏的是什么!!1> 先让我们来MAN一下这个家伙从LINUX提供的手册,我们可以得知一条最重要的信息dmesg是从kernel 的ring buffer转载 2016-08-25 10:36:54 · 4033 阅读 · 0 评论 -
poll机制分析--转韦东山
文章来源:http://blog.youkuaiyun.com/frankyzhangc/article/details/6692210最近看了一下Linux Poll 机制的实现,看了韦老师的分析文档,总结如下:int poll(struct pollfd *fds,nfds_t nfds, int timeout);总的来说,Poll机制会判断fds中的文件是否可读,如转载 2016-09-04 16:25:32 · 468 阅读 · 0 评论 -
完整的按键驱动程序--转韦东山
此文档是看韦东山老师的视频然后手打下来的,所以可能有些地方会有bug,呵呵 。PS:内核版本不同,头文件的位置可能会不同,所以文档只供参考学习#include#include#include#include#include#include#include#include#include#include#include#include#include#include原创 2016-09-06 10:48:57 · 1772 阅读 · 0 评论 -
驱动程序分层、分隔思想
文章来源:http://blog.youkuaiyun.com/zqixiao_09/article/details/51088887 前面我们学习I2C、USB、SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是:1、XXX 设备驱动2、XXX 核心层3、XXX 主机控制器驱动 而需要我们编写的主要是设备驱动部转载 2016-09-06 22:04:33 · 870 阅读 · 0 评论 -
kzalloc和kmalloc函数的区别
这个函数就是原来的两个函数的整合,即原来我们每次申请内存的时候都会这么做,先是用kmalloc()申请空间,然后用memset()来初始化,而现在省事了,一步到位,直接调用kzalloc(),效果等同于原来那两个函数,所有申请的元素都被初始化为0.其实对写驱动的来说,知道现在应该用kzalloc()转载 2016-09-20 21:24:23 · 1013 阅读 · 0 评论 -
linux中的likely和unlikely
文章来源:http://blog.youkuaiyun.com/tommy_wxie/article/details/7384641看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于/in转载 2016-10-09 22:03:16 · 369 阅读 · 0 评论 -
s3c2440的LCD驱动程序--转韦东山
本文档是看韦东山老师的LCD驱动视频手打下来的,所以可能会提示头文件找不到啊之类的,呵呵。另外cfb_fillrect.ko,cfb_copyarea.ko ,cfb_imageblit.ko这三个模块可以在内核的/drivers/video找到#include#include#include#include#include#include#include#include#in原创 2016-09-08 16:06:45 · 2729 阅读 · 0 评论 -
mmap函数
mmap函数是将一个文件或者其他对象映射进内存。函数原型:void* mmap(void* addr,size_t length,int prot,int flags,int fd,off_t offset);其中addr指文件应映射到进程空间的起始地址,默认NULL由内核分配;lenth指映射的文件长度,prot指文件被映射为内存后的访问权限,一般有PROT_READ(可读) , P转载 2016-09-08 08:44:19 · 777 阅读 · 0 评论 -
Linux设备驱动程序--学习笔记(5)
字符设备:面向流的设备,只能按照先后读取数据不能随机读取数据,包含鼠标,键盘,串口,控制台等;块设备:可以随机读取数据,包括硬盘,磁盘,U盘,SD卡等.owner = THIS_MODULE, 该成员可以防止设备的方法正在被使用时,设备所在模块被卸载dev_t=MKDEV(major,minor);dev_t 是unsigned long类型,32位CPU对I/O端口的地址管理分为:(1)I原创 2016-09-19 16:13:39 · 413 阅读 · 0 评论 -
Linux设备驱动程序--学习笔记(4)
1.void *memset(void *s,int ch,size_t n);memset函数将s中当前位置后面的n个字节(typedef unsigned int size_t)用ch替换并返回s。作用是在一段内存块中填充某个给定的值,它是对较大的结构体或者数组进行清零操作的一种最快方法2.void *memcpy(void *dest,const void *src,size_t原创 2016-09-09 10:37:24 · 492 阅读 · 0 评论 -
linux内核中GNU C和标准C的区别
今天看了一下午的linux内核编程方面的内容,发现linux 内核中GNU C与标准C有一些差别,特记录如下:linux 系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C对标准C进行进一步扩展,以增强标准C的功能。下面我们对GNU C中的扩展进行一下总结:1、零长度数组GNU C 允许使用零长度数组,在定义变长对象的头结构转载 2016-11-27 18:17:19 · 5367 阅读 · 0 评论