Linux系统开发专栏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  Linux内核分析笔记帖

本板块主要讨论linux内核的核心思想,讨论大家关心的linux内核问题。
摘要:说句真的,也缓存我听的都少,虽然看了很多。页高速缓存是linux内核实现的一种主要磁盘缓存,它主要用来减少对磁盘的IO操作,具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。为什么要这么做呢?一,速度;二临时局部原理。有关这两个概念,相信熟悉操作系统的我们不会太陌生。页高速缓存是由RAM中的物理页组成的,缓存中的每一页都对应着磁盘中的多个块。每当内核开始执行一个页IO操作时,就先到高速缓存中找。这样就可以大大减少磁盘操作。 一个物理页可能由多个不连续的物理磁盘块组成。也正是由于页面中映射的磁盘块不一定连续,所以在页高速缓存中检测特定数据是否已被缓存就变得不那. 阅读全文
posted @ 2011-08-05 16:44 ☆&寒 烟☆ 阅读(10571) 评论(2) 推荐(2) 编辑

摘要:关于linux内核的可移植性我不用多说,现在的linux操作系统,你装系统时应该很明白的知道了,很少说(至少我没见到)不兼容不能装的问题。今天就来说说这个问题: 1.字节和数据类型 能够由机器一次就完成处理的数据被称为字,字指位的数目。所以我们常听到机器是多少位的时候,就是指该机的字长。处理器通用寄存器的大小和它的字长是相同的。C语言定义的long类型总对等于机器字长。对于支持的每一种体系结构,... 阅读全文
posted @ 2011-08-04 20:13 ☆&寒 烟☆ 阅读(1935) 评论(0) 推荐(0) 编辑

摘要:前边我已经说过了内核是如何管理物理内存。但事实是内核是操作系统的核心,不光管理本身的内存,还要管理进程的地址空间。linux操作系统采用虚拟内存技术,所有进程之间以虚拟方式共享内存。进程地址空间由每个进程中的线性地址区组成,而且更为重要的特点是内核允许进程使用该空间中的地址。通常情况况下,每个进程都有唯一的地址空间,而且进程地址空间之间彼此互不相干。但是进程之间也可以选择共享地址空间,这样的进程... 阅读全文
posted @ 2011-08-03 10:56 ☆&寒 烟☆ 阅读(6945) 评论(2) 推荐(1) 编辑

摘要:如果您记性好的话,应该记得我在linux设备驱动实例帖中说的最多的就是字符设备驱动程序,那么今天的块I/O层是一个和字符设备驱动相对应的设备。两者最根本的区别就是看它们能否被随机访问,换句话说就是看它们能否在访问设备时从一个位置随意地调到另外一个位置,如果可以就是块设备,否则就字符设备。 块设备中最小的可寻址单元是扇区。扇区的大小一般是2的整数倍,最常见的大小是512个字节。扇区的大小是设备的物理属性,扇区是所有块设备的基本单元,块设备无法对比它还小的单元进行寻址和操作,不过许多块设备能够一次就传输多个扇区。从软件角度来讲,最小的逻辑可寻址单元却是块,块是文件系统的一种抽象-----只能基于. 阅读全文
posted @ 2011-08-02 12:17 ☆&寒 烟☆ 阅读(7501) 评论(0) 推荐(1) 编辑

摘要:接着上次的来,我今天讲虚拟文件系统剩下的一点知识. 3.目录项对象.目录项的概念上节已经说了,我就不多说.目录项中也可包括安装点.在路径/mnt/cdrom/foo中,/,mnt,cdrom都属于目录项对象。目录项由dentry结构体表示,定义在文件linux/dcache.h中,描述如下:struct dentry { atomic_t d_count; /* usage count */ u... 阅读全文
posted @ 2011-07-29 16:32 ☆&寒 烟☆ 阅读(3043) 评论(0) 推荐(0) 编辑

摘要:虚拟文件系统,也不知道大家听过没有,反正我是听过了!我们知道在计算机行业,很多东西都不是一定有个官方说:朋友,我最大,你们做的东西,都要是这个样子,否则是非法的。事实上,很多东西都是靠的一种实力,通过实力来慢慢在人们心中成为既定事实。这个事实同样是没有官方的。好了,问题来了,没有官方,就没有标准,没有标准就没有统一,没有统一那就是三国时代,混战当道也! 怎么办?特别是百花争鸣的文件系统,这时li... 阅读全文
posted @ 2011-07-29 10:11 ☆&寒 烟☆ 阅读(4122) 评论(0) 推荐(0) 编辑

摘要:内存管理,不用多说,言简意赅。在内核里分配内存还真不是件容易的事情,根本上是因为内核不能想用户空间那样奢侈的使用内存。 先来说说内存管理。内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常是字,但是,内存管理单元MMU通常以页为单位进行处理。因此,从虚拟内存的交代来看,页就是最小单位。内核用struct page(linux/mm.h)结构表示系统中的每个物理页:struct p... 阅读全文
posted @ 2011-07-28 15:42 ☆&寒 烟☆ 阅读(10111) 评论(3) 推荐(3) 编辑

摘要:在这一次里,主要讲讲和时间相关的东西,这个我们都比较熟悉,我就直接如主题。 首先要明白两个概念:系统定时器和动态定时器。周期性产生的事件都是有系统定时器驱动的,这里的系统定时器是一种可编程硬件芯片,它能以固定频率产生中断。该中断就是定时器中断,它所对应的中断处理程序负责更新系统时间,也负责执行需要周期行运行的任务。系统定时器和时钟中断处理程序是Linux系统内核管理机制中的中枢。动态定时器是用来推迟执行程序的工具。内核可以动态创建或销毁动态定时器。 内核必须在硬件的帮助下才能计算和管理时间。硬件为内核提供了一个系统定时器用以计算流逝的时间,该时钟在内核中可看成是一个电子时间资源。系统定时器以. 阅读全文
posted @ 2011-07-26 14:07 ☆&寒 烟☆ 阅读(12052) 评论(1) 推荐(1) 编辑

摘要:内核同步讲的比较多了,我也就不太啰嗦了,先说一些概念,然后就是方法。 同步就是避免并发和防止竞争条件。有关临界区的例子我就不举了,随便一本操作系统的书上都有。锁机制的提出也算解决了一些问题,我们待会再说,现在只要知道锁的使用是自愿的,非强制的。linux自身也提供了几种不同的锁机制,区别主要在于当锁被争用时,有些会简单地执行等待,而有些锁会使当前任务睡眠直到锁可用为止,这个后面细说。真正的困难在... 阅读全文
posted @ 2011-07-23 17:38 ☆&寒 烟☆ 阅读(4307) 评论(0) 推荐(1) 编辑

摘要:接着上节的来,我们在上节说了软中断和tasklet,那这最后就是工作队列了哦.. 工作队列和前面讨论的其他形式都不相同,它可以把工作推后,交由一个内核线程去执行----该工作总是会在进程上下文执行。这样,通过工作队列执行代码能占尽进程上下文的所有优势,最重要的就是工作队列允许重新调度甚至是睡眠。相比较前边两个,这个选择起来就很容易了。我说过,前边两个是不允许休眠的,这个是允许休眠的,这就很明白了... 阅读全文
posted @ 2011-07-20 12:37 ☆&寒 烟☆ 阅读(3632) 评论(0) 推荐(1) 编辑

摘要:嗨,嗨,如果您记性好的话,我在上一篇博客中提到过这样一件事:中断处理是分为两个部分:中断处理程序是上半部,它接收到一个中断,就立即执行,但只做有严格时限的工作;而另外被叫做下半部的另外一个部分主要做被允许能稍后完成的工作。这个下半部正是今天的重点。 下半部的任务就是执行与中断处理密切相关但中断处理程序本生身不执行的任务。最好情况当然是中断处理程序把所有的工作都交給下半部执行,而自己啥都不做。因为... 阅读全文
posted @ 2011-07-19 18:16 ☆&寒 烟☆ 阅读(7488) 评论(5) 推荐(2) 编辑

摘要:中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的.. 那么什么叫中断呢, 中断还是打断,这样一说你就不明白了。唉,中断还真是有点像打断。我们知道linux管理所有的硬件设备,要做的第一件事先是通信。然后,我们天天在说一句话:处理器的速度跟外围硬件设备的速度往往不在一个数量级上,甚至几个数量级的差别,这时咋办,你总不能让处理器在那里傻等着你硬件做好了告诉我一声吧。这很容易就和日常生活联系起来了,这样效率太低,不如我处理器做别的事情,你硬件设备准备好了,告诉我一声就得了。这个告诉,咱们说的轻松,做起来还是挺费劲啊!怎么着,简单一点,轮训(polli. 阅读全文
posted @ 2011-07-17 10:51 ☆&寒 烟☆ 阅读(30366) 评论(6) 推荐(3) 编辑

摘要:调度?咋这熟悉,我们是不是常在哪里听到。没错,是的,调度我们时常听过,比如交通管制调度啦等。这不,夏天这热, 标语贴的好:相应国电电力调度,做文明市民,好别扭啊!不管了。你要是还是不懂,再啰嗦讲个事,过年回家,和漂亮的GF回家,为了张普通的硬座票还要排老久对,甚至还可能被坑拿到黄牛票,这时你嘴里咧咧的啥:XX,啥火车站,做的啥春运调度啊!唉,这次你说到点上了。 总结一下:调度就是通过调度程序的合... 阅读全文
posted @ 2011-07-12 12:56 ☆&寒 烟☆ 阅读(7446) 评论(0) 推荐(3) 编辑

摘要:进程和线程的概念我就不讲了。总之,你记着:内核调度的对象是线程,而不是进程。linux系统中的线程很特别,它对线程和进程并不做特别区分。进程的另外一个名字叫任务(task).我和作者一样,习惯了把用户空间运行的程序叫做进程,把内核中运行的程序叫做任务。 内核把进程存放在叫做任务队列(task list)的双向循环链表中,链表中的每一项都是类型为task_struct,名称叫做进程描述符(process descriptor)的结构,该结构定义在include/linux/sched.h文件中,它包含了一个具体进程的所有信息。 linux通过slab分配器分配task_struct结构,这样能. 阅读全文
posted @ 2011-07-09 21:18 ☆&寒 烟☆ 阅读(6494) 评论(0) 推荐(4) 编辑

摘要:在Linux中,系统调用是用户空间访问内核的唯一手段,它们是内核唯一的合法入口。实际上,其他的像设备文件和/proc之类的方式,最终也还是要通过系统调用进行的。 一般情况下,应用程序通过应用编程接口(API)而不是直接通过系统调用来编程,而且这种编程接口实际上并不需要和内核提供的系统调用对应。一个API定义了一组应用程序使用的编程接口。它们可以实现成一个系统调用,也可以通过调用多个系统调用来实现,即使不使用任何系统调用也不存在问题。实际上,API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能迥异。 在Unix世界中,最流行的应用编程接口是基于. 阅读全文
posted @ 2011-07-08 09:29 ☆&寒 烟☆ 阅读(3396) 评论(0) 推荐(1) 编辑