关于armhf (hard-float ABI for ARM)

armhf是什么

在Ubuntu 12.04和Debian里,除了arm, armel,还出现了一个名为armhf的版本。这个东西是什么?

众所周知,armel是目前主要的ARM ABI。armhf则是armel的一个变种,主要区别在浮点计算上。

在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。soft是指所有浮点运算全部在软件层实现,效率当然不高,适合于早期没有浮点计算单元的ARM处理器;softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器;hard则使用FPU浮点寄存器将函数参数传递给FPU处理。

需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。

价值

使用softfp模式,会存在不必要的浮点到整数、整数到浮点的转换。而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期[1]。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。

在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20——25%的性能提升[2]。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升[3]。

使用

armhf的开启需要硬件的支持,在Debian的wiki上要求ARMv7 CPU、Thumb-2指令集以及VFP3D16浮点处理器[4]。

在gcc的编译参数上,使用-mfloat-abi=hard -mfpu=vfp即可。

在工具上,CodeSourcery最早支持hard模式。也可已自己编译工具链[5]。

Continue reading

模糊哈希算法的原理与应用

关于模糊哈希(Fuzzy Hashing)算法,目前网上有几篇中文资料介绍,但均不准确。写这篇文章以纠正,并对其原理和应用作详细的介绍。

一、概述

模糊哈希算法又叫基于内容分割的分片分片哈希算法(context triggered piecewise hashing, CTPH),主要用于文件的相似性比较。

2006年,Jesse Kornblum [1] 提出CTPH,并给出一个名为spamsum的算法实例。随后,Jason Sherman开发了ssdeep [2] 工具以实现这一算法。该算法最初用于取证,后来被用于恶意代码检测,最近又有用于开源软件漏洞挖掘等。

模糊哈希的主要原理是,使用一个弱哈希计算文件局部内容,在特定条件下对文件进行分片,然后使用一个强哈希对文件每片计算哈希值,取这些值的一部分并连接起来,与分片条件一起构成一个模糊哈希结果。使用一个字符串相似性对比算法判断两个模糊哈希值的相似度有多少,从而判断两个文件的相似程度。

对文件的部分变化(包括在多处修改、增加、删除部分内容),使用模糊哈希均能发现与源文件的相似关系,是目前判断相似性较好的一种方法。

Continue reading

将电子书转为Kindle友好的格式

除了dxg,其他型号的Kindle最大的问题在于屏幕太小。以下是一些不完美的解决方案,以Kindle 4 keyboard为例:

1、pdf文件

用briss切除白边,在Kindle上横屏阅读。最终效果取决于pdf文件页心的宽度。briss的地址是:http://sourceforge.net/projects/briss/

2、epub文件

现在很多出版社都出售epub格式电子书了,比如Weily, O’Reilly,但Kindle一直不支持。使用calibre可以转换为mobi格式,因为都是基于html和css的格式,所以效果很完美。calibre的地址是:http://calibre-ebook.com/

3、html文件

有的书可以下载到html文件,比如Practical Common Lisp。将整本书的zip文件,或者解压后的index.html文件导入calibre,即可转成mobi格式,效果同样完美。

4、TeX文件

还有的书开放得更彻底,提供了LaTeX源码,例如Paul E. McKenney的Is Parallel Programming Hard, And, If So, What Can You Do About It?。可以自己下载了源码,使用TeX Live编译为适合于Kindle屏幕大小的pdf文件。尝试了几次,对竖屏来说,较好的参数如下:

\documentclass[11pt]{book}
\usepackage[paperwidth=9cm, paperheight=12cm, top=0.1cm, bottom=0.2cm, left=0.1cm, right=0.1cm]{geometry}
\special{papersize=9cm,12cm}

对横屏,则应把其中的宽改为12cm,高改为8.9cm。效果比较好,除了部分大的表格和图片会超出纸张大小。

5、txt文件

主要是小说了,用calibre转换即可。在转换选项中,calibre默认页面边距是5pt,可以全部改成0pt。

Google为Android Market引入恶意代码检测

Android工程副总裁Hiroshi Lockheimer在Google移动官方博客发文称已经为官方市场的应用软件引入了恶意代码检测机制,地址是:

http://googlemobile.blogspot.com/2012/02/android-and-security.html

下面是对其中一段关键内容的翻译:

今天我们公开一个我们开发的服务,名为Bouncer。它提供了对Android市场上潜在恶意软件的自动化扫描服务,并且不影响Android市场的用户体验,也不需要开发者走应用软件批准流程。

该服务对Android市场的新增应用软件、已有应用软件、开发者帐号进行一些分析。它是这样工作的:当一个应用软件被上传后,该服务立即开始分析,判断其是否已知恶意代码、间谍件或木马;它还查找其中是否存在不当行为,并将其与之前分析过的软件进行比较以检测可疑点。事实上,我们将每个软件在Google的云设施上运行,模拟它们在Android设备上运行的情况,并观察是否有隐藏或恶意的行为。此外,我们还分析新增的开发者帐号以防止恶意代码出现、防止反复违规的开发者卷土重来。

文章称该服务已经在官方市场运行一段时间(可能是去年下半年开始的),并取得了较为显著的效果。