DTB Device Tree 视频教程:以瑞萨Cortex-A15为例

上个月初在组内进行了Device Tree 的知识共享交流,主要讲解了一下: Device Tree引入导致的变更 如何在dts中添加一个device node 与Device Tree相关的API有哪些 下面是思维导图的截图: 最后是视频,不需要什么专门播放器与密码,下载或者保存到自己的网盘即可直接播放,如果有错误,请大家多多包涵与评论指出。 点击访问:百度网盘连接地址  密码:2cpd 或者在Youku中观看,注意选择超清观看 第一部分视频: 第二部分视频:

Continue reading »

多线程中的Double Close与System Call Hook

同事在拿到修改后的weston相关的多线程代码中,怀疑有double close。期望我可以帮忙确定出来。 修改后的weston,我们拿到的只有一个executive elf文件,并没有source code。对于这种hook要求,一般有三种方法,但是各不相同: 修改kernel中的close system call:要求可以编译内核 wrap libc中的close():可以直接更改glibc代码,也可以使用ld的“–wrap=symbol”选项,至少要有编译后的object,因为我们需要在link的时候wrap 使用LD_PRELOAD,新建一个动态库来hook/wrap close,不需要更改内核与libc,也不需要源代码 在内核中修改System Call 因为有内核源码,因此第一种方式成为了首选。double close,一般第二次close的时候会出错,但是有的时候会错误的关闭其他线程的fd,因此我们只需要在关闭出错的时候打印出这个线程的名字、pid即可。在close system calll的实现代码中添加一行即可(文件位于fs/file.c):

在用户态Hook

Continue reading »

SysV Init

RunLevel 在提及Unix System-V Init之前,让我们想一想Windows的安全模式与Android的不同启动模式。 ①在Windows启动的时候,可以按下F8,然后选择“安全模式”启动,而安全模式启动又分为带有网络和不适用网络的安全启动。显然,以不同的安全模式启动,系统在初始化时做的事情也不一样,带有网络的安全模式需要额外的初始化网卡等工作。我不了解Windows加载器(bootloader)是如何将不同启动模式的信息(bootmode)告诉Windows的,但是显然他们有约定一种方式来传递信息。或许是类似于u-boot总的bootargs,或许是在磁盘某个特殊的位置写下了对应的信息。 ②经常刷机或者对Android启动熟悉的同学,应该知道Android有几种不同的启动模式,例如:recovery mode、 fastmode。不同的启动模式作用各不相同,例如fastmode一般用于烧写Image。Android或者由Android系统更改的OS,启动模式一般都是由u-boot(bootloader)通过bootargs传递给内核,或者是在Flash中设置Flag。在Android的init程序(第一个被启动的应用程序,可能由init=来指定)启动后根据标志位或者Flasg启动不同的程序,或者使用uramdisk中不同的init.*.rc文件,从而达到不同bootmode下启动不同service,做不同设置的功能。 对于Linux/Unix系统,对于服务器,或许在它正常运行的时候不应该启动X(GUI),对于桌面Destop则需要启动X,因此不同的bootmode的需求一样存在;Unix SystemV的Init使用runlevel来决定启动不同的程序。符合LBS 4.1.0的系统不同的runlevel的约定如下表(来源于Wikipedia Runlevel词条): LSB 4.1.0 ID Name Description 0 Halt Shuts

Continue reading »

Algorithm 4th environment setup

algs4的官方给出环境搭建步骤较多,在github找了一下,看到了aistrate的repo,发现用这个非常方便。   1. 材料与环境准备 1.1 代码与数据准备

在clone下来的文件夹中有需要的源码,同时还有stdlib.jar与algs4.jar两个Package,是对一些static method的封转,这两个文件需要添加到classpath中。 1.2 安装openjdk

2. 编译与运行环境 2.1  使用命令行 Compile:

Run:

Continue reading »

用gitlabCI快速搭建一个GitServer与CI

一般的公司一般都有一个或者多个中央Git Server,托管着所有项目代码;同时当一个项目很大,由许多个工程组成,例如Tizen和Android,那么一般还有Continuous Integration(CI)在有人push代码到工程时编译整个项目,编译出错一般CI会发邮件给提交者和管理者,从而可以及时修正错误。 Git Server安装与使用 Git server很多,列举一部分: WINDOWS GitStack:免费版只能有两个账号 SCM Manager LINUX GitLab Git-Deamon Git使用-bare生成 获取与安装 这里使用gitlab,到这里下载bitnami gitlab一键安装包。安装非常简单,只需要添加可执行权限然后用sudo ./XXX.run 执行即出现图形化的安装向导。在安装过程中需要设置用户名和密码用于后面配置使用。

Continue reading »

Speed up Booting Embedded System

嵌入式产品的启动时间一般是一个指标,像大部分Android手机几乎没有为启动加速做过优化,可以改进的地方非常多。当然因为Android用得最多的地方是手机,难得冷启动一次。 用户从按下电源键开始,看到启动logo或者启动动画到出现可操作的Home/App画面,需要的时间越少,自然越好,产品的竞争力也越强。 一般没有系统的嵌入式设备启动都是上电即进入正常工作流程,这里只说linux/Android及类似的系统;下面将会简单的说明和列举从启动流程到各个启动过程都可以使用的方法,以及快速启动。 ☞启动流程 要做启动时间优化,需要对启动过程非常熟悉。下面从启动流程说起。 不同的嵌入式设备启动流程很可能不一样,但是绝大部分的linux/Android设备都是一样或者类似的。  ❤图片来源于:http://processors.wiki.ti.com/index.php/Optimize_Linux_Boot_Time ☞工具准备: 串口行间数据计时工具Grabserial的安装与使用 因为依赖python的serial模块,先安装它,在Ubuntu中安装python-serial:

获取工具脚本:

添加可执行权限:

设置以U-boot字符串出现为基准计时的使用示例:

如果要同一行内部计时,例如解压kernel的时候是在一行内的,可以使用-i选项:

我们从MMC出现时开始计时,以下为实例log,其中第一列为从出现指定字符串开始的计时,第二列为与上一行log的间隔:

Continue reading »

ARM Linux BenchMark

背景说明 许多公司有很多不同的ARM SoC的研发产品,ARM核心可能有Cortex-A8/A9/A15,核心数可能有单核双核和四核.现在,几乎每出一款手机,网络上马上就有人对其评测.对比和评测不同ARM SoC 芯片以及嵌入式系统是非常有必要的;通过不同的SoC和其运行的OS对比,可以帮助我们了解我们产品的性能,并根据测试得知系统的瓶颈、找出需要改善的方面。 嵌入式产品的硬件一般都是由处理器、主存、存储器、显示设备、以及其他外设组成。嵌入式产品的软件方面,一般都选用嵌入式系统,如小的RTOS,如VxWorks、μC/OS-III、RTT、DJYOS、FreeRTOSLinux,或者是更复杂的Linux、Android、WinCE。评测和对比的内容一般也主要由软件和硬件这两个方面组成。 预备基础知识 如果只是对Andorid系统或者是WinCE相关系统评测,那么我们完全可以下载一些应用(安装)运行即可评测。而如果要评测的嵌入式系统是基于Linux自己定制的甚至没有GUI的,则很可能需要我们下载源代码编译。因此对基础的编译知识的了解必不可少①。编译配置又与ARM SoC构架相关,所以需要了解一下与ARM构架以及有关的交叉编译的选项,比较ARM SoC种类较少,所以这类问题变得很简单了,一般我们需要根据需要配置-mfpu和-march以及-mfloat-abi,以及编译优化选项。 评测工具介绍 评测工具有很多,在这个网页列出了几十个工具。单单系统性评测工具就有7个。那什么是系统性的BenchMark(引用自unixbench): Do be aware that this is a system

Continue reading »

madpaly 移植到 TQ2440 遇到问题madplay not found (2)

上一次遇到了问题,在我确定各类方式无误后, 怀疑原因可能有两个: Reason1:  我安装的Ubuntu 11.10没有需要的那个libid3tag这个文件  编译时lib3tag源码包是不会产生这个的 Reason2:  我哪里设置有问题,即在那个 ./configure …..这里设置有问题. 对于Reason1 ,我换用了一个系统 用Ubuntu 9.10,结果,一次性就搞定了. 既然如此,说明可以了,那么将其中需要的库和二进制文件放入根目录对于文件夹中去试一试. 库已经放入到/usr/lib中,而madplay则已经放入了/bin和usr/bin中 因为用的是nfs根文件系统,拷贝过去后发现是不可以的. 这个是什么原因呢? 回答一楼的问题:【Update Date

Continue reading »

madpaly 移植到 TQ2440 遇到问题 libid3tag was not found (1)

=============================================================================== 上一次构建根文件系统的时候留下了几个问题 第一是没有区分uImage和zImage 第二是对U-boot传入参数的有问题 对于第一个问题,就是需要知道什么时候用的是zImage什么时候是uImage 对于第二个问题,在u-boot中可以直接改变环境变量既可, 如TQ2440的是0选项中的NFS 选项 =============================================================================== 昨天遇到的问题: 1:     弄nfs filesystem 因为一个错误耽误了一天时间 .这个错误是在填入路径的时候没有到达底层 eg /home/tonyho/nfs/rootfs 将后面的rootfs省掉了,这样子就无法被挂载找到/bin sbin 等目录了,改了后就好了.

Continue reading »

TQ2440根文件系统直接编译进内核

直接用TQ2440提供的源码linux2.6.30.4, 然后用其提供的busybox.1.16.0 在(make menuconfig中)没有选中Initial Ram… 时是这样的 看到这里,大约知道除了根文件系统有问题外,其他没有问题. 将文件系统编译进去,遇见问题: make zImage ARCH=arm后,下载zImage.bin到TQ2440,启动系统后居然是这样: 看来这个问题不小,直接bad gzip了 Question1: 该如何解决呢? 不管它继续用uboot的另一个功能 Test Linux Image(zImage) :

Continue reading »