随笔分类 -  操作系统

Linux2.6块设备驱动程序
摘要:一、块设备的操作的处理体系结构1.VFS(虚拟文件系统)VFS位于块设备的处理体系结构的上层,提供一个通用的文件模型。VFS和块设备的关系见Linux2.6设备管理系统调用的服务例程调用一个合适的VFS函数,将文件描述符和文件内的偏移量传递给它。2.磁盘高速缓存VFS函数确定所请求的数据是否已经存在磁盘高速缓存中,若存在,就没有必须访问磁盘上的数据了。3.映射层(块设备文件系统)(1)把文件拆分成大小相同的块,每一个块都有一个逻辑号(2)访问文件的磁盘节点,根据每一块的逻辑块号,确定这块数据的在磁盘上的位置4.通用块层(1)内核利用通用块层启动I/O操作来传送所请求的数据。每个I/O操作只针对 阅读全文

posted @ 2012-06-09 16:21 windmissing 阅读(273) 评论(0) 推荐(0)

Linux2.6设备管理
摘要:一、设备管理与文件管理的关系1.文件操作是对设备操作的组织与抽象设备操作是对文件操作的最终实现二、设备驱动程序模型1./sys -----> 总线-----> PCI-----> 驱动程序-----> 串口-----> 设备2.设备驱动程序模型中的几个主要的层次:(1)总线,见Linux2.6 I/O体系结构(2)PCI总线,见三(3)驱动程序,见四(4)设备,见五三、PCI总线1.地址分配策略I/O地址空间与内存空间相分离,将I/O寄存器的地址映射成内存地址,通过内存指令来操作这些寄存器2.总线竞争策略(1)配备一个分时仲裁器,遇到冲突时,仲裁器选择一个设备暂时 阅读全文

posted @ 2012-06-05 14:30 windmissing 阅读(280) 评论(0) 推荐(0)

Linux2.6 I/O体系结构
摘要:一、I/O体系结构二、I/O总线1.总线计算机内部大部分硬件设备通过总线连接一台计算机可以有几条总线,可以是不同类型总线与总线之间用桥连接2.I/O总线CPU与I/O设备之间的数据通路通常称为I/O总线其中,地址总线16位,数据总线8位、16位或32位三、I/O端口1.概念每个连接到I/O总线上的调和都有自己的I/O地址集,称为I/O端口CPU使用地址总线选择所请求的I/O端口,使用数据总线在CPU寄存器和端口之间传送数据I/O端口可以被映射到物理地址空间,使用对内存操作的汇编指令来对I/O端口进行操作2.应用每个设备的I/O端口被组织成一组专用的寄存器,如图:CPU通过控制寄存器向设备发送命 阅读全文

posted @ 2012-06-04 11:15 windmissing 阅读(282) 评论(0) 推荐(0)

Linux2.6虚拟文件系统VFS
摘要:一、什么是虚拟文件系统1.VFS是用户的应用程序与文件系统实现之间的抽象层2.VFS支持以下三种类型的文件系统(1)磁盘文件系统(2)网络文件系统(3)特殊文件系统二、通用文件系统模型1.VFS的主要思想是引入一个文件系统模型,这个模式能够表示所有支持的文件系统2.通用文件模型的构成(1)超级块super_block:存放已安装文件系统的有关信息,所有的超级块对象以双向链表的形式链接在一起(2)索引结点块inode:存放具体文件的一般信息,对文件是唯一的,并且随着文件的存在而存在(3)文件对象file:存放打开文件与进程之间进行交互的有关信息,仅在文件被打开时创建,它在磁盘上没有对应的映像(4 阅读全文

posted @ 2012-06-01 22:13 windmissing 阅读(312) 评论(0) 推荐(0)

Linux2.6系统调用
摘要:一、引入系统调用1.概念:操作系统为在用户态运行的进程与硬件设备进行交到提供了一组接口。Linux通过向内核发出系统调用来实现这些接口2.作用:对硬件设备操作的编程更容易提高了系统的安全性使程序更有可移植性3.进入系统调用的两种方法(1)int &0x80汇编指令(2)sysenter汇编指令二、系统调用与API的区别1.API只是一个函数定义,说明了如何获得一个给定的服务系统调用中通过软中断向内核发出一个明确的请求2.API可以不使用系统调用,也可以使用多个系统调用多个API也可以调用封装了不同功能的同一系统调用3.系统调用属于同内核用户态的库函数不属于内核三、通过int $0x80 阅读全文

posted @ 2012-05-29 20:09 windmissing 阅读(297) 评论(0) 推荐(0)

Linux2.6-4G的线性地址空间的分配与使用
摘要:一、4G线性空间的使用1.0-3G属于用户空间,无论是用户态还是内核态都可以寻址,但是内核一般不访问这里的数据3-4G属于系统空间,只有内核态的进程才可以访问。二、系统空间1.3G-4G的系统空间的使用(1)3G ----- 3G+high_memory:对前896MB RAM进程映射的线性地址(2)high_memory ----- PKMAP_BASE:非连续内存区。两个区间之间有4KB或8KB的空隔,是为了捕获对内存的越界访问(3)PKMAP_BASE ----- FIXADDR_START:永久内核映射(4)FIXADDR_START ----- 4G:固定映射的线性地址2.高端内存的 阅读全文

posted @ 2012-05-29 19:44 windmissing 阅读(756) 评论(0) 推荐(0)

Linux2.6进程调度
摘要:一、Linux2.6调度算法的特点1.在固定时间内选中要运行的进程,这个时间不会因为可运行进程增多而变大2.每个CPU有自己的可运行队列3.较好地解决区分交互式进程与批处理进程的问题二、进程按调度类型分类1.SCHED_FIFO:先进先出的实时进程如果没有其它更高优先级(必须是更高)的可运行实时进程(普通进程的优先不可能高于实时进程)出现,就可以一地上运行。对于这种进程,时间长度是没有意义的。2.SCHED_RR:时间片轮转的实时进程所有具有同优先级(且都是当前情况下优先级最高)的SCHED_RR以时间片轮转的方式公平地分配CPU3.SCHED_NORMAL:时间片轮转的普通进程时间片用完后会 阅读全文

posted @ 2012-05-26 16:48 windmissing 阅读(501) 评论(0) 推荐(0)

Linux2.6可延迟中断
摘要:一、基本概念1.Linux把紧随中断要执行的操作分为三类特点处理方法举例第一类紧急的在禁止可屏蔽中断的情况下立即执行修改设备和处理器同时访问的数据结构第二类非紧急的在开中断的情况下立即执行修改那些只有处理器才会访问的数据结构(例如,按下一个键后读扫描码)第三类非紧急可延迟的由独立的函数来执行把缓冲区的内核拷贝到某个进程的地址空间2.把可延迟中断从中断处理程序中抽出来,由独立的函数来执行,有助于使内核保持较短的响应时间3.Linux2.6使用可延迟函数和工作队列来处理可延迟中断,这两个都是内核函数。二、可延迟函数1.可延迟函数包括软中断和tasklet,tasklet是在软中断之上实现的task 阅读全文

posted @ 2012-05-24 11:28 windmissing 阅读(425) 评论(0) 推荐(0)

Linux2.6中断与异常
摘要:一、基本概念1.产生的位置发生的时刻时序中断CPU外部随机异步异常CPU正在执行的程序一条指令终止执行后同步2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行中断处理程序与正在运行的程序无关引起异常处理程序的进程正是异常处理程序运行时的当前进程二、特点1.(1)尽可能快(2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套(3)尽可能地限制临界区,因为在临界区中,中断被禁止2.大部分异常发生在用户态,缺页异常是唯一发生于内核态能触发的异常缺页异常意味着进程切换,因此中断处理程序从不执行可以导致缺页的操作3.中断处理程序运行于内核态中断发生于用户态时 阅读全文

posted @ 2012-05-23 20:47 windmissing 阅读(383) 评论(0) 推荐(0)

Linux2.6进程的创建与删除
摘要:一、进程的创建1.系统调用clone()与fork()的区别:资源的继承方式参数区分父进程与子进程的方法fork()全部复制,即父进程的所有资源全部通过数据结构的复制传给子进程无参数父进程与子进程,从fork()返回时的返回值不同,以此区分二者。子进程返回0.父进程返回子进程的pidclone()有选择地将资源复制给子进程,没有复制的资源通过指针复制的方式与子进程共享(共享与复制的关系见2)有参数,用于设置资源复制的方式clone()所产生的子线程的PID有可能是0,因此采用比较系统堆栈指针的方法来区分二者。note:(1)为什么返回值的方式对fork()适用?因为fork()后子进程拥有独立 阅读全文

posted @ 2012-05-22 18:43 windmissing 阅读(412) 评论(0) 推荐(0)

Linux2.6进程切换
摘要:1.进程切换是指:保存prev进程的上下文,用next的上下文替代。其中上下文包括:页全局目录、内核态堆栈、硬件上下文。2.80x86为进程切换提供的硬件支持:第一种:通过任务门第二种:通过JMP和CALL指令:把硬件上下文存在TSS中,执行这条指令时,通过硬件自动切换TSS,完成硬件上下文的过程TSS是任务状态段,只能存放在GDT中,不能存放在LDT中3.Linux使用的硬件上下文切换方法:通过一组MOV指令逐步执行切换,手动模拟1的过程因为这样效率较高,也便于各种检查和保护4.Linux的进程切换不使用80x86提供的硬件方法,但是为了与80x86兼容,仍会为每个CPU创建一个TSS(按照 阅读全文

posted @ 2012-05-22 14:18 windmissing 阅读(309) 评论(0) 推荐(0)

Linux2.6进程
摘要:1.进程、用户线程、内核线程的区别和联系进程用户线程(轻量级进程)内核线程代码段有有有数据段有有有描述符task_struct有有有用户空间堆栈有一个线程组共享一个用户空间完全没有内核空间堆栈有有有PID独一无二的一组线程共享一个有这里的有是指拥有独立的2.内核线程:由内核创建、调度,用于执行一些重要的、周期性的过程。只运行在内核态、只使用3G以后的系统空间。比如用于回收物理页面的kswapd线程3.进程的状态(1)就绪或运行(2)可中断的等待(3)不可中断的等待(4)暂停(5)跟踪(6)僵死(见Linux2.6进程的创建与删除)(7)僵死撤消4.进程描述符与进程之间是严格的一一对应5.内核态 阅读全文

posted @ 2012-05-21 22:13 windmissing 阅读(224) 评论(0) 推荐(0)

Linux2.4打开一个文件的系统调用
摘要:0.sys_open()(1)从当前进程的“打开文件表”中找到一个空闲的项get_unused_fs()(2)建立文件读写的上下文filp_open():(见1)(3)将上下文安装到文件打开表中1.filp_open():建立文件读写的上下文(1)获取指向文件名的dentry和vfsmount:open_namei()若只是打开,则通过path_init()和path_walk()搜索若有不存在就创建的要求,则(见3)3.获取指向文件名的dentry和vfsmount,若不存在就创建(1)找到path_name对应的节点的父dentry(2)找到目标文件的dentry(3)若不存在,则创建de 阅读全文

posted @ 2012-05-21 09:49 windmissing 阅读(230) 评论(0) 推荐(0)

Linux2.6用户空间堆栈区的分配与回收
摘要:1.sys_brk(新边界的线性地址)(1)地址检查,地址不低于代码段的终点(2)与页面大小对齐(3)新地址 < 老边界 -----> 释放空间(见2) 新地址 > 老边界 -----> 申请空间(见8)2.释放空间(1)线性地址 -> 区间地址(2)预备一个新的区间结构(回收一个区间的一部分,可能导致一个区间变成两个区间)(3)把所有涉及到的区间移到一个临时队列(4)解除映射,释放页面(见3)(5)对vm_area_struct和mm_struct作出调整(6)释放页面表3.依次处理PGD中所有的页目录项所指向的页目录表,处理方法(见4)4.依次处理页目录表中的 阅读全文

posted @ 2012-04-30 21:12 windmissing 阅读(263) 评论(0) 推荐(0)

Linux2.6为数据结构分配内存-slab
摘要:1.高速缓存描述符、slab描述符、数据结构对象之间的关系slab描述符也可以在外面不管slab描述符在哪里,空闲链接数组紧跟在slab描述符后面第一张图跟2.6的不太一样,2.6中,所有箭头都是双向的,且没有不同各种类slab描述符的链接建立一个缓冲的专用队列:1.从cache_cache中分配一个kmem_cache_t结构的高速缓存描述符2.进行一系列计算,以确定最佳的slab构成3.设置各种参数4.将kmem_cache_t结构链入cache_cache的next队列中利用这个专用队列来为这个专用的数据结构分配空间1.找到第一个含有空闲对象的slab若找到,则分配一个空闲对象给数据结构 阅读全文

posted @ 2012-04-30 13:01 windmissing 阅读(275) 评论(0) 推荐(0)