摘要:
本文基于2.6.11内核简单介绍了中断处理的过程。本文是一个概述性质的整理,可能没有对每段代码有详细的分析,但希望读者看完之后对整个过程有大致了解。详细的文档请参考这篇论文以及这篇精华帖子,还有这里。整个中断大致的过程(注:本处并不仅仅指中断处理程序)可以描述如下:硬件中断==>CPU在指令周期的最后检测到有中断==>中断应答时序提供8位矢量(中断号)==>根据IDTR找到IDT表(idt_table)==>再根据中断号在IDT表中找到对应的描述符(irq_desc_t)==>根据描述符,调用对应的IRQ0xNN_interrupt,实际上就是调用common_i 阅读全文
摘要:
(1)底层数据结构:双向链表在进程管理中,双向链表是一个基础性的数据结构(后面涉及到的运行队列和等待队列等都使用了这个数据结构)。它的声明如下(虽然名称中含有head,但实际上每个结点都是相同的):struct list_head {struct list_head *next, *prev;};其中含有指向前一节点和后一节点的指针。而作为双向链表,提供的主要操作就是添加/删除元素、遍历链表(特别是list_for_each()函数很重要,可以对每个元素采取相同的操作)。(2)进程描述符进程描述符是一个名为task_struct的C结构(进程也就是任务,所以叫task),其中包含了进程所有的信 阅读全文
摘要:
Linux的内存管理应该是Linux最核心和最复杂的部分之一。因为个人理解水平有限,所以只能根据自己的思路概述,细节还需要更多的去相关参考文献(《深入理解Linux内核》第三版中文版,以下简称《深入》,我买了一本纸版的)中探寻。(英文版可以从网上搜到,我的skydrive中有一份chm的版本,点这里)。(1)逻辑地址、线性地址(虚拟地址)与物理地址下面的图表示三者之间的转化关系。逻辑地址通过分段转化为线性地址,而线性地址通过分页转化为物理地址。分段单元和分页单元都是内存控制单元(MMU)的组成部分。这三种地址中的核心是线性地址。线性地址永远是32位的无符号整形,可以用来表示4GB的地址空间(2 阅读全文
摘要:
分段和分页其实都是一种对地址的划分或者映射的方式。两者的区别主要有以下几点:a) 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。b) 页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的 阅读全文
摘要:
Linux内核网络协议栈笔记0:序言(附参考书籍)自己是研究网络的,但实际上对Linux中网络协议栈的实现知之甚少。最近看完《深入理解Linux内核》前几章之后(特别是与网络子系统密切相关的软中断),觉得可以而且应该看一下网络协议栈了。这部分网上的文章大部分都没有什么结构和思路,很少有能够条分缕析的把协议栈讲述明白的。当然,个人水平有限,还是希望朋友们能够批评指正。参考书籍《Understanding Linux Network Internals》以及《The Linux Networking Architecture Design and Implementation of Network 阅读全文