关于如何编译一个测试型的字符驱动程序,网上一搜还是很多的在此给出一个不错的教程http://blog.chinaunix.net/uid-11829250-id-337300.html我主要是在搜索ioctl的时候才有自己编写一个字符驱动的想法,因为刚工作的时候就看到有同事在用ioctl,当时在网上搜了下ioctl也没怎么明白。现在才发现原来ioctl就是对应的设备驱动程序里的ioctl函数。好了,废话就不多说了。写这篇文档的主要意义在于给后来编写驱动程序的新手们提示几个可...
已经无法再精简,适合入门。 1 #include<linux/module.h>2 #include<linux/init.h>3 4 #include<asm/uaccess.h>5 #include <linux/types.h>6 #include<linux/fs.h>7 #include<linux/cdev.h>8struct mengc_dev{9char data[64];
10struct cdev cdev;
11};
12int mengmajor;
13struct mengc_dev meng_device;
1415void exit_mengc_dev(void)
16{
17 dev_t devno = MKDEV(mengmajor,1);
18 cdev_del(&meng_device.cdev...
设备驱动程序常常会反复的分配很多相同大小的内存块;内核实现了后备高速缓存来对此进行支持,以反复的使用这些相同的内存块;创建Linux内核的高速缓存管理有时被称为“slab分配器”;因此,相关函数和类型在<linux/slab.h>中声明;slab分配器实现的告诉缓存具有kmem_cache类型;通过调用kmem_cache_create创建;1struct kmem_cache *
2 kmem_cache_create(constchar *name, size_t size, size_t offset,
3 unsigned long flag...
Linux驱动可以直接编译进内核,也可以以模块的形式进行加载,前者比较复杂,本文就以模块的形式加载!vi helloi_driver.c #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int __init hello_init(void) { printk(KERN_ALERT "hello driver init!\n"); return 0; } static void __exit hello_exit(void) ...
多数情况下,为了控制一个寻常的硬件设备,tasklet机制都是实现自己下半部的最佳选择;tasklet可以动态创建,使用方便,执行起来还算快;声明tasklettasklet既可以静态的创建,也可以动态的创建;如果准备静态的创建一个tasklet,可以使用下面的两个宏之一:1#define DECLARE_TASKLET(name, func, data) 2struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
34#define DECLARE_TASKLET_DISABLED(name, func, d...
2010年就打算把linux里的驱动框架核心代码抠出来的,但是由于懒而且linux代码量大,一直下不了手。最近调试的intel curie里驱动架构也类似linux,代码就少多了,由于工作需要不得不梳理一下这一堆代码,今天花了一下午,把整个BSP部分的驱动核心抽离出来了,并且做了几个小sample。最小驱动框架核心代码1、设备管理device.c#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
#include <errno.h>
#i...
一、Linux驱动到底是个什么东西:1、 实际上Linux驱动和普通的Linux API没有本质的区别,只是使用Linux驱动的方式与使用Linux API的方式不同而已;2、 Linux系统将每一个驱动都映射成一个文件。这些文件称为设备文件或驱动文件,都保存在/dev目录中。这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易,比访问Linux API也容易。由于大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据就变成了与...
简介
本章给出一个高层总线架构的综述讨论重点是用于访问Peripheral Component Interconnect(PCI,外围设备互联)外设的内核函数PCI总线是内核中得到最好支持的总线本章主要介绍PCI驱动程序如果寻找其硬件和获得对它的访问本章也会介绍ISA总线PCI接口
PCI是一组完整的规范,定义了计算机的各个不同部分之间应该如何交互PCI规范涵盖了与计算机接口相关的大部分问题PCI架构被设计为ISA标准的替代品,有三个主要目标
获得在计算机和外...
《[arm驱动]busybox根文件系统mdev的详解》知道设备文件/dev是如何挂载,内核中文件系统类型proc的挂载。/etc启动脚本过程。《[arm驱动]注册函数相关内容》如何注册自己编写的驱动程序。《[arm驱动]globalmem虚拟设备实例描述》共享虚拟内存《[arm驱动概念篇]Linux内存管理(上)》、《 [arm驱动概念篇]Linux内存管理(下)》强烈推荐要看,新手可以对后面的学习做基础,对于老手-----这确实是一篇很的文章《 [arm驱动]linux内核链表》...
软中断保留给系统中对时间要求严格以及最重要的下半部使用;目前,只有两个子系统(网络和SCSI)直接使用软中断;此外,内核定时器和tasklet都是建立在软中断上的;在使用软中断之前,要先确定为什么不能使用tasklet,tasklet可以动态生成,并且对加锁的要求不高,使用起来也很方便,性能也不错;当然,对于时间要求严格并能自己高效完成加锁的工作,软中断是正确的选择;分配索引在编译期间,通过在<linux/interrupt.h>中定义一个...
统计单词个数的功能是封装在Linux驱动中的。Linux系统将每一个驱动都映射成一个文件。这些文件称之为设备文件或驱动文件,都保存在/dev目录中。编写Linux驱动程序的步骤如下:1、 建立Linux驱动骨架(装载和卸载Linux驱动);2、 注册和注销设备文件;3、 指定与驱动相关的信息;4、 指定回掉函数;5、 编写业务逻辑;6、 编写Makefile文件;7、 编译Linux驱动程序;8、 安装和卸载Linux驱动; 统计单词个数这个驱动程序没有访问...
一、Linux系统将每个驱动都映射成一个文件。这些文件称为设备文件或驱动文件,都保存在/dev目录中。这使得与Linux驱动进行交互就向与普通文件进行交互一样容易。大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据变成与驱动设备交换数据。 二、编写Linux驱动程序 1.建立Linux驱动骨架 Linux内核在使用驱动时需要装载与卸载驱动 装载驱动:建立设备文件、分配内存地址空间等...
我正在研究从RHEL6应用程序服务器连接到MSSQL数据库的可能性.我找到了两种方法:
> FreeTDS> Microsoft SQL Server ODBC Driver for Linux unixODBC
有没有人有使用这些设置的经验? (我对后者特别好奇,因为MS正式支持).性能?稳定性?我可能会遗失任何其他选择?解决方法:为了记录,我现在使用FreeTDS.我评估了unixODBC和FreeTDS,发现FreeTDS目前更容易使用.
Linux设备驱动程序学习笔记
第八章分配内存
一、kmalloc函数的内幕 (1)flags参数
//kmalloc原型
#include<linux/slab.h>
void *kmalloc(size_t size, int flags);//flags分配标志,最常用的是GFP_FERNEL分配标志:
GFP_ATOMIC用于在中断处理例程或其他运行于进程上下文以外的代码中分配内存如tasklet以及内核定时器调用,不会休眠GFP_KERNEL内核内存的通常分配方法,可能引起休眠GFP_USER用于为用户空间页分配内存,可能会休眠GF...
阻塞与非阻塞是设备访问的两种方式。在写阻塞与非阻塞的驱动程序时,经常用到等待队列。一、阻塞与非阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回。 非阻塞指不能立刻得到结果之前,该函数不会阻塞当前进程,而会立刻返回。 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状...