Linux内核分析
文章平均质量分 81
在hust快乐的学习
希望通过CSDN这个平台认识更多志同道合的朋友!
实现共同进步!
展开
-
linux deadline I/O调度算法分析笔记
deadline算法的核心就是在传统的电梯算法中加入了请求超时的机制,该机制主要体现在两点:(1)请求超时时,对超时请求的选择。(2)没有请求超时时,当扫描完电梯最后一个request后,准备返回时,对第一个request的选择。基于以上两点,平衡了系统i/o吞吐量和响应时间。此外,该算法还考虑到了读操作对写操作造成的饥饿。算法核心数据结构:struct deadline_data {转载 2012-08-08 10:05:35 · 4240 阅读 · 0 评论 -
__make_request()函数分析
我们知道,每个块设备程序都有一个请求队列与之关联。在块设备初始化时,会分配并初始化请求队列。在这个时候,我们便可以为块设备驱动程序指定特定的IO调度算法,默认情况下是强制使用系统默认的调度算法。熟悉块设备驱动的人知道,内核是通过generic_make_request函数来不断转发bio,直到该bio被挂载到物理设备的请求队列中。generic_make_request函数会获取bio所指向b转载 2013-03-25 21:21:27 · 11786 阅读 · 0 评论 -
2.6.32内核的generic_make_request()解读
/**************************************************************** * 2.6.32内核的generic_make_request解读 * Blog : noshape.cublog.cn ********************************************************转载 2013-03-25 20:54:21 · 4166 阅读 · 0 评论 -
linux驱动的入口函数module_init的加载和释放
就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:#include #include #include 其中,init.h 定义了驱动的初始化和退出相关的函数,kernel.h 定义了经常用到的函数原型及宏定义,module.h 定义了内核模块相关的函数、变量及宏。 几乎每个转载 2013-05-21 20:08:42 · 1033 阅读 · 0 评论 -
linux内核中等待队列
根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析 介绍这几个函数,不得不先介绍等待队列wait_queue_head_t与完成量completion。 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。 完成量机制是基于等待队列的,内核利用该机制等待某一操作的结束。转载 2013-05-22 11:27:56 · 1295 阅读 · 0 评论 -
kernel panic
Linux kernel panic是很难定位和排查的重大故障,一旦系统发生了kernel panic,相关的日志信息非常少,而一种常见的排查方法—重现法–又很难实现,因此遇到kernel panic的问题,一般比较头疼。没有一个万能和完美的方法来解决所有的kernel panic问题,这篇文章仅仅只是给出一些思路,一来如何解决kernel panic的问题,二来可以尽可能减少发生kernel转载 2013-05-15 20:54:12 · 941 阅读 · 0 评论 -
Linux 内核 hlist 详解
在Linux内核中,hlist(哈希链表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和hlist相关的数据结构有两个:hlist_head 和 hlist_node//hash桶的头结点struct hlist_head { struct hlist_node *first;//指向每一个hash桶的第一个结点的指针};//hash桶的普通结点struct hl原创 2014-04-27 19:14:11 · 30779 阅读 · 4 评论 -
Linux noop io 调度算法分析
定义了一个elevator_noop的调度器类型: static struct elevator_type elevator_noop = { .ops = { .elevator_merge_req_fn = noop_merged_requests,//查询一个request,用于将bio并入 .elevator_dispatch_fn = noop_dispatch,/原创 2014-04-28 19:24:55 · 4488 阅读 · 0 评论 -
Linux deadline io 调度算法
deadline算法的核心就是在传统的电梯算法中加入了请求超时的机制,该机制主要体现在两点:1、请求超时时,对超时请求的选择。2、没有请求超时时,当扫描完电梯最后一个request后,准备返回时,对第一个request的选择。基于以上两点,平衡了系统i/o吞吐量和响应时间。此外,该算法还考虑到了读操作对写操作造成的饥饿。定义了elevator_deadline调度器类型:原创 2014-04-28 19:54:28 · 8352 阅读 · 0 评论 -
LINUX设备驱动之设备模型五--device&driver&bus(三)
接上一篇文章,继续device_add()中的代码: error = bus_add_device(dev); if (error) goto BusError;在对应总线目录下的device目录下创建几个到device的链接文件。 error = dpm_sysfs_add(dev); if (err转载 2012-08-13 22:23:31 · 2303 阅读 · 0 评论 -
linux CFQ IO调度算法分析笔记
CFQ调度器是四种IO Scheduler中最复杂的一个,redhat有个文档可以做为入门的文档先了解下 red-hat-enterprise-linux-5-io-tuning-guide.pdfThe cfq scheduler maintains a maximum of 64 internal request queues; each process running on th转载 2012-08-08 10:15:25 · 6949 阅读 · 0 评论 -
Linux Anticipatory (预测)I/O 调度算法分析笔记
as_add_request是调度算法的入口。AS和Deadline比较类似,都是先把request加入sector 排序的红黑树,然后再把requst加入fifo。只不过AS因为加入了预测,需要在加入requst时,调用as_update_rq来更新当前算法所维护的状态。此外,二者不同之处是,Deadline是以读写来区分request的方向,而AS是以是否同步来区分方向:data_dir =转载 2012-08-08 10:08:23 · 3205 阅读 · 0 评论 -
Linux 内存管理 -- 高端内存的映射方式
解释一: 高端内存是指物理地址大于 896M 的内存。对于这样的内存,无法在“内核直接映射空间”进行映射。为什么?因为“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力。实际上,“内核直接映射空间”也达不到 1G, 还得留点线性空间给“内核动态映射空间” 呢。因此,Linux 规定“内核直接映射转载 2012-08-13 16:32:05 · 1338 阅读 · 0 评论 -
LINUX设备驱动之设备模型三--device&driver&bus(一)
在清楚了kobject之后,就可以继续分析device、driver、bus了,这三者是设备驱动程序的基本数据结构。我们可以这样理解,内核用device来表示各种设备,然后用driver来表示它的驱动,而设备有很多种,也属于相同类型或不同类型,而其对应的驱动可能同时也是另外一个设备的驱动,为了管理这些设备和驱动,就引入了总线bus_type,总线上有两个集合(也可以理解为两转载 2012-08-13 22:19:23 · 1089 阅读 · 0 评论 -
页面交换守护进程kswapd
从原理上说,kswapd相当于一个进程,它有自己的进程控制块task_struct结构。与其它进程一样受内核的调度。而正因为内核将它按进程来调度,就可以让它在系统相对空闲的时候来运行。不过,与普通进程相比,kswapd有其特殊性。首先,它没有自己独立的地址空间,所以在近代操作系统理论中把它称为“线程”以与进程相区别。那么,kswapd的地址空间是什么?实际上,内核空间就是它的地址空间。在这一点上,转载 2012-08-13 19:18:20 · 3446 阅读 · 0 评论 -
LINUX设备驱动之设备模型一--kobject
LINUX设备驱动驱动程序模型的核心数据结构是kobject,kobject数据结构在\linux\kobject.h中定义:struct kobject { const char *name; struct list_head entry; struct kobject *parent;转载 2012-08-13 22:14:44 · 1104 阅读 · 0 评论 -
LINUX设备驱动之设备模型二--kset
我们已经知道了kset内嵌了kobject来表示自身的节点,创建kset就要完成其内嵌kobject,注册kset时会产生一个事件,事件而最终会调用uevent_ops字段指向结构中的函数,这个事件是通过用户空间的hotplug程序处理。下面我们一步一步分析。内核同样提供了创建和注册kset的函数kset_create_and_add()struct kset *kset_create_a转载 2012-08-13 22:17:20 · 885 阅读 · 0 评论 -
LINUX设备驱动之设备模型四--device&driver&bus(二)
接上一篇文章,在往总线注册注册设备前要先创建device,我们可以静态的定义device结构变量,然后调用device_register()将其注册,或者通过内核提供的device_create()接口函数创建和注册device。先看看device的数据结构定义:struct device { struct device *parent;转载 2012-08-13 22:21:28 · 1473 阅读 · 0 评论 -
Linux Barrier IO
IO顺序是一个比较综合的问题,它涉及的层次比较多,从VFS page cache到I/O调度算法,从IO子系统到存储外设。而Linux Barrier IO就是其中重要的一部分。可能很多人认为,在做了文件写操作后,调用fsync就能保证数据可靠地写入磁盘。大多数情况下,确实如此。但是,由于磁盘设备自带缓存的存在,fsync这些同步操作,并不能保证存储设备把数据写入非易失性介质。如果此时原创 2015-01-18 09:35:34 · 2252 阅读 · 0 评论