随想录(定义自己的cpu和工具链)
Posted 费晓行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随想录(定义自己的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移植
以上是关于随想录(定义自己的cpu和工具链)的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II