
linux内核
文章平均质量分 84
Smith先生
全栈多媒体软件系统技术负责人与资深架构师,目前任职于国际大型半导体公司,拥有超过8年以上的音视频软件设计,产品开发与平台化交付经验。工作以来,带领了多个大型全新多媒体项目攻关开发,精进和优化了多个大型软件系统,成功完成平台化建设和运维,为多个技术公司构建了可持续迭代的软件生态,业务面设计GPU系统、人工智能、视频监控系统、会议系统、采集系统、数字电视、多媒体框架、播放器、流式计算及编解码加速等,拥有从上层到底层的全栈软件开发经验和技术团队建设和管理经验。学海无涯,山外有山,天外有天。同大部分技术人一样,希望每天保持进步,最终实现财富自由和人生理想。:)
展开
-
linux内核“任务”之软中断、tasklet、工作者队列
原创链接: http://blog.youkuaiyun.com/goodluckwhh/article/details/9003353一. 软中断和Tasklets1.中断的延迟处理在中断的处理中,有一些不紧急不关键的任务在需要的时候可以被延迟一段时间来执行。对于中断服务程序来说,一般情况下如果它不结束执行,就不应该产生新的中断;而这些延迟的任务可以在打开中断的情形下执行,因而把它们转载 2015-01-07 21:15:32 · 1371 阅读 · 0 评论 -
彻底理解I/O架构
一个系统要能正确工作,必须要有数据通道(data paths)的机制,软件和硬件系统都概莫能外。对于计算机系统而言,必须要有data paths的机制来确保CPU, RAM和I/O设备之间的信息数据能正确的流动。这些data paths,通常被称为总线,是计算机内部主要的通信通道。 计算机内部一般有系统总线来连接内部所有的硬件设备。一个典型的系统总线是PCI((Peripheral原创 2015-01-21 13:34:43 · 11663 阅读 · 1 评论 -
基于fusion的DirectFB消息流 .
本文转载自李先静先生博客:http://blog.youkuaiyun.com/absurd/article/details/619243 传统的DirectFB应用中,所有的应用程序都在一个进程中,在性能上,有一些优势,然而一个应用程序不稳定会造成整个系统的不稳定。若采用C/S模型,无疑是重蹈X Widnow的覆辙,会丧失性能上的优势。 所以DirectFB采用了另外一种转载 2012-09-10 11:05:03 · 1817 阅读 · 0 评论 -
Linux内存寻址之二:逻辑地址到虚拟地址的转换
1.段选择符和分段寄存器 一个逻辑地址包括两部分:段标识符 和 段内相对偏移地址。段标识符是一个被叫做段选择符(selector)的16比特的域,而偏移地址是一个32比特的域。 为了方便快速检索段选择符,处理器提供了6个分段寄存器(segmentation register)来缓存段选择符,它们是:cs,ss,ds,es,fs和gs. 虽然只有这6原创 2012-09-06 14:15:54 · 4072 阅读 · 1 评论 -
DirectFB内存分配与管理:surface pool
1.1版本之前,DFB只有基本的系统内存概念,即使用局部或共享内存;或者视频内存概念,即固定的物理地址和一定大小的连续的内存块,该内存直接由CPU映射或者由DFB内置的内存管理器Surface Manager管理。Surface Manager是一个一维的内存管理器,它会踢出(kick-out)过时的(即不再需要的)内存。这些内存一般是本地备份的内存。只有很少的情况,系统或驱动模块可以控制或自原创 2012-08-18 00:18:37 · 4820 阅读 · 2 评论 -
Linux内核配置与编译
环境:Red Hat Enterprise 6 第一步:查看原系统的内核版本 第二步:安装linux内核源代码 第三步:清除临时文件、中间文件和配置文件 make clean remove most generated files but keep the config make mrproper remove all转载 2012-11-05 16:46:54 · 977 阅读 · 0 评论 -
linux根文件系统制作
原文:http://blog.chinaunix.net/uid-26524139-id-3051914.html1. 根文件系统文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。转载 2012-11-01 20:15:17 · 1109 阅读 · 0 评论 -
内核线程VS普通进程
参考文章:(1) http://blog.youkuaiyun.com/tigerjibo/article/details/8299686 (2)http://blog.chinaunix.net/uid-27032138-id-3364542.html同一程序中可以运行多个线程,这些线程共享内存空间,除此之外,还共享打开的文件,但是我们要建立一个概念,对于LINUX内核而言,根本没有线程一说原创 2015-01-07 21:27:31 · 1347 阅读 · 0 评论 -
Linux--根文件系统的挂载过程分析
前言:http://blog.youkuaiyun.com/guopeixin/article/details/5962482本篇文章以S3C6410公版的Linux BSP和U-Boot来进行分析,文中所有提及的名词和数据都是以该环境为例,所有的代码流程也是以该环境为例来进行分析。哈哈。如果有不正确或者不完善的地方,欢迎前来拍砖留言或者发邮件到guopeixin@126.com进行讨论,先行谢过。转载 2012-11-01 17:53:51 · 1352 阅读 · 0 评论 -
Linux内存寻址之一:内存地址分类以及MMU介绍
对于程序员来说,可以简单的把内存地址理解为一种访问存储单元的内容的一种方式。而对于80x86系列微处理器来说,我们需要区分三种地址: (1)逻辑地址 这种地址通常使用在机器语言里用于指定操作数或机器指令的地址。该类地址在著名的80x86分段体系架构中得到了很好体现,因此DOS程序员和windows程序员都不得不把他们的程序分成一段一段的(如代码段、数据段、堆栈段等等)。每一个原创 2012-09-06 13:22:14 · 2852 阅读 · 0 评论 -
U-Boot启动过程完全分析
1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能Ø 硬件设备初始化Ø 加载U-Boot第二阶段代码到RAM空间Ø 设置好栈Ø 跳转到第二阶段代码入口 (2)第二阶段的功能Ø 初始化本阶段使用的硬件设备Ø 检测系统内存映射Ø 将内核从Fla转载 2012-11-01 21:04:56 · 1094 阅读 · 0 评论 -
内核kernel以及根文件系统rootfs是如何映射到对应的nand FLASH地址的
【解答】内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的 【某人问题 内核在启动的过程中,是如何完成将本地的flash设备映射成文件系统的? 】我用的是ramdisk.image.gz,烧写在flash的0x10140000处我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的?如果ramdisk.image.gz在flash中转载 2012-11-01 15:20:16 · 2159 阅读 · 0 评论 -
netlink socket理解
由于开发和维护内核的复杂性,只用最为关键同时对性能要求最高的代码才会放在内核中。其他的诸如GUI,管理和控制代码,通常放在用户空间运行。这种将实现分离在内核和用户空间的思想在Linux中非常常见。现在的问题是内核代码和用户代码如果彼此通信。答案是内核空间和用户空间存在的各种IPC方法,例如系统调用,ioctl,proc文件系统和netlink socket。这篇文章讨论netlink sock转载 2015-01-27 15:54:52 · 9508 阅读 · 0 评论 -
linux内核的high memory概念详解
32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。linux一般把这个4G的地址空间划分为两个部分:其中0~3G为用户程序地址空间,虚地址0x00000000到0xBFFFFFFF,供各个进程使用;3G~4G为内核的地址空间,虚拟地址0xC0000000到0xFFFFFFFF, 供内核使用。(注意,ARM架构不是3G原创 2013-02-07 11:12:56 · 14982 阅读 · 2 评论 -
DirectFB显卡驱动的加载和初始化
前面我们提到,dfb_core_part_initialize会完成各个核心部件的初始化。 具体是怎么完成这些初始化工作呢?答案是遍历调用各个部件提供的初始化函数。这个调用规则是通过宏 DFB_CORE_PART来制定的。这个宏的定义如下: 由上图的定义可见,DFB_CORE_PART宏指定的规则就是:每一个核心部件都应该在相应的.c文件中填充此宏,也就是为需要实现的各原创 2012-08-09 13:11:54 · 2614 阅读 · 0 评论 -
Linux设备驱动基础Q&A
本文系学习总结并参考了大量网络资源,欢迎大牛指正!1、 Linux中的用户模式和内核模式是什么含意?答: 32位的CPU,最大寻址范围为2^32- 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。Linux一般把这个4G的地址空间划分为两个部分:其中 0~3G为用户程序地址空间,虚地址0x00000000到0xBFFFFFFF,供各原创 2015-01-11 15:11:50 · 1179 阅读 · 0 评论 -
Linux内核中分配4M以上大内存的方法
在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= MAX_ORDER)) return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大...转载 2018-03-14 17:15:44 · 3942 阅读 · 0 评论 -
深入浅出Linux内核内存管理基础
1 背景知识1.1 用户空间与内核空间内存的划分 从Linux操作系统层次上,内存可划分为用户空间内存和内核空间内存。 32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。Linux一般把这个4G的地址空间划分为两个部分:其中 0~3G为用户程序地址空间,虚地址0x00000000到转载 2015-01-18 16:45:49 · 7547 阅读 · 3 评论 -
V4L2框架分析学习
Author:CJOKContact:cjok.liao#gmail.comSinaWeibo:@廖野cjok 1、概述Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。就像公司的老板一般都不会直接转载 2015-01-15 13:59:49 · 1770 阅读 · 0 评论 -
Linux Proc文件系统详解
Linux Proc文件系统详解Proc文件系统是一个伪文件系统,做为一个特殊接口来访问内核,常常挂载在/proc下,里面的大多数文件时只读的,但是我们仍然可以设置其中一些变量来改变内核设置。通过Man5 proc 来进行查阅proc文件系统的详细信息。我们可以用cat more grep等linux命令来进行查看proc文件系统的内容I)进程相关原创 2017-12-24 22:03:15 · 5504 阅读 · 0 评论 -
科普之Linux应用程序与内核程序交互的几种方式。
我们知道,对于一个应用程序即一个操作系统进程来说,它既有内核空间(与其他进程共享),也有用户空间(进程私有私有)。不管是内核空间还是用户空间,它们都处于虚拟地址空间。想了解更多,请参考我之前的博文:深入浅出Linux内核内存管理基础 第一节(http://blog.youkuaiyun.com/acs713/article/details/42836335)。 本文的目的不在于探原创 2017-12-24 20:31:56 · 5471 阅读 · 0 评论 -
理解pages和page Frames的区别
物理页面通常被称作Page Frames,而虚拟地址空间的页面通常被称为pages.Linux以page为单位管理内存。 并不是所有的虚拟地址空间pages都映射到了物理空间的page Frames.一方面,这些没有映射的pages要么是暂时还用不到,要么是由于不需要,数据还没有加载到内存里。另一方面, 这些没有映射的pages也可能是交换出(swapped out)到了硬盘里, 在被原创 2017-04-10 21:30:42 · 11178 阅读 · 3 评论 -
从总体上把握Linux内存管理
1.建立内存碎片的概念 内存碎片分为:内部碎片和外部碎片 1.1 内部碎片 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间; 内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个块。而在进程占有这块存储存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。原创 2013-04-07 15:00:24 · 1849 阅读 · 0 评论 -
Linux进程调度原理
原文链接:http://www.cnblogs.com/zhaoyl/archive/2012/09/04/2671156.htmlLinux进程调度的目标 1.高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效; 2.加强交互性能:在系统相当的负载下,也要保证系统的响应时间; 3.保证公平和避免饥渴;原创 2015-01-19 14:00:25 · 2315 阅读 · 0 评论 -
Linux kernel oops panic 调试技巧
http://blog.chinaunix.net/uid-291731-id-3142689.html最近在调试USB驱动的过程中,偶尔会出现拔出USB线缆时kernel会有oops错误,以下是对kernel oops错误调试的简单记录,该方法也适用于panic错误。oops错误日志信息:Unable to handle kernel NULL point转载 2015-01-11 12:20:16 · 3781 阅读 · 0 评论 -
伙伴算法
如上图所示,首先先来了解下linux内存管理的架构,用于了解伙伴算法所在的位置。 伙伴算法在内存管理中用来消除外部碎片,用Wolfgang Mauerer(《深入linux内核架构》的作者)的话说“伙伴系统基于一种相对简单然而令人吃惊的强大算法,已经伴随我们几乎40年。它结合了优秀内存分配器的两个关键特征:速度和效率。” 这张图能较直观的反映伙伴系统在内存管转载 2013-06-14 17:12:13 · 1263 阅读 · 0 评论 -
Linux pipe详解
1、 管道概述及相关API应用1.1 管道相关的关键概念管道是Linux 支持的最初Unix IPC形式之一,具有以下特点:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单转载 2014-05-29 11:22:50 · 9738 阅读 · 0 评论 -
IO寄存器和传统内存对比
尽管硬件寄存器和内存之间有很强的相似性, 程序员在存取 I/O 寄存器的时候还是要格外小心,避免被CPU(或者编译器)优化所迷惑, 因为它可能修改你期待的 I/O 行为. I/O 寄存器和 RAM 一个主要的不同是:I/O 操作会带来副作用, 而内存操作没有。一个内存写操作的唯一效果是存储一个值到某个地址, 并且一个内存读操作返回上次写到该地址的值. 由于内存存取速度对CPU翻译 2012-08-28 13:46:34 · 1998 阅读 · 0 评论 -
Fusion实例1:如何通过竞技场使用共享内存来发布一个指针?
DirectFB采用了主从模型(Master/Slave)。Fusion即融合,多个应用程序在不同的进程空间,通过这个内核模块通信,在这里,一切都溶为一体了。Master应用程序负责初始化一个称为竞技场的东西,其它Slave应用程序可以加入或者退出竞技场。当Master退出时,则其它所有Slave都必须退出。 我们先实现fusion master,文件名为fusionee_maste原创 2012-09-10 11:09:46 · 1609 阅读 · 0 评论 -
IO端口和IO内存简介
对于每个外设的控制,都是通过读写寄存器来进行的。通常,一个外设会有好几个寄存器,并且这些寄存器的存取地址是连续的。这些存取地址要么处于内存地址空间,要么属于IO地址空间。 从纯硬件的角度来看,内存区域和IO区域没有概念上的区别。它们都是通过在地址总线和控制总线上发出电信号(即, 读写信号)来访问,并且都是从数据总线读取或者往数据总线写入。 一些 CPU 制造商在原创 2012-08-28 13:16:05 · 1114 阅读 · 0 评论 -
DirectFB::->Fusion简介
Fusion是DFB实现的一个进程间通信的机制。它提供了一系列抽象模块/对象的实现。这些抽象模块都是使用多线程、多进程编程必要的模块。这些模块主要有以下几种: (1)共享内存(shared memory);fusion的共享内存是基于GNU malloc在用户空间实现的,但是它mmap到一个基于ram的文件系统(tmpfs或shmfs),该文件系统可作为共享堆内存(share heap)原创 2012-09-10 16:55:27 · 4127 阅读 · 0 评论 -
Linux字符设备驱动程序编写基本流程
驱动程序编写基本流程:1.首先是一些版本信息,没什么用,但是不能少 #define __NO_VERSION__ #include #include char kernel_version[] = UTS_RELEASE;2.为了把系统调用和驱动程序关联起来,需要一个非常关键的数据结构:struct file_operations。 f转载 2012-10-30 15:24:21 · 815 阅读 · 0 评论 -
Fusion实例2:如何通过竞技场使用RPC(远程过程调用)? .
fusionee_rpc.c 该程序会创建一个简单的进程。它通过竞技场共享一个过程调用。为了实现这个共享,我们必须按步骤完成以下工作:创建一个fusion world.创建一个共享内存池初始化一个竞技场在共享内存里通过调用fusion_call_init()注册一个 FusionCall结构。把该结构添加到竞技场; 把fusioncall初始化为一个普通的函数。发布一个指向该fus原创 2012-09-13 17:40:28 · 1330 阅读 · 0 评论 -
Linux内核中ioremap映射的透彻理解
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和O转载 2013-04-07 16:45:26 · 1387 阅读 · 0 评论 -
如何获取结构体某成员的偏移地址
我们假设结构体定义如下所示:#include #include struct test_s{ int pad1; int pad2; int pad3; int pad4; int pad5; }; 思路1: 非常简单,直接用地址差值即可求得。int main(int argc,原创 2013-03-30 20:16:46 · 7905 阅读 · 0 评论 -
如何修改和开启kernel打印级别?
可通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。查看这个文件的方法如下: #cat /proc/sys/kernel/printk 6 4 1 7 上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。 可用下面的命令设置当前日志级别: # echo 8 > /proc/原创 2013-02-17 11:47:06 · 7558 阅读 · 0 评论 -
Linux设备驱动程序学习之数据类型与内存分配 .
在此向Tekkaman Ninja表示感谢,写出这么好的文章,使我少走了很多弯路。由于前面的学习中有用到 第十一章 内核数据结构类型 的知识,所以我先看了。要点如下: 将linux 移植到新的体系结构时,开发者遇到的若干问题都与不正确的数据类型有关。坚持使用严格的数据类型和使用 -Wall -Wstrict-prototypes 进行编译可能避免大部分的 bug。内转载 2013-04-03 17:11:43 · 2817 阅读 · 0 评论 -
mmap函数用法及示例程序
UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。函数:void *mmap(void *start,原创 2013-02-17 17:07:50 · 2267 阅读 · 0 评论 -
Daemon程序的原理和实现
一、引言 Daemon程序是一直运行的服务端程序,又称为守护进程。二、Daemon程序简介 Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。转载 2013-03-20 16:03:26 · 2585 阅读 · 0 评论 -
关于Linux Kernel中的宏定义likely和unlikely
在Linux kernel的源代码中,经常能见到if(likely(x))或if(unlikely(x))之类的用法,其确切含义需要说明一下,以便更好的理解kernel的源代码。likely与unlikely这两个宏在linux/compiler.h中的定义如下:#define likely(x) __builtin_expect(!!(x),1)#define unlikely(转载 2013-03-30 20:33:23 · 2145 阅读 · 0 评论