自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

转载 Linux SCSI 子系统剖析

GNU/Linux 和 SCSI 是很好的一个组合,因为二者在各自的环境中具有类似的特征。GNU/Linux 是一种安全可靠的操作系统,可以不间断地运行。SCSI 适合于可靠和高性能存储。二者都是开源的。您可以下载和查阅 International Committee on Information Technology Standards (INCITS) T10 Technical Commit

2013-08-28 10:12:46 948

转载 Linux SCSI 子系统剖析

原文地址:Linux SCSI 子系统剖析 作者:soararingSmall Computer Systems Interface (SCSI) 是一组标准集,它定义了与大量设备(主要是与存储相关的设备)通信所需的接口和协议。 Linux® 提供了一种 SCSI 子系统,用于与这些设备通信。Linux 是分层架构的一个很好的例子,它将高层的驱动器(比如磁盘驱动器或光驱)连接到

2013-08-28 10:04:48 735

转载 scsi设备模型一

原文地址:scsi驱动模型 作者:soararingscsi驱动在内核中的位置  scsi驱动的核心为总线层驱动,在总线层驱动之上为各种不同的scsi设备驱动,在总线层驱动之下为scsi host驱动。其在内核中的位置如下图所示:    2.3 Linux中scsi驱动框架  在Linux中scsi驱动基本分为三大层:top le

2013-08-28 09:41:22 1126

转载 僵尸进程

1 僵尸进程基本概念,危害性以及避免该部分内容来自 http://blog.csdn.net/duchuanying/article/details/14960871.什么是僵尸进程?In UNIX System terminology, a process that has terminated,but whoseparent has not yet waited f

2012-11-01 14:30:59 515

原创 用引用计数实现简单互斥模型理解

2012-02-07 16:42:56 530

原创 block级锁的理解

1 block 里面的sem本质上是一个队列,是对action的排队目前来说, action包括(io, unmap, remap, merge)2 block 里面为什么一定要一把状态的锁, 因为在某些流程处理中, {检测状态 = >做相应操作} 后面的相应操作必须要依赖前面的状态。 如果不用状态锁的话, 其它上下文可能会改变该状态,从而使后面的操作没有意义。3 put_block中

2012-01-05 10:22:45 1027

原创 锁理解

spin_lock_irqsave 的代码理解:local_irq_save            关闭本地中断preempt_disable         禁止抢占....    __raw_spin_lock  (里面会一直让cpu 做nop(空

2011-09-04 10:40:00 708

原创 块设备驱动-模块引用计数理解

引用计数的理解Add_disk 调用blk_register_region,传入exact_lock。而exact_lock会调用get_disk增加模块的引用计数。Add_disk之后调用register_disk,它会调用blkdev_get,最终调用do_open尝试打开盘,增加引用计数,然后调用blkdev_put来减少引用计数。 add_disk          b

2011-08-25 19:15:39 2072 1

转载 Perl 使用 sort, hash解析文件代码

同事写的简单的Perl代码#!/usr/bin/perl -wuse strict; my $pbid_index = 0;my $lbid_index = 3;my $ver_index = 5;my $uuid_index = 6; &test(); sub my_sort

2011-07-18 18:03:11 1102

原创 bio切分函数 ---- 非递归实现

以前的实现方式: 递归式的,但是在内核中递归是一个非常危险的举动, 所以把它实现成非递归的数据结构:struct md_bio_pair {         struct list_head bio_head;        struct bio *oldbio;

2011-07-18 17:58:21 1147

转载 IO系统性能 衡量 指标

1随着系统实际IOPS越接近理论的最大值,IO的响应时间会成非线性的增长,越是接近最大值,响应时间就变得越大,而且会比预期超出很多。2在实际的应用当中,只会用IOPS来衡量小IO的随机读写的性能,而当要衡量大IO连续读写的性能的时候就要采用传输速度而不能是IOPS了3当我们要用I

2011-07-07 11:42:07 639

原创 ext3日志文件系统理解

1.        对于ext3日志文件系统。是一个事务,对应同一个时间戳?对于ext3的Ordered模式(默认模式)来说事务里面仅包含元数据,包括 inode,bitmap等,这些都会被先写到JBD层所在的磁盘上。每个事务都有自己的状态标记,比如是否committed。没有commit会被放到一起,然后被JBD层scan下刷。在没有断电的情况下,是直接把内存中的相应内容刷到磁盘,断电后重启后,

2011-06-11 10:36:00 2645

原创 项目调试bug感悟 && 取数的高位

1spin_lock_irqsave的第二个参数 flag 必须为unsign long 型,否则会出内存溢出的问题 2对一块内存free(vfree, kfree, mempool_free)后,一定要将相应的指针置空。 否则会出野指针的问题。 这一点在memp

2011-04-23 10:15:00 953

原创 calltrace 中寄存器 && vmalloc && virt_to_page

<br />1<br />预备知识:<br />RIP(指令指针)RIP寻址代码段存储区内的下一条指令<br /> <br /> <br />RSP(堆栈指针)RSP寻址一个称为堆栈的存储区。通过这个指针存取堆栈存储器数据,具体操作将在本书后面讲解访问堆栈存储器数据的指令时再进行

2011-04-15 11:02:00 1602

原创 项目思考

<br />系统的设计是王道,测试只是从一个侧面来考察系统的稳定行,健壮性等。<br /> <br />1<br />为了增加 系统的 健壮性以及 易维护性,需要对系统的结构进行优化。<br /> <br />2<br />从内存压力角度来看系统,导致我们加入 extent概念以及 元数据的换入换出<br /> <br />3<br />具体 实现方面 <br /> <br />1) 为了解决 数据和元数据 的先后关系,引入master --- slave 关系<br />2) 为了 解决 由于 下发请求过

2011-04-13 11:49:00 567

原创 关于 中断 以及 死锁的错误

环境 : 2.6.18内核发生死锁有2中错误:1 :soft lockup - cpu#0  stuck for 10s 发生这种情况的根本原因是__smp_call_function 里面 的 spin_lock(&call_lock) 一直拿不到锁而导致它发生的情况目前遇到2种:1) 死循环所以如果在某个地方不停retry的话,就必须睡一段时间。目前使用的是:set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(WAIT_TIME);目的是

2011-04-12 10:03:00 1781

原创 操作页中某几位 && 块设备 max_sectors

<br />环境 : 2.6.18内核<br /> <br />1<br />调用blk_queue_max_sectors函数,可以设置我们自己的块设备queue的最大sectors,(将来bio_add_page)时,需要用到这个值,最近突然发现调用这个函数时,max_sector的上限是BLK_DEF_MAX_SECTORS(1024)。<br />       这同时印证了 ldd 将bio一节时,说bio 容纳的最大页数是128页<br /> <br />2<br />操作页中某几位小函数实现:<

2011-04-11 16:43:00 1223

原创 vmware虚拟机重启。以及系统服务重启后的相关设置

问题如下:一个模块老是在系统重启的时候自动加载一个模块。 (猜测是某个服务启动时,加载的模块)解决方法一(交互式重启)在系统重启后,常按“I”可以暂停自动加载服务模式,进入交互式加载模式。找到相应的服务,不让它启动。解决方法二(修改启动config文件)runlever 参看运行状态。 输出3(有网络连接的多用户命令行模式)于是到 /etc/rc3.d文件下,这里有runlevel 为3 时,系统启动运行的脚本, 找到相应的服务脚本,进去修改即可。或者利用chkconfig --del name 将相应的文

2011-03-29 11:36:00 9509

原创 存储理解

今天老板来讲了一通,醍醐灌顶,对自己做的东西终于有了一个大概的了解。1raid5对于小写更新,只有25%的raid1的性能。 原因如下: 一个小写(不够一个条带)过来。 需要先读就“旧数据”和“旧的校验” 然后和构成新的数据的新的校验和。相当于有2次读和2次写,这样导致形成只有原来25%的性能。而我们做的系统,asd和cbd充分利用空间局部性(小io变成大io),而bwc(拿出系统2%的空间),充分利用时间局部性(上层应用有可能在不同的时间老是写同一块)。最终可以达到80% ----  90%的raid0的

2011-03-23 21:34:00 729

转载 内核线程 中断上下文 睡眠

1)中断处理程序(top half)中不能睡眠,是因为哪个原因:a)没有进程上下文,睡眠之后不能重新调度?b)中断程序可能关闭了所有中断(使用SA_INTERRUPT),那么再睡眠,就没有抢占点了(中断都进不来,哪里可以schedule()?)2)kernel thread (ps 中名称类似"[xxx]"),可以睡眠,是因为kernel thread是有上下文,可以调度的,那么kernel module作为kernel的一部分是否能够睡眠?为什么?如果能,它有上下文么?3)除了内核线程,内核什么地方可以用

2011-03-19 09:53:00 7052 5

原创 内存越界引起的bug汇总

1一个比较隐蔽的死锁bug 在测试代码的过程中,发现有大概百分之一的概率会出现一个死锁bug。进过仔细检查,发现加锁,解锁的地方是没有问题的。实在找不到问题的原因了,一狠心在每次加锁和解锁之后,将rwlock_t中的lock值打印出来。 每次write_unlock之

2011-02-25 18:01:00 1994

原创 从块设备层理解 add_disk,mkfs.ext3,mount,umount

<br /><br />因为自己写的块设备驱动程序在文件系统的下一层,所以可以通过监视进去块设备的bio的一些数据,来窥视一些操作的内部实现。 比如: add_disk,mkfs.ext3,mount ,umount 等<br /> <br />使用的块设备的大小为 10G<br /> <br />add_disk时,进入make_request的数据如下:<br /> <br /> <br /> <br />rw :READ,bi_sector : 20971392,bi_size :4096<br />

2011-01-17 10:36:00 2021

原创 内核函数(宏)总结

从2.6.32 移植到 2.6.18内核 上碰到的一个问题 当我们判断某个 红黑树节点 或者  list_node 没有被 加到红黑树(或者list)上时,我们会用RB_EMPTY_NODElist_empty_carefulif(!RB_EMPTY_NODE

2010-12-29 19:56:00 1903

原创 hash表,radix_tree,红黑树,B+树比较

如题,这几种数据结构都是我们平时常用的数据结构。hash链表: 本质上就是 数组 + 链表hash树: 本质上就是 数组 + 树。这个树可以是红黑树,B+树,radix_tree等因为每种数据结构都有自己的优点,缺点。hash链表的各种性能介于 数组和链表之间,hash树的各种性能介于 数组和链表之间。先看一个摘自网上的图: 首先,它们的程序在不同程度上比数组和链表的复杂;其次,哈希表要求预先知道要存储多少数据,数据对存储空间的利用率也不是非常高。普通的二叉树对顺序的数据来说,会变成缓慢的O(N)级操作;而

2010-12-22 10:19:00 13671 2

原创 cache设计 && 局部变量调试bug

<br />在我们需要进行查找操作时,如果感觉查找很耗时间,就可以利用cache机制。<br />比如 :<br />在“虚拟地址->物理地址” 过程中使用的tlb<br /> <br />find_vma 搜索vm_area_struct结构时,也是先找cahche,如果没有命中cache,才会遍历红黑树。<br /> <br /> <br /> <br />------------------------------------------------------<br /> <br />以前调一个bu

2010-12-17 13:03:00 813

原创 find_first_bit 与 fls

<br />find_first_bit 顾名思义,就是找出 位图中第一个为1的位。<br /> <br /> <br /><br />Fls(x) = log2(x)+1<br /> <br />可以用来求2叉树的树高。<br />比如:<br />fls(1)=1<br />fls(11)=4<br />fls(111)=7

2010-12-14 10:02:00 3680

转载 内核线程相关

http://blog.csdn.net/maray/archive/2009/08/13/4442450.aspxhttp://blog.csdn.net/bing_bing/archive/2010/09/16/5889224.aspx

2010-12-14 09:33:00 492

原创 shell脚本基础

写一个最基本的shell脚本注意一下几点:1while 与 【】直接有空格; 【】内部的表达式与【】直接有空格2“=” 前后没有空格 下面是将对某个设备dd的数据重定向到result文件中。   1#!/bin/sh  2i=0

2010-12-13 12:52:00 392

原创 strcmp 与strncmp

在比较字符串的时候最好使用 strncmp.今天写代码时,使用strcmp 比较2个字符串,第一次比较没有问题,第二次比较老是失败。后来换成strncmp就没有问题了

2010-12-08 21:00:00 915

原创 cond_resched 以及 dm-io相关问题

cond_resched 这个函数具有主动被调度的作用。为了及时响应实时过程,需要中断线程化,而在中断线程化的过程中,需要调用cond_resched 这个函数。在目前的内核代码中,一般在读磁盘前(或者其它可能费时操作前),会调用这个函数。  在使用dm_io_s

2010-12-06 16:50:00 3783

转载 Linux内存管理图解

转自: http://www.cublog.cn/u3/94690/showart_2051283.htmlLinux内存管理图解作者:wdy一、逻辑地址转线性地址   机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。我们写个最简单的hello world程序,用gccs编译,再反编译后会看到以下指令:mov    0x80495b0, %eax这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的DS 数据段的

2010-11-17 20:24:00 986

转载 Perl 中的正则表达式

转自 http://www.chinaunix.net/jh/25/159388.htmlPerl 中的正则表达式正则表达式的三种形式 正则表达式中的常用模式 正则表达式的 8 大原则       正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地用正则表达式来完成字符串处理的任务,当然在 CGI 程序设计中就更能得心应手了。下面我们列出一些正则表达式书写时的一些基本语法规则。-----------------------

2010-11-15 16:21:00 388

原创 大量使用kmalloc容易造成内存浪费

<br />这段时间做关于缩减内存的项目。发现一个现象,当 调用kmalloc,kfree达到百万级别时,系统内存消耗很大。但和我们算的理论值有几倍的差值。<br />非常困惑。<br />后来,发现在/proc/slabinfo中size_256一直在增大,但我们mempool的alloc_fn用kmalloc只分配80字节。Why? <br />原因: slab是按照2的幂次来分配的,而且是按照一定的倍数来分配的。<br /> <br />用于kmalloc可分配的内存大小范围在32~131027(12

2010-11-11 11:38:00 2322

原创 内核模块中如何打开文件?

第一种方案:用sys_open,sys_read,sys_close需要包含头文件:#include #include /* sys_open, sys_read; sys_close */#include #include 编译 通过,但在insmod模块的时候,却提示:Unknown symbol sys_open. (有可能在内核空间,看不到这个导出的函数,怎么办?)师兄告诉一种方法:在本模块中,自己声明相应的函数指针。比如asmlinkage long (*sys_open1)(const cha

2010-11-10 21:05:00 2462

原创 从网络安装Windows客户机系统步骤

1 在bios中设置“”2选stage1,在服务器上选择要安装的系统3选择ntfs格式化,重启后,选择stage2,后面就不用管了。

2010-11-10 10:47:00 804

转载 slub中的kmalloc和kfree学习笔记

<br />完全转自:  http://linux.chinaunix.net/bbs/thread-1110127-1-1.html<br /> <br />2.6.26中的内存管理大概分为3个层次 SLUB,伙伴系统和ZONE,其中SLUB在最高层,这里通过分析kmalloc和kfree来分析SLUB的模型,在内存管理中还有NUMA系统,但是NUMA不是必须得,所以以下笔记建立在无SMP和不使用NUMA的环境下,并且不运行DEBUG设置<br /><br />SLUB主要对1页以下的内存进行管理,将1页

2010-11-09 20:09:00 1032

转载 Linux 守护进程的编程方法--水碧桥(转载)

作者:jahnny   守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。 守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些

2010-11-08 16:27:00 430

原创 关于bi_sector 的问题

今天一直被一个问题所困扰,我在发bio的时候,打印了bi_sector,然后在bio的结束回调函数里面将bi_sector打印出来,发现它们始终不一样。还以为我们使用的结构有问题,最后查看内核代码,发现在bio_endio里面确实会改变bi_sector. bio->bi_sector += (bytes_done >> 9);浪费一上午时间啊

2010-11-05 14:43:00 1858

转载 vmstat与iostat输出结果详解 -- 转载

<br />转自:http://space.itpub.net/540962/viewspace-321757<br /> <br />Linux下vmstat输出释疑:<br /><br />Vmstat<br />procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----<br />r b swpd free buff cache si so bi bo in cs us sy id wa<br />0 0

2010-11-03 11:49:00 643

转载 Perl 中的正则表达式

<br />转自 : http://www.chinaunix.net/jh/25/159388.html<br /> <br /> <br />9    Perl 中的正则表达式<br />正则表达式的三种形式 <br /><br />正则表达式中的常用模式 <br /><br />正则表达式的 8 大原则 <br /><br />  <br /><br />      正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地

2010-11-01 16:12:00 357

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除