虽然想写《vivi软件架构分析》,但是对软件架构并没有清晰的认识。只是以学习的态度,去尽可能的理解吸收vivi的设计思想,以后可以应用到自己的设计中。
vivi的软件架构分为三个层次:vivi配置bootloader stage1bootloader stage2。另外,Vivi还提供了测试程序和工具,并且有简明的文档。具体如图1所示。
下面进行详细分析。
1 获取源代码
mizi公司提供vivi的源代码,如果你不知道下载的地址,那么到百度或者google搜索一下,很容易找到。在这里多说两句,搜索引擎之争很激烈。不过你没有必要关注那么多,你所需要的是尽可能快的找到你所需要的有价值的资料。一般而言,百度是土生土长的,搜索时用中文关键词比较合适,而google搜索最好用英文关键词。vivi是国外公司的产品,推荐用google搜索。在google中输入vivi download,很容易发现:
http://www.mizi.com/developer/s3c2410x/download/vivi.html。不过很不幸,现在下载地址已经失效了。这时你也许放弃了,我也曾经放弃过。但是你如果使用ftp尝试一下就会发现,就会得到你想要的结果:
[armlinux@lqm vivi]$ ftp ftp.mizi.com Connected to ftp.mizi.com (203.236.241.50). 220 ProFTPD 1.3.0 Server (MIZI Research, Inc. FTP Server) [::ffff:203.236.241.50] Name (ftp.mizi.com:armlinux): anonymous 331 Anonymous login ok, send your complete email address as your password. Password: 230- 230- 230- ftp.mizi.com俊 坷脚巴阑 券康钦聪促. 230- ftp.mizi.com篮 固瘤 府辑摹(林)俊辑 款康窍绰 FTP 辑滚 涝聪促. 230- 230- 固瘤 府椽胶 硅器魄篮 力傍阑 吝窜钦聪促. 230- 捞寇 绢敲府纳捞记 棺 包访 磊丰绰 力傍登绊 乐嚼聪促. 230- 230- Warez啊 酒聪骨肺 惑侩绢敲府纳捞记阑 诀肺靛 窍绰巴篮 阂啊钦聪促. 230- 230- 立加磊 : anonymous 230- 肺弊牢 矫埃 : Wed Jul 25 01:38:38 2007 230- 立加 IP : ::ffff:122.4.41.168 230- 立加磊 荐 : 泅犁 (3) / 弥措 (25) 230- 230- 230- 230- 230 Anonymous access granted, restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (203,236,241,50,234,217). 150 Opening ASCII mode data connection for file list drwxrwxr-x 3 root users 72 Jan 18 2007 incoming drwxr-xr-x 14 root root 336 Dec 23 2006 pub d-wx-wx--x 2 (?) staff 48 Nov 18 2004 uploads -rw-r--r-- 1 root root 399 Jun 29 08:10 welcome.msg 226 Transfer complete. ftp> cd pub 250 CWD command successful ftp> ls 227 Entering Passive Mode (203,236,241,50,163,137). 150 Opening ASCII mode data connection for file list drwxr-xr-x 6 root root 456 Sep 6 2002 baekmuk drwxr-xr-x 7 root root 232 Oct 27 2004 file drwxr-xr-x 2 root root 344 Feb 27 2004 hanIM drwxr-xr-x 2 root root 672 Dec 18 2000 htm drwxr-xr-x 2 root root 376 Jun 7 2000 hwpview drwxr-xr-x 2 root root 152 May 8 2006 i519 drwxr-xr-x 7 root root 200 Sep 1 2006 kernel drwxr-xr-x 3 root root 72 Jun 27 2006 linuette drwxr-xr-x 8 root root 208 Nov 7 2005 misc drwxr-xr-x 2 root root 344 Dec 20 2001 pen drwxr-xr-x 6 yjseo cvs 192 Dec 23 2006 prizm drwxr-xr-x 2 root root 136 Jun 8 2000 xmath 226 Transfer complete. ftp> cd linuette 250 CWD command successful ftp> ls 227 Entering Passive Mode (203,236,241,50,215,24). 150 Opening ASCII mode data connection for file list drwxr-xr-x 3 root root 72 Jun 27 2006 SDK 226 Transfer complete. ftp> cd SDK 250 CWD command successful ftp> ls 227 Entering Passive Mode (203,236,241,50,184,89). 150 Opening ASCII mode data connection for file list drwxr-xr-x 2 root root 96 Jun 27 2006 iso 226 Transfer complete. ftp> cd iso 250 CWD command successful ftp> ls 227 Entering Passive Mode (203,236,241,50,132,159). 150 Opening ASCII mode data connection for file list -rw-r--r-- 1 yjseo cvs 640122880 Jun 27 2006 sdk15-S3C2410-tk-20030630.iso 226 Transfer complete. ftp> |
可见,网站改版后,mizi公司把所有的工具都做成iso文件了,600多M。你把该文件下载下,使用搜索功能,可以找到target/box/boot/vivi-20030629.tar.bz2。如果这样的方法还不能找到,那就需要到论坛求助了。
2 解压分析
[armlinux@lqm vivi]$ tree -L 3 … … 45 directories, 233 files
|
可见vivi的源代码一共有45个文件夹,233个文件。
[armlinux@lqm vivi]$ tree -L 1 . |-- COPYING |-- CVS |-- Documentation |-- Makefile |-- Makefile.newSDK |-- Rules.make |-- arch |-- drivers |-- include |-- init |-- lib |-- scripts |-- test `-- util
10 directories, 4 files
|
可以看出,vivi的代码的组织是模仿Linux的内核,如果看过kernel的架构,那么应该会很熟悉。不过现在,我们要分析vivi的核心代码架构,先对上述文件做一下简要的说明。
COPYING:GPL协议声明,Gnu General Public License,这里是version 2。如果要具体了解一下GPL协议,那么可以仔细读一下该文件。 CVS: Control version system,一种版本控制的工具。使用cvs,可以很方便的进行版本的控制,节约大量的时间。不过该部分并不属于vivi核心软件架构。
Documentation:帮助文档。关于vivi的简单介绍,如何进行编译,如何booting ARM都有简要的描述。拿到源代码,首先应该看该文件夹,了解一下,它是什么,可以如何进行操作。不过,里面有些帮助文档是韩语,看不懂。
Makefile Makefile.newSDK Rules.make:工程管理。Linux下用make来进行工程管理,对Makefile应该不会陌生。读源代码,首先了解Makefile的内容,会很有帮助。 arch: 处理器架构相关的核心代码。这是vivi bootloader stage1的实现部分。如果要支持其他架构,也需要放到这个文件夹下面。
drivers: 通用的驱动程序。
include: 包含的头文件
init: 初始化的核心代码。这是vivi bootloader stage2的实现部分。
lib: 库文件
scripts: Shell脚本。vivi提供了一种交互式配置机制,实现部分是利用shell脚本来完成的。这也是一个重要的研究内容。 test: 测试文件
util: 小工具。现在包含两个文件,ecc.c, imagewrite.c。
|
现在首先要去掉不必要的部分。首先,COPYING可以去掉,CVS也可以去掉,Documentation在读完后就可以去掉了,没什么太复杂的东西。
[armlinux@lqm bootloader]$ cp vivi architecture –rf //备份先 [armlinux@lqm bootloader]$ cd architecture/ //观察architecture [armlinux@lqm architecture]$ find . \( -name COPYING -o -name Documentation -o -name CVS -o -name test -o -name util \) | xargs rm -rf [armlinux@lqm architecture]$ ls Makefile Makefile.newSDK Rules.make arch drivers include init lib scripts //下面分析一下Makefile Makefile.newSDK有什么区别
[armlinux@lqm architecture]$ diff -uN Makefile Makefile.newSDK --- Makefile 2007-07-25 10:32:55.000000000 +0800 +++ Makefile.newSDK 2007-07-25 10:32:55.000000000 +0800 @@ -14,7 +14,7 @@ # # change this to point to the Linux include directory # -LINUX_INCLUDE_DIR = /opt/host/armv4l/include/ +LINUX_INCLUDE_DIR = /opt/kernel/armv4l/include/ VIVIPATH = $(TOPDIR)/include @@ -22,8 +22,7 @@ HOSTCC = gcc HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux- -#CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-redhat-linux- +CROSS_COMPILE = /opt/kernel/armv4l/bin/armv4l-mizi-linux- # # Include the make variables (CC, etc...) @@ -85,8 +84,7 @@ # # Location of the gcc arm libs. # -ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-unknown-linux/2.95.2 -#ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-redhat-linux/2.95.3 +ARM_GCC_LIBS = /opt/kernel/armv4l/lib/gcc-lib/armv4l-mizi-linux/2.95.2 OBJCOPYFLAGS = -R .comment -R .stab -R .stabstr //可见只是更改了三个宏定义,而这也是移植需要更改的,所以,把Makefile.newSDK删掉
[armlinux@lqm architecture]$ rm Makefile.newSDK [armlinux@lqm architecture]$ ls Makefile Rules.make arch drivers include init lib scripts //然后清理一下内部的测试文档
[armlinux@lqm architecture]$ find . -name *test* -print | xargs rm –rf [armlinux@lqm architecture]$ tree -L 1 . |-- Makefile |-- Rules.make |-- arch |-- drivers |-- include |-- init |-- lib `-- scripts
|
就vivi工程的管理来说,按照功能划分非常清晰,模块化的划分,设计上很容易增加新的硬件设备。模块与模块之间的接口也很清晰。读完Makefile之后,就会有更为深入的体会。它的配置机制也是如此。这在以后的文档里会详细说明。
当你看清楚了作者组织的思路时,读取源代码就容易得多了。而这个软件架构是否合理,是否清晰,是需要不断借鉴,修改并完善的。这也正是我学习的所在。
评论
发表评论