zl程序教程

您现在的位置是:首页 >  工具

当前栏目

随想录(定义自己的cpu和工具链)

工具CPU 自己 定义 随想录
2023-09-27 14:27:11 时间

 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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移植