自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 把块存放在页高速缓存中

一、概述   Linux支持的文件系统大多以块的形式组织文件,为了减少对物理块设备的访问,在文件以块的形式调入内存后,使用块高速缓存(buffer_cache)对它们进行管理。每个缓冲区由两部分组成,第一部分称为缓冲区首部,用数据结构buffer_head表示,第二部分是真正的缓冲区内容(即所存储的数据)。由于缓冲区首部不与数据区域相连,数据区域独立存储。因而在缓冲区首部中,有一个指向数据的指

2016-06-23 23:06:55 427

转载 linux内核之页高速缓存

一/概述页高速缓存(page cache)     1.页高速缓存是Linux内核所使用的主要磁盘高速缓存。     2.页高速缓存中可能包含的内容:                  a,含有普通文件数据的页;                  b,含有目录的页;                  c,含有直接从块设备文件读出的数据的页;

2016-06-23 22:19:03 684

转载 读者-写者问题

读者—写者问题读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许

2016-06-23 21:47:03 684

转载 自旋锁

概念何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持

2016-06-23 17:08:29 821

转载 RCU同步机制

《RCU是什么?》第一部分概述     Read-copy update (RCU) 是一种 2002 年 10 月被引入到内核当中的同步机制。通过允许在更新的同时读数据,RCU 提高了同步机制的可伸缩性(scalability)。相对于传统的在并发线程间不区分是读者还是写者的简单互斥性锁机制,或者是哪些允许并发读但同时不 允许写的读写锁,RCU 支持同时一个更新线程和多个读线程的

2016-06-23 11:51:58 529

转载 内核同步机制——RCU同步机制

转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml目录[隐藏]1 RCU同步机制1.1 RCU介绍1.2 RCU API函数说明1.3 调用RCU API实现RCU同步1.4 RCU基本设计模式1.5 变换RCU运算法则后的RCU模式1.6 RCU相关数据结构1.7 R

2016-06-23 11:02:41 6461

转载 UNIX操作系统中加锁和解锁

Unix操作系统加锁和解锁的基本思想是,当某个进程进入临界区,它将持有一个某种类型的锁(UNIX里一般来说是semaphore,Linux里一般是信号量和原子量或者spinlock)。当其他进程在该进程没有释放该锁时试图进入临界区(加锁),它将会被设置成睡眠状态,然后被置入等待该锁的进程队列(某个优先级的)。当Unix操作系统该锁被释放时,也就是解锁事件发生时,内核将从等待该锁的进程优先级

2016-06-23 10:22:38 2180

转载 操作系统中的锁

操作系统内的同步系统,都是使用原子操作实现的。原子操作又是如何实现的呢?一般的操作系统书都是写使用二值信号量实现的。即用二值信号量挡在原子操作的开始和结束,以保护原子操作不被打断。这个是重要的理论依据,但并不能指导实践。因为,二值信号量其实就是对一个标志位置位,当然,在置位前必须测试一下二值信号量。整个信号量的获取过程可以用伪代码描述如下: 1. 如果 信号量S

2016-06-23 10:04:08 1053

原创

在多线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。   所谓的锁,说白了就是内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经上锁,则返回失败。解锁时,则把锁

2016-06-23 09:47:24 208

原创 CAS(compare-and-swap)

支持并发的第一个处理器提供原子的测试并设置操作,通常在单位上运行这项操作。现在的处理器(包括 Intel 和 Sparc 处理器)使用的最通用的方法是实现名为 比较并转换 或CAS 的原语。(在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。PowerPC 处理器有一对名为“加载并保留”和“条件存储”的指令,它们实现相同的目地;MIPS 与 PowerPC 处理器相似,

2016-06-22 22:12:34 383

转载 文件系统对页高速缓存的操作

本文从read函数入手,主要讲述从页缓冲,一直到具体的块请求被提交给块设备驱动程序的过程,以下是本文讲述的一张概图,也是对本文的一个概括,可以结合本图,首先由一个从全局上有个清楚的认识,然后再去查看具体的代码,当然本文只是从大体流程上对页缓冲的处理流程进行分析,还有很多小的细节没有搞清楚,后面还需要继续研究。 1.具体文件系统我们知道通用文件系统也就是虚拟文件系

2016-06-17 20:24:47 813

转载 mcheck

文章出处:http://book.chinaitlab.com/linux/777316.html    mcheck是Glibc提供函数,声明如下:    int mcheck (void (*abortfn) (enum mcheck_status status))    此函数通知malloc进行一致性检查。它可以检查出内存分配不匹配的情况。    enum

2016-06-17 16:10:56 2521

原创 calloc&malloc&kmalloc&vmalloc

头文件:#include calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:    void* calloc (size_t num, size_t size);calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。

2016-06-17 11:38:58 614

原创 Mtrace

对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程序的时候就会遇到。Debug起来也是比较累人。其实Linux系统下有一个使用的工具可以帮忙来调试的,这就是Mtrace。Mtrace主要能够检测一些内存分配和泄漏的失败等。下面我们来学习一下它的用法。使用Mtrace来调试程序有4个基本的步骤,需要用到GNU C 函数库里面的一些辅助的函数功能。1. 在需要跟踪的程序中需要包含

2016-06-17 10:29:41 2052

转载 strrchr

strrchr() 函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回 false。与之相对应的是strchr()函数,它查找字符串中首次出现指定字符的位置。语法strrchr(string,char)参数描述string

2016-06-16 22:00:48 743

转载 sizeof

sizeof()功能:计算数据空间的字节数1.与strlen()比较      strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。      而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。2.指针与静态数组的sizeof操作      指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为

2016-06-16 21:47:39 239

原创 readlink

相关函数: stat, lstat, symlink表头文件: #include 定义函数:int  readlink(const  char *path,  char *buf, size_t  bufsiz);函数说明:readlink()会将参数path的符号连接内容到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾,但会将字符串的字符数返回。若参数bufsiz小于

2016-06-16 17:31:54 388

转载 进程概述和内存分配

进程一个进程的内存布局是什么样的?每个进程所所分配的内存由很多部分组成,通常我们称之为段,一般会有如下段:文本段 包含了进程执行的程序机器语言指令,文本段具有只读属性,以防止进程通过错误指针意外修改自身的指令。初始化数据段包含了显示初始化的全局变量和静态变量,当程序加载到内存时,从可执行文件中读取这些变量的值未初始化数据段包含了未进行显式初始化的全局变量和静态变量,程序启动

2016-06-16 17:28:08 134732

原创 bzero

原型:extern void bzero(void *s, int n);参数说明:s 要置零的数据的起始地址; n 要置零的数据字节个数。用法:#include 功能:置字节字符串s的前n个字节为零且包括‘\0’。说明:bzero无返回值,并且使用string.h头文件,string.h曾经是posix标准的一部分,但是在POSIX.1-2001标准里面,这些函数

2016-06-16 16:58:21 523

转载 进程的关系

注:结合《UNIX环境高级编程》的第9章一起看进程组的概念每一个进程除了有一个进程ID之外,还属于一个进程组,进程组通常是一个或多个进程的集合。这些进程通常是与一个作业相关的。例如:ps axu|grep bash|wc -l 这是三个进程,他们直接通过管道传递数据,为了是完成一个作业,对于这个整体来说是一个进程组,其中ps进程是进程组的组长进程。进程组也是由一个id来

2016-06-15 16:40:01 236

转载 动态链接

一、动态链接的好处前面说了静态链接的流程,提到了静态链接与动态链接的不同之处以及各自的优势:静态链接的优势在于其优秀的可移植性,但是相对应的其所占空间大小也很大,且还有在对程序的更新、维护方面也有着问题。 动态链接则消除了这方面的问题,即使得空间不再浪费,更新一个程序也变得不再麻烦。浪费内存问题的解决假设有两个程序a和b,如果两个都依赖于Libc.o这个模块,那么当

2016-06-15 11:41:07 677

转载 运行库到底做了些什么?

//这是我今天看到的一篇文章,里面的内容进行了一下补充。1、入口函数与程序初始化main真的是程序的起始吗?我们编写每一个C程序都需要编写main函数,之前也一直都说main函数是程序的开始,但是真的是这样吗?其实程序执行到main函数的第一行时候,很多事情都已经完成,比如全局变量的初始化,比如命令行的参数传递,比如堆和栈的初始化,更比如一些系统I/

2016-06-15 10:22:07 667

转载 内存管理之堆和栈

原创 2016-06-14 陶琛嵘 一、内存关于程序的运行,不得不提到内存方面的内容,那么首先就对一个进程虚拟地址空间的布局用一张图来看清楚这张图基于32位Linux系统,即起始地址为0x08048000,可以看到顺序为只读段(代码段等)、读写段(数据段、bss段等)、堆(向上即高地址扩展)、用于堆扩展的未使用空间、动态库的映射位置(0x4000

2016-06-15 09:28:55 623

原创 复制,粘贴,删除,撤消,跳转

复制    a,复制整行        命令模式下,光标位于要复制的当前行,输入 yy     b,复制一个单词        命令模式下,光标位于要复制的当前单词的第一个字母,输入 yw黏贴    命令模式下,输入 p删除    a,删除整行        命令模式下,光标位于要删除的所在行,输入 dd    b,删除一个单词       

2016-06-14 21:59:10 392

转载 Linux驱动修炼之道-内存映射 mmap()/phys_to_virt()

void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);  内存映射函数mmap负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。addr:指定映射的起始地址,通常设为NULL,由系统指定。length

2016-06-13 16:13:04 1494

转载 结合源代码分析一个完整的中断过程

结合源代码分析一个完整的中断过程  此文详细描述了中断产生到中断处理程序执行、中断处理程序返回以及中断描述符初始化整个过程,结合linux-0.00源代码片断学习将会更直观易懂。   中断是指当前执行程序或任务在执行到某处时出现一个事件,该事件需要程序处理。这种事件会导致程序会从当前运行程序转移到被称为中断(或异常)处理程序中执行。中断可以由硬件发生,也可以由软件调用int n指令产生

2016-06-13 15:45:40 533

转载 ctags+taglist+cscope

熟练的使用ctags仅需记住下面七条命令:    $ctags –R * ($为Linux系统Shell提示符,这个命令上面已经有所介绍)    $ vi –t tag (请把tag替换为您欲查找的变量或函数名)    :ts (ts助记字:tagslist, “:”开头的命令为VI中命令行模式命令)    :tp (tp助记字:tagspreview)—此命令不常用,可以不用

2016-06-13 15:37:10 287

转载 linux内存寻址——内存管理

1.     x86的物理地址空间布局 以x86_32,4G RAM为例:物理地址空间的顶部以下一段空间,被PCI设备的I/O内存映射占据,它们的大小和布局由PCI规范所决定。640K~1M这段地址空间被BIOS和VGA适配器所占据。由于这两段地址空间的存在,导致相应的RAM空间不能被CPU所寻址(当CPU访问该段地址时,北桥会自动将目的物理地址“路由”到相应的I/

2016-06-13 15:34:35 317

转载 linux工具---用qemu调试linux内核

一.qemu模拟x861.1 qemu的安装        ubuntu 12.04下安装qemu很简单,         sudo apt-get install qemu1.2 linux内核的编译    www.kernel.org 下载内核, 以linux-3.0.1为例    sun@ubuntu:/work/x86/kernel$ tar xf ./linux-

2016-06-13 15:33:25 3452 1

转载 Linux源代码目录

Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间。 源代码所有在目录:/usr/src/linux (大部分linux发行版本中) init 内核初始化代码 kernel 内核核心部分:进程、定时、程序执行、信号、模块。。。 mm 内存处理 arch 平台相关代码 

2016-06-13 15:32:03 1078

转载 linux内存管理

模块LINUX内存管理代码模块主要分为4个部分:1.Out of memory 代码在mm/oom_kill.c 貌似用于杀进程的时候对内存的操作2.虚拟内存的分配 代码在mm/vmalloc.c3.物理内存页面分配 代码在mm/page_alloc.cVMA(virtual memory addresses)的 创建和进程内的内存区域的管理4.这些模块,贯

2016-06-13 15:30:05 295

转载 Python

1.字符串转义序列转义字符描述\(在行尾时)续行符\\反斜杠符号\'单引号\"双引号\a响铃\b退格(Backspace)\e转义\000空\n

2016-06-13 15:28:15 213

转载 查看进程pid,杀死进程

使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程。这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号。    首先,我们需要使用linux下另外一个ps命令查找与进程相关的PID号:ps aux | grep program_filter_word    ps a

2016-06-08 09:34:55 4270

转载 内核模块编写

内核模块编写本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。参考资料:《Linux设备驱动程序 第三版》来源:http://blog.csdn.net/rosetta/article/details/7563601  以前也曾经想过往Linux内核编程方向长展,但总归是没有入门的机会,看过《Li

2016-06-07 10:51:08 285

转载 在vim中使用cscope查找调用、定义函数和变量的地方

在vim中使用cscope查找调用、定义函数和变量的地方标签: vimsuse输入法unixlinuxtagshttp://www.sudu.cn/info/html/edu/20060102/294929.html在vim中用了一阵子ctags,确实美中不足。ctags只能根据调用函数的地方查找定义该函数的地方,不能根据定义函数的地方查找都有哪些地方调用了

2016-06-06 22:02:47 6592

转载 export

由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"引发的问题1、${HOME}:首先, HOME 是个变量,它代表你的 home 目录,变量前必须加上 $ 符号,否则会报错usr/local/dvsdk为dvsdk的destination folder 由#echo $DVSDK测试环境变量添加成功否2、想要使得开

2016-06-06 20:41:25 249

转载 #ifdef 和#endif的作用

一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif它的作用是:当标识符已经被定义过(

2016-06-04 21:33:41 939

原创 随笔

又到了一年的毕业季,不同的是这次的主角不是我。朋友圈也异常的热闹,看着大家的难舍难分,看着这家感慨时间如白驹过隙。前段时间,刘同的新电影《谁的青春不迷茫》挺火爆的,室友早早就预订了电影票,我吵着也要去看,可是男朋友并不感兴趣,只好作罢,心里想着还是等着看视频网站的独播~~看过的人,都发了一堆堆的感慨,说哭成泪人。。。再后来,我也看了,觉得并没有自己期待的那么理想~~在我看来,这种青春题材的电影真的

2016-06-04 21:07:47 220

空空如也

空空如也

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

TA关注的人

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