华的专栏

讨论与进步

read()/write()的生命旅程——前言与目录

read()/write()是libc最常用的库函数,那么在application调用了read()/write()之后,发生了哪些事情,数据经过了怎样的流程才从media上读出到用户的buffer里,或是从用户buffer被写到media上的呢?本文将通过以下章节详细阐述整个过程。 第一章...

2016-06-30 08:05:10

阅读数:539

评论数:0

read()/write()的生命旅程之二——第二章:read()

本章将介绍read()系统调用的过程。回忆一下第一章里讲到的read()系统调用发生后VFS将调用文件实际所在文件系统的file_operations.read(),我们就从这个地方开始。   1. read():从file operation到page cache 这个过程是在file_o...

2016-06-30 08:04:36

阅读数:583

评论数:0

read()/write()的生命旅程之三——第三章:write()

本章将介绍write()系统调用的过程。和第二章read()一样我们将从file_operations.write()开始。   1. write():从file operation到page cache file_operations.write()的核心函数是generic_perfor...

2016-06-30 08:03:35

阅读数:1632

评论数:1

read()/write()的生命旅程之五——第五章:从bio到media

第四章中writeback thread已经将要写的page或inode(meta data)变成了bio,bio就是已经对应到了block device的哪一块了。本章我们就要搞清楚最后一步,即bio是怎样写到实际的存储media上的。下面这张图从submit_bio开始,揭示了bio最后被写到...

2016-06-30 08:02:29

阅读数:709

评论数:0

read()/write()的生命旅程之四——第四章:writeback

第三章write()中已经提到要写的page加到了writeback queue后将有writeback thread将其真正写到block device上,而不是每一次写都直接写到media上。如果要绕过writeback机制直接写到media上,在open()的时候指定O_DIRECT即可。W...

2016-06-30 08:01:21

阅读数:1395

评论数:0

H264 视频文件 帧格式

rfc3984 Standards Track [Page 2] RFC 3984 RTP Payload Format for H.264 Video February 2005 1. 按照RFC3984协议实现H264视频流媒体 nalu单元 包起始 0x 00 00 00 01 ...

2016-06-29 18:46:39

阅读数:4162

评论数:0

h264 图像、帧、片、NALU

H.264 是一次概念的革新,它打破常规,完全没有 I 帧、P帧、B 帧的概念,也没有 IDR帧的概念。对于 H.264中出现的一些概念从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。这里有几点值得说明: (1)、在 H.264协议中图像是个集合概念,顶场、底场、帧都...

2016-06-29 18:23:36

阅读数:1083

评论数:0

linux下数据同步、回写机制分析

一、前言 在linux2.6.32之前,linux下数据同步是基于pdflush线程机制来实现的,在linux2.6.32以上的版本,内核彻底删掉了pdflush机制,改为了基于per-bdi线程来实现数据同步,与pdflush线程相比,在per-bdi线程机制中,每个后备存储器拥有自己唯一的回写...

2016-06-29 09:46:50

阅读数:998

评论数:0

h264 流、帧结构

H264元素的分层结构 H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构,分别描述各个层次的信息。           在H.264 中,句法元素共被组织成  序列、图像、片、宏块、子宏块五个层次。在这样的结构中,每一层的头部和它的...

2016-06-28 18:55:42

阅读数:905

评论数:0

RTP协议全解(H264码流和PS流)

在前面:RTP的解析,网上找了很多资料,但是都不全,所以我力图整理出一个比较全面的解析, 其中借鉴了很多文章,我都列在了文章最后,在此表示感谢。 互联网的发展离不开大家的无私奉献,我决定从我做起,希望大家支持。 原创不易,转载请附上链接,谢谢http://blog.csdn.ne...

2016-06-28 18:21:21

阅读数:542

评论数:0

pdflush进程详解

以下转自:http://blog.csdn.net/kofshower/article/details/7357968 大家知道,在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上, 而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写...

2016-06-28 09:40:22

阅读数:309

评论数:0

linux驱动程序调试常用方法

驱动程序开发的一个重大难点就是不易调试。本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是: 利用printk查看OOP消息利用strace利用内核内置的hacking选项利用ioctl方法利用/proc 文件系统使用kgdb 一、利用printk 这是驱动开发中最...

2016-06-27 08:03:56

阅读数:1892

评论数:0

linux内核部件分析之——设备驱动模型之class

前面看过了设备驱动模型中的bus、device、driver,这三种都是有迹可循的。其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动。但本节要介绍的class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集...

2016-06-20 09:47:25

阅读数:371

评论数:0

Linux内核部件分析 设备驱动模型之driver

上节我们分析设备驱动模型中的device,主要是drivers/base/core.c,可以说是代码量最大的一个文件。本节要分析的驱动driver,就要相对简单很多。原因也很简单,对于driver,我们能定义的公共部分实在不多,能再sysfs中表达的也很少。本节的分析将围绕drivers/base...

2016-06-19 10:52:38

阅读数:521

评论数:0

Linux内核部件分析 设备驱动模型之device

linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线、设备、驱动、类所组成的关系结构。从本节开始,我们将对linux这一设备驱动模型进行深入分析。      头文件是include/linux/device.h,实现在drivers/base目录中。本节要分析的,是其中...

2016-06-19 10:51:40

阅读数:1538

评论数:0

Linux内核部件分析 设备驱动模型的基石kobject

之前我们分析了引用计数kref,总结了sysfs提供的API,并翻译了介绍kobject原理及用法的文档。应该说准备工作做得足够多,kobject的实现怎么都可以看懂了,甚至只需要总结下API就行了。可我还是决定把kobject的实现代码从头分析一遍。一是因为kobject的代码很重要,会在设备驱...

2016-06-19 10:50:51

阅读数:983

评论数:0

Linux内核部件分析 更强的链表klist

前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的k...

2016-06-19 10:49:52

阅读数:243

评论数:0

Linux内核部件分析 记录生命周期的kref

kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。 kref的头文件在...

2016-06-19 10:49:05

阅读数:249

评论数:0

Linux内核部件分析 原子性操作atomic_t

在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的。在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的。为了弥补这一缺点,x86提供了附加的lock前缀,使带lock前缀的读修改写指令也能原子性执行。带lock...

2016-06-19 10:48:20

阅读数:247

评论数:0

Linux内核部件分析 连通世界的list

在linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。 struct list_head {      struct list_head *next, *prev...

2016-06-19 10:47:25

阅读数:310

评论数:0

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