objcopy -O binary init.bin去掉就好了

在尝试构建OS的过程中,遇到启动程序运行失败的问题。检查环境配置和编译过程无误后,发现批处理文件中objcopy命令可能多余。去掉该命令后,镜像文件成功运行。尽管对objcopy的具体作用理解不透彻,但问题得到解决,显示出在操作系统开发中遇到的挑战与团队合作的信心。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天第一天着手os,中午开始看《Linux0.01内核分析与操作系统设计》,下午正好师兄在网上,他这个东西已经搞了一段时间了,对开发环境比较熟悉,于是决定冲到他那边请教请教,也免得我自己还要研究半天。

    到他那边,讲了一通环境的配置,还给了我们这两天他写的一个启动程序,于是高高兴兴的回到了寝室,搭平台、配环境,也正好用他的代码熟悉一下整个开发工具。环境配置由于暑假研究过一段时间所以很快就搞定了,然后开始将师兄的源文件重新生成镜像文件——c.img。一切看起来都很顺利,但是错误的情况出现了,当我用bochs跑得时候,运行失败了。我首先想到了,环境配置是不是有问题,但一个个试验告诉我——环境配置no problem;之后我又想到了,是不是编译程序有问题,但最后断定也是没问题的;于是我叫telescope试一下,结果问题和我一样,这下我就晕了,一样的环境配置,一样的编译程序,为什么我们这里会出错,师兄就是好的呢?

    到晚上8点,实在没办法了,只能暂时作罢,决定到综A看书,以缓解郁闷的情绪。可是心里的这块石头就是放不下,自习一点心情都没有,9点决定回寝,继续——

    到了寝室搞了一会还是没结果,这是正好室友在看电影,正郁闷中的我于是也跟着一起看了起来,片子还蛮搞笑,结束之后心情好多了,决定接着研究。这时候发现批处理文件中的有个奇怪的地方(下面加粗的语句),感觉上ld生成的已经是binary文件了,问什么还要去生成一次呢?(这里一些细节还是没弄懂),于是我将这句话去掉,重新生成新的镜像,果然运行正常了。 

nasm -f bin -o boot.bin boot.s
partcopy boot.bin 0 200 c.img 0
rem as -o head.o head.s
gcc -c head.s
gcc -Wall -O0 -nostdinc -c main.c
ld -Ttext 0 -e startup_32 -nostdlib -o init.bin head.o main.o
objcopy -O binary init.bin
partcopy init.bin 0 5c00 c.img 200

    于是马上查到objcopy的用法,但是还是有些懵懵懂懂,对于他的具体实现比较模糊。

    整件事最让人搞不懂的是,为什么师兄加上这句话生成的binary文件就运行正常,我们的就不行呢?让人百思不得其解,今天太晚了,我懒得去搞为什么了,l过两天一定和师兄好好讨论讨论。

    没想到,第一天正式着手os就遇到了这么晕的事情,可想而知要真正做成这一个项目,要走的路还很长,困难一定无数,不过我对我们这个团队有信心,对师兄有信心,对telescope有信心,当然对我自己也有信心,我们一定会成功的,加油!夜已深,今天就说到这里————小敏

### 关于GD32和ST-Link的使用教程及常见错误解决 #### 1. GD32开发环境搭建与烧写流程 对于GD32系列微控制器,通常需要完成以下工作来设置开发环境并实现程序烧写。根据已有参考资料[^2],可以按照如下方式操作: - **安装工具链** 需要下载并配置GCC编译器以及OpenOCD调试工具。这些工具可以通过官方文档或者第三方资源获取。 - **硬件连接** 将ST-Link调试器通过SWD接口连接至GD32F303的目标板上,并确保USB线缆已正确接入计算机端口。 - **编写Makefile文件** Makefile用于定义如何构建项目源码。下面是一个简单的模板例子: ```makefile CC = arm-none-eabi-gcc CFLAGS = -Wall -mcpu=cortex-m3 -mlittle-endian -mthumb -g LDFLAGS = -T linker_script.ld all: main.bin main.o: main.c $(CC) $(CFLAGS) -c $< -o $@ main.elf: main.o $(CC) $(LDFLAGS) $^ -o $@ main.bin: main.elf arm-none-eabi-objcopy -O binary $< $@ ``` - **利用OpenOCD加载固件** OpenOCD是一款开源的片上调试软件,能够配合GDB一起使用来进行在线调试或直接刷入二进制镜像。 ```bash openocd -f interface/stlink-v2.cfg -f target/gd32fxxx.cfg \ -c "init" -c "reset init" -c "flash write_image erase main.bin 0x08000000" -c "verify_image main.bin 0x08000000" ``` 上述命令会初始化设备、擦除闪存区域并将指定路径下的`main.bin`文件上传到内存地址空间起点处(即ROM基址),最后验证传输过程是否无误。 --- #### 2. 常见问题排查指南 ##### (a). ST-Link指示灯异常解读 当遇到某些特定情况时,可通过观察ST-Link上的LED颜色变化初步判断当前状况。例如: - 如果发现红绿交替快速闪烁,则表明存在活跃的数据交互活动;反之若是持续亮起单一色彩则可能意味着某种固定的状态达成——比如纯绿色表示最近一次通讯顺利完成而橙黄色却暗示着目标器件未能被识别成功等问题发生概率较大一些[^4]。 ##### (b). NRF52832兼容性注意事项 尽管本主题聚焦于GD32平台,但仍有必要提及有关其他型号处理器可能出现的相关现象作为补充说明材料之一部分。例如,在尝试运用较新版本JLink驱动程序针对Nordic Semiconductor出品之nRF52系列单片机执行编程任务期间偶尔会出现难以预料的技术障碍情形下建议查阅对应解决方案链接内容加以应对处理措施[^1]. ##### (c). 刷卡器类外设适配案例分享 另外值得一提的是关于基于STM32架构设计而成的一套专用型IC卡片阅读装置实例描述片段也值得借鉴参考价值所在之处在于其具体实践过程中涉及到串行通信参数设定环节等方面的知识要点介绍可供同类应用场景迁移改造时予以考虑采纳实施策略方向指导作用明显可见一斑而已[^3]. --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值