博文
讲述hello内核模块编译的全过程(2010-07-16 16:52:00)
摘要:内核版本:2.6.10
在/home/tmp/下建立两个文件hello.c,Makefile
hello.c
------------
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello module init\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "hello module exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
--------------
Makefile
----------
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -f *.ko *.mod.c *.mod.o *.o
-----------
编译模块
#make
清除
#make clean
-----------
为了能够在终端显示信息,要修改
/lib/modules/2.6.10/build/include/linux/kernel.h
文件的KERN_ALERT宏。
#define KERN_ALERT "<1>"
......
EBOOT通过bin文件形式读取、下载LOGO(2010-06-01 17:32:00)
摘要:一般的WINCE系统都是在EBOOT阶段初始化LCD,所以要想显示自己的LOGO就需要在EBOOT阶段将LOGO内容显示出来,读取LOGO的方式可以和从存储器中读取NK一样,具体位置自己来定义。
在EBOOT阶段下载LOGO保存到FLASH中可以采用下载bin文件的方式,bin文件中的内容可以参考eboot.bin和nk.bin。
根据\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON下blcommon.c文件中各函数分析eboot.bin文件的结构:
Eboot.bin的前7个字节("B000FF\x0A")用来判断是否为WINCE的bin文件,接下边分别是4字节映像的起始地址dwImageStart、4字节映像大小dwImageLength,接着分别是4字节接收地址dwRecAddr、4字节接收长度dwRecLen、4字节接收检验和dwRecChk,接下来是eboot.nb0压缩后的数据,即eboot运行时的数据,查看eboot.bin文件dwRecLen值为4,即根据dwRecChk后边的4字节数据得到dwRecChk,VerifyChecksum()函数是将这4字节数据相加得到dwRecChk。
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 42 30 30 30 46 46 0A 00 80 03 80 88 20 07 00 00 B000FF..€.€?...
00000010 80 03 80 04 00 00 00 E2 01 00 0......
MP跟B帧有关系的。AVC/H.264定义了4种不同的Profile(类)(2010-05-05 17:40:00)
摘要:H.264标准三个框架
H.264的编解码框架与以前提出的标准如H.261、H.263及MPEG-1/2/4并无显著变化,也是基于混合编码的方案:以运动矢量代表图象序列各帧的运动内容,使用前面已解码帧对其进行运动估计和补偿或使用帧内预测技术,所得的图象参差值要经过变换、量化、熵编码等部分的处理。所以,新标准的性能提升在于各个部分的技术方案的改进及新算法的应用。新标准在提高图象传输的容错性方面做了大量工作,重新定义了适于图像的结构划分。在编码时,图象帧各部分被划分到多个slice结构中去,每个slice都可以被独立解码不受其它部分的影响。Slice由图象最基本的结构——宏块组成,每个宏块包含一个16×16的亮度块和两个8×8的色度块。为进一步提高鲁棒性,整个系统被划分为视频编码层和网络抽象层。视频编码层主要描述要传输的视频数据所承载的
视频内容。而网络抽象层则是考虑不同的应用,如视频会议通信、H.32X连续包的视频传输或RTP/UDP/IP的通信。
H.264标准分成三个框架(profile):Baseline、Main及X,代表了针对不同应用的算法集及技术限定。其中,Baseline主要包含了低复杂度、低延时的技术特征;主要是针对交互式的应用;考虑到了恶劣环境下的容错性,Baseline的内容基本都被其它更高级别的profile所包含。而Main profile是针对更高编码效率的应用,如视频广播。X profile 的设计主要针对流媒体的应用,在这一框架中所有容错技术和对比特流的灵活访问及切换技术都将包括其中。
Baseline profile的主要技术特征
⑴ Baseline的解码器只对I slice及P slice进行操作。对于帧间预测,相比以前的标
准,为了更精确的对图象的运动内容进行预测补偿,新标准允许宏块更进一步划分为16×16、16×8、8×16、8×8、8×4、4×8、4×4的子块;运动估计精确到经由6-tap滤波器得到的1/4象素位置;运动矢量由相邻块预测得到,其预测的差值被编码传输。H.264支持多参考帧的预测,规定运动估计使用的参考帧数最多可达15帧,多参考帧的使用大大提高了对图像传输的容错性,抑制了错误在空间和时间上的蔓延。对于所有的slice编码类型,H.264支持两类帧内......
GIT和repo使用方法,下载android-2.6.29内核(2010-04-07 17:04:00)
摘要:Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓 库(repository),许多个工作目录(working copy),而像Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。
因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。
这几天William为了拿Android最新的sourcecode,学习了一下git和repo的一些基本操作,整理了一个如何取得Android代码的How-To,今天把他贴上来。
1、Git的安装
从http://git-scm.com/下载最新的git源码包:并解压:
#tar -xjf git-1.6.3.3.tar.bz2
编译并安装:
#cd git-1.6.3.3
#./configure
#make;make install
# git --version
git version 1.6.3.3
2、安装Repo
首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中
接下来通过cURL来下载Repo脚本,保存到~/bin/repo文件中
curl http://android.git.kernel.org/repo >~/bin/repo
别忘了给repo可执行权限
chmod a+x ~/bin/repo
3、初始化版本库
如果是想把Android当前主线上......
分析Android 根文件系统启动过程(init守护进程分析)(2010-03-09 15:06:00)
摘要:在Android系统启动时,内核引导参数上一般都会设置“init=/init”,这样的话,如果内核成功挂载了这个文件系统之后,首先运行的就是这个根目录下的init程序。这个程序所了什么呢? 我们只有RFSC(Readthe Fucking Source code)!!
init程序源码在Android官方源码的system/core/init中,main在init.c里。我们的分析就从main开始。
init:
(1)安装SIGCHLD信号。(如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。
(2)对umask进行清零。
何为umask,请看http://www.szstudy.cn/showArticle/53978.shtml
(3)为rootfs建立必要的文件夹,并挂载适当的分区。
/dev (tmpfs)
/dev/pts (devpts)
/dev/socket
/proc (proc)
/sys (sysfs)
(4)创建/dev/null和/dev/kmsg节点。
(5)解析/init.rc,将所有服务和操作信息加入链表。
(6)从/proc/cmdline中提取信息内核启动参数,并保存到全局变量。
(7)先从上一步获得的全局变量中获取信息硬件信息和版本号,如果没有则从/proc/cpuinfo中提取,并保存到全局变量。
(8)根据硬件信息选择一个/init.(硬件).rc,并解析,将服务和操作信息加入链表。
在G1的ramdisk根目录下有两个/init.(硬件).rc:init.goldfish.rc和init.trout.rc,ini......
Android 根文件系统分析(2010-03-02 16:49:00)
摘要:经过这几天在网上搜索关于Android文件系统的相关资料,发现已经有很多高手分析了Android的文件系统,这些高手多从不同的方面分析了其文件系统的结构和运行原理。我这里就写一下自己的理解。
首先是Android的文件系统根目录的结构:
# pwd && ls -a -l
/
drwxrwxrwt root root 2009-06-10 09:53 sqlite_stmt_journals
drwxrwx--- system cache 2008-09-06 22:51 cache
d---rwxrwx system system 1970-01-01 08:00 sdcard
lrwxrwxrwx root root 2009-06-09 22:11 etc -> /system/etc
drwxr-xr-x root root 2008-09-06 22:45 system
drwxr-xr-x root root ......
三星FIMG-3DSE v1.5 GPU(2009-11-13 15:58:00)
摘要:这个是三星6410 ARM CPU硬件架构的GPU,呵呵共享一下。
这是他的feature
42.1.1 FEATURES
• 4M triangles/s @133MHz (Transform Only)
• 75.8M pixels/s fill-rates @133MHz (shaded pixels)
• Programmable Shader Model 3.0 support
• 128-bit (32-bit x 4) Floating-point Vertex Shader
- Geometry-texture cache support
• 128-bit (32-bit x 4) Floating-point two Fragment Shaders
• Max. 4K x 4K frame-buffer (16/32-bpp)
• 32-bit depth buffer (8-bit stencil/24-bit Z)
• Texture format: 1/2/4/8/16/32-bpp RGB, YUV 422, S3TC Compressed
• Support max. 8 surfaces (max. 8 user-defined textures)
• API Support: OpenGL ES 1.1 & 2.0, D3D Mobile
• Intelligent Host Interface
- 15 i......
Windows Mobile 开发常见问题集(2009-04-09 10:39:00)
摘要:1、Q:新建项目的时候选择哪个项目类型才能创建智能设备的应用程序?
A:在Visual Studio的新建项目对话框中选择Visual C#或者Visual Basic项目类型,选择智能设备模板,然后再选择相应的设备SDK,最后选择“Device Application”,就可以创建一个移动设备的应用程序了。
2、Q:托管代码与本地代码有哪些区别?
A:托管代码是指使用.NET Compact Framework开发的程序代码,可执行文件被编译成IL,执行时需要有.NET的运行时环境。而本地代码指用C 等语言开发的程序代码,可执行文件被编译成与CPU指令集有关的机器码,可以直接运行。
3、Q:能不能简要介绍一下Magneto里面对OTA和MMS的支持?
A:Magneto对OTA有很好的支持,SDK文档的通讯部分中,有针对OTA的专门介绍。MMS的应用程序基本都是由第三方开发的,因为MMS是基于WAP协议的,而Magneto本身对WAP的支持也很好,具体的协议也可以在SDK文档里找到。
4、Q:请问用Visual Basic .NET开发PDA数据库程序能不能使用ADO.NET?
A:Visual Basic .NET开发PDA数据库不需要引用System.data.oledb,只需要引用System.Data.SqlServerCe命名空间就可以了。 该命名空间中的数据库操作类和ADO.NET是基本一致的。可以用它们来开发针对SQL Server CE的应用程序。
5、Q:在Visual C 2005中,可以使用.Net Compact Framework吗?
A:不能,现在.NET Compact Framework只支持C#和VB.NET,而不支持C /CLI。但是在VS.NET 2005中可以用C 来开发Native代码来支持移动设备。
6、Q:从什么地方可以得到Smartphone开发环境?
A:Smartphone的SDK可以在微软网站上找到,而Visual Studio 2005 Beta 2可以通过参加微软活动的方式获得。MEDC 2005的参加者都获得了VS.NET 2005和Windows Mobile 5 SDK的开发光盘。
7、Q:托管性的代码执行效率怎么样?和使用Visual C 编写的代码相......
Qtopia-core-4.3.3编写的第一个程序helloworld(2009-04-09 10:35:00)
摘要:前两天把Qtopia-core-4.3.3移植到了我的ARM开发板上,今天自己编写了一个helloworld程序,准备移植到开发板上。
1、在PC上写helloword程序代码
我用的是QDevelop-0.25-2自动生成的Dialog程序,没做任何修改。在PC上编译运行,一切正常。
2、交叉编译
设置环境变量
#export PATH=/usr/local/Trolltech/Qtopiacore-4.3.3-arm/bin:$PATH
生成Makefile
#/usr/local/Trolltech/QtopiaCore-4.3.3-arm/bin/qmake -spec /root/qtopia-core-opensource-src-4.3.3/mkspecs/qws/linux-arm-g helloworld.pro
其中 /root/qtopia-core-opensource-src-4.3.3/是交叉编译QtopiaCore-4.3.3-arm是的路径,我也尝试过用/usr/local/Trolltech/QtopiaCore-4.3.3-arm/mkspecs/linux-arm-g 代替 /root/qtopia-core-opensource-src-4.3.3/mkspecs/qws/linux-arm-g 但是会出错,具体原因还不清楚。
3、编译
#make
结果提示很多网络相关的东西没有定义,为什么这样??我没有使用网络的东西呀,原来Qtopia的桌面使用的是C/S结构的东东哈,所以默认是使用的网络的。那只要添上网络相关的库就OK了吧。
4、修改工程文件
用gedit打开helloworld.pro。将QT = gui core修改为QT = gui core network然后保存
5、重新生成Makefile
#/usr/local/Trolltech/Qtopiacore-4.3.3-arm/bin/qmake -spec /root/qtopia-core-opensource-src-4.3.3/mkspecs、qws/linux-arm-g helloworld.pro
6、编译
#make
哈哈,这次编译通过了。<......
如何在非实时linux上实现实时应用程序与内核模块之间共享存储器(2009-03-26 16:12:00)
摘要:linux并不是严格意义上的实时操作系统,为了实际需要,工程师们必须想尽办法来祢补这一不足,于是出现了rtlinux和rtai等并不强调商业性的软件。免费的rtlinux显然庞大而并不兼容大部分的嵌入式平台,最新版本的rtlinux也只能支持I386和PPC而已。Rtai是不错的选择,但要把它移植到你的平台上去,为了适应你的linux版本,你的CPU,你必须的花费许多的工作,比如说最近比较流行的AT91RM9200DK,光修改linux版本补丁就要花费许多的功夫。Rtlinux和rtai为了增强linux操作系统的实时性,主要是通过开辟内核模块与应用程序之间可以共享的内存快来实现的。它们在内核空间控制硬实时任务的运行,并通过一个名为FIFO的共享内存块来与应用程序进行通信。他们是很不错的软件,我想用不了多久他们就会具备更强大的可移植性。但我在本文主要是想详细的介绍一个适合小型嵌入式系统使用的增强linux操作系统实时性的方法。当然,原理也是开辟一个实时应用程序与内核模块之间可以共享的内存。
众所周知,内核空间和用户空间只能通过系统调用来共享数据,如果进程要等待一个中断的发生,它所能做的就是把自己挂在等待队列里,直到中断服务程序来唤醒它。然后,进程才把内核空间的的数据通过特定的系统调用写到用户空间里。大部分程序员为了避免这样造成的不可忍耐的延时,都会把对数据的操作都放在内核空间里运行,也就是扩大中断服务程序的功能。但如果开辟两个空间可以共享的内存块,程序员就不必要这么为难了。我以AT91RM9200DK的平台为例,linux操作系统版本为2.4.19-rmk7,不需要半天时间,就可以实现两个空间的共享内存。
AT91RM9200DK的SDRAM的大小为31Mbyte,正常情况下,System RAM的大小也是31Mbyte,我们要把31Mbyte的高端地址空出2M来作为我们的共享内存块,这个内存块是独立的,不能为linux操作系统的内存管理所用了。首先必须通知内核它的内存只有30Mbyte了,我的方法是在u-boot的环境变量里设置mem=29M。然后在include/asm-arm/目录下建立头文件:new_fifo.h,代码如下:
#ifndef NEW_FIFO
#define NEW_FIFO
#endif
#ifdef ......