摘要: 本文基于2.6.11内核简单介绍了中断处理的过程。本文是一个概述性质的整理,可能没有对每段代码有详细的分析,但希望读者看完之后对整个过程有大致了解。详细的文档请参考这篇论文以及这篇精华帖子,还有这里。整个中断大致的过程(注:本处并不仅仅指中断处理程序)可以描述如下:硬件中断==>CPU在指令周期的最后检测到有中断==>中断应答时序提供8位矢量(中断号)==>根据IDTR找到IDT表(idt_table)==>再根据中断号在IDT表中找到对应的描述符(irq_desc_t)==>根据描述符,调用对应的IRQ0xNN_interrupt,实际上就是调用common_i 阅读全文
posted @ 2011-05-12 00:55 微型葡萄 阅读(534) 评论(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 微型葡萄 阅读(401) 评论(0) 推荐(0) 编辑
摘要: Linux的内存管理应该是Linux最核心和最复杂的部分之一。因为个人理解水平有限,所以只能根据自己的思路概述,细节还需要更多的去相关参考文献(《深入理解Linux内核》第三版中文版,以下简称《深入》,我买了一本纸版的)中探寻。(英文版可以从网上搜到,我的skydrive中有一份chm的版本,点这里)。(1)逻辑地址、线性地址(虚拟地址)与物理地址下面的图表示三者之间的转化关系。逻辑地址通过分段转化为线性地址,而线性地址通过分页转化为物理地址。分段单元和分页单元都是内存控制单元(MMU)的组成部分。这三种地址中的核心是线性地址。线性地址永远是32位的无符号整形,可以用来表示4GB的地址空间(2 阅读全文
posted @ 2011-05-12 00:53 微型葡萄 阅读(427) 评论(0) 推荐(0) 编辑
摘要: 分段和分页其实都是一种对地址的划分或者映射的方式。两者的区别主要有以下几点:a) 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。b) 页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的 阅读全文
posted @ 2011-05-12 00:50 微型葡萄 阅读(994) 评论(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 微型葡萄 阅读(3711) 评论(0) 推荐(0) 编辑
摘要: 【问题】现在有一种彩票,总的有N个选择(比如36选7,那么总的选择就是36种),请问期望用多少次可以取到所有的彩票(有放回--当然,没放回就简单了。。。)?同样的一个题目就是:一个袋子里放N个不同的球,有放回的取球。请问期望用多少次可以取到所有不同的球?【解答】粗略的答案,这个期望次数是随着N的规模成O(N*logN)的规模扩大的。下面是分析:我们采取递推的方式,假设现在已经取到了i-1个不同的球或者不同的彩票(我们下边都用球代替),那么下一次取到第i个球的概率是:( N - ( i - 1 ) ) / N这个很显然:下次想取到一个跟以前的球不同的球,显然是在剩下的N-(i-1)个球中任取一个 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(5481) 评论(1) 推荐(0) 编辑
摘要: 所谓子集,是一个数学中的概念。例如一个集合S = {1,2,3,4,5},那么X = {1,3,5}就是它的一个子集,1+3+5等于9就是对应于X的一个子集和。其实子集对于一个数组来说,就是相当于一个子序列(不是子数组,因为子序列意味着可以不连续,而子数组往往是连续的);那么子集和也就是子序列和。另外,子集问题需要与数学中的“排列”问题区分开来。因为子集往往是无序的,但排列是需要考虑顺序的;所以子集问题常常只是一个“组合”问题,而不是“排列”问题。从另一个角度讲,这种子集和问题是一种背包问题的特例。【问题1】下面举一个退化(之所以说退化,因为这里的子集的大小是2,比较特殊)的子集和问题的例子, 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(7807) 评论(0) 推荐(3) 编辑
摘要: 【问题】区间覆盖问题(Interval Cover Problem)常常又叫区间重合问题。一般情况下是求最少区间覆盖,顾名思义,就是用最少数量的小区间去覆盖一个更大的区间。但是本文所说的问题仅仅指的是:判断一个源区间能否被若干给定的已知区间覆盖,是个判断题。【例题】《编程之美》P211的“区间重合判断”就是一种区间覆盖问题。题目:给定源区间[1,6]和一组无序的目标区间[2,3][1,2][3,9],即可认为区间[1,6]在区间[2,3][1,2][3,9]内。【分析】参见编程之美。主要分以下三步:(1)排序。(2)合并。(3)搜索。(1和3具体请看编程之美书中的介绍)下面我只是讲解我的对“合 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(1474) 评论(0) 推荐(0) 编辑
摘要: 数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:前序+中序,前序+后序,中序+后序),唯一的确定一棵二叉树。然后就是根据二叉树的不同遍历序列(前序、中序、后序),重构二叉树。下面是这个问题的证明与结论:①给定二叉树结点的前序序列和对称序(中序)序列,可以唯一确定该二叉树。证明:因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两部分,左边(设1个元素)表示左子树,若左边无元素,则说明左子树为空;右边(设r个元素)是右子树,若为空,则右子树为空。根据前序遍历中"根-左子树-右子树"的顺序,则由从第二元素开始的1个结点序列和中序序列根左边的1 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(4788) 评论(0) 推荐(1) 编辑
摘要: 下面是两道常见笔试题:栈的原地排序。(注:所谓原地就是指不需要额外的辅助空间,或者只需要常数个额外空间)栈的原地倒转。但是在这里递归的思想非常抽象,但是又不得不让人叹服!(我也是看了别人的答案,简直太经典了!)另外,虽然不允许另外使用额外空间,但实际上递归本身就要很多空间。。。【栈的原地倒转】这里的递归思想用语言描述太复杂,但是您一看代码,加上那一点注释,很快就能明白的。相信你也会为这个递归的用法感到奇妙!#include <iostream>#include <stack>using namespace std;//display the stackvoid prin 阅读全文
posted @ 2011-05-11 22:57 微型葡萄 阅读(351) 评论(0) 推荐(0) 编辑