2008年12月25日星期四

ARM Linux 启动过程 (1)

此系列记录了ARM Linux从Bootloader部分到Linux初始化,然后进入C环境的一段坎坷历程 。作为第一部分,我将从RedBoot开开始。RedBoot是嵌入式中应用广泛的Bootloader,他将作为此系列的序章。

RedBoot (bootloader)

  • 概述
  • RedBoot所作的工作

概述

(本示例讲解基于ARM9的Cirrus EP9302) Bootloader 在 ARM 中依然是加电后的第一道程序,其作用简单,相当于 PC 机器上的 BIOS 固件程序。Bootloader 负责完成系统初始化,它将非易失性储存器中的 Linux 内核 拷贝到 RAM 中去,然后跳转到内核的第一道指令,将控制权交给内核。从这个意义上讲, 嵌入式 Bootloader 要做的事情比 x86 等机器多很多。

一般ARM Linux的第一条指令地址是0x0000_0000,而通常嵌入式系统会将FLASH等存储寄存 器映射到这个地址,而Bootloader就位于该存储器顶端,这保证了Bootloader的顺利执行。

以 RedBoot for EP93xx 为例,EP93xx 采用 NAND Flash 作为存储介质,在 RedBoot 中可 以罗列存储器的根目录如下:

RedBoot> fis init
Name FLASH addr Mem addr Length Entry point
RedBoot 0x60000000 0x60000000 0x00040000 0x00000000
RedBoot config 0x60FC0000 0x60FC0000 0x00001000 0x00000000
FIS directory 0x60FE0000 0x60FE0000 0x00020000 0x00000000
zImage 0x60040000 0x00080000 0x00120000 0x00080000
ramdisk 0x60140000 0x00800000 0x00800000 0x00800000

这里可以看出在 Flash 文件系统中存储了他的系统文件 RedBoot(内核)、RedBoot config(设置信息)、FIS directory(系统目录),另外就是 Linux 的内核 zImage 和内 存盘 ramdisk.gz。

RedBoot做的工作

  1. SDRAM初始化,没有内存,啥东西也玩不转 (cyg/hal/hal_platform_setup.h)
  2. 初始化串口 (hal/arch/ARCH/src/hal_diag.c)
  3. 检测处理器类型 (宏指定,cdl/hal_ARCH_MACHINE.cdl)
  4. 设置Linux启动参数 (hal/ARCH/arch/src/redboot_linux_exec.c)
  5. 将Linux内核装载到内存中,跳转执行

启动内核

启动内核函数do_exec的这段代码在 hal/ARCH/arch/src/redboot_linux_exec.c,最重要的 就是末尾处的内联汇编语句:

    asm volatile (
CYGARC_HAL_MMU_OFF(%5)
"__tramp_start__:\n"
" cmp %1,%4;\n" // Default kernel load address. Relocate
" beq 2f;\n" // kernel image there if necessary, and
" cmp %2,#0;\n" // if size is non-zero
" beq 2f;\n"
"1:\n"
" ldr r0,[%1],#4;\n"
" str r0,[%4],#4;\n"
" subs %2,%2,#4;\n"
" bne 1b;\n"
"2:\n"
" mov r0,#0;\n" // Set board type
" mov r1,%3;\n" // Machine type
" mov r2,%6;\n" // Kernel parameters
" mov pc,%0;\n" // Jump to kernel
"__tramp_end__:\n"
: :
"r"(entry),
"r"(CYGARC_PHYSICAL_ADDRESS(base_addr)),
"r"(length),
"r"(CYGHWR_REDBOOT_ARM_MACHINE_TYPE),
#ifdef CYGHWR_HAL_ARM_EDB93XX_VARIANT
"r"((CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS & 0x3ffffff) +
ConfigInfo[3]),
#else
"r"(CYGHWR_REDBOOT_ARM_LINUX_EXEC_ADDRESS),
#endif
"r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_TRAMPOLINE_ADDRESS)),
"r"(CYGARC_PHYSICAL_ADDRESS(CYGHWR_REDBOOT_ARM_LINUX_TAGS_ADDRESS))
: "r0", "r1"
);
首先关闭MMU,保证代码跳转位置是绝对的物理地址,然后重置内核(如果需要)到entry处, 执行跳转,跳转前保证了:r0置0,r1装载机器类型,r2装载struct tag数组地址。

这样RedBoot结束了其短暂而又伟大的一生,我们进入Linux的世界。

2008年12月12日星期五

优化代码显示的另一个方法


int main(void)
{
printf("Hello, everybody!\n");
}
/* 为啥空出那么多呢?*/



参考:
http://klcintw4.blogspot.com/2006/11/blog-post_03.html

2008年12月10日星期三

Linux SCSI子系统

scsi历史

scsi-1::1979年由SHugart Associates创建,它定义了一种具有5MHz数据时钟的8-bit并行接口。

scsi-2::1985年,10MHz,16位总线。

scsi-3::1993年,已经成为了一种标准集,它包含一种命名为Ultra的并行scsi标准和基于 串行scsi和基于串行scsi的协议,这些标准通过引入存储网络技术将数据速率拓展到了 1Gb/s。

scsi架构基础

如果你是一位设计师,那么需要从scsi spec下手。而对于软件开发人员来说,你只需要关 注scsi的架构。在深入之前,将scsi架构图牢记于心,对于理解代码是非常重要的。linux scsi位于系统的底层 —

linux scsi本身是一种三层架构,upper, mid, lower,upper层最为接近内核,包括一组驱 动器(比如块设备SCSI 磁盘和字符设备SCSI generic);mid实现了common services layer, 接受upper的请求并将其转化为scsi请求,scsi lower层则是紧附硬件之上的硬件驱动。

索引

从ibm developerworks大致了解三层架构:

从这里获得scsi标准的细节:

我们的目标在于linux的实现(pdf, 321KB):

出发


本着记录和总结的目的,深入求实的精神,我开始在日志上记录scsi的看书笔记。scsi的设 备是典型的层次架构,经历过风雨变迁的scsi标准也散发着蓬勃的活力,因此看懂这段代码 很有意义。

笔记目标将会从sd_mod.o起步,清晰中间层(mid),上层(upper)和底层(lower)的大 致架构,最后深入到公司最近正在移植的sata_sil驱动。

2008年11月28日星期五

使用muse来发布日志

使用Emacs是一件实在幸福的事情,它提供了一个又一个强大的拓展,让你的上机活动变的
轻松惬意。很多Linux用户都是以Emacs为中心的。而我现在使用ECB阅读代码,diary-mode
来撰写笔记,org-mode来组织日程规划……这次说到使用muse模式。

muse允许通过简单的样式控制,制作出非常漂亮的网页。

  1. 控制基本样式
  2. 高亮代码

控制基本样式

很简单的,我先给出几个例子。

#title 第一个Wiki页面
* 一级标题
** 二级标题
*** 三级标题
#anchor
段落需要空行两个(至少)
居中字前只少空四格
----

这是 *着重* 的文字,这是进一步 **着重** 的文字,这是 ***更进一步的着重*** 的文字

这是 _下划线_ 文字,这是 =等宽verbatim and monospace= 的文字
*** 列表:
- 无序列表需要以空格和“-”开头
1. 有序列表需要以空格和数字序号开头
字典 :: 名词定义需要以“::”分隔名词和所定义文字
- 列表也可以嵌套
1. 列表嵌套深度按照开头空格的多少来控制
2. 可以继续嵌套不同类型的列表
- 比如这样
*** 表格:
Double bars || Separate header fields
Single bars | Separate body fields
Here are more | body fields
Triple bars ||| Separate footer fields

生成的页面:


高亮代码

高亮代码是一个比较头疼的问题,大家给出的方案也不一样。在blogger中,你可以使用
Google的prettyprint方法来实现高亮,但是它支持代码样式很少;同样2maomao也写了一个
高亮语法的工具,相对来说总是麻烦点;其实使用emacs高度的拓展性完全可以做到这点。

这里给出了一个使用muse来实现语法高亮的模式,这个方法非常的cool。它将emacs强大的
高亮特性报留下来,嵌入到了html中。

阅读上面的例子就可以看到,通过很少的字符,就可以实现工整的格式控制,这对于编写繁
杂冗长的标志语言和记住大批的标记来说,是一种极好的替代。muse编写的脚本可以简单的
声称很多种文档发布,包括HTML,Latex,PDF等等,多多使用,也自然可以可以极大提高工
作效率。

参考资料

  1. Emacs Wiki
  2. Emacs muse官方网站

2008年11月27日星期四

eCos HAL分析

HAL架构

HAL在eCos中是一个多层次的架构,层级封装了不同的功能,它包括:

  • the architecture HAL

    架构抽象包含基本的CPU架构,比如interrupt,上下文切换,CPU启动等

  • the variant HAL

    变体抽象层专注某一CPU的特性,比如caches,MMU和FPU等,他通常也处理内存和中断 控制器等外设。

  • the platform HAL

    平台抽象层专注于现任的平台特性,比如平台启动,定时器,I/O寄存器访问和中断控 制器等等。

HAL接口

这里讲究HAL实现了哪些接口。

architecture characterization

这里包含了CPU基础架构的定义。包括了CPU段文存储格式,上下文切换,bit twiddling, 断点,堆栈大小和地址转换。这些定义位于:

  1. cyg/hal/hal_arch.h (arch HAL)
  2. cyg/hal/var_arch.h (var HAL)
  3. cyg/hal/plf_arch.h (plf HAL)

以下为议题细节

  • register save format
  • thread context initialization
  • thread context switching
  • bit indexing
  • idle thread activity
  • reorder barrier
  • breakpoint support
  • GDB support
  • setjmp and longjmp support
  • stack sizes
  • address translation
  • global pointer

interrupt handling

这些接口定义了中断处理相关的定义,包括了异常和中断号,中断允许和屏蔽和实时时钟操 作。这些定义可以位于:

cyg/hal/hal_intr.h (arch HAL)

而变体和平台抽象层定义位于:

  1. cyg/hal/var_intr.h (var HAL)
  2. cyg/hal/plf_intr.h (plf HAL)
  3. cyg/hal/hal_platform_ints.h (?)

议题细节:

  • vector numbers
  • interrupt state control
  • ISR and VSR management
  • interrupt controller management
  • clock control
  • microsecond delay

HAL I/O

此接口定义了对设备控制寄存器的访问支持。

  1. cyg/hal/hal_io.h
  2. cyg/hal/var_io.h
  3. cyg/hal/plf_io.h

议题细节有:

  • register address
  • register read
  • register write

cache control

此接口定义了CPU caches的控制支持。

  1. cyg/hal/hal_cache.h
  2. cyg/hal/var_cache.h
  3. cyg/hal/plf_cache.h

详细议题:

  • cache dimensions
  • global cache control
  • cache line control

Linker scripts(连接器脚本,lds)

连接器脚本对于eCos程序来说是必须的,他定义了内存区域,地址和尺寸,代码段和数据段 的放置位置,还有分配不同的编译器声称的段。

一般lds位于install/lib/target.ld,它事实上是由其他两类文件声称,一个基本的lds和 ldi文件声称的。

基本lds由arch HAL或者var HAL提供,它由一组lds段组成。ldi由plf HAL提供哦你,它包 含目标平台的的内存布局信息,位于

pkgconf/mlt____.ldi

这些ldi文件都是由相应的mlt(memory layout tool)脚本生成的。

诊断支持

SMP支持


参考资料

  1. eCos component writer's guide
  2. eCos HAL porting guide
  3. 如何构建eCos嵌入式系统

2008年11月25日星期二

Cirrus EP9302: 从RedBoot到Linux

Cirrus EP9302

Cirrus Logic是美国德州的一家半导体制造商,早在1989年就进入NASDAQ,股票代码是CRUS。
EP93xx是基于ARM920T的主板系列,在官方上你可以看到详尽的EP9302资料。

http://www.cirrus.com/en/products/pro/detail/P1066.html

EP9302和EP9301最大的区别就在于,CPU核心加入了一个浮点运算部件MaverickCrunch。

我在开始的时候曾经说过,eCos支持非常多的架构,包括ARM, CalmRISC, FR-V, H8,
IA32, M68K, Matsushita AM3x, MIPS, NEC V8xx, PowerPC, SPARC, SuperH。这是eCos非
常值得骄傲的一点,也充分发挥了开源的长处。但是毕竟世界上的主板千千万,从汽车到蓝
牙,无线设备等等等等,eCos开发小组也无法支持所有的主板。如果厂商新推出一个主板,
那多半需要自己拓展eCos来支持自己的新板,我所使用的Cirrus Logic就是一个例子。

你可以在官方网站上找到这些工具:

搭建工作环境

(此工作环境是在Red Hat Linux 9.0下配置完成,嵌入式开发普遍需要串口支持。)

  1. 解压arm-elf-gcc-3.2.1-full.tar.bz2得到两个目录,按照目录指引放置文件
  2. 在/etc/profile或者~/.bashrc中添加系统环境变量。比如 /etc/profile
    if [ `id -u` = 0]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
    #newly added for arm-3.4
    pathmunge /usr/local/arm/3.4/bin
    fi

配置安装redboot

这步会非常简单。Cirrus几乎把一切工作都做好了,解压cirrus-arm-linux-2.0.8.tar.bz2
进入目录 cirrus-arm-linux-2.0.8/edb9302,直接编译

cd /path/to/cirrus-arm-linux-2.0.8/edb9302
make redboot

然后得到cirrus-arm-linux-2.0.8/edb9302/images/redboot.bin,这就是一个redboot内核,
他使用了ecos的redboot模板,创建针对EP9302主板的ecos内核。安装也是比较方便,这使
用到了cirrus给的download工具(如果没有,你还需要编译):

../download/download -p 1 images/redboot.bin

通常情况下,我们的主板都是不允许FLASH被任意擦写的,这个规定在硬件上被强制实现:
用短路块连接EP9302的JP14的2、3脚。相反接到1、2脚,这个时候Flash会根据写入的协议
向外发布数据,待download侦测到数据时候会进行握手和数据传递。

然后关闭主板,进入EP9302,则可以进入Redboot命令行。

编译烧录linux

# busybox config
cd /path/to/cirrus-arm-linux-2.0.8
tar jxf tarballs/busybox-1.1.3.tar.bz2
cd busybox
make menuconfig

# compile ramdisk.gz
cd /path/to/cirrus-arm-linux-2.0.8/edb9302
make ramdisk

# compile linux zImage
make linuxconfig
make linux
这样就在/path/to/cirrus-arm-linux-2.0.8/edb9302/images中生成两个文件:
ramdisk.gz和zImage。

其中busybox和linux都需要对自己需求的理解来进行配置,在这里不再赘述。这里将一下
linux拷贝方法。将Linux内核传递给EP9302,是使用到了tftp(Trival FTP),首先需要配置
Red Hat 9.0主机的tftp客户端(/etc/xinetd.d/tftp),tftp常常用于无盘工作站。在这
里作为RH和EP9302的通讯协议。

然后进入EP9302 redboot配置主板(主要是网络)。

# ---- 主板配置部分 ----
# Local IP address是EP9302 IP地址
# Default server IP address是RH9 IP地址
RedBoot> fcon -i
Initialize non-volatile configuration - continue(y/n)
Run script at boot: true
Boot script:
Enter script, terminate with empty line
>> fis load ramdisk
>> fis load zImage
>> exec -r 0x800000 -s 0x800000
>>
Boot script(1000ms resolution): 1
Use BOOTP for network configuration: false
Gateway IP address: 192.168.16.1
Local IP address: 192.168.16.93
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.16.91
DNS server IP address:
Network hardware address[MAC]:0x78:0x56:0x34:0x12:0x64:0x30
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue(y/n)? y

# ---- 拷贝文件部分 ----
RedBoot> fis init -f
RedBoot> load -v -r -b 0x800000 ramdisk.gz -h 192.168.16.91
RedBoot> fis create -b 0x800000 -l 0x800000 ramdisk
RedBoot> load -v -r -b 0x80000 zImage -h 192.168.16.91
RedBoot> fis create -b 0x80000 -l 0x120000 zImage

# ---- 重启 ----
RedBoot> re

重启EP9302之后,主板开机加载RedBoot,然后执行默认的启动脚本,加载ramdisk和zImage。
就这样我们进入Linux,第一次进入嵌入式Linux的感觉,是不是很奇妙?

2008年11月23日星期日

西冲海岸线穿越

深圳西冲,因为交通不便、偏离市区等天然原因,成为了深圳市最优美的海岸线。仅仅这一
点,就让俺们心里痒痒太多太多了,于是跟随大家一起到西冲鹅公湾穿越海岸线。

到了地方才知道,西贡此行比想象的艰难太多了。活动选取了西贡->鹅公湾这一非常变态的
路线,海岸边的岩石形状大小各异,沟堑无数,深浅不一。在石头间上串下跳,实在是极其
消耗体力的事情,也有部分人受伤。

从下午一点到达海岸开始,接下来的五个小时都要接受如此费力的考验,同时身负重物,真
是让我苦不堪言;更可惜傍晚涨潮,潮水变凉,没能有机会下水。回来时候也已无力气打字,
只能更新照片来看。(PS:不过海景实在是太美了)

回头一看,我也在几个月内到访过梧桐山,老虎涧,塘朗山,排牙山,大小梅沙,西冲海
岸……至此,我也几乎整完深圳所有的著名户外景点,我想可能需要转换一下目标了。当然下
个目标是啥?还没有想过。不过类似户外的活动,我将会愈少的参与。

以下猛击可查看大图
---- 登山部分 ----



---- 海岸线部分 ----





---- 结束部分 ----


Thx for you time!

2008年11月22日星期六

eCos,高度自制性的嵌入式操作系统

eCos, embedded configuratable os. 这个名字很好的说明了这个操作系统的特性,高度可 配置的嵌入式操作系统。他现在是非常流行的嵌入式操作系统,支持很多嵌入式平台(远远 不只是ARM平台),而且配置简单。他原先是由Cygnus开发,后来归于Red Hat旗下。

安装

你可以按照官方的方来安装eCos,使用脚本来完成整个下载和安装过程很方便,这个过程安 全但是不可靠。其实本质上需要的就是下载两个包,和一套安装方法。

解压后的目录可以放置在任意位置(例如/opt/redboot),然后在此目录下创建以下脚本— (记住设置系统环境变量ECOS_REPOSITORY)

#!/bin/sh
export ECOS_DEST=/opt/redboot
export ECOS_REPOSITORY=$ECOS_DEST/ecos-2.0/packages/
export PATH=$PATH:$ECOS_DEST/gnutools/i386-elf/bin/:$ECOS_DEST/ecos-2.0/tools/bin


rm build -rf
mkdir build
cd build
# ecosconfig new TARGET [template [version]]
# -- create a configuration file: ecos-2.0/packages/ecos.ecc
ecosconfig new pc redboot

# ecosconfig import
# -- import additional config info
ecosconfig import ${ECOS_DEST}/ecos-2.0/packages/hal/i386/pc/v2_0/misc/redboot_FLOPPY.ecm

# ecosconfig tree
# -- create a build tree
ecosconfig tree
make
这样就得到一个裸露的内核redboot.bin,可以制作一个启动软盘,来在虚拟机里测试它。

ecos术语

package

parcket关键字对应一组完成独立功能的代码包,他可以内嵌cdl脚本,来容纳更小的单位, 如cdl_option和cdl_component。 option和component是更小的代码元素,在解析之后将会成为C语言的宏。比如:

cdl_option CYGSEM_REDBOOT_DEFAULT_NO_BOOTP {
user_value 1
};

生成在.h文件,就是 CYGSEM_REDBOOT_DEFAULT_NO_BOOTP 1

target

target指定某种目标架构,关键字下将会定义很多的packet,来设置需要的组建和代码包。

target edb9302 {
alias { "Cirrus Logic EDB9302 evaluation board" ep9302 }
packages { CYGPKG_HAL_ARM
CYGPKG_HAL_ARM_ARM9
CYGPKG_HAL_ARM_ARM9_EP93XX
CYGPKG_DEVS_FLASH_STRATA
CYGPKG_DEVS_FLASH_EDB9301
CYGPKG_DEVS_ETH_ARM_EP93XX
}
description "
The EDB9302 target provides the packages needed to run eCos on the Cirrus Logic
EP9302 based development boards."

set_value CYGHWR_HAL_ARM_EDB93XX_VARIANT "EP9302"
}

此target旨在建立edb9302,他会包含packets中指明的packet,并且设置宏 CYGHWR_HAL_ARM_EDB93XX_VARIANT "EP9302"

template

template是指为某种目的build而建立的相应模板配置,比如选取一些包,配置一些选项等 等。在目录 ecos-2.0/package/templates 下面有一些模板的目录。

文件 ecos.db

ecos-2.0/packages/ecos.db是ecos的选项总表,是维系整个ecos代码的数据库。他定义了 全部的target和target所需要packets。ecosconfig将从中获取信息,构建ecos.ecc,从而 完成代码树的构建。

文件 ecos.ecc

由ecosconfig声称的目标代码的设置文件,他包括了生成目标代码所需的所有选项配置,包 括了template, option,component等等等等。ecos.ecc有可能包含有冲突的部分,你需要 解决这些冲突,然后ecosconfig tree 声称代码树。

解释刚才的redboot.sh脚本

ecosconfig new pc redboot

此命令来创建一个针对target pc的ecc脚本,他将选取redboot作为模板。根据模板和 ecos.db,ecosconfig会向ecos.ecc脚本放置所有可能的组建,选项和包集合。

ecosconfig import ${ECOS_DEST}/ecos-2.0/packages/hal/i386/pc/v2_0/misc/redboot_FLOPPY.ecm

引入ecm设置,表明我们选择的启动媒体是软盘,你也可以选择其他介质。

ecosconfig tree

根据ecos.ecc来生成代码集合,之后make,完成编译安装。

eCos架构

这是一个ecos的系统框图,框图重点突出了Hardware Abstraction Layer在eCos中的重要作 用。如果要领悟这些,还需要参看eCos代码。


这里重点表述了redboot模板的eCos系统架构,redboot相当于是一个bootloader,但是他的 作用远远不只是启动内核那么简单。除了提供网络功能,他还包括了硬件初始化,调试,文 件系统等等功用。是嵌入式中应用非常广泛的bootloader。

有空下次聊聊eCos的源代码架构。

http://en.wikipedia.org/wiki/ecos
http://ecos.sourceware.org/

http://www.ecoscentric.com/ecos/ecospro.shtml

2008年11月17日星期一

脚踏排牙山顶

这次活动去了排牙山,排牙山位于深圳龙岗区的大鹏半岛,这里也是深圳的最东边。大约也
是深圳最后一片未开发的原始森林。这里保持了古森林的特色,大鹏半岛三面环海,景色非
常秀丽,山下是大亚湾,坐落着出名的大亚湾核电站。不过要欣赏美景就要付出代价,排牙
山上没有护栏和石阶,为开发的山路会考验你的脚力,而且排牙山山脉险峻,个别路段陡峭,
给出行带来很大难度。

组织:17爬爬吧
领队:阿文,黄瓜,阿鹏
合作:朗森户外
报名:91人
难度:标准+
地图:点击这里



前面罗嗦了很多,讲的就是此行的意义:能够在艰难的环境中披荆斩棘,会当绝顶,领略到
大鹏美景,这毫无疑问是最有成就感的。排牙山旅途将会经历险要的山路,连绵的山峦,似
乎是在牙齿顶端上下起伏,相信这也是排牙山得名的由来。
猛击图片查看大图



经历山顶的起伏,这一路真是险象环生,有部分人中途退出,也有体力透支情况出现。可以
想象排牙山的难度。如果各位朋友要征服排牙山,那定要足够的体力和意志。多人出行需要
作足准备,从登山鞋到活络油不一而足。



下山段也绝对不轻松,很多地方陡峭而且土质疏松。有朋友在这里摔跤和抽筋。




这次旅程在艰险中度过,除了放弃以外,还有中途退出,体力透支,小腿抽筋等意外情况发
生。在后半段过程因为抄近路的原因,领队选择了一段溯溪线路,这段路途很有难度,而且
在六点半钟情况攀爬岩石,大家着实受了苦头。

最后和同行聊天才得知,这次是一次商业性的组织活动,朗森是东莞的一家专门组织户外互
动的公司,本次活动公召集81人参与报名,预计实际参与人数在75人左右。而领队大约只有
6人,而且分布不足,介于人数过多,在旅途中很少得到周围的援助,毕竟认识的人不多,
而且领队都远远的跑在了前面,所以登山之旅实在有些焦躁。如果下次仍旧有此类活动,我
当考虑参与队伍的规模和组织形式。

最后的图片,容易让人产生遐想:

_

2008年11月16日星期日

正版软件距离我们多远

最近喧闹的微软黑屏事件影响力可谓波涛汹涌,各方都对此事表达自己的观点。其实形式如
何,大家心知肚明。然而无论是为自己使用盗版谋权力的个人用户,还是正版用户的铁杆支
持者,都对国家的软件产业抱有怀疑态度——正版推广,真的很难。

前些天,深圳第一现场也对此事进行了报道,文中表达了自己对微软黑屏事件的看法:

首先是加大正版软件使用力度,维护软件开发人员和发布厂商权益。


另一方面是减少对单向软件的依赖度。且拿Linux的发布版本Ubuntu为例,推介软件用户除
微软产品以外的更多选择(这里的Ubuntu还打印错了……)。


还有一方面,是加大国有软件的扶植力度,培养有竞争力的自身软件产业。这个例子选取了
最近推出的个人免费版本的WPS国产办公软件。


不过在我看来,国家和媒体对软件权益的认知都建立在软件版权的基础之上,这个出生于微
软之手的概念为微软等软件商带来丰厚的利润。大家可以尝试一下GNU系列软件,他立志于
推广自由软件产业,也尝试保护开发者的权益。Linux就是GNU旗下软件,遵循GPL条例。

2008年11月2日星期日

山清水秀塘朗山

这次户外活动选择了塘朗山,塘朗山位于南山北部,是宝安和南山的北部分界线;拥有西丽
水库和梅林水库两个水源,山水秀丽,而且攀爬容易,属于休闲娱乐级别。可谓是居家旅
游,避暑游乐之必选之地……

组织:狼行天涯③(Q群 63191237)
领队:wolf, 小雨
说明:桃源村,螳螂山顶,东部穿越到梅林水库
地图:
http://maps.google.com/maps/ms?ie=UTF&msa=0&msid=102563878911537749872.00045ab3e58dd543dec97

废话不说,启程带你们领略秀丽的山水咯~

这里是桃源村的塘朗山入口。进入正门之后就可以上东边坡路,这条道路开发的非常好!阶
梯让攀爬更加容易。深圳城市这一点让人很是欣慰,梧桐山,大南山等大约所有的景点开发
的非常不错。


桃源村这一段路,难度不高。因为路程短暂,不消一会儿,就可以到达山顶。在这里可以看
到深圳梅林一代的城市景观。早上的雾气和蹩脚的技术,让照片技术打了折扣。


12点后开始东移,沿着塘朗山脉起伏升降,三、四十人的队伍也是够壮观的。我们在一个平
台处开始吃午饭,中途有家伙开始打牌。扑克……平民化的艺术!


梅林段的地势开始恶劣起来……山道变的崎岖,沿着溪流而下,甚至有了溯溪的感觉。大家都
没有任何准备,路途变得缓慢艰难。不少人失身于此。


到达一个小瀑布的时候,路途的艰难程度达到最大,山路陡峭。但这也是后半段景色嘴秀丽
的位置,可谓是RPG的小高潮。好在大家团结一心,没有人受伤。如果各位有打算经历此路
程,一点要有心理准备。


到达山脚,天堑变通途!走起来轻松之极,脚步也轻快多了。短时间之后,立刻看到本次行
动的终点,梅林水库大坝。


这里的景色真是非常美丽,这些天让俺们郁闷的情绪一扫而光。就赖在这里多多拍了几张。


梅林水库的大坝上面,没啥好说的了。


最后是大家的集体照,希望各位读者多多参加户外运动,陶冶情操,多多益善:)


谢谢大家的时间:)