- 博客(69)
- 资源 (7)
- 收藏
- 关注
转载 linux内核数据结构之等待队列
Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。它通过一个双链表和把等待task的头,和等待的进程列表链接起来。从上图
2017-08-11 16:12:13
615
原创 基于单幅图像的快速去雾算法实现
基于图像复原的去雾方法中,最有代表性的是暗通道去雾算法,但是暗通道去雾算法的处理时间比较长,不能达到实时处理。在阅读了大量文献及其参考文献,找到能够实时处理的去雾算法,是清华大学写的文章:基于单幅图像的快速去雾算法,作者:刘倩,陈茂华,周东华。
2017-08-10 14:58:41
6685
6
原创 ffplay源码剖析(3.2.4 + sdl2)(3):解码
上一篇讲到ffplay的初始化和解复用,在解复用过程中创建了三个解码线程:音频、视频和字幕解码线程。同时将解复用的数据包分别添加到了音频包队列audioq、视频包队列videoq和字幕包队列subtitleq中。今天要讲的是从这三个包队列中分别进行解码,然后将解码出来的数据帧添加到对应的帧队列。显示线程就是从帧队列中取出数据帧然后进行显示。read_thead函数中用于解码的函数是stream
2017-08-05 20:09:51
1089
原创 图像去雾技术综述
研究图像去雾技术有一段时间,阅读很多文献以及实现了很多算法。因此将个人对图像去雾技术的理解写成这篇文章,避免自己忘记,以及跟广大网友交流学习。1、概述图像去雾的研究算法有很多,但是主要分为两类:基于图像增强的去雾算法和基于图像复原的去雾算法。基于图像增强的去雾算法去除图像的噪声,提高图像的对比度,从而恢复出无雾清晰视频。具有代表性的图像增强去雾算法有: 1. 直方图均衡
2017-08-04 16:55:40
19404
1
原创 ffplay源码剖析(3.2.4 + sdl2)(2):初始化与解复用
接上一篇继续阅读ffplay源码,前一篇从总体上了解了ffplay的整个框架:解复用,解码,显示播放。这一篇就讲第一个解复用。int main(int argc, char **argv){ int flags; VideoState *is; /* register all codecs, demux and protocols */#if CONFIG_AVD
2017-07-19 17:26:20
1273
1
原创 FFmpeg中AVPacket和AVFrame关系
最近在研究ffplay的源码,ffplay中有两个队列一个PacketQueue, 一个FrameQueue,对这两个队列之间的关系不是很清楚。于是对这两个结构进行了深入的研究。AVPacket结构用于存储压缩的数据,分别包括有音频压缩数据,视频压缩数据和字幕压缩数据。它通常在解复用操作后存储压缩数据,然后作为输入传给解码器。或者由编码器输出然后传递给复用器。对于视频压缩数据,一个AVPa
2017-07-10 09:23:07
10902
原创 ffplay源码剖析(3.2.4 + sdl2)(1):函数调用流程图
最近在学习ffplay的源码知识,网上关于ffplay的都是老版本的基于sdl1.x版本的,于是自己结合自己的理解分析了一下ffpaly3.2.4(基于sdl2)的源码,并记录下来供自己以后查阅。如果有理解错误,还请指正。一、总体框架:ffmpeg3.2.4版本中的ffplay的函数调用图如下所示:avdevice_register_all()这ffmpeg设备进行初始化与注册
2017-07-05 11:54:28
1095
1
原创 第六章:高级字符驱动程序操作
1、ioctl除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制。在用户空间,ioctl系统调用有如下原型:int ioctl(int fd, unsigned long cmd, .../*char *argp*/);驱动程序的ioctl方法原型与用户空间的版本不一样int (*ioctl)
2017-07-05 09:43:29
275
原创 第五章:并发与竞态
两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,就成为竞争条件(race condition)。竟态通常作为对资源的共享访问结果而产生的。当两个或多个进程需要访问相同的数据结构(或硬件资源)时,混合的可能性就永远存在。 因此在自己设计驱动程序的时候,第一个要记住的规则是,只要可能,就应该避免资源共享。如果没有并发的访问,也就不会有竟态的产生。 因此,仔细编写的内核代码
2017-07-05 09:43:16
318
转载 第三章:字符设备驱动
编写驱动程序的第一步就是:定义驱动程序为用户程序提供的功能(机制)1、主设备号和次设备号 对字符设备的访问是通过文件系统内的设备名称进行的。那些名称被称为特殊文件、设备文件、或者简单称之为文件系统树的节点,他们通常位于/dev目录下。 一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来区分不同种类的设备
2017-07-05 09:42:10
376
原创 第二章:构造和运行模块
1、一个简单的hello,world的模块:#include /* 用于指定初始化和清楚函数 */#include /* 包含有可装载模块所需的大量符号和函数定义 */#include static int hello_init(void){ printk(KERN_ALERT "Hello, World\n"); return 0;}
2017-07-05 09:41:42
453
原创 第一章:设备驱动程序
设备驱动程序是进入linux内核的大门。设备驱动程序的作用在于提供机制,而不是提供策略.需要提供什么功能(机制)和如何使用这些功能(策略)。内核功能的划分:进程管理:复制创建和销毁进程,并处理它们和外部世界之间的连接。内存管理文件系统:linux中每个对象几乎都可以当作文件来看待。设备控制网络功能linux有一个很
2017-07-05 09:40:41
438
原创 dm-crypt加密
安装 dmsetup和cryptsetup。(apt-get install dmsetup cryptsetup)检查是否已经建立设备映像程式 。(ls -l /dev/mapper/control)cat /proc/crypto 查看aes模块是否加载,如果没有 modprobe aes。(可以是aes的任意一种)加载dm-crypt模块 modprobe dm-c
2017-07-03 14:24:44
1631
原创 ecryptfs加密
首先安装 ecryptfs-utils。(sudo apt-get install ecryptfs-utils)载入ecryptfs模块。(sudo modprobe ecryptfs)挂载ecryptfs文件系统sudo mount -t ecryptfs real-path ecryptfs-mount-path建议real-path和ecryptfs
2017-07-03 14:24:31
769
原创 多线程编程
#include int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*fun)(void *), void *arg);/* * 创建线程 * @tid —— 线程id的类型为pthread_t,成功创建后的线程由tid返回。 * @attr —— 指定创建线程的属性,如线程优先级、初试栈大小、是否
2017-07-03 14:23:39
217
转载 struct inode 和 struct file
1、struct inode──字符设备驱动相关的重要结构介绍内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符。Linux2.6.27内核中,inode结构体具体定义如下:struct inode {struct hlist_node i_hash;struct list_head i_list;struct list_head
2017-06-26 10:45:20
383
转载 linux内核链表实现
linux内核链表实现 内核实现的是双向循环链表,提供了链表操作的基本功能。(1)初始化链表头结点#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name)static inli
2017-06-20 11:28:24
321
原创 dlopen 介绍
dlopen 介绍#include void *dlopen(const char *filename, int flag);char *dlerror(void);void *dlsym(void *handle, const char *symbol);int dlclose(void *handle);打开一个动态链接库,并返回动态链接库的句柄。flag:
2017-06-19 11:25:54
1610
原创 glob和snprintf
glob函数 用于linux文件系统中路径名称的模式匹配。#includeint glob(const char *pattern, int flages, int (*errfunc)(const char* epath, int errno), glob_t *pglob);void globfree(glob_t *pgl
2017-06-16 11:24:31
575
原创 linux复用技术:poll
12#include int poll(struct pollfd *fds, nfds_t nfds, int timeout);总的来说,Poll机制会判断fds中的文件是否可读,如果可读则会立即返回,返回的值就是可读fd的数量,如果不可读,那么就进程就会休眠timeout这么长的时间,然后再
2017-06-16 11:24:00
319
原创 Udp 并发问题分析与总结
一、tcp并发与udp并发的区别 无论是epoll还是select,在观察有无数据就绪时,都是针对多个文件描述符。如果只有一个文件描述符,那么进程只要观察那一个文件描述符即可。在网络编程中,一个Socket对应一个文件描述符。Tcp协议的server在监听端口前初始化一个socket,每有一个新的连接,就新建一个socket。因此当tcp服务器面对高并发请求时,实际上有多个so
2017-06-14 09:44:07
6949
原创 守护进程和inetd超级服务器
13.1 概述守护进程(daemon)是在后台运行且不与任何控制终端关联的进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。守护进程有多种启动的方法:1、在系统启动阶段,许多守护进程由系统初始化脚本启动。2、许多网络服务器将由inetd超级服务器启动。ine
2017-06-14 09:43:08
436
转载 Offsetof与container_of宏总结
1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中得到应用。不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了。后续认
2017-06-13 20:03:01
299
原创 current宏
current 是指当前进程每个进程在内核态下都会开辟一个内核栈(8K或4K),一般大小为8KB,一般每个任务的thread_info结构在它的内核栈的尾端分配。这个thread_info结构是指向task_struct的。thread_info的代码在struct thread_info { struct
2017-06-13 08:58:38
593
转载 僵尸进程与孤儿进程
在探讨这个问题之前,我们先来弄清什么是进程。 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 进程是一个具有独立功能的程序关于某个数据集
2017-06-12 15:10:23
290
原创 ubuntu卸载多余的内核
dpkg --get-selections | grep linux-imagesudo apt-get remove linux-image-3.0.0-12-generic然后修改 /boot/grub/grub.cfg文件
2017-06-12 11:23:26
1327
原创 ubuntu中CUDA 5.5安装
安装CUDA需要在非图形界面下进行,首先切换到虚拟控制台(ctrl + alt + F1)停止图形界面服务的运行sudo stop lightdm切换到cuda安装包所在的目录下面(cuda-~.run)sudo sh cuda-~.run 就会弹出安装界面依次输入accept --> y --> y --> 回车键 --> y --> 回车键修改环境
2017-06-12 11:23:02
476
原创 linux内核的编译(2.6.39.4)
下载源码 linux-2.6.39.4.tar.bz2把源码包复制到/usr/src下,然后解压(tar -xvf linux-2.6.39.4.tar.bz2)进入解压后的的目录, make mrproper然后开始编译内核, make menuconfig 可能会出现缺少ncurses包apt-get install libncurses5-dev进入编
2017-06-12 11:22:09
884
原创 Ubuntu中安装Nvidia闭源驱动
安装图形驱动前,要安装好下面的这些依赖包和开发工具apt-get install build-essential pkg-configapt-get install freeglut3-dev libx11-dev libxmu-dev libxi-dev libgl1-mesa libgl1-mesa-dri (编译Sample时所需的依赖包)libglu1-mesa libglu1
2017-06-12 11:20:55
3223
2
原创 apt和dpkg简要使用参考表
apt-get install 下载以及所有依赖的包,同时进行包的安装或升级。如果某个包被设置了hold(停止标志)就会被搁在一边(即不会被升级),更多hold细节请看下面。apt-get remove [--purge] 移除以及任何依赖这个包的其它包。--purge指明这个包应该被完全清除(purged),更多信息请看dpkg -P。apt-get update升级
2017-06-12 11:20:02
988
原创 linux中的重定向
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。下面就是这些文件描述符及它们通常所对应的文件名:文件描述符输入文件—标准输入0:它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。输出文件—标准输出1:它是命令的输出,缺省是屏幕,也可以是文件。错
2017-06-12 11:19:35
529
原创 Ubuntu修改提示符
修改提示符的颜色和内容:1、打开.bashrc文件 vi ~/.bashrc2、找到 if [ "$color_prompt" = yes ];then 在这之前加上color_prompt = yes 然后修改下面相应的PS1的内容和颜色3、第二个 PS1 为 PS1=’${debi
2017-06-12 11:18:32
969
原创 apt-get update 出现错误
1.将 /var/lib/apt/lists/partial/下的所有文件删除,一般就可以解决了2.如果还是不能解决 那么在/etc/apt/apt.conf.d/00aptitude 文件中加上一行Acquire::CompressionTypes::Order "gz";3.如果是因为版本太老而出错的话,把/etc/apt/sources.list 中 所有的arc
2017-06-12 11:17:50
951
1
原创 OpenCL读取内核cl文件
普遍上的OpenCL编程都分为两个部分,一个为主机端代码,一个为设备端代码。主机端代码的作用是:主要是负责设置设备执行代码的环境,以及与设备端的通信。设备端代码的作用是:设备上所要执行的功能函数。在主机端和设备端通信的过程中,会有一个读取设备端代码的过程。通常就是读取cl文件。因为在创建程序对象program时,需要用到这个cl文件。创建程序对象就会把这
2017-06-11 13:17:19
5080
原创 OpenCL编程之同步问题:事件
事件(event)是OpenCL中传递命令状态的对象。命令队列中的命令会生成事件,其他命令在执行之前可能要等待这些事件。用户可以创建定制事件,在宿主机和计算设备之间提供额外的一层控制。在内核中,程序员利用时间可以允许数据的移动与这些数据的相关操作重叠进行。OpenCL事件是OpenCL中传递命令有关信息的对象。事件的状态描述了相关命令的状态。可以取一下状态值。CL_
2017-06-11 13:16:28
3590
原创 gcc g++版本降级
先安装低版本的gcc和g++然后 cd /usr/bin sudo mv gcc gcc.bak sudo ln -s gcc-低版本 gcc sudo mv g++ g++.bak
2017-06-11 13:15:34
1246
转载 与内存管理相关的几个宏
这几个宏把无符号整数转换成对应的类型#define __pte(x) ((pte_t) { (x) } )#define __pmd(x) ((pmd_t) { (x) } )#define __pgd(x) ((pgd_t) { (x) } )#define __pgprot(x) ((pgprot_t) { (x) } )根据x把它转换成对应的无符号整数#defin
2017-06-11 13:14:21
350
原创 逻辑地址、线性地址、物理地址
逻辑地址 包含在机器语言指令中用来指定一个操作数或一条指令的地址。每一个逻辑地址都由一个段和偏移地址组成。线性地址 线性地址也称虚拟地址。是一个32位无符号整数,可以用来表示高达4GB的地址。物理地址 用于内存芯片级内存单元寻址。他们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址有3
2017-06-11 13:13:17
718
翻译 Getting Started: Building and Running Clang
Getting Started: Building and Running Clang本页面为您提供最短路径检查Clang和演示几个例子。这应该能让最小的遇到麻烦和混乱来运行它。如何你得到了你想要的结果,请考虑参与Clang社团Building Clang and Working with the Code如果你要检查和编译Clang,具体步骤如下:获得所需
2017-06-11 13:10:52
309
翻译 Getting Started with the LLVM System
Overview欢迎到LLVM!为了开始,你首先需要知道一些基本的信息。首先,LLVM有三部分。第一部分是LLVM套件。这部分包含了使用LLVM所包含的所有工具,库和头文件。它包含汇编,反汇编,位码分析器和位码优化器。他也包含了基本的回归测试,可以用来测试LLVM工具和Clang前端。第二部分是Clang前端。此组件是把C,C++,C.obj,C++.obj编译成LLVM位
2017-06-11 13:10:12
523
mali dp550 datasheet
2024-05-15
91030M芯片设计文档
2024-05-15
UEFI下图形驱动开发手册
2023-11-27
FSL91030M datasheet
2023-11-27
长工微is6608调试软件
2023-11-27
基于单幅图像的快速去雾源码实现
2017-08-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人