- 博客(20)
- 收藏
- 关注
原创 字符设备驱动程序的设计
【字符设备驱动程序的组成】 字符设备驱动程序包含5个部分:头文件、file_operation结构体变量、接口函数、加载函数以及卸载函数。 头文件的部分包含进数据结构以及内核函数要用到的头文件。file_operation结构体变量部分定义file_operation结构体的变量,该结构体声明了驱动程序所有的接口函数。接口函数部分包含字符驱动设备驱动程序与内核应用程序交互
2016-01-22 17:27:45 1474
原创 chrdevs数组
chrdevs数组chrdevs数组是一张device_struct结构类型的表,所有的字符设备文件的名称以及相关的file_operation结构描述符都包含在该表中,device_struct和chrdevs数组都在fs/devics.c中定义。 fs/devices.c struct device_struct{ const char *name;
2016-01-21 13:53:04 1229
原创 file结构
file结构是设备驱动程序所使用的另一个重要的数据结构,它代表一个“打开的文件”,是应用程序在进行open()调用时由内核创建的,在进行close()调用时作为参数传递给函数以关闭相应的文件。在文件关闭后,内核释放这个数据结构。file结构也在include/linux/fs.h中定义。 include/linux/fs.h519 struct file{520
2016-01-20 14:26:06 472
原创 file_operations结构
file_operation结构由于用户程序是通过设备文件与硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如open()、read()、write()、close()等,但是如何把系统调用和驱动程序关联起来呢?这需要了解一个非常关键的数据结构:file_operation。改结构定义了文件操作接口,结构中除了owner外,每一个成员都对应着一个系统调用。具体如下:
2016-01-20 12:25:16 777
原创 使用printk()函数调试设备驱动程序
当程序代码编写好时很少不会出错误,这个时候就要用printk()函数来调试了。该函数的功能与printf()差不多,但是,它只能由内核例程来调试,该函数在kernel/printk.c中实现,原型如下:int printk(const char *fmt,…);printk()函数的使用方法与printf()基本相同,但参数的第一个位置可以使用表示信息重
2016-01-19 19:35:23 778
原创 内核空间和用户空间的数据交换
对设备的读操作是将数据从Linux的内核空间复制到用户空间;写操作是将数据从Linux的用户空间复制到内核空间。因为Linux的内核空间和用户空间是隔离的,所以要实现数据的拷贝就要使用专门的内核函数。可以在内核空间和用户空间进行数据复制的函数在中定义,其原型如下:unsigned longcopy_to_user(void_usr *to,con
2016-01-19 18:50:33 1586
原创 信号量
【设备驱动程序中的并发控制】在驱动程序中,当多个线程同时访问像全局变量这样的共享资源时,会引发“竞态”,需要对共享资源进行控制。Linux内核中解决并发控制的最常用方法是信号量与自旋锁。信号量是一种睡眠锁,如果有一个任务试图获得一个已经被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠,这时候处理器获得自由去执行其他代码。当持有信号量的进程释放信号量之后,在等待队列中的一
2016-01-19 17:33:10 1407
原创 中断的禁止和使能以及处理例程
【中断处理例程】中断处理器例程即中断处理函数,其作用是根据被服务的中断的含义进行适当的操作,通常是读、写数据。中断处理例程与普通C函数没有什么差别,但是中断处理装置有以下限制:中断处理装置不能与用户空间传递数据,因为它不在进程上下文执行;中断处理程序也不能做任何可能休眠的事情,例如,调用wait_event(),除了使用GFP_ATOMIC之外的任何东西来分配内存,或者锁住
2016-01-19 15:36:20 6452
原创 中断的注册和释放
大多数设备驱动程序都要使用中断,因此有必要了解linux的中断管理机制,Linux的中断管理机制包含中断服务例程的注册。【中断的注册】Linux使用request_irq()函数为中断服务例程分配一个硬件中断号并登记相应的中断程序处理例程,即所谓的注册中断,该函数在include/linux/sched.h里声明,request_irq()函数原型如下: Int r
2016-01-19 10:54:18 2756
原创 I/O端口的访问
Linux中的任何设备驱动程序都可对I/O端口进行操作,这样很容易引起混乱,因此Linux提供了三个宏check_region(start,n)、request_region(start,n,name)、release_region(start,n)来对端口使用情况进行控制,它们在include/linux/ioport.h中进行了定义。 check_r
2016-01-18 15:35:21 960
原创 模块(加载函数和卸载函数)
Linux模块是一些代码的集成,可以在启动系统后动态链接到内核的一部分,一旦载入之后就和内核没有什么区别,可以使内核崩溃。当不需要这些模块时,又可以断开链接将其删除。Linux的模块可以用C语言来编写,用gcc来编译生成目标文件(不进行链接,作为*.o文件存在),为此需要在gcc命令里加入-c的参数。由于不进行链接,gcc只允许一个输入文本,因此一个模块的所有部分都必须在一个文件中实现
2016-01-18 10:56:53 2802
原创 NFS服务器的使用
(1)NFS服务器的启动和停止: 使用以下命令来查看NFS守护进程的当前状态:#service nfs statusrpc.mountd已停nfsd 已停rpc.rquotad已停 使用以下命令来启动NFS守护进程:#service nfs start 可使用以下命令来停止NFS守护进程:#service nfs stop 修改了NFS的配置
2016-01-16 19:32:20 647
原创 NFS文件的配置
NFS是干什么的? 开发时用到宿主机Windows系统、宿主机Llinux系统及目标机Linux系统,进程需要在不同文件之间进行共享文件。 宿主机Windows系统、宿主机Llinux系统之间的文件共享需要通过配置samba来实现 宿主机Llinux系统及目标机Linux系统之间的文件共享需要通过配置NFS(网络文件系统)来实现。
2016-01-16 18:00:57 887
原创 make命令与描述文件
make命令需要通过描述文件来描述文件之间的相互关系并且自动维护编译工作。 描述文件是一个文本形式的数据库文件,其中包含一些规则来告诉make命令处理哪些文件以及如何处理这些文件。 描述文件的基本结构: 一个描述文件包含一系列规则,但是每一条规则都包含的一些内容,如下: 一个target:即make
2016-01-16 11:36:38 760
转载 file_operation结构体详解
第一个 file_operations 成员根本不是一个操作; 它是一个指向拥有这个结构的模块的指针.这个成员用来在它的操作还在被使用时阻止模块被卸载. 几乎所有时间中, 它被简单初始化为 THIS_MODULE, 一个在 中定义的宏.这个宏比较复杂,在进行简单学习操作的时候,一般初始化为THIS_MODULE。loff_t (*llseek) (struct file
2016-01-15 21:26:06 1914
原创 为设备添加以太网(如何查看设置地址,子网掩码,网关)
本方法实验过且成功,实验平台Ubuntu14.04.1具体操作步骤: 1.首先将网线和设备与电脑连接好 2.在无线网连接中选择编辑连接 3.选择“添加” 4.选择“IPv4"->方法”手动“->地址”添加“ 5.现在要手动输入地址,子网掩码和网关,如果不知道按
2016-01-08 17:35:12 5912
原创 内核空间和用户空间
【内核空间和用户空间】: 我们通常将运行模式称作内核空间和用户空间。模块运行在所谓的内核空间里,而应用程序运行在所谓的用户空间里。每一个模式都有自己的内存映射,即自己的地址空间。两种操作模式在操作系统中的不同: 实际上操作系统的作用是为应用程序提供一个对计算机硬件的一致视图,必须负责程序的独立操作以及保护资源不受非法访问,而这个的完成必须依赖于CPU能够保护系统软件不受应用
2016-01-07 16:14:05 1523
原创 驱动程序前期环境搭建准备(配置、编译、烧写内核)
驱动程序前期环境搭建准备:【1】工具安装:安装交叉编译环境和minicom,tftp,nfs,partitionmanager 工具介绍参见:http://blog.csdn.net/ldan508/article/details/50353917 安装过程参见:http://blog.csdn.net/ldan508/art
2016-01-06 17:41:01 840 1
转载 区分ROM RAM DRAM SRAM DDRAM FLASH NOR FLASH
ROM:READ ONLY MEMORY,常用的硬盘存储器件,系统停电后依然保持数据;RAM:RANDOM ACCESS MEMORY,常用作内存器件,读写速度快于ROM,系统停电后,数据消失;DRAM:动态RAM,所谓“动态”,即当DRAM在供电状态,也需要不断刷新DRAM,对电容重新充电,才可以保持数据;SRAM:静态RAM,常用作高速缓存器件,读写速度快于DRAM,供电状态,不需
2016-01-06 17:14:52 879
原创 《Linux device driver》字符设备和scull
《Linux device driver》-字符设备驱动程序 (并非全部书本知识)主要通过介绍字符设备scull(Simple Character Utility for Loading Localities,区域装载的简单字符工具)的驱动程序编写,来学习Linux设备驱动的基本知识。 一、主设备号和次设备号主设备号表示设备对应的驱动程序;次
2016-01-01 19:08:27 737
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人