最新日志

发表于:2008-8-8 10:33:54
标签:linux  文件共享  

0

VMware虚拟机linux和主操作系统硬盘之间的文件共享实现

VMware虚拟机linux和主操作系统硬盘之间的文件共享实现

1、启动虚拟机中的Linux
这个就不多说了,应该都会。
选择VMware菜单里的VM选项,里面有一个子项是Install VMware Tools,选定它。开始安装。

2、挂载光驱
mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom
这一步一般不用做,因为在第1步里选择Install VMware Tools之后,系统会自动挂载光驱,并打开一个窗口。当然这是在图形模式下,但如果是在文本模式下,就必须要做了。

3、解压安装文件
到cdrom目录里面解压VMware-tools*.tar.gz(根据VMware版本不同,该压缩文件名有所不同)
cp VMware-tools*.tar.gz /tmp
cd /tmp
tar xzvf VMware-tools*.tar.gz

4、安装
cd vmware-tools-distrib
在该目录里面应该有一个vmware-install.pl,按以下方法运行:
./vmware-install.pl
之后会有一些提示信息,只需要回车即可,直到提示安装成功就可以了。
VMware-tools安装成功后在/mnt目录看到一个hgfs文件夹,就表明安装成功了。

5、设置共享
接下来在VM菜单里选择setting子项,再选择Options。
在窗体的左半部分选择Shared Folders一项,如果你以前没有设置过,应该是Disabled。
在窗体的右半部分选择Enabled until next power off or suspend,选择Add,选择要与客户Linux进行共享的文件夹。

现在已经完成所有的工作了,在/mnt/hgfs下你会看到添加的文件夹。
在windows下向指定的share folders写文件,在Linux客户机里面就能够看到,同样在Linux上写文件在Windows下也能够看到,并且可以修改。

6、卸载光驱
umount /mnt/cdrom

按照以上方法通常是没有问题的,但有时可能会在安装设置完成后看不到共享的文件夹和文件,这时只要重新启动一下linux就OK。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 整理

评论(0) | 阅读(121)
发表于:2008-5-20 18:12:44
标签:单片机  AVR  

2

CVAVR用户手册_中文版

CVAVR用户手册 中文版

点击下载

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(503)
发表于:2007-12-2 20:07:37
标签:PIC  编程器  

2

自制PIC单片机编程器[转载]

自制PIC单片机编程器

欢迎来到这里,我觉得这款编程器的声望完全归功于jens madsem.当你完全沉浸在这东西的时候,你可能发现这个编程器可能是最有用的东西。总之,这里有电路图和一些技巧,是我自己做一个编程器时摘录的。

点击看大图

当你完成这款编程器制作以后,当然要找一些芯片来试一试啦,而下面的芯片的编程对这款编程器来说都支持的。PIC12C5XX,12C67X,24CXX,16C55X,16C62X,16C71,16C71X,16C8X,16F8X.

站长为了方便看,自己由画了一张图,如下:

点击看大图

印刷电路板图在这里,请参考:(电路板中红线为跳线)

点击看大图

对应的变成软件在这里可以下载:下载DOS版本的点击这里zip,下载WINDOWS版本的点击这里zip

注意:这款编程器跟电脑连接是采用25针串口的,假如你没有,可以采用9针的串口,但是接线当然需要一些改动,具体如下:
25针串口对9针串口
2------3
7------5
5------8
20-----4
4------7
现在你就可以马上做一个编程器啦

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(1) | 阅读(1478)
发表于:2007-12-1 10:18:53
标签:DS1302汇编程序  

2

ds1302汇编程序

以下是我的DS1302汇编程序

;*********************************************************************/
T_RST Bit P3.3 ;实时时钟复位线引脚
T_CLK Bit P3.4 ;实时时钟时钟线引脚
T_IO Bit P3.5 ;实时时钟数据线引脚
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
DAY EQU 33H
MONTH EQU 34H
WEEK EQU 35H
YEARL EQU 36H

;*********************************************************************/
        ORG 0000H
        LJMP START
        ORG 0060H
START:  ;CLR     T_RST
        ;CLR     T_CLK
        MOV SP,#60H                 ;修改堆栈
        MOV SECOND,#00H             ;初始时间设为12:00:00
        MOV MINUTE,#00H
        MOV HOUR,#12H
        MOV DAY,#01H                ;初始日期设为08年1月1日第一周
        MOV MONTH,#01H
        MOV WEEK,#01H
        MOV YEARL,#08H
        LCALL SETDS1302
        LCALL GET1302
        LCALL DISPLAY
MAIN: MOV R3,#25
        MOV TMOD,#01H
        MOV TH0,#70H  ;置定时器初值(定时40ms)
        MOV TL0,#00H
        SETB TR0   ;启动定时器0
LP1:    JBC TF0,LP2   ;查询计数溢出
        SJMP LP1   ;未到40 ms继续计数
LP2:    MOV TH0,#0B8H  ;重新置定时器初值
        MOV TL0,#00H
        LCALL DISPLAY                 ;显示
        DJNZ R3,LP1                 ;未到1 S继续循环
        LCALL GET1302                 ;每过1s从DS1302读取一次时间
        mov     r3,#25
        SJMP lp1

;---------------------------------------------------------------------------------------------------
;字符显示码表
DIG_CODE:
        DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H

;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;数码显示子程序
DISPLAY:
        MOV     DPTR,#DIG_CODE
;*******************************************
;显示秒
        MOV     A,SECOND
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11011111b
        LCALL   DIS_DELAY
        MOV     A,SECOND
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11101111b
        LCALL   DIS_DELAY
;*******************************************
;显示分
        MOV     A,MINUTE
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11110111b
        LCALL   DIS_DELAY
        MOV     A,MINUTE
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11111011b
        LCALL   DIS_DELAY
;*******************************************
;显示小时
        MOV     A,HOUR
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11111101b
        LCALL   DIS_DELAY
        MOV     A,HOUR
        SWAP    A
        ANL     A,#03H
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11111110b
        LCALL   DIS_DELAY

        RET
;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;显示延时5ms子程序
DIS_DELAY:
        PUSH PSW
        MOV R7,#10
D1:     MOV R6,#248
D2:     DJNZ R6,$
        DJNZ R7,D1
        POP PSW
        RET
;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;设置DS1302初始时间,并启动计时
SETDS1302:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH          ;写控制命令字
        LCALL   INPUTBYTE      
        MOV     B,#00H          ;写保护关闭
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST

        MOV     R0,#SECOND      ;内存中的时间首地址
        MOV     R1,#80H         ;DS1302中的时间首地址
        MOV     R7,#7           ;字节数

SETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1            ;写命令字
        LCALL   INPUTBYTE
        MOV     A,@R0           ;设置时间
        MOV     B,A
        LCALL   INPUTBYTE      
        INC     R0
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,SETLOOP

        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH
        LCALL   INPUTBYTE
        MOV     B,#80H          ;开写保护
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        RET

;---------------------------------------------------------------------------------------------------
;从DS1302读取时间
GET1302:
        MOV     R0,#SECOND    
        MOV     R1,#81H        ;DS1302中读时间的首地址
        MOV     R7,#7
GETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1
        LCALL   INPUTBYTE       ;写命令字
        LCALL   OUTPUTBYTE      ;读时间
        MOV     @R0,A           ;将从DS1302中读取的时间从内存中保存
        INC     R0              ;修改地址指针
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,GETLOOP
        RET

;---------------------------------------------------------------------------------------------------
;向DS1302写一个字节
INPUTBYTE:
        MOV     R4,#8
INPUTLOOP:
       
        MOV     A,B
        RRC     A
        MOV     B,A
        MOV     T_IO,C
        SETB    T_CLK
        NOP
        ;NOP
        ;NOP
        CLR     T_CLK
        DJNZ    R4,INPUTLOOP
        RET
;---------------------------------------------------------------------------------------------------
;从DS1302读一个字节
OUTPUTBYTE:
        clr     a
        clr     c
        MOV     R4,#8
OUTPUTLOOP:
       
        NOP
        ;NOP
        MOV     C,T_IO
        RRC     A
        SETB    T_CLK
        NOP
        ;NOP
        ;NOP
        CLR     T_CLK
        DJNZ    R4,OUTPUTLOOP
        RET
        end

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(5) | 阅读(1429)
发表于:2007-11-24 11:12:02
标签:单片机  DS1302  

3

DS1302应用心得

最近做了一块51单片机实验板,在写DS1302程序时,用了几天的时间终于搞定,现将心得总结如下:

一、读取时间时必须在写入命令字后的第一个下降沿开始读,否则出错;

二、DS1302的RST、CLK、IO引脚(至少IO)必须上拉4.7K的电阻,否则会出现读错误,我正是由于此原因,而花费了好几天时间,这个问题几乎在任何DS1302资料中没有提到的。(当然也有可能是我阅读资料时不仔细)

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(2) | 阅读(1759)
发表于:2007-11-22 23:16:49
标签:学习板  单片机  

9

51单片机学习实验板

最近做了一块51单片机学习实验板

大家看看

点击看大图

 

点击看大图

点击看大图

详情请到以下地址:

http://auction1.taobao.com/auction/0/item_detail-0db1-51d26e3e7e26d3ba952d710e27aba9d7.jhtml

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(39) | 阅读(3918)
发表于:2007-10-18 21:42:44
标签:ds1302  单片机  

1

时钟芯片DS1302 的程序

这是从网上无意中找到的,尽管现在还看不太明白C语言,但先放在这,等以后学完了C语言再来看

 

/*********************************************************************

公司名称:
模块名称:DS1302.c
功 能:实时时钟模块 时钟芯片型号:DS1302
说 明:
程序设计:zhaojunjie
设计时间:2002.03.02
版 本 号: 20020302
*********************************************************************/
#include

sbit T_CLK = P2^7; /*实时时钟时钟线引脚 */
sbit T_IO = P1^4; /*实时时钟数据线引脚 */
sbit T_RST = P1^5; /*实时时钟复位线引脚 */

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;


void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出?1Byte */
void W1302(uchar, uchar);
uchar R1302(uchar);
void Set1302(uchar *); /* 设置时间 */
void Bcd2asc(uchar,uchar *);
void Get1302(uchar curtime[]); /* 读取1302当前时间 */

/********************************************************************

函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************

函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************

函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************

函 数 名:BurstW1302T()
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写命令/数据
调 用:RTInputByte()
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstW1302T(uchar *pWClock)
{
uchar i;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
RTInputByte(*pWClock); /* 写1Byte数据*/
pWClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:BurstR1302T()
功 能:读取DS1302时钟数据
说 明:先写地址/命令,后读数据(时钟多字节方式)
调 用:RTInputByte() , RTOutputByte()
入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstR1302T(uchar *pRClock)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pRClock = RTOutputByte(); /* 读1Byte数据 */
pRClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:BurstW1302R()
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
调 用:RTInputByte()
入口参数:pWReg: 寄存器数据地址
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstW1302R(uchar *pWReg)
{
uchar i;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
{
RTInputByte(*pWReg); /* 写1Byte数据*/
pWReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:BurstR1302R()
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:RTInputByte() , RTOutputByte()
入口参数:pRReg: 寄存器数据地址
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstR1302R(uchar *pRReg)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xff); /* 0xff:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pRReg = RTOutputByte(); /* 读1Byte数据 */
pRReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************

函 数 名:Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:R1302()
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
/*//////////////////////////////////////////////////////////////////////*/

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(759)
发表于:2007-10-13 10:16:21
标签:单片机  加密  

1

单片机系统的动态加密技术

摘要:单片机系统产品的加密和解密技术永远是一个矛盾的统一体。然而,为了更好的保护好自己的单片机技术成果和知识产权,加大解密成本,研究新型加密技术仍是保护成果的主要手段之一。文中在讨论了传统的单处系统加密和解密技术的基础上,提出了一种实用而有效的动态加密技术的实现方案。

    关键词:单片机系统 动态加密技术 FPGA

1 概述

随着单片机技术的发展和广泛应用,许多使用单片机的高新技术产品诸如智能化仪器、仪表、小型工业控制系统等都面临着一个令人头痛的问题,那就是新产品刚一推出就被仿制和剽窃。这种现象会使产品开发商蒙受很大损失,同时也极大地挫伤了开发商的积极性。创新开发是一个公司竞争力的关键,如何保护好自己的劳动成果,除用法律手段外,在产品面市前作好加密是一个必不可少的环节。

单片机系统一般都采用MCU+EPROM模式。通常EPROM都是透明的,而采用的MCU一般有Intel公司的MCS51、52系列,Zilog公司的Z80、Z84系列、Motorola公司的MC68HC系列以及Microchip公司的PIC16C系列等。虽然有许多的MCU都带有加密位,但现在已大多能破解。因此,单靠MCU本身加密位来进行加密已极不可靠的。

2 常用加密技术分析

常用的单片机加密技术无非是硬件加密和软件加密两种。软件加密不能防止别人复制,只能增加别人解剖分析的难度,但对高手而言,这不足为虑。所以,这里讨论的加密主要是硬件加密。总结起来,主要是以下三大类。

2.1 总线乱置法

总线乱置法通常是将MCU和EPROM之间的数据线和地址线的顺序乱置。总线乱置法通常包括下面几种:

(1)将数据或地址总线的某些线位交换或求反;

(2)将数据或地址总线中的某些线进行异或。例如,D5=D5,D6=D5+6等;

(3)把(1)(2)结合起来以构成较复杂的电路;

(4)采用EPROM时,把地址总线(或数据总线)与系统程序的存储器地址(或数据)的对应关系按密钥交换。例如,用一片2764芯片存储密钥,把地址的高8位重新按密钥编码,也就是说,把原程序的页号顺序打乱;点击看大图

(5)采用GAL器件,利用GAL的加密片来对硬件电路进行加密。

2.2 RAM替代法

用电池对RAM进行掉电数据保护。即先将一系列数据写入RAM并接上电池,然后将其余的芯片插上。这样,当单片微机系统运行后,CPU首先从RAM读出数据,这些数据可以是CPU执行程序的条件判别依据,也可以是CPU将要执行的程序。如果数据正确,整个系统正常运行。反之,系统不能运行。

2.3 利用MCU本身的加密位进行加密

现在很多的MCU都带有加密位,其中最成功的加密方法是总线烧毁法,此法在AT89C51中运行用得最成功。即把单片机数据总线的特定I/O永久性地破坏,解密者即使擦除了加密位,也无法读出片内程序的正确代码。此外还有破坏EA引脚的方法。

一般来说,上述的加密方法各有优点,但都存在致命的缺点:第一种方法有两个主要缺点:一是密钥放在哪里才能不被破译;二是用仿真器很容易就能把源程序截取出来。第二种方法同样可以用仿真器把数据区调出来,另外还可以把RAM接上电池,取下来放在仿真器上读出来。第三种方法用来加密小程序是成功的,但由于总线已被破坏,因而不能再使用总线来扩展接口芯片和存储器。同时,片内存储器也不再具有重复编程特性。

3 常用解密方法分析

加密和解密长期以来就是一对矛盾。要做好加密,必须先了解现在的解密水平及手段。目前的解密手段大致可分为下面四种。

3.1 恢复加密位法

该方法能破解常规用E2COMS工艺的存储加密位芯片。它包括两个系列:

第一是MCU系列,例如MCS51系列(包括89C、97C、W78E/77E系列等)、Z84E系列、PIC16C/12C系列、MC68HC系列等。

第二是PLD,如CPLD的GAL,PALCE的16V8、20V8、22V10,Altera的EPM7032、EMP7064、EMP7128,Lattice的LSP1016、LSP1024和Atmel的ATV750/2500等。

3.2 逻辑分析法

该方法主要采用示波器、逻辑分析仪和MDU解密仪等分析工具分配一些逻辑较简单的可编程器件的逻辑功能。

3.3 仿真器软件跟踪分析法

此方法适用于破解一些未带加密功能的单片机系统(如8031,Z80等系统),而对于有加密功能的单片机系统,则可先破解其单片机的源程序,然后进行仿真分析。

3.4 芯片揭盖分析法

现在市场上十万门以下的芯片多功能通过揭盖来进行逆向分析,但此破解法费用甚高。此法适用于破解专门的ASIC芯片。

综上所述,一般芯片及常规加密手段很难实现有效加密。严格来说,要做到绝对的加密是不可能的。选好适当的芯片,采用合适的加密技术,使仿制者面对需付高昂的解密费而却步,那就意味着加密工作的成功。

4 动态加密技术原理

动态加密技术的主要思路是:在程序看到的是虚地址,而虚地址对应的存储器的实地址由CPU程序运行时通过FPGA赋予。其原理如图1所示。

举例说明,若调用子程序CALL Function时,对应于同一个子程序调用,第一次调用的是真正的Function,绝对地址可能在1000H。而在第二次调用Function时,实地址可能是2000H,功能可能根本与Function不相同,这样,只要在调用前把实地址通过软件置进去就可以了。因此可以通过连续表面调用同一个子程序Function,而实际则是分别调用几个不同的子程序来实现加密。至于虚地址映射到何处的实地址,可由编程者自己安排,故只需在调用前输出实地址的对应关系即可。这种软件与硬件相结合、虚地址与实地址相结合的加密方法使破解者即使获得源程序也极难分析出对应关系。

但这种动态加密技术也有漏动,如很难对付仿真器单步跟踪分析,因此,须做进一步个性。改进的方法之一是在FPGA内设计一个计数器,并由CPU定时清零,否则一旦超过时限,FPGA将停止一切操作而使CPU无法运行,就更不用说仿真了。改进方法之二是在FPGA内做一密,并由CPU运行足够长的时间后去访问FPGA,以读取密码并比较,若出错则由CPU破坏主内存RAM的内容,从而导致所有结果出错。用这种方法足可以对付逻辑分析仪的跟踪分析。

对于数据加密,可采用与密钥逻辑异或的方法。对于这种方法密钥以及动态加密技术的逻辑函数都必须放在一个较难破译的芯片上。鉴于对芯片解密技术的了解,笔者推荐使用Actel公司生产的42MX系列的FPGA来进行一次性编程,该芯片不可读出码点文件,市场上无法破解。同时,其资源也极为丰富,设计工具完整,且用VHDL语言极易实现各种功能。

5 结束语

随着单片机系统越来越广泛的,其安全保密问题也越来越受到重视。密码学为其提供了正确的理论基础。同时,性能优良的硬件是实现其安全保密的物质基础。二者缺一不可。加密解密长期以来就是一对矛盾,解密技术随着科学技术的发展不断创新。因此,只有对解密技术有了深刻的了解,才能做好加密工作,从在则确保产品的安全。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(529)
发表于:2007-10-13 10:13:30
标签:ISP  IAP  

1

细说ISP和IAP的区别

ISP:in system programming, 

IAP: in applicatin programming 但两者的操作方式,结果和应用场合有区别

    ISP: 用写入器将code烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫"在系统编程",即不用脱离系统; 
    IAP: 在应用编程,有芯片本身(或通过外围的芯片)可以通过一系列操作将code写入,比如一款支持Iap的单片机,内分3个程序区,1作引导程序区,2作运行程序区,3作下载区,芯片通过串口接收到下载命令,进入引导区运行引导程序,在引导程序下将new code内容下载到下载区,下载完毕并校验通过后再将下载区内容复制到2区,运行复位程序,则Iap完成; 
    应用场合: 1,ISP 程序升级需要到现场解决,不过好一点的是不必拆机器了; 2,IAP 如果有网管系统的话,用网管下载一切搞定,人不用跑来跑去, 这可能是他们的优点或应用吧。 典型IAP:IC卡电话机内含V.xx MODEM芯片,MCU自带引导区,可远程下载更新程序。
   在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。ISP的实现一般需要很少的外部电路辅助实现,而IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。
 
ISP,In System Programing 
   主要是指代芯片的烧写方式,以往写片子需要把片子拿下来,离开电路,用 编程器烧,换句话说,芯片不能不脱离应用系统进行写入。 
    ISP 主要针对这个问题,使用JTAG或者串行口(MCU 内部有Boot Loader,通过指定的方式激活之,它可以和PC或其它上位机通过串口联系,不用使单片机离开应用系统而更新内部的程序/设置)进行程序的烧写操作。
    因此,具有ISP 功能的MCU 可以不使用编程器进行编程。当然,实现ISP 可能需要一些硬件电路支持,具体的在数据手册中有说明。
    IAP,In Application Programing 
    单片机内部具有一些可擦写的非易失存储器,如Flash。在单片机独立运行时,不具备IAP 功能的单片机并不能对Flash的数据进行修改,比如,对自身的某一个模块的代码,数据进行修改。具备了IAP 功能的MCU ,能够通过使用各自公司开发的技术,对于自身进行修改。 
    简言之:ISP=>修改MCU 内部数据需要有外部介入;
     IAP=>修改MCU 内部数据可以不用外部介入。
     二者可以说是数据更新的一种实现机制。
    一般具备ISP 功能后,就不要编程器了,而是使用下载线进行编程工作。但是不是说他们就一定不支持编程器了,具体型号具体分析。是否需要仿真器进行仿真和是否具备ISPIAP没有必然的联系。只不过具备了IAP功能,可以在MCU内写入监控程序,模拟一个仿真器,当然,这个监控程序是要消耗资源的,和使用硬件的仿真器还有一定的差异。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(1) | 阅读(789)
23下一页总共 , 当前 /