随想录(定义自己的cpu和工具链)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
很早就看过cpu的书,对cpu的实现还是有很大兴趣的。当时就在想,如果有一套自己的cpu,需要做哪些工作呢?带着这个疑问,搜索了一些资料,并且看了一些代码,还是有不少收获的。特别是在github上面看到了https://github.com/cassuto的工作,满震撼的。
1、定义自己的指令集
这个是基础,没有自己的指令集,一切都是空谈。目前最火的riscv可以拿来练手,没有侵权这方面的烦恼。
2、移植binutils
binutils里面有很多的工具,主要的是as和ld。前者负责将as编译成*.o文件,后者负责将*.o连接成elf文件。其他比较重要的还要readelf、objcopy、objdump,而objcopy就负责将elf转变成bin文件使用。
3、cpu仿真器
仿真器是验证cpu比较好的一个方法。因为你的cpu是独一份,所以仿真器的工作基本上只能靠你自己开发了。
4、gcc移植
有了binutils是远远不够的,我们最终还是希望用c语言开发,对gcc进行后端移植是十分必要的。至此,我们可以用gcc+binutils开发类似于mcu的开发程序了。gcc的主要作用就是将c变成汇编文件。
5、uboot & linux kernel移植
从生态链的考虑,使linux运行在我们设计的cpu上是十分必要的。暂时,你也不能指望你的cpu可以运行windows系统。linux基本上是唯一的选择。接入了linux,就相当于接入了整个linux生态链。所以,我们需要手动添加代码,使得linux可以支持我们的cpu。
uboot移植主要是为了启动linux的需要,这部分工作不多。
6、uclibc移植
linux上面的程序依赖于libc库,因此有必要移植一个uclibc,这样就可以编译busybox代码了。
7、openjdk等移植
如果我们希望cpu用在更多的领域,那么有必要在openjdk上对我们的cpu进行适配,毕竟目前使用java的开发者还是非常多的。
其他的移植还有.NET Core等第三方软件,这部分其实和指令集本身关系不大,主要还是为了融入某一个技术生态。
8、RTL的编写
实际上上面第三项工作完成后,就可以开始RTL的设计,或者可以一起做。用fpga和仿真器一起验证指令设计有没有问题。
9、soc的编写
单个cpu的功能总是有限的,因此有必要编写一个最小Soc,包括cpu、gpio、uart、debug、spi、timer、sram的添加。
10、linux运行在fpga上面
等到soc没有问题之后,就可以将之前移植好的linux转到fpga上面,这个时候应该有大量的问题需要处理,比如功能、稳定性和性能。当然在此之前,可以先跑一个rtos试试水。
11、其他需要移植或者修改的部分
软件部分,
a)gdb移植
b)gdbserver移植
c)libpthread移植
硬件部分,
a)sdram移植
b)nandflash移植
相关文章
- Python3+PyQT5+Pyserial 实现简单的串口工具
- CoreFreq:一款监控CPU的强大专业工具
- RDB分析工具redis-rdb-tools官方文档翻译
- C++:Boost库概述【Boost是一个“准”标准库,STL的扩充】【和STL相似,都是利用泛型让复用达到最大化;Boost更加实用】【STL集中在算法部分;Boost包含不少工具类,完成具体工作】
- 利用Collections工具类将集合随机打乱
- Spring、Spring Boot和TestNG测试指南 - 使用Spring Boot Testing工具
- android如何使用自己定义JNI接口,以及NDK环境建设和使用的工具。
- 14 个 Linux 下 CPU 监控工具
- Chrome 开发者工具中的命令菜单
- 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )
- cpufetch – 查询cpu架构信息的工具