悟空学Linux专栏
gdlc2017
这个作者很懒,什么都没留下…
展开
-
悟空学Linux专栏----第6篇
研究了Linux内核的链表之后,悟空第一次被Linux内核高超的设计技巧所吸引,一个简单的双向链表中竟然包含了这么多的道理。悟空深深的被这些看似简单,却十分高效的设计所震撼。所以悟空决定好好的研究一下Linux内核管理数据的数据结构。悟空决定研究的第二数据结构就是队列。 然而研究完队列之后悟空感觉有点失望,他无法找到队列的设计中有什么令他感到震惊的地方,更没有什么地方让悟空感到神奇。无非都是原创 2015-07-08 10:49:42 · 353 阅读 · 0 评论 -
悟空学Linux专栏----第28篇
由于唐僧上的课很多笑声,加上唐僧比较帅,所以“西游嵌入式培训班”一下子火了,很多人纷纷跑来报名,其中美女最多。这着实让唐僧高兴了很久,但是高兴之后唐僧也纠结,这么多的学生,需要多少老师啊?唐僧要求他的三个徒弟都做老师,这样让悟空兴奋了很久。悟空心想,我原本是来学习Linux的,没想到自己竟然还有机会给别人上课,想想都激动啊。 唐僧给悟空安排的课是中断描述符表,但是悟空却连中断描述符表是什么都原创 2015-07-14 10:04:25 · 295 阅读 · 0 评论 -
悟空学Linux专栏----第37篇
俗话说人怕出名,猪怕壮,八戒一直很低调,但是他现在又壮有出名。人气爆棚,但也为八戒带来了不少的麻烦,比如今天,明明是悟空的课,唐僧却硬是让八戒来讲。八戒打算给学生们讲软中断的执行,这是八戒最喜欢讲的一节课。 八戒:同学们,软中断的执行其实很简单,主要是通过一个“while”循环来执行,该循环搜寻32个软中断挂起的软中断,如果搜寻发现该软中断被挂起了,则执行该挂起的软中断的中断执行函数。原创 2015-07-14 10:14:04 · 324 阅读 · 0 评论 -
悟空学Linux专栏----第29篇
今天悟空要讲的是中断的约束,这让悟空想起了师傅的紧箍咒,所以悟空一看到约束两字就有点不爽,总觉得这两个字扎眼。 悟空:中断是内核中执行最敏感的任务,因此需要满足一些约束。 A童鞋:那么需要遵守什么约束呢? 悟空(心想竟然有一个人没睡觉):第一个约束,就是,内核需要尽可能快的处理中断。 A童鞋:老师,那么怎样才能尽可能快的处理中断呢? 悟空:为了尽可能快的处理中断,Li原创 2015-07-14 10:05:09 · 289 阅读 · 0 评论 -
悟空学Linux专栏----第48篇
(Linux内核同步机制之自旋锁) 我们已经分析了Linux内核同步机制的信号量,发现信号量其实是基于自旋锁来实现的,现在我们就来看看Linux内核中的自旋锁吧! 那么自旋锁有什么特性呢? 自旋锁最多只能够被一个可执行线程持有,如果一个执行线程试图获得一个已经被持有的自旋锁,那么该线程就会一直进行忙等待,直到自旋锁被释放重新可用;如果锁没有被持有,请求自旋锁的线程便能立刻得到它,原创 2015-07-14 10:34:50 · 342 阅读 · 0 评论 -
悟空学Linux专栏----第1篇
孙悟空完成了护送唐僧到西天取得真经的任务之后,被如来封为“斗战胜佛”。可这“斗战胜佛”是个闲差,整天无所事事,这一晃1400多年就这么过去,最近孙悟空感觉自己都跟不上这个时代了,想学点新的本领。于是跑去请教他的师傅: 悟空曰:师傅我最近想学点东西,你说学什么好呢? 唐僧曰:你想学什么呢?是学《金刚经》还是《大悲咒》呢? 悟空曰:师傅你也太小看我了吧,这些我早会了,有没有新一点的啊原创 2015-07-07 14:54:53 · 372 阅读 · 0 评论 -
悟空学Linux专栏----第45篇
圆方的回答让悟空很郁闷,悟空感觉自己费了九牛二虎之力,可是结果依然和没有修改是一样的,这着实让悟空很是郁闷,郁闷之余悟空决定来一个更暴力的解决方法。悟空决定修改发送的流程,悟空将802.11网络协议栈的挂起函数给删除了。悟空发现这个测试的结果非常好,竟然再也没有出现假死的现象了。 解决了这个问题之后圆方很高兴,因为圆方的老板很高兴,圆方的老板给了圆方一大笔的奖金。但是悟空却高兴不起来,悟空之原创 2015-07-14 10:32:50 · 306 阅读 · 0 评论 -
悟空学Linux专栏----第33篇
最近八戒比较开心,自从上次他的18层梦的事情被媒体大肆报道之后,八戒就一下子成了网络红人。也正因为八戒的网上人气的不断攀升,所以越来越多的学生喜欢八戒的课了。这着实让八戒有点受宠若惊,所以八戒决定邀请悟空、唐僧、沙僧来听课。 八戒:同学们,大家好,我们今天要上的课是Linux中断的控制。 2号童鞋:老师,中断的控制是不是就是对中断的关闭和打开操作呢? 八戒:你理解的很对,中断控制原创 2015-07-14 10:10:43 · 306 阅读 · 0 评论 -
悟空学Linux专栏----第32篇
悟空最近比较郁闷,因为2号童鞋最近老是问悟空一些奇怪的问题。虽然大家都说2号童鞋很傻,但是悟空却觉得2号童鞋很聪明,因为如果悟空无法回答一个很傻的问题,那不是说明悟空更傻。悟空坚信自己不傻,所以悟空觉得2号童鞋很聪明。 比如今天上课2号童鞋就问悟空,request_irq函数的第二个参数的挂钩函数的设计需要注意什么问题。面对这个问题悟空压根就不知道怎么回答,你要知道悟空其实也是刚学Linux原创 2015-07-14 10:08:16 · 329 阅读 · 0 评论 -
悟空学Linux专栏----第51篇
(Linux内核同步机制之自旋锁) 到目前为止,我们讲解了什么事自旋锁,自旋锁的数据结构定义以及内核提供的自旋锁操作APIs。这一篇我们呢讲解一下使用自旋锁的需要注意的问题,来结束对自旋锁同步手段讨论。 首先,第一点需要明确的是,自旋锁是在SMP系统中为防止并发访问提供所需同步机制;在单处理器系统中,编译内核镜像的时候不会加入自旋锁代码,也即是在此时自旋锁代码无效; 第二点,自旋原创 2015-07-14 10:38:53 · 292 阅读 · 0 评论 -
悟空学Linux专栏----第50篇
(Linux内核同步机制之自旋锁) 自旋锁APIs(续): spin_unlock_irqrestore(lock, flags) 该宏释放自旋锁lock的同事,也恢复标志寄存器的值为变量flags保存的值。它与spin_lock_irqsave配对使用。 spin_unlock_irq(lock) 该宏释放自旋锁lock的同时,也使能本地中断。它与spin_lock原创 2015-07-14 10:37:58 · 305 阅读 · 0 评论 -
悟空学Linux专栏----第30篇
悟空感觉讲理论太无趣了,太枯燥了,所以悟空决定讲解一些实用的东西, 悟空打算这节课先讲解中断的使用。 悟空:顾名思义,中断使用之前需要登记注册。没有登记注册的中断是无法使用的,对Linux系统来说没有登记注册的中断就是黑户,Linux内核是不会处理这种中断的。Linux中断的注册函数如下为 Int request_irq(unsigned int irq, Irq_handler原创 2015-07-14 10:06:13 · 321 阅读 · 0 评论 -
悟空学Linux专栏----第31篇
自从悟空答应了“2号童鞋”下节课讲解Linux系统为什么不使用C++,而使用C作为主要语言之后。悟空就头大,查阅了很多资料,最后都没有得出一个比较有说服力的结论。这让悟空很是郁闷,心想自己要食言了,最后还是八戒给他出了一个主意,他让悟空去请教他们的达人老师。在悟空看来这就是个馊主意,但是除了这个馊主意悟空也没有其他办法了。 悟空之所以觉得这是一个馊主意,是因为自从唐僧开了“西游嵌入式培训班”原创 2015-07-14 10:07:08 · 310 阅读 · 0 评论 -
悟空学Linux专栏----第2篇
悟空回到家里之后按照唐僧教的方法废了九牛二虎之力终于从网上下载了内核源码,心里有点小兴奋,觉得自己终于可以踏上研究Linux内核的旅程了,想想这些心里更加兴奋了。可是当他打开内核源码之后,心里就凉了一半,面对着这么多的文件,都不知道该从那里下手,感觉比较迷茫。这时正好猪八戒来串门。 八戒:大师兄,忙啥呢? 悟空:在学习Linux。 八戒:最近我也在学习Linux,感觉这东西最近顶原创 2015-07-07 16:03:57 · 410 阅读 · 0 评论 -
悟空学Linux专栏----第7篇
有了队列的简单是最大的奥秘之后,悟空感觉自己找到了研究Linux内核代码的感觉了,每次悟空研究一段代码的时候,悟空都会拿这段代码设计的够不够简单来衡量代码的质量。而且悟空发现Linux内核中很多概念都遵循了这个原则,比如Linux中一切皆是文件的概念,也就是Linux中所有的东西都是文件,就连硬件设备也被称为设备文件。所有的操作都遵循文件的操作,大大简化了操作接口。 但是最近悟空碰到了一个令原创 2015-07-08 10:50:30 · 578 阅读 · 0 评论 -
悟空学Linux专栏----第8篇
悟空想了一夜还没有想明白为什么图4不是树,这让悟空很受打击。但是很受打击悟空也需要继续树的研究,悟空决定先把这个问题放一放,继续Linux内核的研究。接下来需要研究的是二叉树。二叉树是一种树,这种树的一个特点就是:最多只有两个出边。也就是将树的四个含义中的第三个含义修改为:顶点具有0个、1个或两个出边。 而二叉搜索树,也是一个二叉树,只不过这个二叉树是一个节点有序的二叉树,其顺序遵循以下法则原创 2015-07-08 10:53:50 · 302 阅读 · 0 评论 -
悟空学Linux专栏----第43篇
按照圆方的建议,悟空打开了无线驱动的debugfs功能。悟空通过模拟大数据通信的场景,测试了一个多小时候,发现无线果然不再发送数据了。悟空查看了debugfs之后,发现发送队列的状态位和802.11协议栈的状态出现了冲动。发送队列的状态为显示为802.11协议栈没有挂起,而802.11协议栈的状态却是挂起的状态。这让悟空怎么也想不通,所以悟空再次找到了圆方。 悟空曰:从测试的结果来看,发送队原创 2015-07-14 10:24:23 · 276 阅读 · 0 评论 -
悟空学Linux专栏----第35篇
因为悟空昨晚好好研究了一下软中断,所以悟空今天上课心里终于有底了。 悟空:Linux内核采用softirq_action结构体来表示软中断,具体结构体如下 struct softirq_action{ void (*action)(struct softirq_action *) }; 为了管理这些软中断,Linux内核中定义了一个数组,static struct s原创 2015-07-14 10:12:11 · 278 阅读 · 0 评论 -
悟空学Linux专栏----第27篇
由于唐僧请来了这么多木人上课,一下子增加了不少的人气,所以最近唐僧的这里迎来了很多学生报名试听,这着实让唐僧高兴了好一阵,唐僧心想终于不用对着木人上课了。所以唐僧打算好好上一下课,争取留住这些学生。为了能让课堂的氛围活跃一些,唐僧要求他的三个徒弟在课堂上要尽量保持活跃。 唐僧:今天我们上的是异常、intel将异常分为了四类:故障、陷阱、异常中止、编程异常。 这时八戒哈哈大笑。 唐原创 2015-07-14 10:01:50 · 466 阅读 · 0 评论 -
悟空学Linux专栏----第49篇
(Linux内核同步机制之自旋锁) 接着讲解自旋锁操作API! spin_lock_init(x); 该宏用于初始化自旋锁x,自旋锁在真正使用之前必须先初始化,该宏用于动态初始化; spin_unlock_wait(x) 该宏用于等待自旋锁x变得没有被任何执行单元保持,如果没有任何执行单元保持该自旋锁,该宏立即返回,否则将在循环在那里,直到该自旋锁被释放; sp原创 2015-07-14 10:36:36 · 312 阅读 · 0 评论 -
悟空学Linux专栏----第44篇
悟空讨厌关中断,关中断很暴力,但是再暴力也比导致系统异常好,所以悟空决定将所有的发送队列的自旋锁都使用关中断的自旋锁。修改完代码之后,悟空很开心,因为这是悟空第一次改正大牛错误的代码,能够找到别人的错误这让悟空很开心。但是测试的结果让悟空欲哭无泪,因为测试的结果告诉悟空,加锁之后的确保证标志位和802.11协议栈的状态保持了一致,但是另一个奇怪的问题出现了。802.11协议栈一直处于挂起状态,而一原创 2015-07-14 10:31:59 · 275 阅读 · 0 评论 -
悟空学Linux专栏----第36篇
一直以来“2号童鞋”都感觉自己比较笨,之所以感觉自己比较笨是因为这个世界有很多问题无法想明白,比如上节课老师为什么没有讲软中断的注销函数。为了想明白这个问题,“2号童鞋”失眠了好几晚,可是失眠了好几晚之后,“2号童鞋”依然无法想明白这个问题。 最后还是可爱的八戒老师告诉了“2号童鞋”原因,八戒告诉“2号童鞋”软中断是在Linux内核编译期间静态分配的,所以软中断一旦注册了就不会注销,因此Li原创 2015-07-14 10:13:09 · 377 阅读 · 0 评论 -
悟空学Linux专栏----第34篇
悟空最近明白了一个道理,你要教给“2号童鞋”一杯水,自己需要先准备一桶水,这个道理是唐僧教给悟空的。这让悟空感觉很郁闷,因为按照这个道理,悟空需要一桶水,那么唐僧应该教给他一池塘的水。但是唐僧却并没有教给悟空一池塘的水,所以悟空感觉自己无法教给“2号童鞋”一杯水。 唐僧还告诉悟空,如果没有人教给你一桶水,那么你就需要自学一桶水,所以悟空不得不自学一通水。悟空接下来需要讲的是软中断,所以悟空打原创 2015-07-14 10:11:21 · 320 阅读 · 0 评论 -
悟空学Linux专栏----第46篇
(Linux内核同步机制之信号量) 从这篇开始就来讲讲Linux内核的同步机制吧! 首先我们来看看semaphore信号量吧;定义在 struct semaphore { spinlock_t lock; unsigned int count; struct list_head wait_list; }; 其中lock为自选锁,放在结构体里面用于实现原创 2015-07-14 10:34:01 · 324 阅读 · 0 评论 -
悟空学Linux专栏----第42篇
有了圆方的思路,悟空决定设计一个测试程序,来验证一下。悟空给驱动程序加了很多的打印函数,悟空希望通过这些打印来判断发送队列最后处于什么状态。但是悟空测试了两天也没有测试出任何问题,所以悟空非常高兴,悟空跑去找到圆方,想把这一好消息告诉给圆方。 悟空曰:我家了很多打印函数,发现这个问题竟然不再出现了,那么是不是说这个问题已经解决了呢?圆方,你怎么看呢? 圆方曰:我觉得问题依然存在,只是你原创 2015-07-14 10:23:05 · 280 阅读 · 0 评论 -
悟空学Linux专栏----第41篇
为了尽快解决这个问题,悟空打算好好的研究一下该无线的驱动程序,悟空先花费了一晚的时间统计了一下驱动程序,总文件数为55个,总的代码行数为45954行。统计完之后悟空开始研究驱动的代码,可是看来看去,悟空都无法看出这些代码有什么问题,这让悟空头大,悟空打算问问圆方有什么好的思路。 悟空:我看了一下驱动代码,没有发现这段代码没有什么问题啊?圆方你怎么看呢? 圆方:如果我们要找出问题的所在,原创 2015-07-14 10:21:27 · 321 阅读 · 0 评论 -
悟空学Linux专栏----第15篇
今天悟空终于发现,原来八戒为了不让他扰乱达人上课,竟然偷偷的给达人换了课室。悟空心想算了,我还是换个身份去听课吧。悟空想扮八戒,但是又一想,八戒就在课堂上,扮八戒肯定穿帮,所以悟空想想还是扮三师弟沙僧算了。 达人:上次我们将时间的维护者timekeeper,而且系统会定时触发中断去执行do_timer函数,那么这个定时中断又是谁产生的呢?答案是时钟事件设备。 “沙僧”:时钟事件有什么特原创 2015-07-10 14:52:34 · 283 阅读 · 0 评论 -
悟空学Linux专栏----第13篇
下课之后悟空百思不得其解,为什么达人老师要敲他四下,这四下代表了什么含义呢?悟空想了很久也没有想明白,这时只听到外面的打更的人连敲四下。悟空这才恍然大悟,以前菩提老祖敲三下意味着三更给他开小灶,达人敲四下是不是叫我四更去找他啊?想到这悟空立马向达人家飞奔而去。 悟空体力比较好,不一会儿就到了,悟空看见达人家里的灯还开着。这让悟空感觉自己的猜想是对的,老师果然在等他。悟空按住心里的喜悦,连敲了原创 2015-07-10 14:31:57 · 392 阅读 · 0 评论 -
悟空学Linux专栏----第19篇
今天悟空早早地就下载了达人先生的课件,悟空打算接着昨天的问题继续研究。悟空先研究tv1、tv2、tv3、tv4、tv5中存放的数据的条件。按照达人老师的课件。tv1中存放的是定时器的到期时间减去tvec_base中的timer_jiffies(和jiffies相等)的值小于2^8的值的定时器,tv2是存放着这个值在2^8 ~2^14之间的定时器,tv3是存放着这个值在2^14 ~2^20之间的定时原创 2015-07-10 15:10:07 · 307 阅读 · 0 评论 -
悟空学Linux专栏----第18篇
解决了struct timer_list中的expires成员为什么是unsigned long类型的问题之后。悟空决定自己揭开为什么采用双向链表管理数据结构。悟空从网上下载了达人老师的课件,决定先研究定时器的软件架构,Linux内核采用如下的结构体表示: struct tvec_base { spinlock_t lock; struct timer_list *running原创 2015-07-10 15:08:00 · 317 阅读 · 0 评论 -
悟空学Linux专栏----第10篇
自从拜了达人先生为师之后,悟空感觉反而好多了,以前有什么问题还要变成猪八戒的样子去请教达人。现在好了有什么问题可以直接向达人请教了,而且达人还免费为他的徒弟开了嵌入式培训班,每周一都可以来培训班听课。 今天是悟空第一天来培训班,今天培训的是Linux内核的时间子系统。 达人:人们习惯的时间的表示方式是:年、月、日、时、分、秒。但是Linux内核没有采用这种方式表示时间。 悟空:老原创 2015-07-08 10:55:41 · 344 阅读 · 0 评论 -
悟空学Linux专栏----第12篇
为了提高上课的学习效率,悟空在上课之前先预习一下,预习的时候发现了两个问题。一个是struct clocksource结构体中的read函数,这个函数是一个挂钩函数,那么这个挂钩函数最后调用的是什么函数呢?Linux内核又为什么要设计这个挂钩函数呢?直接调用不就得了吗?第二个就是这个函数返回的是一个cycle计数值,也就是时钟周期的计数值,要将这个值转换为时间,就必须知道时钟频率,而这个结构体中却原创 2015-07-08 10:57:48 · 353 阅读 · 0 评论 -
悟空学Linux专栏----第11篇
上节课悟空感觉受益匪浅,听课果然比自学效果要好,所以这次悟空一大早就来。今天达人先生要讲的是时钟源。 达人:上节课我们讲的是Linux时间的表示方法。 悟空:老师,那么Linux系统的时间是哪里来的呢? 达人:Linux系统的时钟是由时钟源产生的,软件用结构体struct clocksource表示时钟源。在硬件上面,这个时钟源往往是一个固定频率的计数器,这个计数器只能单调递增,原创 2015-07-08 10:57:01 · 294 阅读 · 0 评论 -
悟空学Linux专栏----第5篇
悟空决定按照Linux达人教的方法研究Linux内核,他想首先研究Linux内核中数据结构,第一个吸引悟空的是Linux双向链表。 很多程序设计双向链表的方式是如下: Struct fox{ Int tail_length; Int weigth; Struct fox *next; Struct fox *prev; }; 但是Linux内核的双向原创 2015-07-08 10:48:32 · 414 阅读 · 0 评论 -
悟空学Linux专栏----第3篇
原来Linux内核中有一张代码地图呀,哈哈,悟空还是挺高兴的,心觉着吧,这下可以根据这张内核地图来研究内核代码了吧。怀着这兴致,打开内核根目录下的Makefile文件一看,哎呀!完全看不懂呀有木有?悟空的心情瞬间低落了下来,看来有了内核地图,路还是没那么容易走呀!面对Linux内核这汪洋的大海,悟空心想,还是从干中学吧,先编译个内核镜像来看看先,可是如何编译呢?还是请教一下师傅吧,于是悟空拨通了唐原创 2015-07-07 16:06:03 · 344 阅读 · 0 评论 -
悟空学Linux专栏----第9篇
研究完了什么是红黑树之后,悟空决定研究的下一个问题是:红黑树有什么特点?为什么要给这个半平衡二叉树着色呢?悟空感觉一个人研究太累了,还是去找人请教来的快。这次悟空还是想到了达人先生,悟空决定再次变成八戒来请教达人。 “八戒”:师傅,你说红黑二叉树有什么特点啊? 达人:红黑二叉树的最大特点就是它的算法复杂度小。采用红黑二叉树存储数据,搜索到需要搜索的数据的时间比采用其他结构存储数据搜索的原创 2015-07-08 10:54:41 · 448 阅读 · 0 评论 -
悟空学Linux专栏----第16篇
悟空觉得课堂估计是去不了,所以自己打算在家里继续自学,悟空知道达人老师接下来需要讲的是低分辨率的定时器。所谓定时器就是设定一个未来的时间,让系统在这个未来的时间触发一个特定的事件,执行一些预先设定的程序。低分辨率的定时器的计时单位是jiffies的值,也就是精度只能达到1/HZ,以HZ=1000为例,意味着系统定时器的精度就是1ms。 低分辨率的定时器用struct time_list结构体原创 2015-07-10 14:55:09 · 317 阅读 · 0 评论 -
悟空学Linux专栏----第17篇
悟空正在低分辨率的定时器的问题而烦恼,这时沙师弟跑来找悟空诉苦,沙师弟说就因为他上课睡觉了,八戒就将他狠狠的揍了一顿,他要悟空给他主持公道。悟空没心思理他。 悟空自言自语:为什么struct timer_list中表示时间采用了unsigned long表示呢? 沙僧:这个我知道啊。因为低精度定时器的触发处理函数是由内核的tick产生的啊,而tick是基于jiffies来处理的,而ji原创 2015-07-10 15:04:39 · 292 阅读 · 0 评论 -
悟空学Linux专栏----第40篇
最近有个公司找到唐僧,希望唐僧给他解决一个驱动程序的bug,该公司最近开发了一款无线路由器,客户在使用这款路由器的时候经常用着、用着就无法上网了,而且不管怎么重链,再也链接不上了,但是从串口看系统还是正常运行,而且CPU的负荷也不高。唐僧把这个任务交给了悟空,为了尽快解决这个问题该公司还特意安排了一个经验丰富的嵌入式工程协助悟空,这个工程师叫圆方,每次悟空和他讨论问题的时候,悟空说的最多的一句话就原创 2015-07-14 10:20:37 · 268 阅读 · 0 评论 -
悟空学Linux专栏----第39篇
最近沙僧休息了好久,唐僧希望沙僧能够讲工作队列,工作队列是Linux系统中最为重要的一个中断后半部分机制,也是最为实用的一种。这让沙僧很是高兴,所以一大早沙僧就兴奋的来到了课堂。 沙僧:工作队列其实是将任务交给一个内核线程来执行,因此这部分代码总是在进程的上下文中执行。 2号童鞋:老师,工作队列的线程和软中断的线程有什么区别呢? 沙僧:啊,软中断中也有线程啊?这个我还真不知道哦?原创 2015-07-14 10:19:50 · 346 阅读 · 0 评论