摘要: 本文基于2.6.11内核简单介绍了中断处理的过程。本文是一个概述性质的整理,可能没有对每段代码有详细的分析,但希望读者看完之后对整个过程有大致了解。详细的文档请参考这篇论文以及这篇精华帖子,还有这里。整个中断大致的过程(注:本处并不仅仅指中断处理程序)可以描述如下:硬件中断==>CPU在指令周期的最后检测到有中断==>中断应答时序提供8位矢量(中断号)==>根据IDTR找到IDT表(idt_table)==>再根据中断号在IDT表中找到对应的描述符(irq_desc_t)==>根据描述符,调用对应的IRQ0xNN_interrupt,实际上就是调用common_i 阅读全文
posted @ 2011-05-12 00:55 微型葡萄 阅读(570) 评论(1) 推荐(0)
摘要: (1)底层数据结构:双向链表在进程管理中,双向链表是一个基础性的数据结构(后面涉及到的运行队列和等待队列等都使用了这个数据结构)。它的声明如下(虽然名称中含有head,但实际上每个结点都是相同的):struct list_head {struct list_head *next, *prev;};其中含有指向前一节点和后一节点的指针。而作为双向链表,提供的主要操作就是添加/删除元素、遍历链表(特别是list_for_each()函数很重要,可以对每个元素采取相同的操作)。(2)进程描述符进程描述符是一个名为task_struct的C结构(进程也就是任务,所以叫task),其中包含了进程所有的信 阅读全文
posted @ 2011-05-12 00:54 微型葡萄 阅读(405) 评论(0) 推荐(0)
摘要: Linux的内存管理应该是Linux最核心和最复杂的部分之一。因为个人理解水平有限,所以只能根据自己的思路概述,细节还需要更多的去相关参考文献(《深入理解Linux内核》第三版中文版,以下简称《深入》,我买了一本纸版的)中探寻。(英文版可以从网上搜到,我的skydrive中有一份chm的版本,点这里)。(1)逻辑地址、线性地址(虚拟地址)与物理地址下面的图表示三者之间的转化关系。逻辑地址通过分段转化为线性地址,而线性地址通过分页转化为物理地址。分段单元和分页单元都是内存控制单元(MMU)的组成部分。这三种地址中的核心是线性地址。线性地址永远是32位的无符号整形,可以用来表示4GB的地址空间(2 阅读全文
posted @ 2011-05-12 00:53 微型葡萄 阅读(450) 评论(0) 推荐(0)
摘要: 分段和分页其实都是一种对地址的划分或者映射的方式。两者的区别主要有以下几点:a) 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。b) 页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的 阅读全文
posted @ 2011-05-12 00:50 微型葡萄 阅读(1004) 评论(0) 推荐(0)
摘要: Linux内核网络协议栈笔记0:序言(附参考书籍)自己是研究网络的,但实际上对Linux中网络协议栈的实现知之甚少。最近看完《深入理解Linux内核》前几章之后(特别是与网络子系统密切相关的软中断),觉得可以而且应该看一下网络协议栈了。这部分网上的文章大部分都没有什么结构和思路,很少有能够条分缕析的把协议栈讲述明白的。当然,个人水平有限,还是希望朋友们能够批评指正。参考书籍《Understanding Linux Network Internals》以及《The Linux Networking Architecture Design and Implementation of Network 阅读全文
posted @ 2011-05-12 00:44 微型葡萄 阅读(3763) 评论(0) 推荐(0)
摘要: 【问题】活动选择问题的大致意思就是在一种只能被独占的资源上,现在有很多事务(这些事务只有两个参数:开始时间和结束时间)在竞争使用这个资源,如何能让更多数目的事务使用这个资源。计算机科学中的例子:比如这个资源是CPU,那么好多进程要竞争使用CPU,那么如何能让CPU处理更多的进程。现实生活中的例子:某大学里只有一间活动教室,用于举办各种学生活动。现在有学生会的各个部门来申请这间教室,如何分配这个教室,能使得这个活动教室举办活动更多呢?当然,我们仅仅考虑活动的开始和结束时间,而不考虑活动的优先级之类的。【参考文献】http://blog.csdn.net/a9529lty/archive/2009 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(870) 评论(0) 推荐(0)
摘要: 【方法一】函数参数与局部变量。函数参数先入栈,然后才是局部变量。如下面的代码,1-向上生长;0-向下生长。int stackDir( int x ) { int a; return (&a - &x)>0; }注意:不推荐同时使用两个局部变量的地址进行判断,因为有的时候编译器会做优化。【方法二】声明在两个不同函数作用域中的局部变量。如下面的代码:#include <iostream>#include <string>#include <algorithm>using namespace std;void func(){int temp; 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(288) 评论(0) 推荐(0)
摘要: 【问题】原文参见这里:http://yueweitang.org/blog/posts/rotate-coin-games.html原文中只给出了一个结果,但是没有分析过程。最后我逆向了一下,有点拾人牙慧。我再引用一下人家的题目:Alice和Bob两人玩一种硬币游戏。游戏在一个的棋盘上进行,棋盘上每个格子上都有一枚硬币。在每一回合,Alice可以决定选择翻转某两枚或者一枚硬币,接着Bob可以选择将棋盘旋转90,180或者270度,也可以什么都不做。 游戏轮流进行直到棋盘上所有硬币都正面朝上或者反面朝上,Alice获得胜利。 如果Alice在游戏过程中无法看到棋盘上的银币,也不知道游戏刚开始的状 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(1464) 评论(0) 推荐(0)
摘要: 下面是两道常见笔试题:栈的原地排序。(注:所谓原地就是指不需要额外的辅助空间,或者只需要常数个额外空间)栈的原地倒转。但是在这里递归的思想非常抽象,但是又不得不让人叹服!(我也是看了别人的答案,简直太经典了!)另外,虽然不允许另外使用额外空间,但实际上递归本身就要很多空间。。。【栈的原地倒转】这里的递归思想用语言描述太复杂,但是您一看代码,加上那一点注释,很快就能明白的。相信你也会为这个递归的用法感到奇妙!#include <iostream>#include <stack>using namespace std;//display the stackvoid prin 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(357) 评论(0) 推荐(0)
摘要: 数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:前序+中序,前序+后序,中序+后序),唯一的确定一棵二叉树。然后就是根据二叉树的不同遍历序列(前序、中序、后序),重构二叉树。下面是这个问题的证明与结论:①给定二叉树结点的前序序列和对称序(中序)序列,可以唯一确定该二叉树。证明:因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两部分,左边(设1个元素)表示左子树,若左边无元素,则说明左子树为空;右边(设r个元素)是右子树,若为空,则右子树为空。根据前序遍历中"根-左子树-右子树"的顺序,则由从第二元素开始的1个结点序列和中序序列根左边的1 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(4888) 评论(0) 推荐(1)