<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[LinuxWorking的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/LinuxWorking</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LinuxWorking]]></copyright><item><title><![CDATA[解决u-boot 2016.11 ”ERROR: Makefile:1385: recipe for target 'checkarmreloc' failed”]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78512610</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78512610</guid><author>LinuxWorking</author><pubDate>Sun, 12 Nov 2017 16:27:09 +0800</pubDate><description><![CDATA[在编译u-boot-2016.05时出现如下问题：

解决办法： 
搜索 “u-boot contains unexpected relocations”，没有搜索到任何内容，那么我们再尝试搜索checkarmreloc：
lvxiaoliang@lvxiaoliang-virtual-machine:~/Ftp/tmp/u-boot-2016.05$ grep "checkarmrelo]]></description><category></category></item><item><title><![CDATA[linux系统函数container_of浅析]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78491086</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78491086</guid><author>LinuxWorking</author><pubDate>Thu, 09 Nov 2017 16:22:19 +0800</pubDate><description><![CDATA[Container_of是linux内核中常用到的一个宏macro，他的主要功能是根据包含在某个结构体中变量的指针来获取该结构体本身的指针，通俗讲就是根据结构体中成员变量中某个成员的首地址来获取该结构体的首地址
/**
*container_of - cast a member of a structure out to thecontaining structure
*@ptr: the ]]></description><category></category></item><item><title><![CDATA[ARM常用汇编指令]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78491026</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78491026</guid><author>LinuxWorking</author><pubDate>Thu, 09 Nov 2017 16:20:27 +0800</pubDate><description><![CDATA[（1）GBLL 伪指令用于定义一个全局的逻辑变量，并初始化为{False}。
GBLL BOOTLOADER
BOOTLOADER SETL {TRUE}
（2）GET（或 INCLUDE）
GET 伪指令用于将一个源文件包含到当前的源文件中，并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET。
INCLUDE ..\\..\\kernel\\oal\\st]]></description><category></category></item><item><title><![CDATA[C程序的BSS段 代码段   数据段]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78490947</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78490947</guid><author>LinuxWorking</author><pubDate>Thu, 09 Nov 2017 16:16:04 +0800</pubDate><description><![CDATA[BSS段：BSS段（bsssegment）通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStartedbySymbol的简称。BSS段属于静态内存分配。

数据段：数据段（datasegment）通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段：代码段（codesegment/textsegment）通常是指用来存放]]></description><category></category></item><item><title><![CDATA[Linux C中内联汇编的语法格式及使用方法（Inline Assembly in Linux C）]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78490841</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78490841</guid><author>LinuxWorking</author><pubDate>Thu, 09 Nov 2017 16:10:46 +0800</pubDate><description><![CDATA[在阅读Linux内核源码或对代码做性能优化时，经常会有在C语言中嵌入一段汇编代码的需求，这种嵌入汇编在CS术语上叫做inline assembly。本文的笔记试图说明Inline Assembly的基本语法规则和用法。


内联汇编（或称嵌入汇编）的基本语法模板比较简单，如下所示（为使结构更清晰，这里特意做了换行，其实完全可以全部写到单行中）：
asm [ volatile ] ( 
a]]></description><category></category></item><item><title><![CDATA[C语言函数之可变参数原理:va_start、va_arg及va_end]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484209</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484209</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 22:33:08 +0800</pubDate><description><![CDATA[说到C语言函数可变参数，我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里，printk函数原型如下:




asmlinkage int printk(constchar*fmt,...)




asmlinkage表示通过堆栈传递参数。gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法：一种是通过堆栈，另一种]]></description><category></category></item><item><title><![CDATA[CPSR 和 SPSR]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484185</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484185</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 22:31:08 +0800</pubDate><description><![CDATA[CPSR:程序状态寄存器(current program status register) (当前程序状态寄存器)，在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。

CPSR在用户级编程时用于存储条件码。
  SPSR:程序状态保存寄存器（saved programstatus register）,每一种处理器模式下都有一个状态寄存器]]></description><category></category></item><item><title><![CDATA[C语言可变参数函数取参方法]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484170</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484170</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 22:28:59 +0800</pubDate><description><![CDATA[熟悉C的人都知道，C语言支持可变参数函数(Variable Argument Functions)，即参数的个数可以是不定个，在函数定义的时候用(...)表示，比如我们常用的printf()\execl函数等；printf函数的原型如下：




int
printf(const
char *format, ...);




注意，采用这种形式定义的可变参数函数，至少需要]]></description><category></category></item><item><title><![CDATA[container_of和list_for_each_entry 及其相关函数的分析]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484134</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484134</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 22:25:33 +0800</pubDate><description><![CDATA[Linux代码看的比较多了，经常会遇到container_of和list_for_each_entry，特别是list_for_each_entry比较多，因为Linux经常用到链表，虽然知道这些函数的大概意思，但一旦出现一个类似的函数比如list_for_each_entry_safe就又会感到头大，所以下定决心分析总结一下这些函数的用法，以后再看到这些面孔的时候也会轻松很多，读Linux代码的]]></description><category></category></item><item><title><![CDATA[Linux __setup宏解析]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484092</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484092</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 22:22:06 +0800</pubDate><description><![CDATA[__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_]]></description><category></category></item><item><title><![CDATA[ARM Linux系统调用的原理]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484051</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78484051</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 22:18:52 +0800</pubDate><description><![CDATA[操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口。在应用程序和硬件之间设置一个额外层具有很多优点。首先，这使得编程更加容易，把用户从学习硬件设备的低级编程特性中解放出来。其次，这极大地提高了系统的安全性，因为内核在试图满足某个请求之前在接口级就可以检查这种请求的正确性。最后，更重要的是这些接口使得程序具有可移植性，因为只要内核所提供的一组接口相同，那么在任一内核之上就可以正确地编译和执]]></description><category></category></item><item><title><![CDATA[文件系统VFS数据结构]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78482118</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78482118</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 19:17:59 +0800</pubDate><description><![CDATA[标签：
Linux虚拟文件系统四大对象：
1）超级块(super block)
2）索引节点(inode)
3）目录项(dentry)
4）文件对象(file)


一个进程在对一个文件进行操作时各种对象的引用过程如下：
通过task_struct得到files_struct，然后通过文件描述符（int fd）获得相应的文件对象（file **fd），接下来获得目录项对象（den]]></description><category></category></item><item><title><![CDATA[malloc内核实现原理]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78474880</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78474880</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 09:26:45 +0800</pubDate><description><![CDATA[考虑这样一种常见的情况：用户进程调用malloc()动态分配了一块内存空间，再对这块内存进行访问。这些用户空间发生的事会引发内核空间的那些反映？本文将简单为您解答。
1.brk系统调用服务例程
malloc()是一个API，这个函数在库中封装了系统调用brk。因此如果调用malloc，那么首先会引发brk系统调用执行的过程。brk()在内核中对应的系统调用服务例程为SYSCALL_DEFINE]]></description><category></category></item><item><title><![CDATA[linux 内存管理的slab机制分析]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78474832</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78474832</guid><author>LinuxWorking</author><pubDate>Wed, 08 Nov 2017 09:22:41 +0800</pubDate><description><![CDATA[Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求，它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求，比如说几个字节或者几百个字节，如果依然分配一个页框来来满足该请求，那么这很明显就是一种浪费，即产生内部碎片（internal fragmentation）
为了解决小块内存的分配，Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分]]></description><category></category></item><item><title><![CDATA[Linux块设备驱动]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78467348</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78467348</guid><author>LinuxWorking</author><pubDate>Tue, 07 Nov 2017 14:07:55 +0800</pubDate><description><![CDATA[(1)---块驱动中相关的结构体及其操作

1.字符设备与块设备IO操做的区别
1)块设备只能以块为单位接收输入返回输出,而字符设备则以byte为单位.大多数设备是字符设备,他们不需要缓冲并且不以固定块大小进行操作.
2)块设备对于IO请求有对应的缓冲区,所以他们可以选择以什么顺序进行响应.字符设备无须缓冲且被直接读写.
3)字符设备只能被顺序读写,块设备可以随机访问. 
 
 
]]></description><category></category></item><item><title><![CDATA[linux进程地址空间]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78452142</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78452142</guid><author>LinuxWorking</author><pubDate>Sun, 05 Nov 2017 20:39:18 +0800</pubDate><description><![CDATA[我们知道，在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间，3G-4G是内核空间。其实，这个4G的地址空间是不存在的，也就是我们所说的虚拟内存空间。
那虚拟内存空间是什么呢，它与实际物理内存空间又是怎样对应的呢，为什么有了虚拟内存技术，我们就能运行比实际物理内存大的应用程序，它是怎么做到的呢？呵呵，这一切的一切都是个迷呀，下面我们就一步一步解开心中的谜团吧!]]></description><category></category></item><item><title><![CDATA[Linux设备树解析]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78446327</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78446327</guid><author>LinuxWorking</author><pubDate>Sat, 04 Nov 2017 21:49:42 +0800</pubDate><description><![CDATA[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中充斥]]></description><category></category></item><item><title><![CDATA[MTD设备驱动详解]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78446152</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78446152</guid><author>LinuxWorking</author><pubDate>Sat, 04 Nov 2017 21:22:49 +0800</pubDate><description><![CDATA[MTD(memory technology device内存技术设备)是用于访问memory设备（ROM、flash）的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单，为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。CFI接口的MTD设备分为四层（从设备节点直到底层硬件驱动），这四层从上到下依次是：设备节点、MTD设]]></description><category></category></item><item><title><![CDATA[i2s总线规范]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78446110</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78446110</guid><author>LinuxWorking</author><pubDate>Sat, 04 Nov 2017 21:17:42 +0800</pubDate><description><![CDATA[I2S(Inter—IC Sound)总线是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准，该总线专责于音频设备之间的数据传输，广泛应用于各种多媒体系统。




I2S总线拥有三条数据信号线：

1、SCK: ( serial clock)  串行时钟，有时也称作：SCL

       对应数字音频的每一位数据，SCK都有1个脉冲。SCK的频率=2×采样频率×]]></description><category></category></item><item><title><![CDATA[UVC（USB Video Class）协议讲解]]></title><link>https://blog.youkuaiyun.com/LinuxWorking/article/details/78419631</link><guid>https://blog.youkuaiyun.com/LinuxWorking/article/details/78419631</guid><author>LinuxWorking</author><pubDate>Wed, 01 Nov 2017 22:30:12 +0800</pubDate><description><![CDATA[1. UVC功能概述
UVC设备都是多Interface设备，这点同普通的u盘不同。UVC设备最起码有两个Interface，VideoControl（VC）Interface和VideoStream(VS) Interface； 这也是最常见的UVC设备。 Spec明确要求一个具有可用的，具有实际UVC功能的设备要有一个VC Interface，一个或多个VS Interface。

VC]]></description><category></category></item></channel></rss>