摘要:“小王,再告诉你一个好消息,今天是咱们设备驱动程序核心基础理论的最后一节课了,战斗就已经到了最后一刻了,开心不”我眉飞色舞的对小王说。 “嗯,开心,我挣扎许久了,终于结束了,只是..”小王伤感的说“只是我觉得怎么能一下就没了呢, 心里空荡荡的”. “没关系的…”看着小王噘着嘴调皮而又可爱的样子,我也心软了”核心的理论是讲完了,但你不是没动过手吗,还有很多路要走呢..我还舍…”我一把蒙住自己的嘴. 嘿嘿,心里咋想咋们都明白,是不…别伤感了,继续咱们上节的东西: 上节我们说到了dma_mem_alloc()函数,需要说明的是DMA的硬件使用总线地址而非物理地址,总线地址是从设备角度上看到的内存..
阅读全文
随笔分类 - Linux内核开发理论帖
本分类介绍了linux内核开发的基本理论知识,这部分知识是linux开发和驱动开发必备的基本知识.
摘要:“小王,告诉你一个好消息,最难理解的部分不知不觉中已经讲完了,今天的课程就简单多了,而且最重要的是咱们的Linux设备驱动核心理论课也差不多了…” “最难的部分?已经讲完了?我咋没感觉呢..你讲的真是太好了,太通俗易懂了,太..”小王调皮的说。 “切,就你嘴甜,我还不知道你啊,小脑筋..”我白了小王一样。 那么今天呢?今天就讲讲IO内存静态映射。在将Linux移植到目标电路板中,通常会建立外设IO内存物理地址到虚拟地址的静态映射,这个映射通过在电路板对应的 map_desc结构体数组中添加新的成员来完成,map_desc结构体的定义如下: struct map_desc{ unsigne...
阅读全文
摘要:时间:晚上7点 地点:寝室中.. “小王,今天就不多话了,接着昨天没讲完的,不然连不起来了,都..”我催促着。 上节讲到kmalloc()申请的内存若要被映射到用户空间可以通过mem_map_reserve()设置为保留后进行。具体怎么操作呢,给你一个模版吧: // 内核模块加载函数int __init kmalloc_map_init(void){ ../申请设备号,添加cedv结构体 buffer = kmalloc(BUF_SIZE, GFP_KERNEL); //申请buffer for(page = virt_to_page(buffer); page< virt_to_...
阅读全文
摘要:“小王,不瞒你说,我现在是悲喜交加啊,悲的是:这最后一章,我讲的是胆颤心惊(以前自己都没学好,现在也算还账了),喜的是每讲一张,我知道离结束就近了一点,赶快把这个东西过掉,进入下一环节,那又是我牛皮吹破天的时代了”看着小王期盼和怀疑的眼神,我,昔日的风采也不见了。 “没事的,小涛哥,其实说真的,不是我安慰你哈,从开始我什么都不懂,到现在我也算个入门级的高手了,都是你一手带过来的,我已经对你推崇备至了,你就放心吧,会的你尽情教,不会的,你慢慢说,我都听你的”小王善解人意的说。 “嗯,你真好,看来我没看错你,那好,继续课程”。。。 一般情况下,用户空间是不可能也不应该直接访问设备的,但是设备驱动.
阅读全文
摘要:“小涛哥,咱们说Linux设备驱动程序说了那么久,怎么从来不说实际设备呢,顶多就说了下内存,总感觉驱动程序是和设备分离的,怎么关联起来..”小王思索着。 “不错,这也正是这次讲课的内容,设备I/O端口与I/O内存的访问”我啊,禁不住拍拍她的头。 对于一块实际的设备而言,通常会提供一组寄存器来用于控制设备,读写设备和获取设备状态,也就是我们常说的控制寄存器,数据寄存器和状态寄存器。这些寄存器可能位于I/O空间(这时叫做I/O端口),也可能位于内存空间(对应的内存空间被成为I/O内存)。在Linux中提供了一系列的I/O端口和I/O内存操作的接口如下: 1)I/O端口操作:在Linux设备驱动..
阅读全文
摘要:“小王,今天咱们开始讲有关内存和I/O访问的内容,心里先要有点低,这部分内容还是有点烦,有点难的哦”说着话,我心里都没底,怕吓着小王,不瞒你说,当时看这部分,我可是没少费劲。 “哦,那咋办,不能不学是不?没事,有小涛哥在,俺就不怕”小王信心十足的说。 “哦!看不出来,还让你来安慰我了”看着小王这充满信心的样子,我也没啥顾虑了。好了,深吸一口气,开始今天的课程。 我们知道,在X86中,有I/O空间的概念,I/O空间是相对于内存空间的概念,它通过特定的指令in,out来访问。端口号标识了外设的寄存器地址。而巧的是Arm等嵌入式控制器中并不提供I/O空间,所以我们就不考虑了,我们重点放在内存空间。.
阅读全文
摘要:“小王,小王,今天可是这一章节最后一节了,知识点咱们前边都讲过了,今天主要是给你用前边的东西讲一个实际例子---秒字符设备驱动程序” 这个驱动程序会在被打开的时候初始化一个定时器并将其添加到内核定时器链表中,每秒输出一次当前的jiffies,这意味着,定时器处理函数中每次都要修改新的expires。不多说了,看代码分析:#include …//必要的系统头文件#define SECOND_MAJOR 252 /*预设的second的主设备号*/static int second_major = SECOND_MAJOR;struct second_dev /*second设备结构体...
阅读全文
摘要:晚上7点10分.. “小涛哥,这章不是叫Linux设备驱动程序之中断与时钟,前边你讲了中断,还给了我很多模版,我都看懂了,这次是不是要开始讲时钟了..” “真聪明,越来越喜欢你这聪明的样子了,说的不错,今天就要开始一个新的模块--内核时钟”我很少夸人,为啥今天夸她呢了,呵呵. 定时器,意思大家都明白,我就不说了,要是不明白,把它想成个闹钟总可以吧.. 定时器分为硬件和软件定时器,软件定时器最终还是要依靠硬件定时器来完成。内核在时钟中断发生后检测各定时器是否到期,到期后的定时器处理函数将作为软中断在底半部执行。实质上,时钟中断处理程序执行update_process_timers函数,该函...
阅读全文
摘要:“小涛哥,快醒醒,快醒醒..”小王使劲推着睡梦中的我,“你不是说今天要讲昨天有关的典型模板实例吗…” “啊?小姐啊,现在才早上8点,还让人睡觉不,别吵”我一头钻进被子里说。 “不管,谁让你昨天不说完,还卖个小关子,害我昨天晚上都没睡好,想了一晚上…” 我揉揉蒙蒙的眼说:“行,权当看在你渴求的心情上,但只此一次,下不为例,我还想好好睡懒觉呢..” 昨天我们讲了有关中断方面的东西,鉴于小王你不太懂,我今天就专门拿出一章来说说前边中断的使用典型模版,你照抄也方便不是: 1)在中断分类中,我们说到了有关向量中断和非向量中断,向量中断就是入口地址不同,进不同的地址做不同的事。那非向量中断则是进同一地址,
阅读全文
摘要:“小王,醒醒,开始上课了,今天咱们开始讲中断,这可是高级东西,错过不补哈”我使劲推着睡梦中的小王。 “嗯?感情好啊,快点,快点”小王一听有新东西讲,像打了鸡血似的兴奋,连我都怀疑起她是不是性格中喜新厌旧。 不管那么多了,我讲我的,她厌她的… 啥叫中断?就是指cpu在执行过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU有返回原程序被中断的位置并继续执行。 中断的分法不懂,分类就不同,向什么内外部中断,可/不可屏蔽中断…等等乱七八糟一大堆,我这里要说明的一点是按照中断入口跳转方法的不同,可分为向量中断和非向量中断。采用向量中断的CPU通常为不同的中断..
阅读全文
摘要:“小王呢,今天开始讲AIO与设备驱动,这也是设备驱动通知与异步IO的最后一节了,下次咱们就要开始讲更高级的东西,比如中断啦,时钟等” 在Linux内核中,每个IO请求都对应一个kiocb结构体,其ki_filp成员指向对应的file指针,通过is_sync_kiocb可以判断某Kiocb时候为同步IO请求,如果非真,表示是异步IO请求。 块设备和网络设备本身就是异步的。只有字符设备驱动必须明确指出应支持AIO.需要说明的是AIO对于大多数字符设备而言都不是必须的。只有少数才需要。 在字符设备驱动程序中,file_operations包含了3个和AIO相关的函数。如下: ssize_t ...
阅读全文
摘要:“小王,接着昨天的来,你知道吗?在异步IO中,什么可以用来做为AIO的通知呢?”我用渴求的眼神望着她. "啊?那我咋知道,你说的我能记住就不错了,让我发明创造,我可是不会."小王委屈道。 “笨死了,我前边花了那么多的时间来讲信号之类的东西,联想一下信号作为异步通知的信号,也想的出来啊,告诉你,我当年用脚肢头都能想到,可你..真让我失望”我叹气到,“算了,也不怪你了,咱们开始继续学习吧“。 先上代码:使用信号作为AIO异步IO通知机制 void setup_io(..){ int fd; struct sigaction sig_act; struct aiocb my_ai
阅读全文
摘要:小王,听说过AIO没?外国人,就这样,总是爱简写,简写的结果是咱们都不认识了。所谓AIO就是Asynchronous Input/Output异步输入/输出,基本思想是允许进程发起很多的I/O操作,而不用阻塞或等待任何操作的完成,稍后或在接收到I/O操作完成的通知时,进程就可以检索I/O操作的结果。 “得得,你咋又跟我上起课来了呢,不是说好,今天CS吗?是不是跟我讲课特自信啊“小王抱怨到。 “啊?不是吧,为啥这样呢,那你到底听不听,别到时面试叫天天不灵叫地地不应的,别再找我哈”我气愤的说。 "唉,你都这样说了,我也只能竖起耳朵好好听听了"看着小王极不情愿的表情,我也觉得很可
阅读全文
摘要:“曾经有一份真挚的爱情摆在面前,我却不懂珍惜;曾经有一个承诺,我却倍感珍惜,今天一定要好好讲讲..” 讲讲啥,讲讲上节说的那个异步通知的例子呗,大家喜欢看代码,咋们就先上代码:struct globalfifo_dev { struct cdev cdev; /*cdev结构体*/ unsigned int current_len; /*fifo有效数据长度...
阅读全文
摘要:“小王,听说过锦上添花吧..”我拍拍下王的头说。“还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我。“啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东东,看来现在是不行了”我吃惊道,“这样吧,这次就给你讲些和前边有关的东西,也不失为锦上添花不是?”。“好,我也是这么打算的,就是没好意思说,今天讲些啥呢?”小王暗淡的眼光总算闪了闪。(为啥这么难受呢,好像跟什么会嚎叫的特像,哈哈) 那就言归正传,今天我们讲---Linux设备驱动程序之异步通知与异步I/O.” 小王,前边不是讲了阻塞与非阻塞访问,poll()函数等提供的较好的解决设备访问的机制,那么通
阅读全文
摘要:“小王,来聊聊,今天面试的情况怎么样,应该挺顺利的吧..”看着小王平淡的眉头,我问道。 “唉,别提了,你说,我的运气咋这差呢,面试前你不是给我讲了有关阻塞的问题吗,我见了面试官是吧,还跟他好好的用今天排队的例子说了有关阻塞的问题,但是..”小王哀声叹气地说到。 “别但是了,怎么啦..” “可问题是面试官压根就没打算问我有关阻塞的问题及解决方案,但是问我说:这样吧,你给我说说在Linux设备驱动中有关非阻塞的方法,我这一听,傻眼了不是,你刚好给我讲的是阻塞的东西,可人家偏要问我有关非阻塞的问题,我..”小王欲哭无泪啊.. “怎么这样呢,算了,机会多的是,亡羊补牢,我现在就给你说说有关非阻塞的问题
阅读全文
摘要:十一过后.. 小王也刚好即将大学毕业,现在要开始写简历,投简历,找工作了。 到了家工作单位,小王欣喜若狂,可再一看,心都凉了半截.. “咋了,小王,看你找工作,我都来了帮你大气,怕什么,不就人多点吗..”看着排到电梯口的长龙,我说(其实,我心里也害怕,可也不能说出来不是)。 “不是,你不知道,我并不怕面试上有问题,有你在,技术上还是问题吗,不相信自己还不相信你啊,我主要是怕连面试的机会都没有,你看那么多人,不知道要排到哪里去了,你说每年都这样,那些人力主管部门的咋也不想个好办法来改善一下..”小王抱怨道。 “呵呵,有需求才会有进步”我哈哈大笑道,“要不这样吧,看这样子,正好给你说说有关Linu
阅读全文
摘要:"小王,小王,别睡了,瞧你,咋还睡着了呢…"我催促他说. "现在是公元前还是公元后啊,我的MM等急了没.."呵呵,看他一脸傻笑。 提醒各位路过的MM,如果没有男友的,可以联系小王,电话:拐拐拐。“什么,我的,呵呵,没办法,谁让我这有才呢..” 算算前边有关并发控制的有关内容,都到五了,一连来了十一招,今天也不好意思再卖官子了,做一个最后的实例总结篇,下一节,就要开始新的内容了哦,没赶上的可要加油了。 实例篇:1.定义带有设备并发控制方案的结构体(诸如信号量,自旋锁等,反正前边那么多了) 我是一名高手,告诉大家一个高手的习惯,就是喜欢也习惯把将某设备所使用
阅读全文
摘要:"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看MM的事,你在眉飞色舞,鸡飞狗跳的没完了呢…” "啊?怎么这样呢,本来一个寝室,做人的差别就那么大嗫,平时不好好学习,有问题了问我,给你免费教学,还满腹牢骚,也太不够朋友了吧…."我锤着桌子说. "朋友,我还不够朋友啊,你没听说吗:朋友为我,两肋插刀,我为朋友,插它两刀..“小王打断我,”听你念经似的,都三个小时了,你瞧,都来五了,怎么,你还想和老易的品三国pk一下谁的剧集..“ 想想我也无语了,太阳起了又落,落了又起;花儿也不知开了几次,都懒得理我了,我也寻思这个并发控制为啥就讲不完呢
阅读全文
摘要:出招表七:信号量(信号量其实和自旋锁是一样的,就是有一点不同:当获取不到信号量时,进程不会原地打转而是进入休眠等待状态) Linux系统中与信号量相关的操作主要有一下4种: 1)定义信号量 struct semaphore sem; 2)初始化信号量 void sema_init (struct semphore *sem, int val); //设置sem为val void init_MUTEX(struct semaphore *sem); //初始化一个用户互斥的信号量sem设置为1 void init_MUTEX_LOCKED(struct semaphore *sem); //初.
阅读全文