为了保存flash上数据的安全,需要对kernel和文件系统进行加密。
加密采用tea加密算法。
1 在PC上对kernel的img文件进行加密,同时对密钥加密,保存在img末端。
2 hi3510通过i2c与psoc进行通信,将加密过的密钥发给posc,psoc使用保存在内部的key对密钥进行
解密,解密后发给3510.3510根据密钥对kernel img进行解密,解密后跳转。
解密阶段发生在将kernel从flash拷贝到ram;
文件系统的加密暂未实现。
注意:
1 pc上对密钥加密使用的key 和 psoc上对密钥解密使用的key 相同,事先约定好的。
2 hi3510 为小端字节序,而psoc为大端字节序。
加密的kernel实为mkimage制作的镜像;mkimage为uboot下的一个工具,主要作用是对编译的好的内核加一个image_header_t 头,指定kernel的类型、名字、以及加载地址和入口地址。其中加载地址为将kernel从flash 拷贝到ram的地址,而入口地址为uboot将cpu交给kernel的跳转地址(即kernel执行的第一条指令地址,我的理解);uboot的do_bootm/* in comm/cmd_bootm.c*/函数的主要两个工作:
1 判断image_header_t中的加载地址和do_bootm传入的参数addr是否相等;如果相等,表示现在内核已经位于image_header_t中ih_load指定的位置,不再做复制kernel的工作;如果不相等,表示kernel仍然处于flash,将kernel的数据拷贝到ih_load指定的位置(该数据没有包括image_header_t,所以mkimage时一定注意入口地址的指定)
2 调用do_bootm_linux启动kernel。
mkimage时,可以指定加载地址和入口地址相等,也可以不相等;在m161中,将入口地址指定为加载地址向后偏移64字节(image_header_t的大小)
阅读(1684) | 评论(0) | 转发(0) |