博客园  :: 首页  :: 联系 :: 管理

随笔分类 -  Kernel

Linux Kernel
摘要:epoll用法回顾先简单回顾下如何使用C库封装的3个epoll相关的系统调用。更详细的用法参见http://www.cnblogs.com/apprentice89/archive/2013/05/06/3063039.htmlint epoll_create(int size);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);使用起来很清晰,首先要调 阅读全文

posted @ 2013-08-03 15:30 Apprentice89 阅读(21530) 评论(4) 推荐(7)

摘要:select 实现分析 –2 【整理】l select相关的结构体比较重要的结构体由四个:struct poll_wqueues、struct poll_table_page、struct poll_table_entry、struct poll_table_struct。每一个调用select()系统调用的应用进程都会存在一个struct poll_wqueues结构体,用来统一辅佐实现这个进程中所有待监测的fd的轮询工作,后面所有的工作和都这个结构体有关,所以它非常重要。struct poll_wqueues { poll_table pt; struct poll_table_page 阅读全文

posted @ 2013-05-09 21:43 Apprentice89 阅读(8321) 评论(3) 推荐(2)

摘要:等待队列 正如list_head结构那样,等待队列(wait queue)作为linux内核中的基础数据结构,与进程调度紧密结合在一起;在驱动程序中,常常使用等待队列来实现进程的阻塞和进程的唤醒。因此,我们很有必要对它的内部实现进行分析。 0.数据结构 一般我们的链式线性表都会有一个头结点,以使我们迅速找到这个线性链表的“领导”。在等待队列中,同样有队列头,只不过等待队列头和普通的等待队列结... 阅读全文

posted @ 2013-05-09 18:55 Apprentice89 阅读(3082) 评论(0) 推荐(0)

摘要:select源码结构图:源码分析:#undef __NFDBITS#define __NFDBITS (8 * sizeof(unsignedlong))#undef __FD_SETSIZE#define __FD_SETSIZE 1024#undef __FDSET_LONGS#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)typedefstruct { unsignedlongfds_bits [__FDSET_LONGS]; //1024个bit。} __kernel_fd_set;//由上可以看到可以支持1024个描述符//系统调用(内核态 阅读全文

posted @ 2013-05-09 18:55 Apprentice89 阅读(1243) 评论(1) 推荐(1)

摘要:Ext文件系统族l 简介² 文件系统要考虑的几个问题:碎片、空间利用率、维护内容一致性。Ext2文件系统l 结构概况² 块组(Block Group):块组是Ext2的核心要素。² 文件系统是由大量块组在硬盘上相继排布。如图。一个块组硬盘如下² 启动扇区是硬盘上的一个区域(一般是第一个扇区),加电后BIOS自动加载并执行其中的内容。² inode间接索引数据块:灵活应对大小文件。² ext2试图将同一个文件的块维持在同一个块组中。² ext2在分配块的时候采用预分配的方式。² 创建文件系统:用户空间工具mke2fs 阅读全文

posted @ 2013-01-21 21:53 Apprentice89 阅读(242) 评论(0) 推荐(0)

摘要:文件系统的操作l 注册文件系统² 文件系统信息用struct file_system_type来描述。² fs/super.c中register_filesystem注册文件系统。l 装载和卸载文件系统² 文件系统的装载由mount系统调用发出。² UNIX使用单一的文件系统层次描述,新的文件系统集成到其中(mount到这个文件系统中)。² 装载点:原来的文件系统的一个目录,用来挂载新的文件系统。挂载后,该目录的内容变成新文件系统的根目录的内容,原有内容消失直到被挂载的文件系统卸载。装载可以嵌套。² 每个装载的文件系统都对应一个str 阅读全文

posted @ 2013-01-20 18:03 Apprentice89 阅读(300) 评论(0) 推荐(0)

摘要:《第八章》虚拟文件系统VFS的层次文件系统实现与用户进程(或C库)之间。文件系统分类基于磁盘的文件系统(ext2/3 fat iso9660…)、虚拟文件系统(proc)、网络文件系统(nfs)通用文件模型VFS提供一种结构模型,包含了一个强大的文件系统所应具备的所有组件。所有的文件系统实现,都必须提供与VFS定义的结构配合的例程,以弥补两种试图之间的差异。文件描述符一个整数,在用户层所有有关文件的操作中用于标识一个文件,在打开文件时由内核创建,特定于进程。inodel inode是什么?² inode用来存放文件的元数据(例如,文件的创建者、文件的创建日期、文件的大小等等) 阅读全文

posted @ 2013-01-19 20:32 Apprentice89 阅读(636) 评论(0) 推荐(0)

摘要:进程调度三个组件:调度器、调度器类、上下文切换。struct task_struct { ... int prio, static_prio, normal_prio; unsignedintrt_priority; struct list_head run_list; conststruct sched_class *sched_class; struct sched_entity se; //调度器不限于调度进程,可以处理更大的实体(组调度)。因此要求调度器不直接处理进程,而是处理se. unsignedintpolicy; cpumask_t cpus_allowed; //sched_ 阅读全文

posted @ 2012-12-16 19:07 Apprentice89 阅读(1215) 评论(0) 推荐(0)

摘要:《第二章》进程管理和调度 - 续进程管理之进程复制三个系统调用--- fork, vfork, clone。vfork不创建父进程数据的副本,fork使用了写时复制(copy-on-write)技术后,vfork已无用武之地。clone产生线程,可以对父子进程之间的共享、复制进程进行精确的控制。写时复制(copy-on-write COW)--- 并不复制整个地址空间,只复制页表,即父子进程使用相同的物理内存页。但父子进程都不能对页面写(因为是父子进程共享物理页),当父进程或者子进程需要写入时,CPU向内核报告访问错误(缺页异常),内核检查额外的数据结构,发现这是因为COW造成的,于是创建一个 阅读全文

posted @ 2012-12-09 19:23 Apprentice89 阅读(740) 评论(0) 推荐(0)

摘要:《第二章》进程管理和调度主流的Linux内核不支持硬实时,但一些修改版本如RTLinux、Xenomai、RATI。在这些修改方案中,Linux内核作为独立进程运行,实时的工作在内核外部完成,只有当没有实时操作的时候,内核才会运行。2.5内核中引入了O(1)的调度算法,2.6.23时引入完全公平调度器(CFS)。命名空间命名空间建立了系统的不同视图,此前的每一项全局资源都必须包装到容器数据结构中,只有资源和包含该资源的命名空间组成的二元组仍然是全局唯一的。新的命名空间的创建:1. fork或者clone时,可以设定是与父进程共享命名空间还是创建新的命名空间; 2. unshare系统调用将进程 阅读全文

posted @ 2012-12-09 10:55 Apprentice89 阅读(1085) 评论(0) 推荐(0)

摘要:《第一章》简介和概述实现策略:微内核、宏内核命名空间:全局资源具有不同的分组由于被中断的进程与中断原因没有什么关系,因此内核无权访问被中断进程用户空间的内容。页表虚拟地址的分割:页表的一个特色在于:对虚拟地址空间中不需要的区域,不必创建中间页目录或者页表,与直接使用一级页表数组的方式相比,节省了大量的内存。加速转换:1.MMU硬件支持,2.TLB硬件缓存(有些架构下TLB运转透明,有些需要内核专门处理)内存映射:内存映射是一种重要的抽象手段,可以将任意来源的数据传输到进程的虚拟地址空间,映射到的这部分虚拟地址空间可以像内存一样被操作,其上的修改会被内核自动传输到数据源。这样就可以使用相同的函数 阅读全文

posted @ 2012-12-08 09:55 Apprentice89 阅读(2862) 评论(1) 推荐(0)

摘要:《Chapter 15 进程地址空间》是否共享地址空间几乎是进程和Linux中的线程间本质上的唯一区别。同一进程的几个线程的tassk_struct中mm域指向同一个struct mm_struct。内核线程的mm域为NULL(没有用户上下文)。VMAstruct vm_area_struct;VMA操作函数:struct vm_area_struct* find_vma(struct vm_area_struct* mm, unsigned long addr);//search in RBTreestruct vm_area_struct* find_vma_prev(struct mm_ 阅读全文

posted @ 2012-12-02 21:53 Apprentice89 阅读(406) 评论(0) 推荐(0)

摘要:《Chapter 12 内存管理》MMU:内存管理单元,管理内存,地址转换,通常以页为单位管理。从虚存角度看,页是最小单位。struct page { unsigned long flag; //页是否脏,是否被锁定在内存 atomic_t _count; //页引用计数 atomic_t _mapcount; // unsigned long private; struct address_space *mapping; pdoff_t index; ... 阅读全文

posted @ 2012-11-30 21:18 Apprentice89 阅读(345) 评论(0) 推荐(0)

摘要:《Chapter 9~10 内核同步》临界区(CS):访问共享资源的代码段。造成并发的原因:中断软中断和tasklet内核抢占睡眠及用户空间的同步对称多处理器锁的使用本身并不是难点,真正的挑战在于辨认出需要共享的数据和相应的临界区。在最开始设计代码的时候就要想到要使用锁,而不是在完成代码后再去加锁。interrupt-safe / SMP-safe / preempt-safe预防死锁的一个比较方便的方法(不能彻底解决):按顺序枷锁。死锁的四个条件:互斥(mutual exclusion),请求与保持(hold and wait),非剥夺(non-preempt),循环等待(circular 阅读全文

posted @ 2012-10-31 22:40 Apprentice89 阅读(267) 评论(0) 推荐(0)

摘要:《Chapter 1 & 2》 1 机制与策略分离:机制(mechanism)和策略(policy):a. 机制是指需要提供什么功能,策略是指如何使用这些功能。b. 机制是实现具体功能,策略是组合已有功能。c. 机制是战术,策略是战略。策略与机制是动态与静态的关系。机制意味着固定和自动,像是一个一个的积木块。策略是组合方法,怎样使用已有的积木搭出一个作品。策略往往是在机制的基础上进行具体问题的调整。2 单内核与微内核:Linux是单内核,但吸取了微内核的诸多优点:模块化设计,内核可抢占,支持内核线程,动态装在内核模块。至今,Linux是模块化,多线程,内核本身可调度的OS,实用主义再次 阅读全文

posted @ 2012-10-31 10:05 Apprentice89 阅读(679) 评论(0) 推荐(0)