-
Java Card虚拟机(JCVM)规范定义了Java程序设计语言的一个子集和一个用于智能卡的兼容Java的虚拟机,包括二进制数据表示和文件格式,以及JCVM指令集。
用于Java Card平台的虚拟机是两部分实现,一部分在卡外,一部分运行在卡本身。卡上的Java Card虚拟机解释字节码、管理类和对象等等。外部Java虚拟机部分是一个开发工具,一般称为Java Card转换工具,装载、检验和进一步地准备卡片小应用程序Java类,用于在卡上执行。转换工具输出的是一个Converted Applet(CAP)文件,这是一个包含一个Java程序包中所有类的文件。转换程序检验类是否遵循Java Card规范。
JCVM只支持Java程序设计语言的一个有限的子集,然而它保留了许多熟悉的特性,包括对象、继承、程序包、动态对象创建、虚拟方法、接口和异常。JCVM规范放弃了对许多语言元素的支持,因为这些语言元素可能会用掉很多智能卡本来就很有限的内存:
Java Card语言限制
语言特性
动态类装载、安全管理(java.lang.securitymanager)、线程、对象克隆和某些方面的程序包访问控制不支持。
关键字
不支持native、synchronized、transient、volatile、strictfp。
类型
不支持char、double、float和long,也不支持多维数组。对int的支持是可选的。
类和接口
不支持除了Object和Throwable以外的Java核心应用编程接口类和接口(java.io、java.lang、java.util),并且Object和Throwable的大部分方法不可用。
异常
一些Exception和Error子类被省去,因为它们封装的异常和错误不可能在Java Card平台上出现。
还有程序模型限制。例如一个装载库类不能再扩展到卡上;它隐含地成为final类型。
为了符合存储限制,JCVM规范额外定义了许多程序属性的约束。表格4 JCVM资源限制总结。 注意这些约束中许多对于Java Card开发者来说是很明白的。
Java Card虚拟机约束
程序包
一个程序包可以引用128个其他的程序包
一个完全合乎要求的程序包名限于255字节以内。 注意字符大小取决于字符编码。
一个完全合乎要求的程序包名限于255字节以内。
类
一个类最多可以直接或者间接地实现15个接口。
一个接口最多可以继承于14个接口。
一个程序包如果包含小应用程序(一个小应用程序程序包),它最多可以有256个静态方法;如果没有小应用程序(库程序包),它最多只能有255个静态方法。
一个类最多可以实现128个public或者protected实例方法。
在Java Card虚拟机中,象在J2SE虚拟机中一样,class文件是核心,但是JCVM规范定义了两种其他文件格式来进一步使平台独立,转换小应用程序(Converted Applet,CAP)和导出(Export)格式.
虚拟机的生命周期
JCVM的生命周期与卡片本身的生命周期一致:在卡片制造并测试之后至发行到持卡人手中的一段时间内它就开始了生命周期,当卡片丢失或者毁坏的时候它的生命周期也就结束了。 卡片没有电力的时候JCVM也不会停止,因为它的状态被保存在卡片的非易失性存储器中。启动JCVM初始化JCRE并且创建所有的JCRE框架对象,这些在JCVM的整个生命周期都是运转着的。JCVM启动之后,与卡片所有的相互作用原则上都是被卡片上的某个小应用程序控制。 当卡片没电的时候,保存在RAM中的任何数据都会丢失,但是保存在永久性存储器中的任何状态都被保留。当再次加电以后,虚拟机又再次激活,这时虚拟机和对象的状态被恢复,并且重新开始执行等待进一步地输入。
转自
http://blog.csdn.net/q2360c/archive/2005/03/23/327405.aspx -
2005-03-30
Embedded Graphic System Summary - [嵌入式软件、GUI]
Open source Embedded Linux Graphics System Software
----------------------------------------------------------------------------------------
Dillo浏览器,小于300K,开源,C and GTK+ Lib,遵循GPL
www.dillo.org
smamary:
图像支持PNG、Jpeg、Gif
HTML/XHTML,no frames
现在还不支持Jsp,JVM
全屏、非模块化用户界面
高兼容性,比如手持设备中的 iPAQ、GMATE’s Yopy、Pison、CerfPod
非基于GECKO的定制化rendering引擎
in more detail
http://www.linuxdevices.com/articles/AT7153264029.html
应用举例
http://www.linuxdevices.com/articles/AT2869412121.html
----------------------------------------------------------------------------------------
DirectFB
http://directfb.org/
一个小型库,提供开发者基于FrameBuffer上进行图形加速、输入设备处理提取、支持透明窗口和多重显示层的整合窗口系。
对于不支持的硬件的图形操作,其提供了一个HAL。
提供的图形操作
矩形填充/绘图
三角形填充/绘图
绘线
Flat shaded triangles
(Stretched) blitting
alpha通道混合(a.k.a texture alpha)
Blending with a constant alpha blend factor (a.k.a. alpha modulation)
Nine different blending functions respectively for source and destination, so all
Porter/Duff rules are supported
Colorizing (a.k.a. color modulation)
Source color keying
Destination color keying
DirectFB有自己的显存资源管理,诸如显示层或输入设备之类的资源被锁定从而独占访问。
Font Provider (currently DirectFB bitmap font, TrueType via FreeType 2)
Image Provider (currently PNG, GIF and JPEG)
Video Provider (currently Video4Linux, AVI (using avifile), MPEG1/2 (using libmpeg3), macromedia flash (using libflash))
the Familiar Project
an open source Linux distro for PDAs
Compaq iPAQ h3600-series
完全基于Tiny-X server
使用Xft APIs 在rxvt、ion、blackbox、fltk下支持True-Type字体
OpenSSH
JFFS2
整合Python2.0 、PyGtk 、PyGDKlmlib
兼容DedianARM
ipkg
----------------------------------------------------------------------------------------
FBUI
http://home.comcast.net/~plinius/fbui.html
驱动整合进内核
核心32KB、库文件17KB
面板式窗口管理器 fbwm 静态连接 46KB
传统窗口管理器 fbwm 静态连接 39KB
终端模拟器 fbterm 静态连接 46KB
模拟时钟 fbclock 静态连接 34KB
JPEG/TIFFviewer fbview 静态连接 42KB
----------------------------------------------------------------------------------------
GGI
http://www.ggi-project.org/
General Graphics Interface
多平台编译支持
快速、抽象、动态组件、高度优化
子项目包括设备驱动子系统,可扩展用户空间API库构架、输入设备管理
----------------------------------------------------------------------------------------
GPE
GPE Palmtop Environment
http://gpe.handhelds.org/
GPE掌上电脑环境
X window system, gtk+ widgets
可以交互SQL、XML
GPL、LGPL
----------------------------------------------------------------------------------------
GtkFB
http://developer.gnome.org/doc/API/2.2/gtk/gtk-framebuffer.html
来源于GIMP项目
Gtk+ 2.0已可以直接对framebuffer进行着色,而非传统的使用Xwindow system,即使用FrameBuffer访问显卡,无需搭配一个Xserver
相关库:
基本数据类型-Glib
支持不同字型文字处理库-Pango
图片文件格式-libpng、libjpeg、libtiff
FrameBuffer port-FreeType库
整合后即为gdk-pixbuf、gdk、gtk三个库
gdk-pixbuf 处理图片影像的库
gdk 视窗绘图系统的抽象层,framebuffer的处理
gtk 高级用户界面
几乎所有FB功能代码都包含在gdk中,称为通用gtk代码;有一些FB功能代码包含在gtk中用来管理窗口。
GtkFB shared lib 2MB
FreeType lib 202KB
libjpeg 138KB
libpng 126KB
memory mapped statistics:
Arial font -- 72KB
local info -- 112KB
libc code -- 1444KB
binary -- 120KB
heap -- 836KB
stack -- 24KB
采用动态连接DL的RSS大小(使用的所有物理大小)为3.4MB,静态连接SL的为2.5MB;
DL虚拟内存总大小为6.6MB,进程间共享2.3MB;
SL的为5.2MB,共享的为1.7MB;
gdk库有三个基本任务
绘图、处理交替窗口、产生事件。gdk核心很像Xwindow系统,事实上其使用了一个经修改的X库-libmi。交替窗口处理是指在一个窗口树中,确定在哪个窗口上进行操作。事件产生是通知gdk用户输入、窗口重绘。它是X产生的一个子集。因为gtk不需要所有X发出事件及其信息。
当程序连接了GtkFB,其最先调用gt -
2005-03-22
Embedded software design & devel ...2 - [嵌入式软件、GUI]
1、驱动编写的注意事项:
目标文件不能太大;
减少驱动程序结构的内部复杂精密数值运算,主要功能是方便其他模块更简单的操作硬件;
驱动对其他模块的反应要即时;
提高移植性,即分出代码中与特定芯片相关或无关的代码;
程序接口与硬件规格相关性要低,便于其他模块的移植;
各模块的相关性低及处理要相对独立,不使用Multi-Thread 、MM;
与浮点运算无关,在一些小型系统内;
中断程序执行时间短;
减少状态量,即及时的反应硬件的状态;
状态量所表示的硬件状态要单一化;
驱动的基本规划:
基地址常量声明--控制寄存器、数据寄存器、系统内存分布等基址;
屏蔽常量声明--将每个功能位做常量定义;
状态常量声明--对硬件的所有可能状态进行专用常量描述;
功能宏声明--定义某些特定的程序执行功能;
中断&异常处理
中断用来描述硬件的相关意外处理 外围设备 <-> 中断控制器 <-> OS <-> 中断向量表 <-> ISR
异常用来描述软件的相关意外处理
中断方式的使用比起轮询方式要复杂,但要省电,这对于嵌入系统是重要的。
轮询polling方式一般使用在一段时间内数据不停要求处理,而中断来不及处理时。较好的办法是使用中断方式等待数据进来,进来之后,关闭中断,采用轮询方式传输,完毕后再回到中断等待中。如通信服务。
开启/关闭中断
使用不同CPU的汇编语言
ex.
inline viod disableInt (void)
{ int temp;
asm {
mrs temp,CPSP
orr temp,temp,#0x80
msr CPSR_c,temp
}
}
牵涉到的一些知识
内存管理方式:
Simple Method
BitMap Method
Tag-Boundary Method(连续空间与非连续空间)
Memory Partition Method
多任务管理:
进程调度器、上下文切换
写上下文切换程序时,需要使用汇编指令写,而每个OS的规定的工作状态方式又缺乏统一性。这是一件非常麻烦的工程。需要毅力经验。
多线程执行状态
Dormant--线程建立、结束、删除的状态
Ready--线程就绪,等待OS分配CPU执行
Running--正在使用CPU资源
Waiting--等待条件事件发生的封锁状态
Delay--延时,等待延时终了,进入Ready状态
特殊执行线程idle
系统开机时建立,所有执行线程不存在或延时或等待时,CPU只执行它。调度机制secheduler必需要执行一个线程,其运行时,检查系统的运行状态,如果没有事,即将CPU切入sleep模式。
Scheduler的调度算法
在嵌入式OS里,多采用抢占式优先级调度算法: pre-emptive priority-based scheduling ,即抢占+优先级排列大概有四种方式
1、 First Come First Scheduling FCFS 、FIFO
根据提出服务的先后来安排CPU时间
2、Priority First Scheduling PFS
根据优先级高低安排
3、Round.Robin Scheduling RRS
将Ready状态的线程当作一个环状队列。每个线程具有一个时间片time slice的值,记录可以使用的CPU时间。当执行后递减为零后,转到其他线程。
4、Priority First with Round-Robin Scheduling
优先级+Round.Robin
关于因为严格区域critical section所引起的优先级反转
【待述】
各执行线程之间的同步沟通采用semaphore 或 event方式协调。如设置一个全局变量。
方式
Share Memory、Mail Box、Message Queue
外围资源管理
通过注册取得设备资源,系统返回一个handle
驱动使用switch table方式来规定设备驱动接口。
int dev_fd;
dev_fd = open (RS232 , O_RDWR);
int open (int handle , unsigned short flag )
{
...
switch (handle)
{
case RS232;
i = open_rs232();
break;
...
default:
break;
}
...
return i;
}
2、EOS要求
跨平台开发环境
代码大小
核心功能完整度
核心工作效率
网络协议
标准驱动接口
文件系统或数据库效率
图形界面效率及函数库的完整性
电源管理机制
系统价格
系统需求支持度
第一步:规划 需求与相应的程序功能实现
如何跨平台开发
预编译
#ifdef _DEBUG_
......
#endif
#ifdef _DEBUG_
......
#else
......
#endif
ex.
#ifdef _A _DEBUG_
*M328_PESEL &= 0x0F;
*M328_PEPUEN |= 0xF0;
#elif defined (_B _BOARD)
*M328_PESEL &= 0x0F;
*M328_PEPUEN |= 0xF0;
#else
*M328_PESEL = 0x0F;
*M328_PEDIR = 0x0D;
#endif
加上编译选项-D、或者定义#define _DEBUG_可以控制编译不同针对硬件的程序内容
软件总体层次结构
用户界面函数:针对不同的嵌入式用户界面
如大小不一的LCD或者触控屏、只用串口控制等
环境界面函数:针对硬件和编译器的不同、每个OS提供的API不同
如int类型在16位和32位CPU上不同长度。
对数据长短的定义,可使用typedef
typedef char xChar;
typedef char* xCharPtr;
typedef unsigned char xUChar;
typedef unsigned char xByte;
typedef unsigned short xWord;
typedef unsigned int xD -
2005-03-21
Embedded software design & devel -1 - [嵌入式软件、GUI]
首要任务:定规格,功能(功能达到什么程度才能顺利建立系统)
通常的产品功能和成本有着很大的联系。一些常见产品的组成则是相对比较固定。
如:PDA有Embedded CPU、Core Logic、外围设备、ADC、DAC组成
ECPU & core logic组成SoC
SmartPhone由RF、基频处理器、CPU Core、DSP Core、 ADC、DAC组成。
DSP中常用代表C5x和C6x,后者常用于弹道系统
根据CPU厂商的设计电路图,设计基本的开发板。
开发工具构架:人机界面、系统程序、模拟程序、模块集(CPU模块、I/O模块、功能模块).
流程:
1.系统的用途---决定系统整个行为模式和系统构架。
2.选择适当的开发环境和工具---编译器、连接器、定位器,或其他厂商的整合开发环境。
如何将编译后形成的映像文件下载到目的平台端,由连接管道(一般RS232)与开发平台沟通测试。
因为不是直接在目标平台上写程序,嵌入式除错相当繁琐,一般是由除错硬件来进行。
嵌入式操作系统构成:
提供微核心的一般有三大项主要机制:
内存管理--动态内存管理,操作系统提供的分配函数为程序提供空间,使用释放函数释放空间。采用静态的函数通常程序会较大。
多进程处理--同时执行多个进、线程。CPU本身提供多组寄存器来记录各程序状态,使用OS的调用机制来控制这些程序的状态。
外围资源管理--资源有限,OS会要求外围资源驱动程序有一个固定格式界面,方便管理。应用程序则需要向OS注册一下索引机制,等待安排。需要注意的是避免竞赛状态(race condition),死锁(dead lock)。
Bootloader:
开机初始化步骤
【初始化处理器】用汇编写的重置码(reset/boot code)
每个CPU一般都有不同的重置码,通常有两三个汇编指令,将CPU控制权交给硬件初始程序。
由CPU制造商提供源代码,便于修改,规定跳到内存哪个特殊地址执行剩余指令。
【初始化必备硬件】汇编写成
大概初始化CPU及RAM必备硬件。其他的硬件使用C写。
先设置处理器寄存器、内存、关掉所有输入管脚,防止错误信号干扰初始化。
这个时候如要使用高级语言C,就必须加入一段起始码(startup descript code)-用来布置高级语言程序的运行环境,如一些内部堆栈。这部分由交叉编译器厂商提供,是一堆汇编程序或一段描述语言源代码。需要根据说明,配合硬件线路图修改,再加入系统中。
【初始化操作系统】
初始必要外围装备,开启内存管理,开始初始化中断控制器,配置中断向量表,异常处理,打开计时器,(切换实模式到保护模式)
ex.
Motorola 68x的DragonBall EZ 328
【1】确定硬件平台,使用开发评估板/或自己设计测试板子。了解开发板子的基本构架。
让板子跑起来:在无任何软件控制下,Motorola提供了工具。
bbug(EZ上)、bbugv(VZ上)程序可以让PC通过RS-232管脚将程序写入板子内存中的相应地址。(硬件要先调通)。
执行文件格式:Motorola的s-record、b-record
stob.exe--->将s-record格式转为b-record,文件名为filename.b
$1、把开发板设置为bootstrap模式(用RS-232传送数据至内存),拉出EMUBRK和RESET两管脚,短路RESET,再短路EMUBRK
$2、启动bbug/bbugv,更改RS-232 baud rate(波特率)
使用命令,Bootstrap:> cb (change baud rate)
> 2 (selection 2: 115200 bps)
Bootstrap:> init
......
Bootstrap:> lo bloader.b b (写入开发板)
如果使用定位器转换地址到0X4000,让CPU的program pointer指到0X4000执行
使用go命令: > go 4000
如果没有烧录程序的辅助,需要用ROM擦写器或ROM模拟器等额外硬件来辅助
$3、退出
Bootstrap:> exit
对外围设备的存取:
有内存映射和I/O地址两种方式,通常多用内存映射方式。
例:DragonBall EZ328
由说明书上知道,其基地址为0XFFFFF000L。(从说明书的内存映射地址表中可以得到外围设备的地址)
例如得到PLLCR PLL control register地址为0XFFFFF200,
定义如下:
#define M328_BASE 0XFFFF000L
#define M328_PLLCR ((unsigned short *)(M328_BASE+0x200))
又由说明书得知
如果要关闭PLLCR需要用到第3个bit值
//PLL Modeule
#define PLL_DISABLE 0x0008 /* bit 3 = 1 */
下面的函数就会起关闭PLLCR control register的作用
void disablePLL (void)
{ *M328_PLLCR |=PLL_DISABLE; }
通常采用头文件header file,这样为了以后更改线路后,编译一下就可以使用。
#define M328_BASE 0xfffff000l
#define M328_SCR ((unsigned char *)(M328_BASE+0))
//chip group
#define M328_CSGBA ((unsigned short
*)(M328_BASE+0x100)) //chip select A base)
......................
以上通常是在 -
2005-03-20
《God and Computers》Donald Knuth Lectures ,In MIT, 语音 - [杂谈]
http://technetcast.ddj.com/tnc_catalog.html?item_id=1042
总共六讲
课堂气氛活泼,不过没想到大师上课不仅风趣,还有点结巴 -
2005-03-06
Linux的嵌入式移植[2] - [Linux深入技术]
4、特定平台初始化代码
/usr/src/linux/arch/mips/your_platform/setup.c
包括各种基地址、特定平台的RTC和PCI操作
__initfunc(void myplatform_setup(void)) {
irq_setup = myplatform_irq_setup; /*
* mips_io_port_base is the beginning
*of the address space to which x86
* style I/O ports are mapped.
*/
mips_io_port_base = 0xa0000000;
/*
* platform_io_mem_base is the beginning of I/O bus memory space as
* seen from the physical address bus. This may or may not be ident-
* ical to mips_io_port_base, e.g. the former could point to the
beginning of PCI
*memory space while the latter might indicate PCI I/O
* space. The two values are used in different sets of macros. This
* must be set to a correct value by the platform setup code.
*/
platform_io_mem_base=0x10000000;
/*
* platform_mem_iobus_base is the beginning of main memory as seen
* from the I/O bus, and must be set by the platform setup code.
*/
platform_mem_iobus_base=0x0;
#ifdef CONFIG_REMOTE_DEBUG
/*
* Do the minimum necessary to set up debugging
*/
myplatform_kgdb_hook(0);
remote_debug = 1;
#endif
#ifdef CONFIG_BLK_DEV_IDE
ide_ops = &std_ide_ops;
#endif
#ifdef CONFIG_VT
#if defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &dummy_con;
#endif
#endif
/*
* just set rtc_ops && pci_ops; forget the rest
*/
rtc_ops = &myplatform_rtc_ops;
pci_ops = &myplatform_pci_ops;
}
myplatform_pcibios_fixup()
myplatform_pcibios_read_config_byte()
myplatform_pcibios_read_config_word()
myplatform_pcibios_read_config_dword()
myplatform_pcibios_write_config_byte()
myplatform_pcibios_write_config_word()
myplatform_pcibios_write_config_dword()
5、中断处理
/usr/src/linux/arch/mips/your_platform/irq.c
/usr/src/linux/arch/mips/your_platform/inthander.S
trap_init()函数复制KSEG0向量位置的顶级异常处理程序。
一、 使用set_except_vector()来安装最高优先级的中断处理器。
二、初始化应用平台上的中断控制器。
在激活远程调试程序时,调用set_debug_traps(),就能将调试信息阻止或报告给调试程
序。
static void __init myplatform_irq_setup (void)
{
set_except_vector (0, myplatform_handle_int);
// Initialize InterruptController
InterruptController_Init(IsrTable);
#ifdef CONFIG_REMOTE_DEBUG
printk ("getting debug traps - please connect the remote debugger.\n");
set_debug_traps ();
breakpoint ();
#endif
}
6、顶级中断处理程序
顶级中断处理器首先保存所有寄存器,然后禁止级别低的中断,并通过CAUSE寄存器来
查找中断源。
1、如果是定时器中断,调用对应的ISR
2、如果不是,检查是否是同中断控制器相连的连接线路发生中断。
NESTED(myplatform_handle_int, PT_SIZE, ra)
.set noat
SAVE_ALL
CLI
.set at
mfc0 s0, CP0_CAUSE # get irq mask
/* First, we check for counter/timer IRQ. */
andi a0, s0, CAUSEF_IP5
beq a0, zero, 1f
andi a0, s0, CAUSEF_IP2 # delay slot, check hw0 interrupt
/* Wheee, a timer interrupt. */
move a0, sp
jal timer_interrupt
nop # delay slot
j ret_from_irq
nop # delay slot
1:
beq a0, zero, 1f
nop
/* Wheee, combined hardware level zero interrupt. */
jal InterruptController_InterruptHandler
move a0, sp # delay slot
j ret_from_irq
nop # delay slot
2:
/* Here by mistake? This is possible, *what can happen is that by the time
we *take the exception the IRQ pin goes low, so *just leave if this
is the case. */
j ret_from_irq
nop
END(myplatform_handle_int)
中断控制的中断处理程序
其获取引起中断的中断向量,然后执行中断源处理程序
void InterruptController_InterruptHandler (struct pt_regs *regs)
{
IntVector intvector;
struct irqaction *action;
int irq, cpu = smp_processor_id();
InterruptControllerGetPendingIntVector(&intvector);
InterruptControllerGetPendingIntSrc((&irq);
action = (struct irqaction *)intvector;
if ( action == NULL )
{
printk(*No handler fo -
2005-02-28
VxWorks 6.0新特点简介 - [新闻业界]
产品上市速度(Time-to-Market)和开发成本直接关系到企业经营的成败。
VxWorks演变成为一个面向整个企业的高效率、高可靠性的设备专用软件开发平台,
风河通用平台VxWorks(Wind River General Purpose Platform)组件,简称GPP VxWorks版,已经不再是单纯的RTOS.
专注于开放性、性能、可靠性和互操作性。VxWorks 6.0向后兼容,原有的VxWorks 5.X代码不需任何改变直接移植过来.为VxWorks 5.5所开发或移植的BSP、驱动程序和内核应用程序只需进行重新编译便可运行于VxWorks 6.0内核下。
在VxWorks 6.0之中包含了最新的存储保护技术、基于标准流程的编程模式、可根据客户需求定制的应用程序接口(API)、错误探测与报告机制、可扩展的消息传递架构、双模式Ipv6/Ipv4网络栈等,而且可以支持非VxWorks应用,所有这些新技术都为电子产品专用软件开发者带来了新的价值。
VxWorks 6.0还提高了对开放式标准的支持。推动了开源软件和VxWorks 6.0之间的兼容性。基于标准进程的编程模型降低了用于在VxWorks 6.0上编写新应用程序的学习曲线,对IPv6的支持非常方便下一代网络设备的开发,基于标准套接字和模块化的消息通道提供了一个公共的通信接口。
VxWorks 6.0 提供了最先进的内存保护机制,用户可通过基于MMU的内存保护机制来提高其设备可靠性。
基于MMU的内存保护机制将内核与用户模式应用程序分离、将应用程序彼此分离,从而提高了设备可靠性。基于进程的标准编程模式简化了应用程序开发。对MMU-less处理器也提供实时进程支持,从而通过采用低成本处理器降低了设备成本。
除了传统的VxWorks内核执行模式之外,VxWorks还推出了基于进程的用户模式执行应用程序。从而使内核免受运行于VxWorks实时进程(RTP)下用户模式应用程序的影响。
消息通道是一种新式的面向连接的双向消息机制,它允许任务跨内存边界进行通信,从而补充了VxWorks中所提供的传统通信机制。位于不同进程或内核中的任务可彼此建立与其位置无关的连接。
双模IPv4/Ipv6网络堆栈特性是构成VxWorks 6.0整体所需的一部分,目的在于在内核和网络应用程序之间引入一个更强的隔离。高性能和可裁剪性是这一协议栈的两个主要特性。IPv4/IPv6双网络协议栈是基于KAME/FreeBSD TCP/IP版本移植而来。
早期VxWorks版本中所使用的非重叠地址空间。非重叠内存模型促进了对传统VxWorks代码的向后兼容,它可提供许多优点。例如:无需多余的内存射入(mapped in)或射出(mapped out)操作,及多余的缓存刷新,这就保证了高确定性和低延时;在MMU-less配置下不需要内存转换表,这一点节省了内存空间并(在某些CPU下)提升了内存访问性能;地址指针具唯一性,支持现有VxWorks驱动程序和应用程序的重复使用,并简化了新驱动程序和应用程序的开发;同时支持有MMU和无MMU的处理器使设备制造商能够更灵活地选择处理器以满足功能和预算需求。
处理器抽象层(PAL)
使操作系统增强了支持类似硬件体系结构系列的能力。体系结构特定的PAL为每个体系结构系列定义了功能接口,并且在一定程度上抽象了操作系统对硬件特性的功能性需求。这一点对于应用程序用户是透明的,一个体系结构系列PAL的出现加速了对该系列处理器变种的支持,并缩短了VxWorks 6.0客户的产品上市时间。
对MMU、CACHE和大物理地址的抽象化是VxWorks 6.0的航向标。
开发工程助推器——Wind River Workbench 2.2
Wind River Workbench提供了一种开放式、基于标准的集成化设备软件开发环境。它使得企业能够标准化它的整个设备软件开发过程到一个公共平台下,以其独特的将可靠性, 功能性以及端对端集成性整合到一起方式,大幅优化了工程人员、项目团队和企业的工作效率。
与VxWorks 6.0配套的IDE组件是Wind River Workbench 2.2,这也是Wind River GPP VxWorks版的重要组成部分之一。 -
738464 嵌入式系统设计
2586848 ARMer
3613624 ARM技术在线
3707325 ARM硬件学习与开发
1317362 BREW or wince
620738 BREW-everenter.com
1450971 C&C++大本营
2571345 CSDN_XML/SOAP
3644343 DSP技术在线
3168828 J2EE项目开发
1407900 JAVA爱好者
1407904 JAVA爱好者
3003469 JAVA天地
2646142 JAVA学习小组
1845058 Java Fans
3766667 LFS社区
2988322 Linux
1828314 Linux Club
1325440 Linux fans
495049 Linux&Kylix
3312403 LinuxStudy(Gentoo)
1336527 Linuxstudy(Ess)
1277786 Linux爱好者
1433911 Linux爱好者2
3029703 Linux技术学院
1284535 Symbian & Java
3586333 USB技术在线
3687071 arm嵌入式系统
3709555 arm嵌入系统联盟2号群
2694692 linux社区
254979 uclinux/ARM
299785 编程研究
3613632 单片机技术在线
1602389 单片机在线
1686202 电子工程
1688658 电子工程01
3768089 黑客帝国--Linux
899038 汇编
2965715 汇编语言学习
2551160 济南单片机
2396427 牛群--J2ME
3526128 嵌入式linux
3348403 嵌入式系统
743040 嵌入式系统研究
1397390 驱动开发爱好者
2974031 驱动开发网
3361462 文件系统驱动
2879101 我爱单片机
1466796 喻园嵌入式联盟
-
2005-02-25
Linux的嵌入式移植[1] - [Linux深入技术]
【前期准备】
1、通常为了加快移植,使用Ramdisk作为root文件系统
2、基于MIPS的MPU,其实对于ARM,x86都是大同小异,不过小异有时候也需要注重的
3、移植开发环境:运行Linux的PC,包括MIPS等处理器的开发工具链,cross-binutils-as,ld,cross-gcc/gdb,特定目标平台的C开发库
4、内核源代码的获得
特定MPU的内核源码获得通常是来自特定处理器Linux版本的维护站点
如MIPS可到www.linux-mips.org中获得(其实里面包括了大多数的平台)
需要清楚如何组织内核源码,也就是了解诸如arch、kernel、mm、lib、platform、documentation、drivers、fs、include、init等目录含义
阅读源代码的好去处 http://joshua.raleigh.nc.us/docs/linux-2.4.10_html/
【起步】
Makefile的中arch应指明为MIPS
/usr/src/linux/arch/mips/boot
下面的Makefile文件中应有CROSS_COMPILE设为mipsel-linux、MIPS little-endian、
LOADADDR也必须被设定成MPU特有的内核镜像加载地址。
其他配置的需要修改文件中的/usr/src/linux/arch/mips/cinfig
如增加一个config选项CONFIG_MIPS,指定目标特殊平台代码
#make config编译内核为最低限度的系统,如串口驱动、ramdisk驱动、ext2fs
#make dep安装依赖的相关程序 #make vmlinux生成镜像
[Ramdisk的生成]
Ramdisk是一个包含ext2fs镜像的文件
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_RAM=y
指定了ramdisk对象可以将内核和压缩ramdisk镜像链接在一起
如果应用程序要在RAMDISK中运行,也可调整进去(方法尾述)
如果要单独生成ramdisk,可以编写工具脚本,当然linux-mips.org中已有人做好了。
ramdisk.o文件复制进/usr/arch/mips/boot/,链接入内核
下面是创建ramdisk较详细的文档
【深入】
针对特定处理器的内核代码与流行的代码之间差异是众所共知的。
下面是进入内核的伪代码
1、set big/little endian mode
2、clear the BEV bit
3、set the TLB bit
4、goto cpu_probe and return
5、set up stack for kernel
6、clear bss
7、goto prom_init and return
8、goto loadmmu and return
9、disable coprocessor
10、goto kernel start
11、goto 10
前6步是正确的设置寄存器
1、设置大端/小端字节模式
2、清除引导异常向量位,确定以后使用正确的异常向量
3、TLB的设置,不同mpu的tlb进入数是可能有差异的
4、cpu类型探测(简单实现的mips代码如下)
LEAF(cpu_probe)
la t3,mips_cputype
li t2,MYCPU /* include/asm-mips/bootinfo.h */
b probe_done
sw t2,(t3)
END(cpu_probe)
注:bootinfo.h中有cputye(MYCPU)和机器组(MY_MACH_GROUP)的入口 ,mips_cputype变量需要cpu_probe函数来更新。使用此值来终止 异常处理和MMU程序。
5、初始化内核堆栈
6、清除内核映像的bss
7、将控制权交到init prom,刷新TLB和缓冲
8、载入mmu程序,loadmmu中内置缓冲处理函数
9、处理器0完成后禁止其他协处理器
10、跳转启动start_kernel()
由于TLB的进入数不同,处理器特定的include代码应增加CONFIG_MIPS配置选项 通常,需要修改的代码位于/usr/src/linux/arch/kernel/
特定平台的TLB、缓冲处理程序包含于/usr/src/linux/arch/mips/mm/
【进一步深入】
内核代码的特定平台转换
特定平台需修改的代码包括中断处理、定时器、初始化、加载等程序。
在/usr/src/linux/include/asm/下建立mips目录,保存特定平台的include文件。
1、prom_init()
位于/usr/src/linux/arch/mips/your_platform/prom.c
prom_init()函数可更改命令行字符串,来增加一些需要从引导程序传递给内核的参数。还可以设置机器组和可用内存上限。
如vr41xx
int __init prom_init(int argc, char **argv, char **envp)
{
unsigned long mem_limit, mem_detected, mem_use;
unsigned long mem_start, mem_end, bootmap_size;
int i;
// clear ERL and EXL in case the bootloader got us here through an
// exception. this is mostly to make kernel debugger happy
write_32bit_cp0_register(CP0_STATUS, 0);
// set upper limit to vr41xx maximum physical RAM (64MB)
mem_limit = 64 << 20;
// the bootloader passes us argc/argv[], but the kernel wants one big string
// put it in arcs_cmdline, which later gets copied to command_line
// (see arch/mips/kernel/setup.c)
// we skip the first argument which is the program file name
strcpy(arcs_cmdline, "");
for (i = 1; i < argc; i++) {
// is it the "mem=" option?
if ( memcmp(argv[i], "mem=", 4) == 0 )
{
// limit to amount of memory specified in megabytes
-
2005-01-07
famous R&D orgnization - [杂谈]
AT&T Bell Lab
Mathematical
Sciences Research
Information Sciences
Research
Computing
Sciences Research
Bell Labs Research -
China
AT&T
Research Labs
HP Lab
IBM Research
Center
Intel Research
Lab
-
2004-11-22
实时系统软件设计概念纲要 - [实时系统软硬件技术]
实时系统软件设计的重要概念
有效状态机:
实时控制系统,其整个分析机制与系统的状态有相当大的关系。
有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。
主要有两种方法来建立有限状态机,一种是"状态转移图",另一种是"状态转移表",分别用图形方式和表格方式建立有限状态机。实时系统经常会应用于比较大型的系统中,这时采用图形或表格方式对理解复杂的系统具有很大的帮助。
并发任务
实时系统通常都会有很多事件同时产生。一个任务描述一个事件,整个系统的并发机制是通过让很多任务并行运行而实现的。一个强调并发任务的系统设计通常都会显得更加清楚并且易于理解。
信息隐藏
信息隐藏是一个与各种系统设计都有关的设计概念,原则是每个模块应该隐藏可能会做改变的设计结果。采用信息隐藏的原因是使模块可供修改,易于理解,因此也便于维护。
实时系统常用分析和设计方法
首先要区分两个不同的概念:系统分析和系统设计。
系统分析指的是由用户提供的,说明软件系统应该做什么以及需要在什么环境下运行等情况的方案;
系统设计则是指那些由系统分析员或设计者提供的描述软件系统如何实现这些需求的方案。
在实时系统的设计中,系统的瞬时表现是最难描述的,但同时也是最重要的因素。
1、语言描述及数学分析
在系统分析和设计中,语言描述是不可缺少的,但其功能也只是对其他方法提供的分析和设计进行补充。在系统分析中,也可以采用数学分析来描述对系统功能的需求。
数学分析是一种精确而有效的方法,对系统性能的优化可以通过优化相应的数学模型而获得,但在大系统中,其作用相对受限。
2、流程图
流程图也许是最早出现的软件系统模型,而且也有着很广泛的应用,因此,简单的系统可以采用流程图来进行建模。流程图适合指令不超过5000到10000条的系统。在多任务的系统中,流程图可用来对各个任务进行分别描述,但是进程之间的交互就不太容易描述,同时也无法描述其瞬时的表现。
3、结构图
结构图是一种广泛采用的、用以描述系统模块结构的方法。结构图从左到右代表了执行的顺序,从上到下代表了程序模块的细节化。结构图可以在相当多的计算机科学的文献以及其他描述系统的文章中见到。
4、伪代码和编程设计语言(PDL)
编程设计语言与伪代码只有细小的差别。
编程语言是一种与系统运行的底层硬件环境相分离的抽象语言,它以一种类似于真正的编写代码的方式来说明系统。ADA就是一个成功应用编程设计语言的例子。
使用编程设计语言或伪代码的好处是,它们比直接应用语言来描述系统需求更抽象,而同时比前述所有方法都更接近实际的编程语言。
5、有限状态机FSM
有限状态机是实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比较广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计的所有阶段。 有限状态机的组成如下:
(1) 一个有限的状态集合Q
(2) 一个有限的输入集合I
(3) 一个变迁函数δ:Q×I→Q 变迁函数也是一个状态函数,在某一状态下,给定输入后,FSM转入该函数产生的新状态。δ的定义域内的某些数值可以是未定义的。
有限状态机通常用图的方式来表示,其节点代表状态。若在输入i下状态由q1转变为状态q2,则有一条标有输入i的弧线从状态q1指向q2。此时,其变迁函数δ(q1,i)=q2。
FSM的优点在于简单易用,状态间的关系能够直观看到。但应用在实时系统中时,其最大的缺点是:任何时刻系统只能有一个状态,无法表示并发性,不能描述异步并发的系统。另外,在系统部件较多时,状态数随之增加,导致复杂性显著增长。
下面的Petri网与FSM相比,具有更强的建模能力,并能描述系统的并发、异步、同步等特性。
6、Petri网
Petri网是一种使用图形方式对系统进行需求规格说明的技术,用来定义多进程、多任务系统的数学模型,易于描述系统的并发、竞争、同步等特征,并可用于评价和改进系统。Petri网已经大量应用于各种系统的模型化。与FSM相比,Petri网不仅能描述同步模型,更适合于相互独立、协同操作的处理系统。
Petri网的组成成分包括:
(1)一个有限的库所(place)集合,表示系统的状态。
(2)一个有限的变迁(transition)集合,表示系统中的事件。
(3)一个有限的连接库所到变迁或者反向的有向箭头的集合,又分输入和输出。
Petri网有如下特性:
(1)状态 通过标记Petri网的库所来给出其状态,标记Petri网的库所在图形中表现为对库所插入数目不同的令牌。
(2)状态变化规则 一个变迁可以有多个输入或输出库所,如果一条有向箭头是从库所到变迁,则该库所是该变迁的一个输入库所,反之则为输出库所。如果一个变迁 -
2004-11-10
运行与T-Engine上的Linux『Tron之父联合MontaVista日本』 - [新闻业界]
开发新一代嵌入式设备平台“T-Engine”的T-Engine论坛( http://www.t-engine.org/ )和日本MontaVista Software(http://www.montavista.co.jp/ )宣布将开发在T-Engine上运行的Linux。
T-Engine是基于作为嵌入式设备的OS而普及的ITRON技术而开发出来的,其即时性能非常出色。另一方面,Linux拥有丰富的应用软件及中间件资源。将两种技术融合在一起,嵌入式设备的开发人员将能够同时享受到上述两种优点。
双方联手开发的Linux在T-Engine的OS——T-Kernel上运行。也就是说,Linux将作为T-Engine的一个中间件运行。双方将于年内制订在T-Kernel上运行的Linux标准“T-Linux”,并开发标准模型。开发出来的Linux将向开放源码团体公开 。(好像需要lisence)
另外,具有Java及蓝牙协议堆栈等各种功能的T-Engine中间件也将陆续亮相。各中间件能够通过进程间的通信来交换数据。
●T-Linux在T-Engine的架构T-Kernel上运行
通过在T-Engine上运行Linux,用户接口中使用Linux开发的、动态图像播放等有即时性要求的部分,就能够使用在T-Engine上运行的其它中间件。这样一来,多功能数字家电及移动设备的软件开发就变得更加灵活。
T-Engine论坛的成员包括夏普、NEC、NTT、东芝、松下电器产业、索尼等多家日本主要的电子产品、通信设备制造商。MontaVista Linux目前已在索尼的家庭AV服务器“CoCoon”及美国摩托罗拉公司正在开发的Linux手机“A760”等中被采用。
T-Engine
http://www.t-engine.org/english/whatis.html
uT-Engine
相关链接:
Tron系统
http://www.tron.org/index-e.html
-
2004-11-10
嵌入式实时UML资源 - [实时系统软硬件技术]
手中有了一本《pattern》,但最想看看的《rt UML》找不到~~0day上好像有,不过俺没有下载权限~~准备以后掏RMB来
实时UML大师:Bruce Powel Douglass --布鲁克·泡尔·道格拉斯
简介:在设计安全性要求严苛的实时应用系统设计领域具有20多年经验。
Bruce Powel Douglass是OMG实时分析设计工作组的主席,现为I-Logix公司首席科学家。
著作:
《Doing Hard Time: Developing Real-Time Systems with UML, Objects, Frameworks, and Patterns》
《Real-Time UML:Developing Efficient Objects for Embedded Sysgtems》
《Real-Time Design Patterns: Robust Scalable Architecture for Real-Time Systems》
《Real Time UML: Advances in The UML for Real-Time Systems》
umlchina曾经对他做过专访........
中文版的
《实时UML—开发嵌入式系统高效对象》
其他几本好像都是gravure的*__*
这里发现一本好书
《嵌入式系统的微模块化程序设计——实用状态图C/C++实现》--量子编程和架构......不知道什么意思*__*
http://www.buaapress.com.cn/buaa/html/commend/view.asp?id=773
嵌入式UML工具比较好用的是ilogix的Rhapsody,想用的话到akaembed去当,lisence需要找一个注册机,不过这几天akaembedFTP没开*__*
还有
Rational的Rose RT
Artisansw的Artisan Studio
Telelogic的Tau
这里有网友的评价
-
That all computers can simulate each other is an immediate consequence of the theoretical work of Alan Turing and Alonzo Church.
所有计算机能够互相模拟,这是阿兰·图林和奥隆索·乔奇理论工作的直接结论。
※MIPS虚拟机※:
【mips64emul】
http://www.mdstud.chalmers.se/~md1gavan/mips64emul/index.html
可模拟32/64位的MIPS CPU,支持许多UNIX系统的MIPS版本。
支持boot模式安装系统、user模式直接运行elf/coff格式可执行文件。
支持模拟如下硬件平台:
DECstation:
NetBSD/pmax onto a harddisk image.
old OpenBSD kernel in a.out format.
Linux kernels for Mips R4000.
SGI:
NetBSD/sgimips.
Linux/SGI kernels for Mips R10000.
ARC:
NetBSD/arc.
An ARC linux kernel, ECOFF.
Cobalt:
NetBSD for Cobalt.
Linux for Cobalt.
Playstation 2:
NetBSD/playstation2.
Linux kernel (2.2.21-pre1-xr7).
配合gcc的mips交叉编译器进行程序开发。
http://www.tik.ee.ethz.ch/~gfa/sim/applet.html
MIPS R3000 体系实现的一个Java Applet;简而言之,就是MIPS VM运行在JVM里......当然速度就像蜗牛了
【VMips】
http://www.dgate.org/vmips/index.shtml
C语言版本的mips VM --VMips,运行于Unix。
虽然VMips提供了完整的MIPS指令集,可以用gcc/gdb做交叉开发,不过老了
【Qemu】
http://fabrice.bellard.free.fr/qemu/
Qemu支持x86、ARM、Sparc、PowerPC四种指令集,效率比VMpis高;
支持Boot和User运行模式。
Boot模式下就像Vmware,可安装和引导一个完整系统;
User模式下像Wine,由Qemu进行指令转换,直接运行一个其它硬件平台的程。
【spim】
http://www.cs.wisc.edu/~larus/spim.html
spim比Qemu有更好的用户界面,能够运行在Unix、Windows、Dos下
完整实现MIPS R3000指令集,图形界面通用,可以直接读取和解释MIPS R3000汇编指令。
※X86虚拟机※:
【bochs】
http://bochs.sourceforge.net/
开源的
【Vmware、VirtualPC】
※重量级模拟器※
--Simics: A Full System Simulation Platform
simics
http://www.virtutech.com
ftp://ftp.simics.net
模拟平台最多的虚拟机
支持 Alpha、ARM、IA-64、MIPS、PowerPC、SPARC V9、x86、AMD64平台,
要求的机器配置很高,一般人还是看着解解馋吧。
还需要对应的lisence去下载package -
离线单板硬件测试方法和系统测试方法
对嵌入式系统进行离线测试分析,以保证系统的软件、硬件具有兼容性、高可靠性和高可用性,迅速发准确定位系统中的问题。
离线单板硬件测试
一般的离线测试是在出厂检验、开发阶段检测和维修诊断时对各测试项进行的测试,以定位出错位置。
自检测试
单板初始化完成后为了保证板子的正确运转进行的测试。
包括看门狗测试、快速硬器件测试和下载通路测试。
当然,不同的系统,自检测试包括的测试项也不尽相同。
1、快速硬件测试
完成寄存器测试和板上单个设备测试,包括许多测试项。
某一项失败,整个测试就会停止直到看门狗超时重启系统。
2、下载测试
保证软件下载功能能正常工作而进行的测试。
主要完成通信接口收发数据测试、中断功能测试。
3、看门狗测试
看门狗测试是硬件检测的第一步。
任何一项硬件测试失败便需要重启系统,而硬件测试失败是以看门狗超时为判断条件。
测试方法是设置并激活一个N秒的看门狗,等待N秒后系统重启。
4、Flash测试
烧录Flash时,可存放预先计算好的checksum值。测试Flash时,即重新计算checksum,然后与预先存放的值进行比较。
Data Flash的测试方法有两种。
一种是非破坏性的基本测试,主要是checksum测试。
一种是破坏性的扩展测试,包括读写测试和地址/数据总线测试,具体方法与内存测试一致。
基本测试可在系统自检时使用,扩展测试可在维修诊断时采用。
5、内存测试
分为三类:
(1)、数据总线测试: 将0001循环左移并写入内存,然后读出并比较测试。
(2)、内存区测试: 对内存所有存储单元进行读写测试(读写5555H和AAAAH测试)。
(3)、地址总线测试:
地址总线通常测试法:对内存所有存储单元进行地址累加测试。从RAM的基地址起,在每一个存储单元(按照总线宽度)中写入不同的值(递增值),地址递增,直至所有的存储单元都保存不同的内容,然后读出并进行检验。
地址总线快速测试法:对0x1地址的内存单元写入地址值0x1,地址值循环左移,依次将相应的地址值写入相应的内存地址,最后检验。
6、主控芯片测试
对主控芯片进行定时器测试、寄存器测试、中断测试和片内RAM测试。
(1)寄存器测试
对一些特殊寄存器的功能进行测试,以验证CPU寄存器是否能正常工作。
(2)中断测试
人为产生一些硬件中断,检测主控芯片是否能及时标志中断寄存器的相应标志位。
片内内存测试则遵循一般内存测试规则。
7、PLD/FPGA测试
复大型FPGA常实现较复杂的功能,测试时要就其各功能进行详细的功能测试。
简小型PLD/FPGA进行自测:在PLD/FPGA编制过程中,加入一些自测手段。当主控芯片测试它们时,设置和读取相应的PLD或FPGA的测试接口,从而获得测试结果。
8、PCI总线测试
PCI总线常用于连接处理器和各类外设。
它提供了低延时路径,使处理器能够直接存取任何映射在存储器或I/O地址空间的PCI设备。
还提供高带宽路径,允许PCI主设备直接到主存储器存取。
测试方法:先测试是否能正确读写PCI配置空间寄存器,然后测试内存映射是否可以在两端正确读写。
嵌入式系统离线测试方法
增量测试
使用综合测试发现错误的原因:
单板测试完成后,系统集成在一起有可能无法正常工作。
主要原因:
模块相互调用时,接口会引入许多新问题。
例如,数据经过接口可能丢失;一个模块对另一模块可能造成不应有的影响;模块之间的硬件连接不正确也可能造成通信不畅;误差不断积累达到不可接受的程度等等。
1、非增量式集成
定义:如果把所有模块按设计要求一次全部组装起来,然后直接运行系统软件。
缺点:易出现混乱,在改正一个错误时又可能引入新的错误,新旧错误混杂,更难断定出错的原因和位置。
2、增量式集成方法
定义:通过测试软件一段一段地扩展,测试的范围一步一步地增大,来逐步定位错误和纠正。
根据系统的不同特点可以采用两种增量式集成模型:
自底向上集成和自顶向下集成
比如:
由主控板和其它单板组成的系统,离线系统测试软件采用自顶向下集成的方法:
由主控板将各个单板的系统测试程序通过网络下载到目的板,然后主控板通过深度优先策略搜索单板。
首先主控板发送消息到直连的单板,如果主控板、单板之间连线正确,且单板硬件及软件工作正常,单板收到消息后将自己的相关信息返回给主控板。
接着主控板再通过直连的单板获取下层单板的相关信息,直到获得所有单板的相关信息(位置,单板类型等),然后就可以开始整个系统的综合测试。
综合测试方法
大型的嵌入式系统都采用分布式处理系统:
由多个模块协同工作完成复杂的功能,模块之间通过网络互联。
整个系统分成3个不同的层次:设备层、系统层和应用层。
针对这3个层次,系统的离线综合测试可以通过互通性测试->功能测试->性 -
2004-11-04
嵌入式Linux标准下、如何摊智能手机这块大饼 - [杂谈]
[quote]
作者:利索脚的老铁
www.lisoleg.net
lao_tie@hotmail.com
_________________________________________________________________________
前提
.脱离产业大背景和国内现状空谈技术是无效的
.也应该看到未来的发展趋势和产业链和价值链的重组和渐变,提前布局和准备
_________________________________________________________________________
抓住关键产业支持
.手机-智能手机
.数字家庭-智能家居-闪联-e家佳
.工业控制
.通信设备-安全
_____________________________________________________________________________
1.什么是智能手机?
(1)从概念上看,采用开放式OS,可承载大量越来越复杂的第三方应用(这难道不象PC工业?只是有个运营商-所以也许非常不同)。具备这个特征的手机对其OS和GUI有较高的要求,目前看可以满足未来相当长一段时间内要求的是Windows Mobile、Symbian和Linux+Qt。用功能清单来区分智能手机和非智能手机并不本质,只会看到在不断变化的功能,智能手机和非智能手机的分界线在不断拉高-是动态变化的-非智能手机在顽固坚守自己的阵地。
(2)其他Linux+GUI的方案由于其相对简陋的GUI无法承担起复杂应用的重担,准确说是不合格的智能手机软件方案,但短期内可以满足目前所谓中端手机的需要,但未来呢?智能手机也许会到50%的份额,价格也会下来。什么是中端高端?-这是动态的概念
(3)其他专属OS和GUI的组合更是吃力很难跟上三者快速的发展步伐,在智能手机领域越来越没有前途,会被逐步吸纳到三者中去,当然,短期(2年-5年?)内Linux+GUI甚至专属OS和GUI在中端市场还是有生命力的,也可以挣到钱
_______________________________________________________________________________
2.Linux危矣
(1)MiniGUI之类沉迷于GUI底层技术细节,舍本逐末地讨论什么C/C++效率之类非常可怕,玩物丧志
(2)Windows迅速向.NET演进,而Linux还是玩弄一些无关紧要的技术
(3)Windows携整个生物链和价值链进入手机行业迅速繁殖,当初PC工业未必是Gates的预见,只是PC自身顽强的生命力最终教育大家看到了构筑生态圈的重要性,但目前是理论指导实践,MS引导PC生态圈进入手机行业,大家一起实实在在赢利
(4)程序员的激情最终屈服于商业利益,商业利益而不是技术优劣更多的决定技术的成败生死
(5)国内(Linux)程序员水平低是环境造成的,没有足够多的有挑战力和真正能获得个人利益最大化的Project来激励和推动,国家的基金支持基本没有太大意义,培养了一些华而不实的人
_______________________________________________________________________________
3.也许我们看到了大公司的正确思路
(1)Motorola和运营商等基于Linux+JavaGUI的方案JUnix也许是对的(打算抛弃A768的Linux+QT方案,不是因为Qt License,而是战略考虑),运营商也欢迎,解决了内容收费的问题-为什么在搞DRM/TrustZone
(2)此外,Java应用在运营商的推动下和利润作用下不断涌现,Java生态圈目前还算健康
(3)PC/Server方面,Java和.net阵营正在残酷争夺可见的未来
(4)反之,Windows Mobile就没那么讨好,除非.NET被运营商接受?但是它在PC行业的垄断形象和几百亿美金花不完的现金已经深入人心,运营商也担心啊-树大招风-Bill同志太招眼了
(5)Java不断在完善,SUN也许会Open Source,注意到了SUN最新的Java 3D Desktop没有,Java除了浪费点MIPS,可以做的事情很多,.NET CLR就不浪费CPU了吗?-何况CPU速度在不断增长-TI、Intel、ARM、Motorola在协力-购买百万MIPS的价格也在下跌-半导体工业急需新的增长点
(6)也许,Linux+JAVA我们也应该尝试,最终不是Linux和Windows Mobile之争,而是Java和.NET之争-Symbian除了OMA,也需要投入JAVA的怀抱
(7)但和MS一样,我想这个JavaGUI会被他们那个联盟垄断,也确实不必开源,Java生态圈的生物关注应用开发就行了-和Windows阵营一样,那些PC/Server Java生态圈的生物一样可以很快迁徙和适应到智能手机生态圈里
(8)大公司里养着IT从业几十年的牛人,他们的思路一定有道理,我无非逼近了他们的思路
_______________________________________________________________________________
所以,关键问题是什么
.各种嵌入式系统都逐渐需要复杂的GUI,这其实也是Linux取代传统RTOS的原因之一
.Kernel、C Lib(glibc/uclibc)其实都是标准的,代码一两套-所以ELC进展缓慢,意义甚小
.GUI的标准才是当务之急
.CELF也非常需要跟踪
_______________________________________________________________________________
呼吁
.我们应该将力量凝成一股绳
.Linux力量很大,但没有朝一处使力
.Symbian/Java/WinCE都有带头大哥
.不要再浪费纳税人的钱了
.战略决策的失误而不是贪污腐败对民族产业的损害最大-我们曾经错过PC工业的绝好机会,今天请不要再错过智能手机工业的机会
______________________________________________________________________________
建 -
SavaJe OS:
SavaJe OS, an open standards-based, 100% pure Java™ platform for mobile phones, enables operators and handset manufacturers to rapidly brand and customize mobile handsets, while simultaneously delivering high performance and an advanced feature set.
纯Java可定制的OS。
沃达丰、mmO2、NTT DoCoMo、Orange等推出OMTP(开放移动终端平台),其是为了保证所有手机用户业务体验的连续性,言外之意是打算控制手机应用和用户接口部分,打算在与手机制造商的交往中占据控制权。
OMTP成立受影响最大的将是诺基亚和微软。诺基亚作为世界最大的手机生产商,同时也是居智能手机操作系统统治地位的Symbian操作系统的最大股东。
OMTP成立受益最大的将是一家小公司——SavaJe,这家由沃达丰、Orange和T-Mobile注资$1750万的公司以推出完全可定制的基于Java的手机操作系统而闻名。
详细的
【沃达丰陷困境仍逞能 标准泛滥 3G重开战】
http://www.tele.com.cn/article/list.asp?id=2586 -
2004-11-03
Linux实时性研究(1) - [实时系统软硬件技术]
Linux Realtime
何谓实时系统:
POSIX 1003.b 定义:系统能够在限定的响应时间内提供所需的服务
Donald Gillies 的定义: 计算的正确性不仅取决于程序的逻辑正确性,也取决于产生结果的时间快慢。
分类:
【hard realtime(HRT)】在不满足响应时限、响应不及时或反应过早的情况下都会导致灾难性的后果
【soft realtime(SRT)】在不满足响应时限时,系统性能退化,但并不会导致灾难性的后果
【best effort(BE)】工作速度没有特定限制,快一点更好些
实时指标:
】Response time
】Latency
】Deadline
其中
HRT对以上三者都有硬性要求,否则服务完全失效。如工业控制,航天航空,军事应用等。
SRT无法提供服务质量。如多媒体实时需求。
BE,如一些字处理器,PC的常规应用。
影响实时的因素:
硬件--MPU的设计: Cache结构设计,上下文切换速度,异常处理,内嵌寄存器等。
软件--OS设计理念:kernel的可抢占、重入性,硬件支持程度,实时调度算法。
Linux的缺陷--Desktop,Server型OS,实时性有限。主要体现在:内核的可重入、可抢占性,系统时钟粒度,实时调度算法。
突破Linux缺陷的方法:
1】、增加kernel可抢占性
一般的kernel的不可抢占性使实时任务无法提供任务的调度权,可以通过修改源码,缩小禁止中断、内核加锁的范围。
2】、细化时钟粒度
一般的kernel无法提供高精度时钟,也即无法高精度分辨RT任务的到来,RTC可提供高精度。
3】、调度算法
一般的kernel是基于优先级的调度算法,无法满足HRT、QoS等的任务需求。可向调度器增加hook或改造调度器来改善。
实时调度算法概览:
三种模式:
TD--time driven: 被静态精确计算过的运行时任务计时,适合小型嵌入式系统、自动控制、传感器领域等。
具有稳定、已知输入的简单系统,通常提供数据处理的预测性。其本身是一种设计时就确定下来的离线的静态调度算法。在系统的设计阶段,对于任务的开始、切换、结束都事先做好安排。
有良好的任务可预测性,但缺乏灵活性,会出现CPU空闲但却有任务需要执行的情况。
PD--priority driven:静态优先级进程调度算法:静态分配给进程优先级,根据应用的属性进行。例如:任务周期,用户优先级,预先策略等等。RM(rate-monotonic)--根据任务的执行周期长短来决定调度优先级,小周期任务具有较高优先级。
动态优先级进程调度算法:根据进程的资源需求动态分配进程的优先级。许多非实时系统采有此种算法,如短作业优先调度算法。实时算法中EDF(earliest deadline first)较普遍--给就绪队列中的各任务的Deadline来分配优先级,Deadline最近的任务具有最高优先级。
基本可以说以上两类算法提供了硬实时调度。
SD--shared driven:基于CPU使用比例的进程调度算法,让他们的执行时间和他们的权重成正比。方法有两种:(1)、调节任务队列在调度队列队首的频率,(2)、根据权重分配时间片,并逐次调度队列中的进程投入运行。
主要类别:轮转法、公平共享、公平队列、彩票调度法(Lottery)。
缺点:没有优先级之分,任务共享资源,系统处于过载状态时,所有任务都按比例变慢,所以一般采用一种动态调节进程权重的方法。
基础是GPS(general processor sharing);算法有WFQ(weighted fair queueing);WF2Q;qlinux使用H-SFQ等。
适合实现资源预留,保障多媒体等软实时性能的算法模式,实现的前提要求系统提供某种静态优先级算法,以实现资源预留。
其一般内容包括:accounting, policing/enforcement,admission control。
linux上的实时多媒体性能
1】、linux-SRT (Cambridge Univ.)
采用高精度时钟,支持QoS,没有修改调度算法,通过在现行kernel中增加调度类来实现QoS(由于文档描述粗糙,可靠性收到怀疑)。
2】、Qlinux (Massachusetts Univ. 、Texas Univ. 、Ensim Corp.)
致力于支持高性能多媒体功能的linux,采用H-SFQ(hierachical start-time queueing),提供CPU,network,disk的QoS服务。
3】、linux/RK(Carnegie-Mellon Univ.、Timesys Corp.)
致力于资源预留的linux实现,通过实现资源预留管理模块、在内核调度相关代码中插入hook,达到预留CPU,network资源,并且向系统特殊任务实现QoS的目的。
4】、KURT-linux(Kansas Univ.)
提供高精度时钟&一种特殊的实时任务保障体制(文档缺少),提供的实时机制对多媒体性能没有什么特别。
5】、Red-linux(California Univ.)
整合了三种(TD、PD、SD)实时模式。
【注1】关于RTlinux/RTAI: 主要用于工控,但缺少学术价值,专利许可严密,最重要的是已经有理论支持(网上的adeos模型可以取代他)。
【注2】关于linux内核时间粒度:scheduling time slice的最大值为10ms; 时钟粒度主要取决于RTC。
对于arm来说,提供的high-res clock主要是通过RTC的高精度,而对于MIPS、PPC、x586这样的处理器还提供了基于总线仲裁的计数器,通常叫做TSC(timer stamp counter)来提高时钟精度。
就通常情况,时钟的频率是系统总线时钟频率的1/4。
【注3】关于抢占:抢占可以发 -
2004-11-03
Undocmented-Windows分版开篇语 - [杂谈]
非常遗憾,这个分版开在这里实在是有意无意就冷落了。
倒不是什么Win-Lin水火不容,而是现在堕落进Lin里挺深的,虽然我对Win的研究还是童幼级别的水平,但MS的水平是不容质疑的,无论是系统构架还是编码工程,当然还有许多不为人所知的许多“内部技术”......现在MS所犯的错误,就是过度的相信系统软件产业前期所累积下来的经验:完全封闭技术、通用测试成本的局部分担......变革总是会牵涉到一些群体利益的。Anders Hejlsberg这样的就不用担心自己的钻石饭碗,在哪个世界,他都是超一流大师。
【关于Undocumented windows系列的介绍:】
以下的引用部分不系鄙人所写
就像Anders Hejlsberg对编译器技术超凡的洞察水平,计算机世界中也有Andrew Schulman这样把系统底层技术钻研的淋漓尽致的人。
Andrew Schulman最早的成名作是《Undocumented DOS》作者,Phar Lap 公司的工程师。
老黄历:以前有种 DOS Extender 产品。要开发 DOS Extender ,必须获得大量 DOS 内部的、保留的、不为外人知的资料。 DOS Extender 最有名的厂商之一,就是Phar Lap 公司。
Addison Wesley 有一个The Andrew Schulman Programming Series 系列书籍,从Un-Dos到最新的Un-2K。
[quote]
http://jjhou.csdn.net/review1-8.htm
书名 Undocumented DOS
作者 Andrew Schulman, Raymond J. Michels, Jim Kyle
Tim Paterson, David Maxey, Ralf Brown
出版 Addison Wesley
页数 8 章,694 页
售价 US$ 44.95
磁片 Yes
1. Regarding the Use of Undocumented DOS
2. Programming for Documented and Undocumented DOS : A Comparison
3. MS-DOS Resource Management : Memory, Processes, Devices
4. The DOS File System and Network Redirector
5. Memory Resident Software : Pop-ups and Multitasking
6. Command Interpreters
7. The MS-DOS Debugger Interface
8. INTRSPY : A Program for Exploring DOS
到底你能够从这本书中获得什麽呢 ? 首先掂掂自己的份量。你必须熟悉 C 语言以及组合语言。懂得组合语言的程式员已被我归为稀有族类。你的实际工作或许不需要以组合语言解决,但即使不会写,顶好还是看得懂这个低阶语言,因为许多重量级作家在期刊上发表技术时都还以组合语言设计范例。你有没有碰过那种坚持要用软须膏、刮胡刀片、古龙水刮胡子的男人 (私底下他也承认电动胡刀方便) ? 说是比较有...呃...这个...比较有古典的味道。本书读者的第二个条件是,必须熟悉 IBM PC 上的程式写作,否则你适合看 Documented DOS 不适合看Undocumented DOS
背景资料 :
书名 Undocumented Windows
作者 Andrew Schulman, David Maxey, Matt Pietrek
出版 Addison Wesley
页数 10 章,715 页
售价 US$ 39.95
磁片 Yes
1. This Was Not Supposed to Happen
2. Examing Windows Executables
3. Disassembling Windows
4. Tools for Exploring Windows
5. KERNEL : Windows System Services
6. USER : Microsoft Windows User Interface
7. Undocumented Windows Messages
8. GDI
9. System
10. ToolHelp
Andrew Schulman 自从写了 Undocumented DOS 一书声誉鹊起,奠下不朽基业後,再接再励写下 Undocumented Windows 一书。目前 Addison Wesley 有一系列书籍就叫作 The Andrew Schulman Programming Series,人红到这个田地真不容易。所以国内出版社诸位老板请好好培养几位有技术、有文采的作家,不会亏本的。那种年产量以打计的作者,书的内容如何 ? 手上不时有三十本书排队等候制作的编辑,书籍制作品质又如何 ?
[glow=255,red,2](此言一出得罪多少人 ? 其实侯捷是五十步笑百步,巴不得一年出它个 365 本)。[/glow]
原本我对此书的兴趣并不高。虽然我对 Windows 是死忠拥护 (不快点表态的人恐怕再过三两年你会死得很惨,饿死的),但 Windows SDK 的近千个函式已经够呛人的了,K 不完白了少年头,哪还有时间看这什麽 Undocumented Windows !! 而且 Windows 是保护模式环境,也不允许你用什麽绝招秘步在系统里面挖宝探险。但是,我错了,这本书着实有看头。
想学点绝招现买现卖立刻用到自己软体上的人可能会失望。搞清楚,本书名叫Undocumented Windows 而不是 Undocumented Windows API。虽然它对超过 250 个未公开函式都有描述,然而有一半的篇幅是在介绍如何以各种工具窥视 Windows 系统,帮助我们了解什麽是 Module、什麽是 Task、什麽是 Instance。而这三者是KERNEL 模组中最重要的成份。当然它也对 GDI 模组和 USER 模组开膛剖腹一番。
书里附了许多软体工具的侦测报告。Schulman 使用的工具有 :
■ Windows SDK 的 Heap Walker : 可用来看记忆体的状况。
■ NuMega Tech. 公司的 SoftICE : 这是个完整的除错工具,威力强大。
■ Phar Lap 公司的 MAPWIN : 可以看 EXE 或 DLL 呼叫了哪些 API。如果你拿到一个很有趣或是 -
2004-10-30
风河四管齐下,继续引领业界 - [新闻业界]
Wind River正在采取四大市场发展策略巩固和扩大其在嵌入式设备市场领先地位:
一是与Linux市场领头羊红帽子公司联合开发针对多功能嵌入式设备市场的【嵌入版Linux】;
二是为客户提供完整的同时支持VxWorks和嵌入版Linux的【新一代可扩展IDE】;
三是通过不断升级为客户提供性能更强大、更可靠和更安全的VxWorks实时操作系统(RTOS);
四是针对不同行业的不同客户采取灵活的实际的授权政策。
自1981至今,其主打产品VxWorks RTOS已几乎在所有的专用嵌入式设备上得到应用,如航天/航空领域的卫星、火星探测器、导弹和军/民用飞机,网络与通讯领域的路由器、交换机、网关、接入点(AP)和各种Modem,消费电子领域的IP电话、IAD设备、DVD播放机、数码相机、数码摄像机、数字电视和机顶盒,汽车电子领域的GPS导航系统和信息系统,以及工业控制、医疗和测量领域的机器人、打印机、传真机、CT机、核磁共振仪和数字示波器。
风河全球营销副总裁Robert Wheaton对记者讲:“几年前我们对嵌入式Linux的认识有偏差,我们那时认为Linux的体系结构不适合于嵌入式市场。但嵌入式应用的市场范围在扩大,不同的应用对嵌入式操作系统的要求也不尽相同。另外由于其开放源码性质和众多厂家的追捧,使其迅速被市场接受。
我们认为,【新兴的嵌入式Linux与传统的RTOS,如VxWorks,会长期共存】。这就是我们为什么会同时支持嵌入式Linux和VxWorks。”当记者问到风河公司的Linux策略时,Robert Wheaton讲:“众多市场分析数据表明超过60%的嵌入式Linux开发者希望有更好的开发工具。而开发工具一直是风河公司的强项,我们正在将最【新一代的开发工具Wind River Workbench移植到Linux上来】,并且很快会投入市场。目前市场上的嵌入式Linux超过数百种,而且绝大多数或多或少已经偏离了主流Linux,这样下去会损害Linux使用者的利益。因此风河公司不是另起炉灶,而是选择与最主流的Linux,Red Hat Linux,合作开发嵌入式Linux。”
另外一个原因是,风河亚太地区高级总监Namiq Kunimoto说:“以前【网络交换/路由设备的主处理器部分通常采用Unix操作系统,这部分用户比较熟悉Unix】,因此他们在升级时一般不会考虑采用其它RTOS。由于Linux源自Unix,因此我们希望这部分客户在升级时也能考虑采用风河的Linux操作系统。”
风河在其最新推出的可扩展集成开发环境Wind River Workbench 2.0中同时提供了对VxWorks和嵌入版Linux两种操作系统的支持,它使得风河的客户可以在一个统一的开发平台上同时进行VxWorks和嵌入版Linux应用程序、嵌入式设备驱动程序和BSP的开发。为不同领域的客户提供针对性的完整集成开发环境已经成为风河颇具特色的平台发展策略,例如,风河分别为网络与通讯领域、消费电子领域、航空航天/国防领域、汽车信息娱乐领域和工业控制领域开发了含有常用协议堆栈的可扩展开发平台NE、CD、DO-178B、CI和ID,以方便客户尽可能地缩短应用程序开发周期。风河是目前RTOS业界为数不多的能同时提供RTOS和开发平台的供应商之一。
此外,风河也在通过不断地改进VxWorks巩固该公司在专用嵌入式设备RTOS市场上的领先地位。例如,风河在今年二月份发布的第二代RTOS VxWorks 6.0就在性能上有了很大的改进,它提供了更加完善的内存保护机制、支持USB 2.0、支持非VxWorks应用、可根据客户需求定制的应用编程接口和可扩展的消息传递架构,并支持VxWorks 5.5下开发的BSP、驱动程序和应用程序无缝升级到VxWorks 6.0。
嵌入式设备是目前全球最具增长潜力的市场之一,目前全球采用嵌入式操作系统的设备已达到3亿台,而且Wheaton预测道:“【今后五年内具备联网能力的嵌入式设备将达到140亿台】。”这么庞大的市场前景不仅为像VxWorks这样的RTOS提供了一个难得的发展良机,而且网络上到处流窜的病毒也对嵌入式操作系统的安全性提出了更高的要求。
目前市场上最具代表性的嵌入式操作系统中,【风河VxWorks的安全性是最好的】。这是因为VxWorks是一种确定性的RTOS,系统开发者能够更好地把握操作系统的行为,从而严密控制系统对外界各种访问的反应,因此病毒很难攻破它的防线。据介绍,风河至今尚未收到任何VxWorks用户对其安全性的投诉。确定性是实时操作系统,如VxWorks,区别于各种桌面操作系统及其变种的本质特性。它为开发者编写出稳定、可靠、安全的应用程序提供了一个坚实的基础。
最后,风河也正在采取更灵活和更实际的授权政策来吸引更多的客户。例如,与过去僵硬的单一授权政策不同,现在风河为不同行业的不同客户制订了不同的授权政策,【批量小利润率低的客户不再需要支付与大批量高利润客户同样多的授权费用】,从而为不同的客户提供了相应的可承受的使用门槛。【【这也正是为什么VxWorks既能在需要高可靠性高实时性的火星探测器上得到应用、同时也能在利润率很薄的IP电话上得到应用的主要原因,VxWorks现在已不再“昂贵”。】】
-
2004-10-24
Linux钻进Robot~~酷毙 - [杂谈]
Using microcontrollers in your robot
http://homepages.which.net/~paul.hills/Embedded/Embedded.html
超眩超酷,啥时候俺也能搞搞这个~~~robot -
Bloger: 笑雨bladerunner
首先要树立一个信念,内核调试是一个梦魇,需要具有的第一要素是毅力,然后才是技术本身。
内核是一个不与特定进程相关的功能集合,因此内核代码在调试器中执行调试不太容易,且难跟踪。
内核代码错误有时具有不可复现性,特别是导致系统崩溃的错误,现场跟踪在这种情况下很难实现。
普通的调试技术:通过printf调试
监视
在APP编程中,适当调用printf ;
在Kernel中,使用用printk
【printk()】
keyword: loglevel(日志级别)、消息优先级、DEFAULT_MESSAGE_LOGLEVEL、console_loglevel 、/proc/sys/kernel/printk 、setlevel工具、
printk通过根据附加不同日志级别(loglevel),或消息优先级的所标级别的严重程度,对消息进行分类。
一般采用宏来指明日志级别,例如,KERN_INFO。
日志级别宏展开为一个字符串,在编译时由预处理器将它和消息文本拼接在一起;
优先级和格式字串间没有逗号。下面有两个 printk 的例子,一个是调试信息,一个是临界信息:
------------------------------------------------------------------------------------------
printk(KERN_DEBUG "Here I am: %s:%i\n", _ _FILE_ _, _ _LINE_ _);
printk(KERN_CRIT "I’m trashed; giving up on %p\n", ptr);
------------------------------------------------------------------------------------------
在头文件 <linux/kernel.h> 中定义了 【8 种可用的日志级别字符串】
KERN_EMERG 用于紧急事件消息,它们一般是系统崩溃之前提示的消息。
KERN_ALERT 用于需要立即采取动作的情况。
KERN_CRIT 临界状态,通常涉及严重的硬件或软件操作失败。
KERN_ERR 用于报告错误状态;设备驱动程序会经常使用 KERN_ERR 来报告来自硬件的问题。
KERN_WARNING 对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重问题。
KERN_NOTICE 有必要进行提示的正常情形。许多与安全相关的状况用这个级别进行汇报。
KERN_INFO 提示性信息。很多驱动程序在启动的时候,以这个级别打印出它们找到的硬件信息。
KERN_DEBUG 用于调试信息。
每个字符串(以宏的形式展开)代表一个尖括号中的整数。整数值的范围从0到7,0最高优先级,7最低。
printk默认采用的级别是 DEFAULT_MESSAGE_LOGLEVEL,
这个宏在文件 kernel/printk.c 中指定为一个整数值,且是变化的。始终指定一个明确的级别是个好建议。
根据日志级别,内核可能会把消息打印到控制台(字符终端、串口打印机、并口打印机)上。
1、如果优先级高于 console_loglevel 这个整数值的话,消息才能显示出来。
2、如果系统同时运行了 klogd 和 syslogd,则内核消息一律写入 /var/log/messages 中
3、如果 klogd 没有运行,消息就不会传递到用户空间,需要查看 /proc/kmsg 。
※※变量 console_loglevel 的初始值是 DEFAULT_CONSOLE_LOGLEVEL,而且还可以通过sys_syslog 系统调用进行修改。※※
可以调用 klogd -c 来修改这个变量。
注意,要修改它的当前值,必须先杀掉 klogd,再加 -c选项重新启动它。
此外,还可以编写程序来改变控制台日志级别。读者可以在 O’Reilly 的 FTP 站点提供的源文件 miscprogs/setlevel.c 里找到这样的一段程序。新优先级被指定为一个 1 到 8 之间的整数值。如果值被设为 1,则只有级别为 0(KERN_EMERG) 的消息才能到达控制台;如果设为 8,则包括调试信息在内的所有消息都能显示出来。
因为出错处理代码会把 console_loglevel 增为它的最大数值,导致随后的所有消息都显示在控制台上。
如果需要查看少一些的调试信息,就有必要降低日志级别;
如果需要查看更多调试信息,就有必要提高日志级别;
这在远程调试内核,并且在交互会话未使用文本控制台的情况下,是很有帮助的。
比2.1.31高的版本中,可以通过文本文件 /proc/sys/kernel/printk 来读取和修改控制台的日志级别。
这个文件容纳了 4 个整数值。前两个为:控制台的当前日志级别和默认日志级别。
# echo 8 > /proc/sys/kernel/printk
2.0 版本下的,需要使用 setlevel 工具。
如果控制台是文本屏幕,可以发送消息到一个指定的虚拟控制台。默认情况下,是虚拟终端。
可以在任何一个控制台设备上调用 ioctl(TIOCLINUX),来指定接收消息的虚拟终端。
下面的 setconsole 程序,可选择专门用来接收内核消息的控制台;这个程序必须由超级用户运行,在 misc-progs 目录里可以找到它。下面是程序的代码:
------------------------------------------------------------------------------------------------
int main(int argc, char **argv)
{
char bytes[2] = {11,0}; /* 11 is the TIOCLINUX cmd number */
if (argc==2) bytes[1] = atoi(argv[1]); /* the chosen console */
else {
fprintf(stder -
《Computer Systems A Programmer’s Perspective》
《深入理解计算机系统》这本书由13个章组成,旨在阐述计算机系统的核心概念:
第一章:计算机系统漫游。这一章通过研究“hello, world”这个简单程序的生命周期,介绍计算机系统的主要概念和主题。
第二章:信息的表示和处理。我们讨论计算机算术,重点描述对程序员有影响的无符号和二的补码(two’s complement)的数字表示法的特性。我们考虑数字是如何表示的,以及由此确定对给定的字长,它可能编码的值的范围。我们探讨有符号和无符号数字之间类型转换的效果,还阐述算术操作的数学特性。学生们很惊奇地了解到(二的补码表示的)两个正数的和或者积可以为负。另一方面,二的补码满足环的特性,因此,编译器可以把一个常量乘法转化为一系列的移位和加法。我们用C语言的位级操作来说明布尔代数的原理和应用。我们从如何表示浮点值和浮点操作的数学属性方面讲述IEEE标准的浮点格式。对计算机算术非常了解是写出可靠程序的关键。
作者介绍
Randal E. Bryant 1973年获得密歇根大学(University of Michigan)学士学位,随即就读麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士学位。他在加州理工学院(California Institute of Technology)做了三年助教,从1984年至今一直是卡内基梅隆大学(Carnegie Mellon)的教师。他现在是计算机科学的主任级教授和计算机科学系的系主任。
他同时还受邀于电子和计算机工程系。 他从事本科和研究生计算机系统方面课程的教学超过20年。在讲授计算机体系结构课程多年后,他开始把关注点从如何设计计算机转移到程序员如何在更好地了解系统的情况下编写出更有效和更可靠的程序。他和O’Hallaron教授一起在卡内基梅隆大学开设了“计算机系统导论”课程,那便是此书的基础。
他还教授一些算法和编程方面的课程。 Bryant教授的研究涉及帮助硬件设计者验证其系统正确性的软件工具的设计。其中,包括几种类型的模拟器,以及用数学方法来证明设计正确性的形式化验证工具。
他发表了100多篇技术论文。包括Intel、Motorola、IBM和Fujitsu在内的主要计算机制造商都使用他的研究成果。他还因他的研究获得过数项大奖。其中包括Semiconductor Research Corporation颁发的两个发明荣誉奖和一个技术成就奖,美国计算机学会(Association for Computer Machinery,ACM)颁发的Kanellakis理论与实践奖,还有电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)授予的W. R. G. Baker奖和50年金质奖章(A Golden Jubilee Medal)。他同时是ACM和IEEE的院士。 David R. O’Hallaron 1986年在维吉尼亚大学(University of Virginia)获得计算机科学的博士学位。在通用电气工作一段时间后,于1989年作为系统科学家成为卡内基梅隆大学的教员。他目前是计算机科学系和电子及计算机工程系的副教授。 他教授一些本科生和研究生的计算机系统方面的课程,例如计算机体系结构、计算机系统绪论、并行处理器设计和Internet服务。和Bryant教授一起,他开设了“计算机系统导论”课程,那便是此书的基础。 O’Hallaron教授和他的学生从事计算机系统领域的研究。特别的,他们开发了一些软件系统,帮助科学家和工程师在计算机上模拟自然界。其中最著名的是Quake项目,一群计算机科学家、土木工程师和地震学家致力于在强烈地震中预测大地运动的能力,这些强烈地震包括南加洲、古巴、日本、墨西哥和新西兰的大地震。同Quake项目中其它人员一起,他获得了CMU计算机科学院颁发的Allen Newell优秀研究奖章。他为Quake项目创立的基准程序,183.equake,被SPEC(Standards Performance Evaluation Corporation)选入非常有影响的SPEC CPU和OMP(Open Mp)基准程序包中。
书评
“我坚信从程序员的角度来看计算机系统对教会学生们计算机的内部结构非常有帮助。” ――Kostas Daniilidis,宾夕法尼亚大学
“这本书讲述事物的方法与众不同,但是和我想要的课程进行方式类似。” ――John Greiner,Rice大学
“这是一项出色的工作,是这一领域教学方法的一次革命。” ――Michael Scott,罗切斯特大学
程序员的视角本书适用于那些想要写出更快、更可靠程序的程序员。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境。而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构,程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的。例如,在 -
2004-10-20
嵌入式硬件梗概(3) - [嵌入式硬件]
Bloger: 笑雨bladerunner
嵌入式系统的【输入输出接口】:
有线接口注意的:嵌入式微处理器的接口电位必须和外围装置相同;防止连接干扰;驱动外围装置的驱动电位。
无线接口注意的:红外、GSM、GPRS、蓝牙模块。
高速I/O传输接口:
以前的RS-232太慢。现在较多使用USB接口。
IEEE1394:firewire,可达400Mbps,多用作多媒体传输。
USB:一个USB接头支持127个USB设备。 USB1.1-12Mbps, USB2.0-480Mbps。
红外端口:IrDA1.0--1994,波长0.85-0.90微米红外线,115.2Kbps,1公尺。
IrDA1.1--4Mbps;IrDA1.2--115.2Kbps,2公尺;IrDA1.3--4Mbps
FIR1.1-- 4Mbps
VFIR-- 16Mbps , 8公尺。
蓝牙模块:
无线通信频率在2.4Ghz,ISM频带内,具有很好的抗干扰能力。
构架-无线传输收发单元,基频处理单元,数据传输处理单元。
蓝牙模块价格较贵-原因,制程中需要采用低温陶瓷基板(LTTC)。
【输入输出装置】:
触控面板:
早: 电容式、音波式、红外式、近场感应式
主要:电阻式-4线电阻式Turbo 4 ; 6线电阻式Turbo 6
新: XGT式,寿命长。
LCD显示器
扩充装置:
Compact Flash-CF卡:记忆卡、数据卡、串行端口连接卡、Barcord扫描卡。
IBM MicroDriver可达1G容量,马达驱动的。
Secure Digital-SD卡:松下,东芝倡导协议。可防数据写入。还符合SDMI网上电子音乐保护标准。
Palm采用,速度10MB/s,体积邮票大小,容量大。
Memory Stick---SONY,扩展功能好:MS数码相机插入MS扩展槽中,PDA可作数码相机;插入GPRS扩充卡,PDA可作无线上网;扩充功能还有蓝牙扩充模块、指纹识别扩充模块、GPS扩充模块。
SpringBoard---使用Palm OS的PDA Visor的专用扩充系统。应用于移动电话模块、数码相机、MP3播放器。 -
2004-10-20
嵌入式硬件梗概(2) - [嵌入式硬件]
Bloger: 笑雨bladerunner
快速SoC系统设计制造:
Tensilia公司
Xtensa嵌入式系统微处理器核心:先制定出微处理器的规格、处理器位架构、最高工作频率、功耗、晶体管数目、OS、指令集、中断信号、芯片制程等,这些资料由Xtensa处理,产生RTL Core。然后生产芯片。
其可整合一百颗微处理核心,平行运算。具有高效率。
DSP上,Tensilica的核心技术:Vectra DSP,为一浮点处理架构及32位乘法器。
www.tensilica.com
---------
ARM嵌入式微处理器家族:
ARM7 Thumb:32位,中初级市场,
指令集不同,分为ARM710T、ARM720T、ARM740T,核心ARM7TDMI
32位的寄存器,ALU,移位器(Shifter),寻址模式,32x8 DSP乘法器,16位Thumb指令集。
注:ARM740T没有MMU,有4K--8K的快取内存,写入缓冲器,内存保护单元。功能多,价格低,主要用于多媒体应用。如机顶盒,PDA
ARM720T支持windowsCE
ARM7核心工作构架:
1、执行效率小于15MIPS,内存空间8K-8M,使用执行效率比较慢的低成本扩展内存。
ARM7TDMI(ASIC)---\8 or 16\---3 cycle memory
2、执行效率在10mips到30mips之间,内存空间8k-128k,使用执行效率较快的扩展内存
ARM7TDMI(ASIC)---\8 or 16\---3 cycle memory
3、执行效率在30mips--59mips之间,内存空间8k--64k,使用执行效率较快的内嵌式内存
(ARM7TDMI----memory) ASIC
4、执行效率在30mips--53mips之间,内存空间128K--4G之间,使用执行效率较慢的扩展内存
(ASIC) ARM7xxT + Cache + MMU or protection Unit-------|
|
(Peripherals) Serial I/O or USB ------Gateway-------|--(AMBA Bus)---Memory |
DMA Controller -------|
ARM7 Thumb开发工具:
Software Development Toolkit SD211A-------KT-00000
Multi-ICE--------------------KPI-0091A
ARM7TDMI Development Board-----------KPI-0011C
Embedded ICE Interface-------------KPI-0006C
----------
Thumb指令集
----------
32位 RISC构架指令集,以16位宽度压缩。执行时可以在不消耗处理效率情况下,完成指令集解码,转换成32位元。
处理指令的选择:
要缩小程序,使用16位压缩Thumb指令编程;
考虑程序执行效率,使用32位ARM RISC指令集;
--------------------------------
ARM9 Thumb家族
ARM920T、ARM940T
ARM920T具有2x16K的cache,可运行很多EOS;
ARM940T具有2x4K的cache,只运行小程序
32位,核心:ARM9TDMI, 开发时可选择32位的RISC指令集和16位的Thumb指令集。
可运行200MHz,效率220MIPS
ARM940T核心构架:
一个ARM9TDMI微处理器核心、一个4K数据cache、一个4K指令cache、内存保护单元(MPU)、一个AMBA总线接口。
内存保护单元可将内存分为8个寄存器,每个寄存器拥有独立的cache,写入缓冲器及数据读取通道等,通过程序化控制,经由微处理器核心中的寄存器去设置内存保护单元,不需要在内存中放置内存映射表数据。
4K指令cache <------>ARM9TDMI核心<------>4K数据cache
^ ^
| |
| |
| |
| V
V 写入缓冲器
-----------------------------------------------------
总线接口单元
-----------------------------------------------------
| | AMBA总线
| |
| |
| |
_| |_
\ /
\ /
\ /
\/
ARM920T核心构架:
一个ARM9TDMI微处理器核心,一个16K数据cache,一个16K指令cache,MPU,AMBA总线接口,一个ETM(Embedded Trace Macrocell)接口。
ETM接口允许开发人员进行即时的微处理器流程跟踪和除错。
ARM9 和 ARM7有一样的功耗,也可动态调整工作频率。
ARM9主要应用于媒体播放上,如MP3的解压,ARM9工作在25MHz;MPEG4播放,仅需要11MHz;
---------------------------------
ARM10 Thumb
300MHz,64位AMAB AHB总线接口,拥有平行分支预测(branchprediction),
丢失命中cache(hit-under-miss caches),写入缓冲器等。
三种微处理器:
ARM1020E,ARM1022E,VFP10
ARM1020E/ARM1022E,整数运算的RISC 64位架 -
2004-10-20
嵌入式硬件梗概(1) - [嵌入式硬件]
Bloger: 笑雨bladerunner
DSP概述:
手机中的DSP用来处理数字语音解码和编码
VCD中的解码;
处理大量即时运算,数据处理一般要比通用处理器多2-3倍处理周期。
最基本的运算:加法,乘法;还要实现一些算法,如FIR(有限长单位脉冲响应)滤波器,IIR(无限长单位脉冲响应)滤波器,DFT(离散傅立叶变换),DCT(离散余玄变换)。
平行运算结构:平行运算乘法、加法,有的使用蝶型转换快速处理傅立叶变换。有的还含有移位器。
哈勃架构的bus总线结构,拥有不同指令与运算数据Bus,可同时从内存中读取指令和运算数据,进行处理。一般是1个指令总线,2个数据总线。
处理庞大数据矩阵,内含计算矩阵数据的硬件结构,产生数据地址。不需要付出额外周期处理地址。
SoC系统概论:
整合了RISC、外围IP、DSP等,以及相应需要的接口,并整合在一个芯片内。
SoC嵌入式微处理器技术构成:
IP(硅知识产权)---微处理器核心(ARM,MIPS,DSP...) ; 输入输出接口单元 ;
内存单元 ; 通信协议单元 ;多媒体数据压缩解压 ;
模拟电路 ;射频电路 ;微机电系统
设计工具---快速原型技术 ; EDA设计开发环境 ;芯片测试验证工具
设计方法---可重复利用IP ; IP组件整合技术 ;电路噪声处理技术 ;
芯片消耗功率分析技术 ;集成电路布线最优化。
OMAP微处理器技术:Open Multimedia Application Platform
开放多媒体应用平台
TI公司开发。主要应用于2.5G和3G无线通信网络平台。核心是TMS320C54X、C55X DSP核心。加上ARM925 RISC核心,再结合外围电路IP。
可按照即时/非即时处理程序来开发,再由DSP及RISC处理数据。功耗很低,效率很高。
其中,C55X DSP芯片支持无线网络传输、音频数据处理;并提供了copr()指令集,针对多媒体数据流处理。
C55X可以加速的多媒体影像数据处理包含 影像位移预测(Motion estimation)、离散余弦转换(DCT)、反离散余弦转换(IDCT)、像素填补(Pixel interpolation)算法
主要特点:将大量数据分配给DSP核心做单独处理,不需占用RISC太多资源,处理即时数据时,即时运算就交给RISC处理。从而提高系统效率。其中的DSP/BIOS Bridge是一个通讯接口,作为RISC与DSP之间的数据传输。
应用于即时多媒体影音数据处理、语音识别、因特网通讯、无线通信与电子商务。(对垒Xscale)
DSP核心和ARM核心通过DSP/BIOS Bridge接口进行数据交流。两个核心分别由两个OS操控;
DSP核心由DSP/BIOS OS进行初始化,运算功能控制、数据传输、状态监控;ARM RISC核心由一般的EOS控制。
开发工具:Code Composer Studio整合开发软件。
包含编译器、模拟器、除错器。
使用Localized DSP Gateway Component控制DSP核心运算处理,不必了解DSP/BIOS OS的使用。
通过Code Composer Studio合理分配数据处理给ARM RISC和DSP 核心。
Windows上开发:Symbian Quartz C++ SDK 开发 EPOC上的OMAP应用程序。
在JAVA OS上针对字节码处理,效率高。
关于MPEG4的处理:
TI使用C语言编写MPEG4编解码软件,依照DSP指令,转成ETSI C函数库,再转为C5XX DSP组合语言码。可以15张/秒左右的即时编解码速度处理QCIF(176x144像素)数据。
EPOC操作系统上的MPEG4处理构架:
用户应用程序------>多媒体网关(Multimedia Gateway)------>多媒体解码程序
(Mutilmedia Algorithm)
语音识别的应用
OMAP架构中的DSP用来执行识别算法和处理相应数据,ARM RISC是工作包括存放识别算法的描述、语音识别库、电脑视觉的数据处理。
--------
Intel公司
Xscale处理器:Intel开发。包含DSP延伸指令集、DSP外接通信单元(可以连接外部DSP)。
第二代StrongARM处理器。是根据第五代ARM RISC处理器ARM V5TE所设计,不过只包含整点运算线路。
定位于高速无线通信应用。可以将移动电话所需要的组件整合成一个完整的移动通信模块。
另外Xscale可以整合DSP、4M SRAM、32M快闪成为一个高度整合性SoC。
最高频率1G Hz. (由于采用了PIII中的超级管线技术。1.75W功耗下1270 MIPS)
应用开发:
Xscale具有兼容ARM RISC的程序执行核心。内部拥有ARM V5TE、16位ARM Thumb指令集,还有DSP延伸指令集。
MS的Windows Media Audio及Windows Media Video两种技术,应用于2.5G/3G上。主要使用的是Intel的IPP-Integrated Performance Primitives多媒体开发程序库,处理
Xscale多媒体数据.
MontaVista Software公司开发了Xscale处理器的Linux OS。
Xscale--Intel 80200
----
87C196CA、87C196CB嵌入式微处理器:Intel和德国Robert/Bosch合作开发,CAN(controlled Area Network)通信协议控制器。
i960JT:RISC构架,32位微处理器,网络传输,ADSL Modem。
i960VH:快速网络数据处理、多媒体影像处理。
---------------------------
MIPS RISC嵌入式处理器
MIPS公司提供IP。日本电子厂商是MIPS的忠实用户。
NEC----Vr4100、Vr4300---M -
博客名:笑雨bladerunner
网络ID:sky-walker
关键词:
Kernel Symbol Table、/proc/ksyms、system.map、Oops、LKM
这应该是一个很基本的内核概念,和模块、系统调用等一样基础,但牵涉的东西却一点也不窄,一毫也不浅。(但也不深:-)
【内核符号表,kernel symbol table】
Linux的内核是个单内核monolithic,任一函数都可以访问公共数据结构和函数调用。在设计程序时,需要命名一些函数名、变量名等;同样内核中就含有很多的全局符号。
内核不是人脑皮层,要使用变量和函数-地址(指针)-来访问对应的变量和函数。
内核符号表就是为程序员通过符号来访问程序体的对应地址(指针),建立了一个动态的,可变更的映射表格。
一个符号表例子:
c03441a0 b dmi_broken
c03441a4 b is_sony_vaio_laptop
可以看出变量dmi_broken位于内核地址c03441a0处。
这和gdb的按图索骥的功能很相似,不同的是内核采用文件为载体的形式。
【/proc/ksyms】
ksyms是内核数据映像文件,在内核引导时创建,其实就是内核数据(/proc文件系统的特性及详解文末),没有实际大小的。
ksyms中的每一个表项代表着一个全局内核符号。这些符号可被LKM引用的,即可以看出LKM可以调用哪些函数(这里有一个安全问题)
【System.map】
位于/或者/boot、/usr/src/linux/下
在每次重新编译内核时,各符号名及其对应的地址指针将有所变化。(有变的,也有不变的)。所以系统需要自行更新此文件。
(关于System.map和系统出错的关系,需要额外说明)。
System.map文件作为特定内核的内核符号表,其链接了系统所使用的System.map。
一般的创建步骤:
当编译后生成内核vmlinux-2.X.Y后,存于/usr/src/linux/下,这时编译脚本将运行“nm /usr/src/linux/vmlinux-2.X.Y > System.map”,并将其拷入/boot下。
具体的生成过程可以从内核编译脚本中得到启示:
/usr/src/linux-2.X.Y/Makefile
nm vmlinux | grep -v ’(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)’ | sort > System.map
cp /usr/src/linux/System.map /boot/System.map-2.X.Y
注:nm vmlinux的作用是过滤掉其中不需要的符号。
值得注意的是内核本身并不真正使用System.map,但其它程序比如klogd, lsof和ps等软件需要一个正确的System.map。某些与内核头连接而非glibc库的驱动也需要System.map来解析符号(模块加载是与内核版本有关,但与内核版本一致而符号表发生变化的编译后内核无关)。
klogd 内核日志守护进程
为了执行名称-地址解析,klogd需要使用System.map。
man klogd可知,klogd将从一下路径查找System.map:
/boot/System.map
/System.map
/usr/src/linux/System.map
如:
# strace -f /sbin/klogd | grep ’System.map’
open("/boot/System.map-2.4.18", O_RDONLY|O_LARGEFILE) = 2
# strace lsof 2>&1 1> /dev/null | grep System
readlink("/proc/22711/fd/4", "/boot/System.map-2.4.18", 4095) = 23
# strace ps 2>&1 1> /dev/null | grep System
open("/boot/System.map-2.4.18", O_RDONLY|O_NONBLOCK|O_NOCTTY) = 6
【/proc文件系统】
一个伪文件系统,它只存在内存当中,而不占用外存空间。为访问系统内核数据的操作提供接口。有些是动态可变的。
以数字命名的目录是进程目录,以进程的PID号为目录名,而self目录则是读取进程本身的信息接口,是一个link,proc文件系统的由来也因为此。
apm 高级电源管理信息
cmdline 内核命令行
Cpuinfo 关于Cpu信息
Devices 可以用到的设备(块设备/字符设备)
Dma Used DMS channels
Filesystems 支持的文件系统
Interrupts 中断的使用
Ioports I/O端口的使用
Kcore 内核核心印象
Kmsg 内核消息
Ksyms 内核符号表
Loadavg 负载均衡
Locks 内核锁
Meminfo 内存信息
Misc Miscellaneous
Modules 加载模块列表
Mounts 加载的文件系统
Partitions 系统识别的分区表
Rtc Real time clock
Slabinfo Slab pool info
Stat 全面统计状态表s
Swaps 对换空间的利用情况
Version 内核版本
Uptime 系统正常运行时间
进程目录的结构如下:
目录名称 目录内容
Cmdline 命令行参数
Environ 环境变量值
Fd 一个包含所有文件描述符的目录
Mem 进程的内存被利用情况
Stat 进程状态
Status Process status in human readable form
Cwd 当前工作目录的链接
Exe Link to the executable of this process
Maps 内存印象
Statm 进程内存状态信息
Root 链接此进程的root目录
查看系统信息:cat /proc/mem
修改内核参数
/proc/sys不仅提供了内核信息,而且可以通过它 -
2004-10-19
关于堆栈计算机的一些资源 - [计算机理论]
卡耐基梅隆大学Philip Koopman的著作《Stack Computer》。http://www.ece.cmu.edu/~koopman/stack_computers/index.html
一个堆栈机的模拟代码,
http://sourceforge.net/projects/cdis/ ,用c++。perl所写
http://www.stackcomputer.com/
http://www.stack.co.uk/
A Stack Computer
Our target computer is a stack computer with the following instructions (the instructions are given as predicates, that, when invoked, emit the instruction):
’action’ PLUS
’action’ MINUS
’action’ PUSH(Variable)
’action’ POP(Variable)
The instructions modify the stack of the computer. If the stack has the form
... X Y
then PLUS replaces the top two elements by their sum Z = X+Y, i.e. the stack becomes
... Z
Similarly, MINUS replaces X and Y by Z = X-Y.
If K is the value of a variable V, then PUSH(V) puts K onto the stack.
If K is the value on top of the stack, then POP(V) removes it from the stack and stores it in V.
Let us write predicates Encode and StackCode that emit instructions for statements and expressions.
If we have to generate code for assign(V, X), we have to emit code for the expression X that computes its value on top of the stack. Then, we can use the POP instruction to store it in V.
’rule’ Encode(assign(V,X)):
StackCode(X)
POP(V)
The predicate StackCode processes the alternatives for Expr:
’rule’ StackCode(plus(X,Y)):
StackCode(X)
StackCode(Y)
PLUS
’rule’ StackCode(minus(X,Y)):
StackCode(X)
StackCode(Y)
MINUS
’rule’ StackCode(var(V)):
PUSH(V)
For the Statement
assign("Res", plus("A", minus("B", "C")))
the generated code is
PUSH A
PUSH B
PUSH C
MINUS
PLUS
POP Res
which, when executed, results in the following stack configurations
... (A)
... (A) (B)
... (A) (B) (C)
... (A) (B-C)
... (A+(B-C))
...
-
2004-10-19
User-Mode-Linux - [虚拟机技术]
UML HOWTO:
http://user-mode-linux.sourceforge.net/UserModeLinux-HOWTO.html
http://user-mode-linux.sourceforge.net/als2000/index.html
以下是kkqq所写的分析,很不错
1.UML的启动流程
UML内核最终编译出来的是一个Linux的程序,file看一下可以知道是一个静态连接的
ELF程序。入口自然就是main(arch/um/main.c)中。
在UML真正进入kernel代码之前,值得注意的代码就是do_uml_initcalls了。
55 static __init void do_uml_initcalls(void)
56 {
57 initcall_t *call;
58
59 call = &__uml_initcall_start;
60 while (call < &__uml_initcall_end){;
61 (*call)();
62 call++;
63 }
64 }
呵呵,看过内核源代码的朋友不陌生了。还不清楚怎么回事的可以去看一下<<情景
分析>>下册P726中关于do_initcalls的介绍 :)。不过使用__uml_initcall定义的声明
过的函数也只有register_logger(arch/um/kernel/tty_log.c中)一个。
register_logger的功能就是在内核启动之前虚拟一个控制台,用来接受printk的输出。
这部分不在研究范围之内,所以就此略过。
下来就执要进入UML内核的启动了。在真实的环境下,start_kernel之前进行的体
系结构相关的初始化工作。UML也不例外。在启动之前需要进行虚拟机体系(为什么要
说虚拟机体系呢?因为UML的主要代码是在arch/um下边,也算是和x86,arm,mips并列
的一个体系吧:P)的初始化。闲话不说,看代码看看到底初始化了什么。
接着上边,do_uml_initcalls之后就是linux_main了(arch/um/kernel/um_arch.c).
305 int linux_main(int argc, char **argv)
306 {
307 unsigned long avail;
308 unsigned long virtmem_size, max_physmem;
309 unsigned int i, add;
310
311 for (i = 1; i < argc; i++){
312 if((i == 1) && (argv[i][0] == ’ ’)) continue;
313 add = 1;
314 uml_checksetup(argv[i], &add);
315 if(add) add_arg(saved_command_line, argv[i]);
316 }
317 if(have_root == 0) add_arg(saved_command_line, DEFAULT_COMMAND_LINE);
这一部分是对命令行的处理主要是把UML可执行文件的参数转化成kernel启动的参数。
这里放过。下来就是一个小高潮,就是UML中物理内存的初始化,不过还是留着等到专门
到内存管理中分析里吧。进行完物理内存的初始化,就可以认为UML内核可以通过物理地
址来存取内存了。
372 uml_postsetup();
373
374 init_task.thread.kernel_stack = (unsigned long) &init_task +
375 2 * PAGE_SIZE;
376
377 task_protections((unsigned long) &init_task);
378 os_flush_stdout();
379
380 return(CHOOSE_MODE(start_uml_tt(), start_uml_skas()));
381 }
分特,uml_postsetup又是像do_uml_initcalls一样的技巧,看的多了也觉得无聊。
不过还是效率和可扩展性至上,也不管你无聊不无聊了。实际来说uml_postsetup执行
了下边这些东西。
__uml_postsetup(read_initrd);
__uml_postsetup(make_uml_dir);
__uml_postsetup(make_umid_setup);
__uml_postsetup(create_pid_file);
从名字看上去也大概知道干什么的,只是为什么要把read_initrd移到这么靠前的
位置还有些不是很了解,不知道处于什么样的设计目的。剩下三个是软件设计相关的,
与虚拟机技术无关,略过(好像都略过了...)。
下来就是idle进程了(kernel里边命名为swapper),首先设置好init_task的堆栈,
要不到时候找不到堆栈就死翘翘了。因为init_task算是运行在虚拟机的kernel space,
所以要对这一段地址使用mprotect保护起来,要不虚拟机上用户程序就可以读取这段
地址的内容了。
arch/um/kernel/user_util.c
55 void stack_protections(unsigned long address)
56 {
57 int prot = PROT_READ | PROT_WRITE | PROT_EXEC;
58
59 if(mprotect((void *) address, page_size(), prot) < 0)
60 panic("protecting stack failed, errno = %d", errno);
61 }
下来就最后一句了
return(CHOOSE_MODE(start_uml_tt(), start_uml_skas()));
UML有两种运行模式,tt(tracing thread)和skas。历史+技术原因,技术原因就是
UML虚拟中的每一个进程对应Host OS中的一个进程,但是又不能等同的可以做Host OS
中进程中的工作,所以需要一个全局的管理进程来做这些限制,这就是tracing thread
的来历;历史原因就是tt效率太差了,所以引入了skas。google了一下也没有找到skas
是什么东西的缩写。具体这些细节就放到进程部分了。
CHOOSE_MODE就是一个宏,根据系统mode参数判断返回哪一个。这里以tt为例:
arch/um/kernel/tt/process_kern.c
472 int start_uml_tt(void)
473 {
474 void *sp;
475 int pages;
476
477 pages = (1 << CONFIG_KERNEL_STACK_ORDER) - 2;
478 sp = (void *) init_task.thread.kernel_stack + pages * PAGE_SIZE -
479 sizeof(unsigned long) -
介绍几个关于虚拟机体系结构的好站点
列出了很多VM,很全的
http://www.cs.wisc.edu/~arch/www/tools.html
http://www.cs.wisc.edu/~mscalar/simplescalar.html
http://www.cs.wisc.edu/~arch/
linux下有个UML(user-mode-linux)项目,到sourceforge找找吧
介绍一群牛人的站点,用汇编写的OS,支持M-thread,GUI,TCP/IP
http://www.menuetos.org/
最后是linux-kernel超级群牛们的照片:(ft,偶的偶像都在里面了,可惜他们不认识偶)
http://lwn.net/images/ns/ks2003-group.jpg
共1页 1






