HEX文件解析


摘要:
Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。

记录格式:
Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
: 每个Intel HEX记录都由冒号开头.
ll 是数据长度域,它代表记录当中数据字节(dd)的数量.
aaaa 是地址域,它代表记录当中数据的起始地址.
tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 – 数据记录
01 – 文件结束记录
02 – 扩展段地址记录
04 – 扩展线性地址记录
dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符.
cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足.
数据记录
Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下:
:10246200464C5549442050524F46494C4500464C33
其中:
10 是这个记录当中数据字节的数量.
2462 是数据将被下载到存储器当中的地址.
00 是记录类型(数据记录)
464C…464C是数据.
33 是这个记录的校验和.


扩展线性地址记录(HEX386)
扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下:
:02000004FFFFFC
其中:
02 是这个记录当中数据字节的数量.
0000 是地址域,对于扩展线性地址记录,这个域总是0000.
04 是记录类型 04(扩展线性地址记录)
FFFF 是地址的高16位.
FC 是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 04h + FFh + FFh).
当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址 2462
扩展线性地址记录的数据域 + FFFF
绝对存储器地址 FFFF2462


扩展段地址记录(HEX86)
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下:
:020000021200EA
其中:
02 是记录当中数据字节的数量.
0000 是地址域.对于扩展段地址记录,这个域总是0000.
02 是记录类型 02(扩展段地址记录)
1200 是地址段.
EA 是这个记录的校验和,计算方法如下:
01h + NOT(02h + 00h + 00h + 02h + 12h + 00h).
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变.
通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址.
以下的例子演示了这个过程..
来自数据记录地址域的地址 2462
扩展段地址记录数据域 + 1200
绝对存储器地址 00014462


文件结束(EOF)记录 Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下: :00000001FF 其中: 00 是记录当中数据字节的数量. 0000 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址. 01 是记录类型 01(文件结束记录)
FF 是这个记录的校验和,计算方法如下: 01h + NOT(00h + 00h + 00h + 01h).
Intel HEX文件例子: 下面是一个完整的Intel HEX文件的例子: :10001300AC12AD13AE10AF1112002F8E0E8F0F2244 :10000300E50B250DF509E50A350CF5081200132259 :03000000020023D8 :0C002300787FE4F6D8FD7581130200031D :10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016 :04003F00A42EFE22CB :00000001FF

- 阅读全文 -

JLINK修复


文章摘要:
本文介绍了一种JLink经常出现的掉固件修复的方法。


1.去ATMEL官网下载AT91-ISP下载软件AT91-ISP V1.13.exe,
安装AT91-ISP V1.13.exe(默认设置),
并在网上下载J-Link V8.bin文件

2.打开J-Link仿真器,找到三对跳线的地方,旁边分别标有ERASE、JTAGSEL、TST
3.用USB线将J-Link与PC相连,然后短接标号为ERASE的这对跳线,时间约5秒
4.断开这对跳线,再断开USB线缆
5.短接标号为TST的这对跳线,然后再连接USB线缆,大约10秒后断开USB线缆,再断开这对跳线
6.打开刚刚安装好的AT91-ISP软件(SAM-PROG v2.4),点击Browse选择J-Link V8.bin文件,并勾选文件加密选项
7.此时连接USB线缆,这时AT91-ISP软件界面的Write Flash选项有效,点击该按钮烧录软件
8.待烧录完成后,烧录软件界面的Active Connection 后面的参数会变为1
9.烧录完成,断开USB线缆 仿真器复活了
Jlink.png

此时再将J-Link连接到PC与开发板时,Windows提示找到新硬件并安装驱动成功,J-link指示灯显示闪烁,之后常绿,
打开Keil 4下载调试,OK了

注:我用的J-Link里面的主控器型号是AT91SAM7S64

相关下载


Jlink固件升级/降级:

下载并安装旧版本的jlink驱动(如常用的4.08l)
打开Jlink-Commander
输入命令:
exec invalidatefw

- 阅读全文 -

Linux内核升级


测试平台: RHEL5
内核版本: 2.6.18


1.首先去官网下载一个比较稳定的内核版本,如2.6.38.

2.将其解压到/usr/src目录下,解压后会产生一个内核目录.

3.进入内核目录.

4.配置内核

#make menuconfig ARCH=x86

友情提示:可将原生系统代码目录下的.config拷贝至新内核代码目录下做为默认的配置项。

5.执行编译

#make

6.编译模块

#make modules

实际上执行make时,已经生成了模块,此处应该可以省略.

7.执行安装

#make modules_install 
#make install

注意事项:
一定要先安装modules,在/lib/modules/目录下产生该内核模块的目录;
执行安装后,会自动将内核文件复制到/boot目录下,并更新grub;

8.重启系统,在启动界面选择新的内核.


问题及解决方案

问题1:
启动时出现严重错误,不能正常启动.
mount: could not find filesystem '/dev/root'

原因:
initrd是旧版本mkinitrd生成的,需要加入对旧版sysfs路径的支持.

解决方法:

General setup --> 
    [*] enable deprecated sysfs features to support old userspace tools

或者直接修改.config文件中的

CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y

默认该选项为not set,被注释掉的,将其改为y,重新编译,重启即可正常。
如果没有找到CONFIG_SYSFS_DEPRECATED_V2,那么只配置CONFIG_SYSFS_DEPRECATED=y
在编译的时候会提示是否编译V2选项,选择YES即可;


问题2:
新内核启动时,提示:
insmod: error inserting '/lib/dm-region-hash.ko': -1 File exists

原因:
模块被加载了两次,第2次加载时会提示文件已存在,虽然并不影响系统正常使用。

解决方法:
1.解压initrd文件

[root@bogon ~]# cp /boot/initrd-2.6.38.img /tmp
[root@bogon ~]# cd /tmp/
[root@bogon tmp]# ls
initrd-2.6.38.img
[root@bogon tmp]# mkdir newinitrd
[root@bogon tmp]# cd newinitrd/
[root@bogon newinitrd]# zcat ../initrd-2.6.38.img |cpio -i
11537 blocks(此行内容是上条命令的系统回应)
 
[root@bogon newinitrd]# ls
bin   dev   etc   init   lib   proc   sbin   sys   sysroot

2.编辑init,删掉其中重复的四行中的两行

echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko

3.重新打包initrd

[root@bogon newinitrd]# find .|cpio -c -o > ../initrd
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd > initrd.img
[root@bogon tmp]# ls
initrd-2.6.38.img    initrd    initrd.img    newinitrd

然后把重新打包好的initrd.img拷贝到/boot,并更改grub.conf里边的initrd-2.6.38.img为initrd.img就可以了。


问题3:
执行make install(安装)的时候出现了:
WARNING: No module ata_piix found

解决方案:

Device Drivers -->  
    SCSI device support --> 
        SCSCI low-level drivers --> 
        [M] Serial ATA (SATA) support --> 
            [M] Intel PIIX/ICH SATA support。

注意事项:
那两项一定要配置成为M(模块)才不会出错;


- 阅读全文 -

服务器搭建--基于vsftpd的FTP服务器


文档名称:vsftp服务器的构建
安装模式:源码安装
参考资料:鸟哥的私房菜
文档说明:此文档在本人的rhel5系统上调试通过


1.编译与安装: 编译的过程可能有 warning 的讯息,只要不是 Error 就可以不理他!
# tar -zxvf vsftpd-1.2.0.tar.gz 
# cd vsftpd-1.2.0/ 
# make
# make install 

复制配置文件
也可以放到/etc/vsftpd目录下边也可,
但要在/etc/xinetd.d/vsftp文件中设置该路径.

# cp vsftpd.conf /etc    

将 PAM 身份认证模块给他放进去系统里面!

# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd 

建立 ftp 这个使用者以及他的家目录:
若本来就存在 ftp 这个使用者,就跳过以下4步

# useradd -M ftp -d /var/ftp 
# mkdir -p /var/ftp 
# chown root:root /var/ftp 
# chmod 755 /var/ftp   

    

建立 vsftpd 需要的特殊目录(如果没有的话):

# mkdir -p /usr/share/empty 

移除:
如果想要移除 vsftp 时,可以这样做

#rm /usr/local/sbin/vsftpd 
#rm /usr/local/man/man5/vsftpd.conf.5 
#rm /usr/local/man/man8/vsftpd.8 
#rm /etc/xinetd.d/vsftpd 
#rm /etc/vsftpd.conf  

因为安装只有安装这几个档案而已!所以啦, vsftpd 真的是挺安全的说!

先确认一下 xinetd.d 有没有问题再说:

# vi /etc/xinetd.d/vsftpd 
service ftp 
{ 
    socket_type      = stream 
    wait             = no 
    user             = root 
    server           = /usr/local/sbin/vsftpd 
    log_on_success  += DURATION USERID 
    log_on_failure  += USERID 
    nice             = 10 
    disable          = no 
}

运行服务

#/etc/rc.d/init.d/xinetd restart 

登陆测试:

#ftp localhost 
ftp localhost 
Connected to localhost. 
220 (vsFTPd 1.2.0) 
530 Please login with USER and PASS. 
530 Please login with USER and PASS. 
KERBEROS_V4 rejected as an authentication type 
Name (localhost:root):

这样就表示 vsftpd 已经可以正确的启动了,不过因为我们还没有设定好vsftpd.conf
所以暂时可能无法登入!没关系,等一下设定好就 OK 了!

- 阅读全文 -

Linux防火墙使用笔记


文章摘要:本文描述了linux防火墙的命令规则说明,及简单实例。


防火墙的策略
防火墙策略一般分为两种:
一种叫“通”策略,默认大门是关着的,要定义谁能进;
一种叫“堵”策略,默认大门是开着的,要定义谁不能进;

当我们定义的策略的时候,要分别定义多条功能表,现在用的比较多个功能表有3个:

filter:过滤的功能,定义允许或者不允许的策略,一般只能做在3个链上:INPUT, FORWARD, OUTPUT;
nat:定义地址转换的策略,一般也只能做在3个链上:PREROUTING,OUTPUT,POSTROUTING;
mangle:修改报文原数据的功能,5个链都可以做:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING;

注意事项:
规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。


规则的写法:

#iptables [-t table] command [chain] [rules] [-j ACTION]

-t table:指定表名,如果省略则默认为filter表;
command:定义如何对规则进行管理(P/F/N/X/E/Z,A/I/R/D,L);
chain:指定规则链,当定义策略的时候,可以省略;
rules: 匹配标准;
-j ACTION :处理动作;


规则链 chain:

NetFilter规定了五个规则链:
1.PREROUTING (路由前);
2.INPUT (数据包流入口);
3.FORWARD (转发关卡);
4.OUTPUT(数据包出口);
5.POSTROUTING(路由后);
任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。


链管理命令(command)

-P :设置默认策略
默认策略一般只有两种 (DROP|ACCEPT)

#iptables -P INPUT DROP 

默认规则拒绝,关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。

-F: FLUSH,
清空规则链;

#iptables -t nat -F PREROUTING

清空nat表的所有链

#iptables -t nat -F 

注意事项:
清除操作会将本机防火墙的所有规则都清除,但却不会改变预设策略 (policy) ,如果你不是在本机下达清除指令时,而且默认策略为堵策略时,很可能会被挡在家门外;

-N:NEW 新建一个用户链

#iptables -N inbound_tcp_web 

-X: 用于删除用户自定义的空链;

-E:重命名用户自定义链;

#iptables -E oldname newname

-Z:将指定表中的数据包计数器和流量计数器归零;

# iptables -Z

规则管理命令(command)
-A:追加,在当前链的最后新增一个规则;
-I num : 插入,把当前规则插入为第几条;
-R num:Replays替换/修改第几条规则;
-D num:删除,明确指定删除第几条规则;
-L: 查看当前防火墙规则


规则查看命令

#iptables -L   

附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名;
-v:显示详细信息,越多越详细;
-x:在计数器上显示精确值,不做单位换算;
--line-numbers : 显示规则的行号;

-t nat:查看指定表名的规则;


匹配标准(rules)
[-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP和ICMP等以及all。
[-s 源IP地址 | 源子网]:源主机的IP地址或子网地址。
[--sport 源端口号]:数据包的IP的源端口号。
[-d目标IP地址 | 目标子网]:目标主机的IP地址或子网地址。
[--dport目标端口号]:数据包的IP的目标端口号。

-i:封包所进入的那个网络接口,例如 eth0, lo 等接口,需与 INPUT 链配合;
-o:封包所传出的那个网络接口,需与 OUTPUT 链配合;


指定动作:-j ACTION

DROP:悄悄丢弃,一般我们多用DROP来隐藏我们的身份以及链表;
REJECT:明确拒绝;
ACCEPT:明确接受;
DNAT:目标地址转换,改变数据包的目的地址;
SNAT:源地址转换,改变数据包的源地址;

custom_chain:转向一个自定义的链;
MASQUERADE:源地址伪装;
REDIRECT:重定向:主要用于实现端口重定向;
MARK:打防火墙标记的;
RETURN: 在自定义链执行完毕后使用返回,来返回原规则链。
LOG:日志记录

比如:不允许172.16.0.0/24的主机UDP协议访问

# iptables -t filter -A INPUT -s 172.16.0.0/24 -p udp --dport 53 -j DROP

-t filter 指定filter;
-A 追加规则
INPUT 指定规则链(输入)
-s 指定源地址0/24(0表示网段,24表示掩码为24个1,即255.255.255.0)
-p UDP,指定协议(不指定时为所有协议)
--dport 53 指定端口
-j DROP 执行动作丢弃;

显式拒绝:

# iptables -t filter -R INPUT 1 -s 172.16.0.0/24 -p udp --dport 53 -j REJECT

保存规则

#service iptables save 

规则将保存在/etc/sysconfig/iptables文件中,开机的时候,系统自动加载;

保存规则至文件

#iptables-save > /etc/sysconfig/iptables

从文件加载规则

#iptables-restore < /etc/sysconfig/iptables

注意事项:
通过iptables命令产生的规则会立即生效;
更新规则后必须调用保存命令,否则重启失效.


练习测试:

1.端口映射:将服务器的某个端口(8888),直接转发至LAN的某一主机上(6666)

# iptables -t nat -A PREROUTING -p all --dport 8888  -j DNAT --to 192.168.6.166:6666

2.将路由后的源地址修改为173.213.119.103

#iptables -t nat -A POSTROUTING -j SNAT --to 173.213.119.103 

3.将来自64.137.222.219的所有请求丢弃

# iptables -A INPUT -s 64.137.222.219 -j DROP

4.删除INPUT链中的第2条规则

# iptable -D INPUT 2

5.指定IP来的数据包,全部记录至日志/var/log/messages

# iptables -A INPUT -s 192.168.2.200 -j LOG

参考文档
http://www.linuxso.com/linuxpeixun/10332.html

- 阅读全文 -


Copyright©2025 春天花会开, All Rights Reserved. Email: webmaster@oroct.com