自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 解决u-boot 2016.11 ”ERROR: Makefile:1385: recipe for target 'checkarmreloc' failed”

在编译u-boot-2016.05时出现如下问题:解决办法: 搜索 “u-boot contains unexpected relocations”,没有搜索到任何内容,那么我们再尝试搜索checkarmreloc:lvxiaoliang@lvxiaoliang-virtual-machine:~/Ftp/tmp/u-boot-2016.05$ grep "checkarmrelo

2017-11-12 16:27:09 1820

原创 linux系统函数container_of浅析

Container_of是linux内核中常用到的一个宏macro,他的主要功能是根据包含在某个结构体中变量的指针来获取该结构体本身的指针,通俗讲就是根据结构体中成员变量中某个成员的首地址来获取该结构体的首地址/***container_of - cast a member of a structure out to thecontaining structure*@ptr: the

2017-11-09 16:22:19 370

原创 ARM常用汇编指令

(1)GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为{False}。GBLL BOOTLOADERBOOTLOADER SETL {TRUE}(2)GET(或 INCLUDE)GET 伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET。INCLUDE ..\\..\\kernel\\oal\\st

2017-11-09 16:20:27 452

原创 C程序的BSS段 代码段 数据段

BSS段:BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStartedbySymbol的简称。BSS段属于静态内存分配。数据段:数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(codesegment/textsegment)通常是指用来存放

2017-11-09 16:16:04 354

原创 Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

在阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入汇编在CS术语上叫做inline assembly。本文的笔记试图说明Inline Assembly的基本语法规则和用法。内联汇编(或称嵌入汇编)的基本语法模板比较简单,如下所示(为使结构更清晰,这里特意做了换行,其实完全可以全部写到单行中):asm [ volatile ] ( a

2017-11-09 16:10:46 435

原创 C语言函数之可变参数原理:va_start、va_arg及va_end

说到C语言函数可变参数,我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里,printk函数原型如下:asmlinkage int printk(constchar*fmt,...)asmlinkage表示通过堆栈传递参数。gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种

2017-11-08 22:33:08 281

原创 CPSR 和 SPSR

CPSR:程序状态寄存器(current program status register) (当前程序状态寄存器),在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。CPSR在用户级编程时用于存储条件码。  SPSR:程序状态保存寄存器(saved programstatus register),每一种处理器模式下都有一个状态寄存器

2017-11-08 22:31:08 8356

原创 C语言可变参数函数取参方法

熟悉C的人都知道,C语言支持可变参数函数(Variable Argument Functions),即参数的个数可以是不定个,在函数定义的时候用(...)表示,比如我们常用的printf()\execl函数等;printf函数的原型如下:intprintf(constchar *format, ...);注意,采用这种形式定义的可变参数函数,至少需要

2017-11-08 22:28:59 1209

原创 container_of和list_for_each_entry 及其相关函数的分析

Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,读Linux代码的

2017-11-08 22:25:33 324

原创 Linux __setup宏解析

__setup这条宏在Linux Kernel中使用最多的地方就是定义处理Kernel的启动参数的函数及数据结构,宏定义如下:#define __setup(str, fn) \__setup_param(str, fn, fn, 0)#define __setup_param(str, unique_id, fn, early) \static char __setup_str_

2017-11-08 22:22:06 611

原创 ARM Linux系统调用的原理

操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口。在应用程序和硬件之间设置一个额外层具有很多优点。首先,这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来。其次,这极大地提高了系统的安全性,因为内核在试图满足某个请求之前在接口级就可以检查这种请求的正确性。最后,更重要的是这些接口使得程序具有可移植性,因为只要内核所提供的一组接口相同,那么在任一内核之上就可以正确地编译和执

2017-11-08 22:18:52 575

原创 文件系统VFS数据结构

标签:Linux虚拟文件系统四大对象:1)超级块(super block)2)索引节点(inode)3)目录项(dentry)4)文件对象(file)一个进程在对一个文件进行操作时各种对象的引用过程如下:通过task_struct得到files_struct,然后通过文件描述符(int fd)获得相应的文件对象(file **fd),接下来获得目录项对象(den

2017-11-08 19:17:59 308

原创 malloc内核实现原理

考虑这样一种常见的情况:用户进程调用malloc()动态分配了一块内存空间,再对这块内存进行访问。这些用户空间发生的事会引发内核空间的那些反映?本文将简单为您解答。1.brk系统调用服务例程malloc()是一个API,这个函数在库中封装了系统调用brk。因此如果调用malloc,那么首先会引发brk系统调用执行的过程。brk()在内核中对应的系统调用服务例程为SYSCALL_DEFINE

2017-11-08 09:26:45 1343

原创 linux 内存管理的slab机制分析

Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分

2017-11-08 09:22:41 538

原创 Linux块设备驱动

(1)---块驱动中相关的结构体及其操作1.字符设备与块设备IO操做的区别1)块设备只能以块为单位接收输入返回输出,而字符设备则以byte为单位.大多数设备是字符设备,他们不需要缓冲并且不以固定块大小进行操作.2)块设备对于IO请求有对应的缓冲区,所以他们可以选择以什么顺序进行响应.字符设备无须缓冲且被直接读写.3)字符设备只能被顺序读写,块设备可以随机访问.   

2017-11-07 14:07:55 243

原创 linux进程地址空间

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。那虚拟内存空间是什么呢,它与实际物理内存空间又是怎样对应的呢,为什么有了虚拟内存技术,我们就能运行比实际物理内存大的应用程序,它是怎么做到的呢?呵呵,这一切的一切都是个迷呀,下面我们就一步一步解开心中的谜团吧!

2017-11-05 20:39:18 271

原创 Linux设备树解析

1. Device Tree简介Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a fucking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥

2017-11-04 21:49:42 291

原创 MTD设备驱动详解

MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。CFI接口的MTD设备分为四层(从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设

2017-11-04 21:22:49 3532

原创 i2s总线规范

I2S(Inter—IC Sound)总线是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。I2S总线拥有三条数据信号线:1、SCK: ( serial clock)  串行时钟,有时也称作:SCL       对应数字音频的每一位数据,SCK都有1个脉冲。SCK的频率=2×采样频率×

2017-11-04 21:17:42 1181

原创 UVC(USB Video Class)协议讲解

1. UVC功能概述UVC设备都是多Interface设备,这点同普通的u盘不同。UVC设备最起码有两个Interface,VideoControl(VC)Interface和VideoStream(VS) Interface; 这也是最常见的UVC设备。 Spec明确要求一个具有可用的,具有实际UVC功能的设备要有一个VC Interface,一个或多个VS Interface。VC

2017-11-01 22:30:12 28186 5

原创 i2c协议

I2C总线知识1.1.1  I2C总线物理拓扑结构     I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。1.1.2  I2C总线特征    I

2017-10-29 08:13:41 420

原创 SD卡开发详细文档

1、简介  SD卡是基于flash的存储卡。 SD卡和MMC卡的区别在于初始化过程不同。 SD卡的通信协议包括SD总线和SPI两类。 SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。通信电压范围:2.0-3.6V;工作电压范围:2.0-3.6V最大读写速率:10Mbyte/s

2017-10-19 15:25:10 2967

原创 SPI 协议详解

1、什么是SPI?SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。2、SPI优点支持全双工通信通信简单数据传输速率块3、缺点没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。

2017-10-18 10:25:26 637

原创 SD卡规范解读

1. SD卡介绍1.1 各类型储存卡/接口首先了解一下我们在SD卡驱动学习中会碰到的主要几个储存卡名词:SD:Security Digital Memory Card,新一代多媒体储存卡,高速,安全(但安全机制貌似很少用到)MMC:Multimedia Card,SD卡的上一代多媒体储存卡,已基本被SD卡代替eMMC:Embedded Multimedia Card,内嵌式存储

2017-10-16 20:33:08 2796

原创 USB协议基本知识

USB 基本知识 USB的重要关键概念: 1、 端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)2、 帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。3、ups

2017-10-16 10:12:13 500

原创 linux 虚拟文件系统实现

虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备。虚拟文件系统本身是linux内核的一部分,是纯软件的东西,并不需要任何硬件的支持。1. 虚拟文件系统的作用虚拟文件系统(VFS)是linux内核和存储设备之间的抽象层,主要有以下好处。- 简化了应用程序的开发:应用通过统一的

2017-10-12 14:03:43 834

原创 linux系统调用分析

1. 什么是系统调用简单来说,系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。系统调用的存在,有以下重要的意义:1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,这样大大简化了用户程序的开发。    比如:用户程序通过write()系统调用就可以将数据写入文件,而不必关心文件是在磁盘上还是软盘上,或者其他存储上。2

2017-10-12 13:57:54 262

原创 linux内核中断处理

中断处理一般不是纯软件来实现的,需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理,特别是驱动程序的开发。1. 什么是中断为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。没有中断的话,CPU和外围设备之间协同工作可能只有轮询这个方法:CPU定期检查硬件状态,需要处理时就处理,否则就跳过。当硬件忙碌的时候,CPU很可能会做许多无

2017-10-12 13:48:06 276

原创 对linux进程的理解

进程是UNIX操作系统抽象概念中最基本的一种,其中涉及进程的定义以及相关的概念,比如线程;它们在内核中如何被列举?如何创建?最终又如何消亡?让我们通过下面的分析,一步步解开内核进程的神秘面纱。1. 进程和线程进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作(比如,创建,销毁等)都是有内核来实现的。Linux中的进程于Windows相比是很轻量级的,而且不严格区

2017-10-12 13:32:09 353

原创 Linux 虚拟地址,逻辑地址,物理地址

逻辑地址(Logical Address):包含在机器语言指令中用来指定一个操作数或一条指令的地址,每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。由程序产生的与段相关的偏移地址部分。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干;应用编程中,变量a,

2017-10-12 13:27:08 488

原创 linux内核进程调度

1. 什么是调度现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程)。个管理程序就是调度程序,它的功能说起来很简单:1.决定哪些进程运行,哪些进程等待;2.决定每个进程运行多长时间。此外,为了获得更好的用户体验,运行中的进程还可以立即被其他更紧急的进程打断。总之,调度是一个平衡的过程。一方面,它要

2017-10-12 13:01:19 277

原创 linux内存管理深入分析

内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决)。所有内核的内存管理必须要简洁而且高效。1.linux 内存管理涉及的概念1.1 页内核把页作为内存管理的基本单位,内存管理单元(MMU)通常以页为单位进行处理。从虚拟内存的角度看,页就是最小单位。在linux系统中可以用如下命令来查看系统内存页的大小:[b

2017-10-12 12:14:18 263

空空如也

空空如也

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

TA关注的人

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