- 博客(51)
- 资源 (6)
- 收藏
- 关注
原创 __attribute__ 属性之constructor/destructor
<br />#include<stdio.h><br /><br />void __attribute__( (constructor) ) display()<br />{<br /> printf("hello world!/n");<br />}<br /><br /><br />void __attribute__((destructor)) print()<br />{<br /> printf("exit /n");<br />}<br /><br />
2010-10-13 11:13:00
643
原创 对Linux kernel中 generic_hweight32函数的理解
<br />对Linux kernel中 generic_hweight32函数的理解 收藏<br />generic_hweight32<br />Hamming weight is the number of "1" bits in the binary sequence.<br />/*<br />* hweightN: returns the hamming weight (i.e. the number<br />* of bits set) of a N-bit word.<br />*/<br
2010-10-11 14:34:00
614
原创 Linux内存管理之高端内存映射
<br />一:引子<br />我们在前面分析过,在linux内存管理中,内核使用3G—>4G的地址空间,总共1G的大小。而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大小供内核映射到物理地址。通常,我们把物理地址超过896M的区域称为高端内存。内核怎样去管理高端内存呢?今天就来分析这个问题。<br />内核有三种方式管理高端内存。第一种是非连续映射。这我们在前面的vmalloc中已经分析过了,在vmalloc
2010-10-11 10:29:00
507
原创 page_address()函数分析--如何通过page取得虚拟地址
<br />由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的。<br /><br />一. x86上关于page_address()函数的定义<br /><br />在include/linux/mm.h里面,有对page_address()函数的三种宏定义,主要依赖于不同的平台:<br /><br />首先来看看几个宏的定义:<br />CONFIG_HIGHMEM:
2010-10-11 10:28:00
2359
原创 Linux 中软件 RAID 使用常见问题解决
在文章“Linux 中软件 RAID 的使用”中我们讲述了 Linux 系统中软 RAID 的基本概念和如何使用 mdadm 程序来管理软 RAID 设备,通过对 mdadm 命令的主要参数来介绍软 RAID 设备的创建,删除,停止和扩展等操作,以及其元数据和位图 bitmap 数据的管理方法。在本文中我们讨论使用软 RAID 设备常见的问题以及解决的方法。
2010-09-21 13:59:00
440
原创 Linux中软Raid的使用
在以数据为中心的信息时代,如何妥善有效地保护数据是存储系统的核心问题之一。人们可以忍受计算机宕机,所有应用程序重新启动或者硬件损坏,但是他们要求信息永远不会丢失。冗余磁盘阵列(Redundant Array of Independent Disks )技术是各种企业信息系统和个人广泛使用的解决方案,一般的中高档服务器多使用硬件RAID控制器,但是由于硬件RAID控制器的价格昂贵,导致系统成本大大增加。而随着处理器的性能快速发展,使得软件RAID的解决方法得到人们的重视。这里我们主要介绍在Linux系统中软件
2010-09-21 13:57:00
488
原创 几个重要的Linux操作系统 内核文件介绍
在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行:ls –l。编译过RedHat Linux内核的人对其中的System.map 、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作
2010-09-21 13:51:00
445
原创 vm_area_struct结构
每一个用户态进程都有独立的页目录,pgd就是页目录指针。进程的3GB虚拟地址空间不可能是全部映射到物理内存中的,所以mm结构的vm_area_struct记录了虚拟地址空间的使用情况。 注意:page结构记录了物理内存的使用情况 struct vm_area_struct { struct mm_struct * vm_mm; unsigned long vm_start; unsigned long vm_end; struct vm_a
2010-09-04 11:29:00
3070
原创 进程的虚拟内存布局
每一个用户态进程拥有独立的3GB用户态虚拟地址空间,共享1GB的内核空间,而这3GB的地址不可能都映射了物理内存。task_struct的mm成员就是用来描述这3GB的虚拟地址信息的。对于内核态进程,由于没有3GB的用户态虚拟地址空间,所以其mm结构为NULL,可是为什么要在task_struct中设置mm和active_mm两个mm_struct成员呢?这是由于内核线程没有用户态地址空间,所以他的mm设置为NULL,但是由于页目录的地址保存在mm结构中,从其他进程切换到这个内核态进程是,调度器
2010-09-04 11:06:00
1867
原创 进程的内核态堆栈
进程的内核态堆栈默认为2个页面8KB,由于在运行中需要频繁地获取当前进程的task_struct指针,因此内核定义了一个current,在任何时候,current都指向当前进程的task_struct.早期的内核把task_struct放到堆栈的顶部,这样在内核态,current这个宏就是ESP的最低13位清0,来得到当前进程的task_struct指针。但是随着task_struct结构的不断增大,把这个结构嵌入8KB的堆栈顶部已经不合适,于是分离出一个很小的thread_info结构嵌入到堆
2010-09-04 10:10:00
1296
原创 中断控制
<br /> Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器中的中断系统,或屏蔽掉整个机器中的一条中断线的能力,这些例程都是与体系结构相关的,可以在<asm/system.h>和<asm/irq.h>中找到。<br /> 一般来说,控制中断系统的原因归根结底是需要提供同步。通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。此外,禁止中断还可以禁止内核抢占。然而,不管是禁止中断还是禁止内核抢占,都没有提供任何保护机制来防止来自其他
2010-09-03 08:38:00
349
原创 共享的中断处理程序
<br />共享的中断处理程序和非共享的中断处理程序差异主要有以下三处:<br />1)request_irq()参数的flags必须设置为SA_SHIRQ标志;<br />2)对每个注册的中断处理程序来说,dev_id参数必须唯一。指向任一设备结构的指针就可以满足这一要求;通常会选择设备结构,因为它是唯一的,而且中断处理程序可能会用到它。不能给共享的处理程序传递NULL值。<br />3)中断处理程序必须能够区分它的设备是否真的产生了中断。这既需要硬件的支持,也需要处理程序中有相关的处理逻辑。
2010-09-02 17:04:00
412
原创 中断
<br />中断<br />中断使得硬件得以与处理器进行通信。中断本质上是一种特殊的电信号,由硬件设备发向处理器。处理器接收到中断后,会马上向操作系统反映此信号的到来,然后就有OS负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步---换句话说就是中断随时可以产生。因此,内核随时可能因为新到来的中断而被打断。<br />从物理学的角度看,中断是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚上。然后再由中断控制器向处理器发送相应的信号。处理器一经检测到此信号,便中断
2010-09-01 12:18:00
295
原创 I/O调度程序
<br /><br />如果简单地以内核产生请求的次序直接将请求发向块设备的话,性能肯定让人难以接受。磁盘寻址是整个计算机中最慢的操作之一,每一次寻址---定位硬盘磁头到特定块上的某个位置---需要花费不少时间。所以尽量缩短寻址时间无疑是提高系统性能的关键。<br />为了优化寻址操作,内核既不会简单的按请求接收次序,也不会立即将其提交给磁盘。相反,它会在提交前,先执行名为合并和排序的预操作,这中预操作可以极大地提高系统的整体性能。在内核中负责提交I/O请求的子系统被称为I/O调度程序。<br />
2010-08-31 19:59:00
1086
原创 上下文切换
<br /><br />上下文切换,也就是从一个可执行进程切换到另一个可执行进程,由定义在kernel/sched.c中的context_switch()函数负载处理。每当一个新的进程被选出来准备投入运行的时候,schedule()就会调用该函数。它完成了两项基本的工作:<br />调用定义在include/asm/mmu_context.h中的switch_mm(),该函数负责把虚拟内存从上个进程切换到新进程中。<br />调用定义在include/asm/system.h中的switch_t
2010-08-30 16:06:00
447
原创 内核抢占VS用户抢占
<br />用户抢占<br />内核即将返回用户空间的时候,如果need_resched被设置,会导致schedule()被调用,此时就会发生用户抢占。在内核返回用户空间的时候,它知道自己是安全的,因为既然它可以继续去执行当前进程,那么它当然可以再去选择一个新的进程去执行。所以内核无论是从中断处理程序还是在系统调用后返回,都会检查need_resched标志。如果它被设置了,那么,内核就会选择一个其他(更合适的)进程投入运行。从中断处理程序或系统调用返回的代码都是跟体系结构相关的,在entry.S文件中
2010-08-30 15:22:00
1594
原创 与处理器绑定有关的系统调用
<br /><br /> Linux调度程序提供强制的处理器绑定机制。也就是说,虽然它尽力通过一种软的或者说自然的亲和性试图使进程尽量在同一个处理器上运行。但它也允许用户强制指定“这个进程无论如何必须在这些处理器上运行。”这种强制的亲和性保存在进程task_struct的cpu_allowed这个位掩码标志中。该掩码标志的每一位对应一个系统可用的处理器。 默认情况下,所有的位都被设置,进程可以在系统中所有可用的处理器上执行。用户可以通过sched_setaffinity()设置一个不同的一个或几
2010-08-30 14:30:00
420
原创 调度程序的负载平衡
<br /> Linux的调度程序为对称多处理系统的每个处理器准备了单独的可执行队列和锁。也就是说,每个处理器拥有一个自己的进程链表,而它只对属于自己的这些进程进行调度操作。出去效率的考虑,整个调度系统从每个处理器来看都是独立的。那么,针对对称多处理系统,调度程序有没有提供什么加强型的策略来提升整体的调度呢?如果可执行队列间出现负载不均衡的情况时,比如一个处理器的队列上有五个进程,而另外一个处理器的队列上只有一个进程。该怎么办呢?这些问题由负载平衡程序解决,它负责保证可执行队列之间的负载处于均衡状
2010-08-30 14:29:00
500
原创 磁盘扇区
1 扇区头标 将每个环形磁道等距离切割,形成等长度的圆弧,每个圆弧就是一个扇区。划分扇区的目的是为了使数据存储更加条理化,就像一个大仓库要划分更多的房间一样。每个扇区可以存放512个字节的数据和一些其他信息。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。 扇区头标包括组成扇区三级地址的三个数字: 。扇区所在的柱面 。磁头编号 。扇区在磁道上的位置,即扇区号 柱面(Cylinder),磁头(Header)和扇区(Sector)三者简称CHS,
2010-08-29 21:55:00
3424
原创 磁盘盘片上的数据组织
硬盘首先在逻辑上被划分为磁道、柱面以及扇区。 每个盘片有两个面,每个面都有一个读写磁头,磁头起初停在盘片的最内圈,即线速度最小的地方。这是一个特殊区域,它不存放任何数据,称为启停区或着陆区。启停区外就是数据区。在最外圈,里主轴最远的地方是0磁道,硬盘数据的存放就是从最外圈开始的。硬盘有一个0磁道检测器,由它来完成硬盘的初始定位。0磁道为存放着用于操作系统启动所必需的程序代码,因为PC启动后BIOS程序在加载任何操作系统或其它程序时,总是默认从磁盘的0磁道读取程序代码来运行。
2010-08-28 16:50:00
1443
原创 影响磁盘性能的因素
<br /> 目前磁盘可以分为单碟盘和多碟盘,前者在盘体内只有一张盘片,后者则有多张。每张盘片的正反面都可以存放数据,所以每张盘片需要两个磁头,各读写一面。然而,有一点必须澄清,磁盘每个时刻只允许一个磁盘读写数据。也就是说,不管盘体内盘片和磁头再多,也不可能提高硬盘的吞吐量和IO性能,只能提高容量。然而,已经有很多人致力于改变这个现状,希望能让磁头在盘内实现并发读写,也就相当于盘片和盘片之间相互形成RAID从而提高性能,但是这项功能目前还没有可以应用的产品。<br /> 影响硬盘性能的因
2010-08-28 09:30:00
1495
原创 SAN和NAS的具体比较
<br />首先对SAN作一简要介绍:<br /> SAN的一个概念是允许存储设备和处理器(服务器)之间建立直接的高速网络(与LAN相比)连接,通过这种连接实现只受光纤线路长度限制的集中式存储。SAN可以被看作是存储总线概念的一个扩展,它使用局域网(LAN)和广域网(WAN)中类似的单元,实现存储设备和服务器之间的互连。这些单元包括:路由器、集线器、交换机和网关。SAN可在服务器间共享,也可以为某一服务器所专有,既可以是本地的存储设备也可以扩展到地理区域上的其他地方。SAN的接口可以是企业系统连接
2010-08-26 14:48:00
446
原创 硬盘缓存区
<br /> 磁盘上必须有缓存,用来接收指令和数据,还被用来进行预读。磁盘缓存时刻处于打开状态。有很多文档资料上提到某些情况下可以“禁用”磁盘缓存,这是容易造成误解的说法。缓存在磁盘上表现为一块电路板上的RAM芯片,其容量大小是固定的,目前有2MB,8MB, 16MB, 32MB等容量规格。所谓“禁用”磁盘缓存值得其实是write through模式。即磁盘收到写指令和数据后,必须先将其写入盘片,然后才向控制器返回成功信号,这样就相当于“禁用”了缓存。但是实际上,指令和数据首先到达的一定是缓存。<
2010-08-26 14:41:00
1777
原创 软连接VS硬链接
<br />首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。 <br />链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。 <br />一、硬链接<br />硬链接说白了是一个指针,指向
2010-08-26 11:43:00
357
原创 硬链接VS软连接
首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存中,从而实现文件的快速访问。 链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。软链接与硬链接,区别不仅仅是在概念上,在实现上也是不同的。区别:硬链
2010-08-24 14:38:00
317
原创 内核体系结构
<br />大部分Unix内核是单块结构:每一个内核层都被集成到整个内核程序中,并代表当前进程在内核态下运行。而微内核操作系统只需要有一个很小的函数集,通常包括几个同步原语,一个简单的调度程序和进程间通信机制。运行在微内核之上的几个系统进程实现从前操作系统级实现的功能,如内存分配程序、设备驱动程序、系统调用处理程序等等。<br />关于操作系统的学术研究都是面向微内核的,但这样的操作系统一般比单块内核的效率低,因为操作系统不同层次之间显示的消息传递要花费一定的代价。不过,微内核操作系统比单块内核有一定的理论
2010-08-24 11:46:00
230
原创 Raid0分析
<br /> <br />。我们先看看读写在Linux里面大概的过程:<br /> <br />虚拟文件系统层的作用:屏蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口。正是因为有了这个层次,所以可以把设备抽象成文件,使得操作设备就像操作文件一样简单。 <br />在具体的文件系统层中,不同的文件系统(例如 ext2 和 NTFS)具体的操作过程也是不同的。每种文件系统定义了自己的操作集合。关于文件系统的更多内容,请参见参考资料。 <br />引入 cache
2010-08-16 17:28:00
218
原创 并发控制经验之谈
多年使用锁的经验说明,我们很难驾轻就熟地使用锁。并发的管理本来就非常棘手,而许多使用方法都可能导致错误。本文将总结一些并发控制中容易导致错误的东西。不明确的规则: 恰当的锁定模式需要清晰和明确的规则。当我们创建一个可被并行访问的对象时,应该同时定义用来控制访问的锁。锁定模式必须在一开始就安排好,否则其后的改进将会非常困难。先期的时间投入通常会在调试阶段获得收益。在编写代码时肯定会遇到几个函数,它们均需要访问某个受特定锁保护的结构。这时。我们必须小心:如果某个获得锁的函数要调用其它同样试图获取这个锁的函数。我
2010-08-11 11:43:00
240
原创 并发的来源
<br />在现代Linux系统中存在大量的并发来源。比如正在运行的多个用户空间进程可能以一种令人惊讶的组合方式访问我们的代码。SMP系统甚至可在不同的处理器上同时执行我们的代码。内核代码是可抢占的;因此,我们的内核代码可能在任何时候(非原子上下文)丢失对处理器的独占,而拥有处理器的进程可能正在调用我们的内核代码。设备中断是异步事件,也会导致代码的并发执行。内核还提供了许多可延迟代码执行的机制,比如workqueue、tasklet以及timer等,这些机制使得代码可在任何时刻执行,而不管当前进程在做什么。
2010-08-11 08:53:00
208
原创 Linux 内核中的 Device Mapper 机制
本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Map
2010-08-03 19:34:00
430
原创 网上linux乐园
Internet是Linux的诞生地,Linus Torvalds当初创建她时,就是在Internet上,在全世界各地的UNIX高手、编程奇才的帮助下,以Internet为联系媒介,由分布在世界各地的成千上万的计算机爱好者一起努力的结果,所以认识Linux,学习Linux和应用Linux的最好场所就是Internet。下面所收集到的资源,希望能对和笔者一样正在学习、使用Linux的读者们提供最大的帮助。 1.国内的专业Linux网站(GB) 中国自由软件库:http://free
2010-08-03 15:11:00
271
原创 linux守护进程
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond, 打印进程lpd等。下面将我理解的Linux下守护进程做一些解释和说明。同时将网上一个常用的解说Linux下守护进程的程序作为实例介绍一下。 Linux下的守护进程 守护进程有三个最基本的
2010-08-03 11:13:00
189
原创 热插拔
<br /><br />热插拔事件的产生<br />一个热插拔事件是从内核空间发送到用户空间的通知,它表明系统配置出现了变化。无论kobject被创建还是被删除,都会产生这种事件。比如当数码相机通过USB线插入到系统时,用户切换控制台终端时,或者当给磁盘分区时,都会产生这类事件。热插拔事件会导致对/sbin/hotplug程序的调用,该程序通过加载驱动程序,创建设备节点,挂载分区,或者其他动作来响应事件。<br />我们要讨论最后一个重要的kobject函数用来产生这些事件。当我们把kobject传递给ko
2010-08-02 17:20:00
332
原创 指针和错误值
许多内部的内核函数返回一个指针值给调用者,而这些函数中很多可能会失败。在大部分情况下,失败是通过返回一个NULL指针值来表示的。这种技巧有作用,但是它不能传递问题的确切性质。某些接口确实需要返回一个实际的错误编码,以使调用者可以根据实际的情况做出正确的决策。 许多内核接口通过把错误值编码到一个指针中来返回错误信息。这种函数必须小心使用,因为它的返回值不能简单地和NULL比较。为了帮助创建和使用这种类型的接口。内核提供了一小组函数。 返回指针类型的函数可以通过如下函数返回一个错误值:
2010-07-31 20:29:00
179
原创 块设备驱动一些函数分析
<br /> <br />struct gendisk *get_gendisk(dev_t dev, int *part){ struct kobject *kobj = kobj_lookup(bdev_map, dev, part); return kobj ? to_disk(kobj) : NULL;}<br />这个函数用来获取设备的分区信息。参数dev是要获取分区信息的设备号,参数part返回设备在磁盘中分区的编号,如果是整个磁盘则part返回0,这个函数返回包含此设备的磁盘
2010-07-29 19:25:00
237
原创 关于宏的解析顺序
<br />#include<stdio.h><br /><br />#define xjoin(x,y) x ## y<br />#define join(x,y) xjoin(x,y)<br /><br />int join(join(join(x,y),z),0)()<br />{<br /> return 3;<br />}<br />int main(int argc, char *argv)<br />{<br /> int i
2010-07-28 14:17:00
249
原创 后备高速缓存
<br />设备驱动程序常常会反复地分配很多同一大小的内存块。既然内核已经维护了一组拥有同一大小内存块的内存池,那么为什么不为这些反复使用的块增加某些特殊的内存池呢?实际上,内核的确实现了这种形式的内存池,通常称为后备高速缓存。设备驱动程序通常不会涉及这种使用后备高速缓存的内存行为,但也有例外,linux2.6中的USB和SCSI驱动程序就使用了这种高速缓存。<br />Linux内核的高速缓存管理有时称为“slab分配器”。slab分配器实现的高速缓存具有kmem_cache_t类型,可通过调用kmem_
2010-07-28 09:34:00
961
原创 Linux内存管理之高端内存映射(转贴)
-------------------------------------- 本文系本站原创,欢迎转载! 转载请注明出处:http://ericxiao.cublog.cn/ ------------------------------------------ 一:引子 我们在前面分析过,在linux内存管理中,内核使用3G—>4G的地址空间,总共1G的大小。而且有一部份用来做非连续空间的物理映射(vmalloc).除掉这部份空间之外,只留下896M大小供内核映射到物理地
2010-07-27 23:21:00
572
原创 高端内存与低端内存
首先给出它们的定义: 低端内存:存在逻辑地址的内存。 高端内存:是指那些不存在逻辑地址的内存。 在装有大量内存的32位系统中,内核逻辑地址和内核虚拟地址的不同将非常突出。由于使用32位地址最多同时能在4GB内存中寻址,因此直到最近,32位系统的linux仍被限制使用少于4GB的内存。 内核将4GB的虚拟地址空间分割为用户空间和内核空间,在二者的上下文中使用同样的映射。一个典型的分割是将3GB分配给用户空间,1GB分配给内核空间。内核代码和数据结构必需与这样的空间相匹配,但是占用内核地址空间最大的部分
2010-07-27 23:14:00
1647
原创 linux 地址类型
Linux 系统处理多种类型的地址,而每种类型的地址都有自己的语意。下面分别进行介绍: 用户虚拟地址:这是在用户空间程序所能看到的常规地址。用户地址或者是32位的,或者是64位的。这取决于硬件的体系架构。每个进程对都有自己的虚拟地址空间。 物理地址:该地址在处理器和系统内存之间使用,物理地址也是32位的或者是64位的,在某些情况下甚至32位系统也能使用64位的物理内存。 总线地址:该地址在外围总线和内存之间使用。通常它们与处理器使用的物理地址相同,但这么做并不是必需的。一些计算机体系架构提供了I/O内
2010-07-27 22:29:00
1207
CC嵌入式编程.pdf
2009-02-12
中兴6SIGMA培训资料.rar
2009-02-12
图像格式.doc JPEG
2009-02-12
s60文件系统解析 nokia。
2009-02-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人