Archive for the ‘Linux’ category

list.h解析与应用

September 3rd, 2014

双链表的应用在内核中随处可见,list.h头文件集中定义了双链表(struct list_head结构体)的相关操作。

关于list.h的分析,网上资料很多,这里只是记录我在分析list.h中遇到的问题。

struct list_head结构体:
struct list_head
{
struct list_head *next;
struct list_head *prev;
};

这个结构经常作为成员与其他数据类型一起组成一个新的结构体(后文若无特别提示,“新结构体”均指类似下面举例的嵌套型结构体),比如: » Read more: list.h解析与应用

OS的分页分段(笔记)

September 2nd, 2014

我们从80386处理器入手。首先,到了80386时代,CPU有了四种运行模式,即实模式、保护模式、虚拟8086模式和SMM模式。

实模式其大致包括实模式1MB的线性地址空间、内存寻址方法、寄存器、端口读写以及中断处理方法等内容。到了80386时代,引进了一种沿用至今的CPU运行机制——保护模式(Protected Mode)。保护模式有一些新的特色,用来增强系统稳定度,比如内存保护,分页系统,以及硬件支持的虚拟内存等。

对CPU来讲,系统中的所有储存器中的储存单元都处于一个统一的逻辑储存器中,它的容量受CPU寻址能力的限制。

这个逻辑储存器就是我们所说的线性地址空间。8086有20位地址线,拥有1MB的线性地址空间。而80386有32位地址线,拥有4GB的线性地
址空间。但是80386依旧保留了8086采用的地址分段的方式,只是增加了一个折中的方案,即只分一个段,段基址0×00000000,段长0xFFFFFFFF(4GB),这样的话整个线性空间可以看作就一个段,这就是所谓的平坦模型(Flat Mode)» Read more: OS的分页分段(笔记)

编写简单的HelloWorld Kernel Module

August 28th, 2014

普通的用户态下的C编程,估计很多人都可以熟练编写掌握。但是跨入内核层之后,用户态的函数与头文件统统变了。
» Read more: 编写简单的HelloWorld Kernel Module

在塔式服务器中安装Debian 7.6

August 28th, 2014

今天负责给实验室的server安装debian 7.6遇到很多问题,特在此小记一下。

由于塔式服务器不同于普通的pc,主板结构不同于pc的主板。

这个主板的特殊之处在于主板有两个cpu插槽,cpu是Intel Xeon E5530 4核八线程,如果插上两个cpu的话,可以拓展成为8核16线程。

» Read more: 在塔式服务器中安装Debian 7.6

Memory Barriers 的一些思考

August 14th, 2014

之前由于各种原因blog停更了半个月,现在回到正常环境下。

我们都知道在多处理器环境下,我们会遇到Memory Barriers,其实说白了,就是数据的不一致性,说的更加精确点,就是cache的不一致性,因为各种architecture 不同,x86与ARM不同,在x86下,Intel与AMD又不同,所以我们要搞清cpu与cache的不同结构,之前我们知道cache分为N路组相联(N-way set associative)。在取值的时候,中间位负责区分是哪一路,在这篇文章中讲的很详细:http://www.lizhaozhong.info/archives/580

不过x86的mb。x86 CPU会自动处理store顺序,所以smp_wmb()原语什么也不做,但是load有可能乱序!

» Read more: Memory Barriers 的一些思考