随笔分类 -  Linux内核

摘要:Slab分配器把对象分组放进高速缓存(cache),以避免重复初始化对象。slab分配器并不丢弃已分配的对象,而是释放并把它们保存在内存中。当以后又要请求新的对象时,就可以从内存直接获取而不用重复初始化。 对象高速缓存的组织如下图所示,高速缓存的内存区被划分为多个slab,每个slab由一个或多个连续的页框组成,这些页框中既包含已分配的对象,也包含空闲的对象。 FQL同学问了个问题,说... 阅读全文
posted @ 2013-04-19 14:10 ydzhang 阅读(468) 评论(0) 推荐(0)
摘要:内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程“并行”执行(实际上,也并行于内核自身的执行),内核线程经常被称为内核“守护进程”。它们主要用于执行下列任务: l 周期性地将修改的内存页与页来源块设备同步。 l 如果内存页很少使用,则写入交换区。 l 管理延时动作 l 实现文件系统的事务日志。 内核线程主要有两种类型: 1. 线程启动... 阅读全文
posted @ 2013-04-19 14:09 ydzhang 阅读(198) 评论(0) 推荐(0)
摘要:进程是操作系统运行的基础,本文以比较粗犷的角度闲侃linux进程方面的知识。 用户态的每个进程在内核中对应一个task_struct结构的进程描述符,描述符中包含进程的状态和执行信息、虚拟内存信息、打开文件信息、以及文件文件系统信息,信号相关信息等(进程使用的资源时有限制的,如打开文件数,使用的物理页,文件大小等,其值包含在描述符中task_struct->signal->rlim字段中,也... 阅读全文
posted @ 2013-04-19 14:09 ydzhang 阅读(166) 评论(0) 推荐(0)
摘要:linux系统中每个进程由一个进程id标识,在内核中对应一个task_struct结构的进程描述符,系统中所有进程的task_struct通过链表链接在一起,在内核中,经常需要通过进程id来获取进程描述符,最简单的方法可以通过遍历task_struct链表并对比id的值来获取,但这样效率太低,尤其当系统中运行很多个进程的时候。 linux内核通过PID散列表来解决这一问题,能快速的通过进程I... 阅读全文
posted @ 2013-04-19 14:09 ydzhang 阅读(651) 评论(0) 推荐(0)
摘要:内核中很多地方都需要跟踪记录C语言中结构的实例。尽管这些对象的用法大不相同,但各个子系统的某些操作都非常类似,如引用计数,内核为了减少代码复制,采用了一般性的方法来管理内核对象。所引入的框架并不只是为了减少代码复制,同时也为内核不同部分管理的对象提供了一致的视图。 一般性的内核对象机制可用于执行下列对象操作: 1. 引用计数; 2. 管理对象链表; 3. 集合加锁; 4. 将对象属性... 阅读全文
posted @ 2013-04-19 14:09 ydzhang 阅读(833) 评论(0) 推荐(0)
摘要:1. Linux系统调用的作用? 系统调用是操作系统为用户态运行的进程与系统内核、硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,在应用程序和硬件之间设置一个额外层的优点包括: 1. 用户编程更加简单,不必学习硬件设备的低级编程特性; 2. 提高了系统的安全性,内核在试图满足某个请求前在接口级可以检查请求正确性。 3. 这组接口使得程序具有可移植性,只要内核所提供的接口相同,使用这些接... 阅读全文
posted @ 2013-04-19 14:08 ydzhang 阅读(344) 评论(0) 推荐(0)
摘要:同一硬件高速缓存行可以映射RAM中多个不同的块,相同大小的对象倾向于存放在高速缓存内相同的偏移量处。在不同slab内具有相同偏移量的对象最终很可能映射到同一高速缓存行中。而使用slab分配器的对象通常是频繁使用的小对象,高速缓存的硬件可能因此而花费内存周期在同一高速缓存行与RAM内存单元之间来来往往的传送两个对象。 如下例:假设cache行为32Bytes,CPU包含512个cache行(缓存大... 阅读全文
posted @ 2013-04-19 14:08 ydzhang 阅读(1056) 评论(0) 推荐(1)
摘要:1. 内核与普通进程获取内存时有何不同? 内核是操作系统中优先级最高的成分,如果某个内核函数请求动态内存,则其必定有正当的理由发出那个请求,内核的内存请求应该立即被满足;内核信任自己,所有的内核函数都被假定是没有错误的,内核函数不必考虑编程错误的保护措施。 而当用户态进程请求分配内存时,进程对动态内存的请求被认为是不紧迫的,当进程的可执行文件被装入时,进程并不一定立即对所有的代码页进行访问,同样的... 阅读全文
posted @ 2013-04-19 14:08 ydzhang 阅读(292) 评论(0) 推荐(0)
摘要:1. linux的内存管理的单位? linux操作系统使用分页内存管理的机制,将内存空间划分成多个页面(页框,大小通常为4K),内核使用struct page结构的页描述符来保存一个页框的状态信息,所有的页描述符存放在全局的mem_map的数组中,每个page结构体大小为32B,故mem_map所占的空间小于整个内存空间的1%(页面大小按4K计算)。 2. 如何标识一个页面是否空闲? 页描述符中... 阅读全文
posted @ 2013-04-19 14:08 ydzhang 阅读(258) 评论(0) 推荐(0)
摘要:1. 内核符号表 内核符号表是linux内核提供给内核代码的一部分引用,所指的“内核代码”包括内核以及驱动程序等运行在内核内存空间的程序,“引用”包括对变量的引用,对函数的引用等。最常见的内核符号引用如printk打印输出,通常内核符号是由一部分内核代码提供给其他内核代码访问其内部数据的接口。 外部模块只能使用内核或其他外部模块导出的符号。内核或外部模块可通过EXPORT_SYMBOL宏导出符... 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(1318) 评论(0) 推荐(0)
摘要:asmlinkage long sys_mount(char __user * dev_name, char __user * dir_name, char __user * type, unsigned long flags, void __user * data); 参数说明: 1. 文件系统所在的设备文件的路径名,或者如果不需要则为NULL(如网络文件系统); 2. 文件系统被安... 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(469) 评论(0) 推荐(0)
摘要:链表(list)和哈希表(hlist)是内核常用到的两个工具,负责组织内核中很多的数据结构,如在进程管理中用于组织进程,文件系统中的inode节点链表,dentry链表,vfsmount链表等等。 链表使用struct list_head内嵌结构来将其寄生的结构组织成双向循环链表,并且表头跟普通节点的结构相同,非常容易理解。 但哈希表不同,其表头跟普通节点采用不同的数据结构,并且节点的组织也不是... 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(580) 评论(0) 推荐(0)
摘要:如果在编写内核源代码时给内核留下后门,则你可以很容易的利用,则可轻易的使用模块实现一些扩展功能(实现一些跟内核相关的应用或是出于攻击性目的的扩展)。例如:在read系统调用的实现中,你留下了后门:在read_write.c中,定义了函数指针void (backdoor*)(size_t *count) = NULL;并使用EXPORT_SYMBOL带出符号backdoor。在sys_read中加入如下代码:if(backdoor != NULL) backdoor(&count); //这里的count为sys_read的最后一个参数在内核模块中,你可以实现自己的后门函数,并将back 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(231) 评论(0) 推荐(0)
摘要:方法1:修改系统调用表(适用于linux-2.4内核) 内核使用sys_call_table数组来存储系统调用表,将系统调用号与系统调用处理函数对应起来,通过修改sys_call_table数组的某一个元素,即可实现截获系统调用的功能,在2.4内核中,sys_call_table符号是被导出的,外部模块可以使用,故能简单的实现截获系统调用,在加载模块时,修改sys_call_table的处理函数... 阅读全文
posted @ 2013-04-19 14:07 ydzhang 阅读(552) 评论(0) 推荐(0)
摘要:最近学习块设备驱动程序的编写,在网上发现一个题为“写一个块设备驱动“的教程,共包含15章,教程最先是在chinaunix论坛上发的,很多人的博客都转载了这组文章,是一个叫赵磊的大牛写的,拜读了一下,教程写得通俗易懂,很有收获。本文对这组文章的内容进行了简要的概括,并附上每章的链接,当然,你google一下也能找到一大堆。第一章内容概括:模块的编写,块设备的基础编程结构,gendisk及其request_queue的管理,简单块设备驱动的实现(初始化gendisk,实现request_queue的处理方法),对块设备进行格式化文件系统并使用。链接1:http://hi.baidu.com/jjb 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(668) 评论(0) 推荐(0)
摘要:为什么需要iSCSI ? 1. 解决了SCSI协议在设备数目和连接距离上的限制; 2. 为SAN提供了一种高性价比的传输协议; 3. 与各种存储管理结合起来,提供灵活的备份、镜像、灾难恢复以及次级存储解决方案; 什么是iSCSI ? iSCSI是由IEETF开发的网络存储标准,目的是为了用IP协议将存储设备连接在一起。通过在IP网上传送SCSI命令和数据,ISCSI推动了数据在网际之间的... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(831) 评论(0) 推荐(0)
摘要:最近实验室搞了一些列讲座,阿福师兄关于文件系统的讲座帮我弄清楚了一些以前不清楚的问题,以问答的形式对文件系统常见的问题进行了总结。 Q: 文件系统如何看待底层物理块设备? Ÿ 文件系统把块设备简单的看做线性的组合,即对文件系统而言,块设备是一系列可以读写的块。文件系统不需要知道这些物理设备的实际布局及如何读写,这些是设备驱动的工作。 Q: 跟文件系统相关的系统调用主要有那些? Ÿ 打开文件o... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(371) 评论(0) 推荐(0)
摘要:等待队列是linux里的一个重要数据结构,包括之前分析的fuse中也用到等待队列以实现阻塞IO,等待队列实际上是一个循环链表,需要等待某个条件的进程在相应的等待队列上睡眠,但等待条件变为真时,进程被唤醒。 主要的数据结构在include/linux/wait.h中声明及定义: 等待队列头的结构如下: struct __wait_queue_head { spinlock_t lock; //用于... 阅读全文
posted @ 2013-04-19 14:05 ydzhang 阅读(293) 评论(0) 推荐(0)
摘要:最近做项目时需要修改一下内核的配置,重新编译内核,于是到网上搜了个教程跟着做了,步骤大同小异。 进入/usr/src中发现fedora 11自带的源代码,进入后make,结果一直有错误,估计是发行版的内核做了优化之类的,具体原因不详。于是到kernel.org去down了2.6.25的source,经过多次尝试加资料收集,make menuconfig----》make(相当于make ... 阅读全文
posted @ 2013-04-19 14:04 ydzhang 阅读(641) 评论(0) 推荐(0)
摘要:看虚拟文件系统的次数估计已经是两位数了,每次都有新的收获,这里把VFS涉及到的链表串起来总结一下,主要就是四大对象之间的串连,由于把这些串连关系放到一个图中,逻辑结构太过复杂,可看性太差。另外虚拟文件系统中链接关系比较复杂,下面是对深入理解VFS机制比较重要的一些链表的介绍。 文件系统类型file_system_type链表 其中,file_systems全局变量定义在fs/filesyste... 阅读全文
posted @ 2013-04-19 14:04 ydzhang 阅读(485) 评论(0) 推荐(0)