2015年2月16日

摘要: 一、 当应用程序要对某个资源进行访问的时候,如果这个资源没有或者说被占用,这个应用程序就要进入阻塞状态,在linux系统中它会进入一个内核等待队列,等到被唤醒之后才能运行。这就是阻塞机制,它对一个驱动程序来说是很重要和必要的。二、如何使用等待队列 1、定义等待队列 wait_queue_... 阅读全文

posted @ 2015-02-16 23:55 Bumble_Bee 阅读(252) 评论(0) 推荐(0) 编辑

摘要: Linux使用struct timer_list来描述一个定时器。 重要成员: expires:定时时长 *function:超时执行函数名使用流程: 1、定义定时器变量/*定义定时器变量结构体*/struct timer_list key_timer; 2、初始化定时器 a... 阅读全文

posted @ 2015-02-16 23:38 Bumble_Bee 阅读(174) 评论(0) 推荐(0) 编辑

摘要: 一、中断嵌套 当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套。当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束了;当中断为快速中断时,新的终端就不会产生。这两种情况都是我们不愿意看到的情况,所以就有了今天的题目——中断分层。二、中断分层 中断分层是将... 阅读全文

posted @ 2015-02-16 23:25 Bumble_Bee 阅读(314) 评论(0) 推荐(0) 编辑

摘要: Linux进行中断处理的4个步骤: 1、当中断产生,跳到统一入口IRQ_SVC 2、获取中断号 3、根据中断号找到irq_desc结构 4、从irq_desc结构中取出事先注册好的中断处理函数Linux中断处理程序设计: 1、注册中断 2、实现中断处理函数 3、注销处理一、注册中断 ... 阅读全文

posted @ 2015-02-16 22:58 Bumble_Bee 阅读(292) 评论(0) 推荐(0) 编辑

摘要: 一、混杂设备 Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice... 阅读全文

posted @ 2015-02-16 22:44 Bumble_Bee 阅读(592) 评论(0) 推荐(0) 编辑

摘要: LED的驱动程序很简单,按照张字符型设备驱动设计方法顺下来即可实现,这里主要讲几个注意事项。 一、在linux系统中,操作硬件不能够使用物理地址,一定要用虚拟地址。将物理地址转化为虚拟地址的函数如下: #defineioremap(cookie,size) 其中cookie为要转化的物... 阅读全文

posted @ 2015-02-16 22:33 Bumble_Bee 阅读(282) 评论(0) 推荐(0) 编辑

摘要: 引入: 有时对设备不仅仅是进行一些读写操作,还需要进行一些对设备的控制,比如LED的点燃与熄灭,电机的转速等。那就需要使用到ioctl这个系统调用。先来看看他的函数原型: intioctl(int fd,unsigned int cmd, ...); 参数: fd:字符设备文件的文件描述... 阅读全文

posted @ 2015-02-16 18:23 Bumble_Bee 阅读(179) 评论(0) 推荐(0) 编辑

摘要: 今天来总结一下这几天字符设备驱动的学习吧。 首先要明白这几天的学习是围绕哪些角色展开的。我认为主角有这三个:驱动程序、字符设备文件、用户应用程序。而这些角色的出场顺序应该也是这样:应该先有驱动程序,然后有字符设备文件,最后才有用户应用程序。驱动程序要做的事情有这么几个: 1、初始化好驱动,分... 阅读全文

posted @ 2015-02-16 18:16 Bumble_Bee 阅读(161) 评论(0) 推荐(0) 编辑

摘要: 一、设备描述结构 在任何一种驱动模型中,设备都会用内核中的一种结构来描述,字符设备在内核中使用struct cdev结构体来描述。1 struct cdev {2 struct kobject kobj;3 struct module *owner;4 const stru... 阅读全文

posted @ 2015-02-16 18:13 Bumble_Bee 阅读(306) 评论(0) 推荐(0) 编辑

摘要: 应用程序通过操作字符设备文件来控制字符设备,字符设备文件通过主设备号操作字符设备。 创建字符设备文件 使用mknod命令 mknod /dev/文件名 c 主设备号 次设备号 其中c为char的缩写,意为字符设备。主设备号用cat /proc/devices命令查询,次设备号为0-25... 阅读全文

posted @ 2015-02-16 18:01 Bumble_Bee 阅读(202) 评论(0) 推荐(0) 编辑

摘要: 一、驱动分类 1、常规分类法 a、字符设备 一种以字节为最小访问单位的设备,通常支持open,close,read,write等系统调用。属于这种设备的有led,串口等。 b、块设备 最小访问单位为512字节或512的倍数,flash等。 c、网络接口设备 ... 阅读全文

posted @ 2015-02-16 17:59 Bumble_Bee 阅读(121) 评论(0) 推荐(0) 编辑

摘要: 一、 Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲。由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用。/*********************************** 文件名:kernel link list of linux.h作者:Bu... 阅读全文

posted @ 2015-02-16 17:54 Bumble_Bee 阅读(641) 评论(0) 推荐(0) 编辑

摘要: 一、Linux内存管理模型 1、虚拟地址与物理地址的映射 2、物理地址的分配二、虚拟地址与物理地址的映射 1、虚拟地址空间分布 32位处理器有32根地址总线,可访问4G的物理空间。其中有0-3G为用户程序空间,剩下3-4G为内核空间。内核空间又分为如下四个部分。 A、直接映射区:3... 阅读全文

posted @ 2015-02-16 17:35 Bumble_Bee 阅读(349) 评论(0) 推荐(0) 编辑

摘要: 前一次讲的三个要素是编写内核模块必不可少的三个信息,今天讲的这些是可选信息,可写可不写。 一、模块申明 MODULE_LICENSE("GPL"); 声明模块遵守的协议 MODULE_AUTHOR("Bumble Bee"); 声明模块编写的作者 MODULE_DESCRIPTI... 阅读全文

posted @ 2015-02-16 17:32 Bumble_Bee 阅读(137) 评论(0) 推荐(0) 编辑

摘要: 一、关于内核模块 如果将所有的组件全部编入内核映像太浪费内存空间。比方说USB驱动,我只需要它运行1分钟,那么在剩余内核运行的59分钟都没有使用到它,但是他却一直占用着系统资源,显然这很不科学,所以就有了今天的题目——内核模块设计。 内核模块特点: 1、不被编译进内核文件 2、在内核... 阅读全文

posted @ 2015-02-16 17:24 Bumble_Bee 阅读(231) 评论(0) 推荐(0) 编辑

摘要: 昨天编译并下载好了内核,但是内核还是无法正常启动,原因就是没有挂载根文件系统。今天讲的就是如何去创建一个根文件系统并将它挂载到内核上。 一、创建根文件系统 1.创建目录 #mkdir rootfs #cd rootfs #mkdir bin dev etc ... 阅读全文

posted @ 2015-02-16 17:14 Bumble_Bee 阅读(448) 评论(0) 推荐(0) 编辑

摘要: 今天来总结一下mini2440的内核制作过程。 一、 将内核文件拷贝至目标目录,解压。 二、清除中间文件 命令:make distclean 三、配置内核文件 将开发板厂商制作好的内核文件拷贝至内核文件目录,并命名为.config,退出保存。 这里有个特别坑的,就是老... 阅读全文

posted @ 2015-02-16 17:06 Bumble_Bee 阅读(288) 评论(0) 推荐(0) 编辑

摘要: Uboot的学习主要是uboot的一些命令的学习,难度不大,下面逐一介绍。 1、help 查看uboot中的命令及其用法 2、printenv/print 查看环境变量 环境变量是保存的系统配置的信息 3、setenv 添加、修改、删除环境变量 用法:setenv环境变量 值 (添加、修改) 例:s... 阅读全文

posted @ 2015-02-16 16:54 Bumble_Bee 阅读(304) 评论(0) 推荐(0) 编辑

摘要: 突然发现自己之前写的笔记还挺多的,裸机应用这两部分的还有几十篇,最近在搞驱动,就先不把这两部分的笔记搬到这里了吧,以后有时间再搞。驱动还在学习中,全部都会发上来的! 阅读全文

posted @ 2015-02-16 16:45 Bumble_Bee 阅读(115) 评论(0) 推荐(0) 编辑

摘要: Linux应用程序在内存中的布局,由高地址到低地址依次为:栈、堆、BSS段、数据段、代码段。代码段的起始地址固定为0x8048000,无论哪一个应用程序它的代码段起始地址一定是0x8048000,这里的地址虚拟地址,映射到不同的物理地址中去。 查看程序各段的地址 ps aux ... 阅读全文

posted @ 2015-02-16 16:37 Bumble_Bee 阅读(873) 评论(0) 推荐(0) 编辑