`
spartan1
  • 浏览: 365246 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ucore-project1: boot(2),去掉sign

 
阅读更多

sign主要的作用是创建一个启动扇区,在第511、512个字节上分别写上0x55和0xAA。为此需要为编译系统专门写这么一个四五十行的C工具。

在shell里很难处理二进制数据,大部分处理二进制数据的都是怎么将二进制数据以ascii的形式展示出来,包括od,objdump等等,而反过来处理的很少

还好有xxd,xxd正常也是展示二进制数据,但xxd –r可以将展示的十六进制ascii数据再反向回去,这个功能非常适合替换sign

xxd有两个文件参数,第一个是输入文件名,第二个是输出文件名,第一个可以用“-”代替表示标准输入,第二个可以用“-”代替表示标准输出,如果都没有的话表示从标准输入读,输出到标准输出。输出文件参数对于xxd –r非常有用,因为xxd –r不会把输出文件清空后重新生成,而是在原先已有文件上进行修改,这样xxd –r可以用来给已经存在的输出文件打补丁,sign程序的功能用一句话就可以代替:

echo “1FE:55AA” | xxd –r – bootblock

搞定。

linux下的xxd使用lazy parser来解析器选项,因此在使用其选项时有点诡异,单字母选项不能合起来用:
1. xxd –p可以生成plain的十六进制ascii展示形式,没有前面的行号和后面的ascii展示,但xxd –pr效果和xxd –p是一样的,而xxd –rp效果和xxd –r是一样的,要同时使用这两个选项,需要使用xxd –r –p或xxd –p –r,必须分开。

2. xxd –r永远不会出错,有处理不了的东西直接扔掉:echo 1234 | xxd –rp,但echo 0x1234就可以展示。原因,xxd –rp实际上就等于xxd –r,要求带行号的数据展示出来。正常带行号的格式是“0000008: 1234”这样子,但实际上,xxd只要找到第一个非16禁止字符(这里是”0x”中的”x”),就会当做行号分隔符,后面的数据当做hex来处理。所以echo 0j1234 | xxd –r效果和echo 0x1234 | xxd –r是一样的。
3. 而因为lazy parser的缘故,echo 1234 | xxd –pr,实际上展示了xxd –p的能力,根本没有-r
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics