全部博文(200)
发布时间:2013-01-07 14:16:18
RO段、RW段和ZI段 要了解RO,RW和ZI需要首先了解以下知识:ARM程序的组成 此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。 一个ARM程序包含3部分:RO,RW和ZI。RO是程序中的指令和常量;R......【阅读全文】
发布时间:2013-01-07 14:14:53
在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。在数据处理指令中使用S后缀来实现该功能。 不要在CMP,CMN,TST或者TEQ指令中使用S后缀。这些比较指令总是会更新标志位。 在Thumb模式下,所有数据处理指令都更新CPSR中的标志位。有一个例外就是:当一个或更多个高寄存器被用在MOV和ADD指令时,此时MOV和ADD不能更新状态标志. 几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行。参见表2-1条件执行后缀表。 在ARM模式下,你可以: · 根据数据操作的结果更新CPSR中的ALU状态标志; ·......【阅读全文】
发布时间:2013-01-07 14:12:00
Linux kernel里面从来就不缺少简洁,优雅和高效的代码,只是我们缺少发现和品味的眼光。在Linux kernel里面,简洁并不表示代码使用神出鬼没的超然技巧,相反,它使用的不过是大家非常熟悉的基础数据结构,但是kernel开发者能从基础的数据结构中,提炼出优美的特性。kfifo就是这样的一类优美代码,它十分简洁,绝无多余的一行代码,却非常高效。关于kfifo信息如下:本文分析的原代码版本:2.6.24.4kfifo的定义文件:kernel/kfifo.ckfifo的头文件: include/linux/kfifo.h1. kfifo概述kfifo是内核里面的一个First ......【阅读全文】
发布时间:2013-01-07 14:11:25
忘记了之前是有个什么事情一时想起好像需要用个cycler buffer,手头一时又没有,懒得自己实现。就向同学要了个。后来好像也没有用到,倒是一直记得好像老早以前看到ldd上提到双向链表的时候有提到个kfifo,只是一直没有用到这个,所以一直没看。倒是无聊的时候想起过printk是否用的就是这个数据结构。 昨天临下班的时候想到kfifo这个东东,今天就抽点时间看看。 刚开始是把双向链表拎出来编一下看看,结果让我大吃一惊。居然没有list.h,看来fc从4以后开始倒退倒是有点佐证了。好在机器上还有linux-libc-headers的包,解包覆盖一下应该就ok了吧。不要高兴,还是不行。打开l......【阅读全文】
发布时间:2013-01-07 14:11:02
作者:西邮 王聪Linux内核中的循环缓冲区(circular buffer)为解决某些特殊情况下的竞争问题提供了一种免锁的方法。这种特殊的情况就是当生产者和消费者都只有一个,而在其它情况下使用它也是必须要加锁的。循环缓冲区定义在include/linux/kfifo.h中,如下:struct kfifo {unsigned char *buffer;unsigned int size;unsigned int in;unsigned int out;spinlock_t *lock;};buffer指向存放数据的缓冲区,size是缓冲区的大小,in是写指针下标,out是读指针下标,lock是......【阅读全文】