walkie

支持MMU的Linux移植到Spartan3E 500上

0
阅读(4112)

这个想法开始于去年。那个时候尝试在V2P Pro上移植,可以通过,但是在spartan3E上移植一直没有通过。直到最近,再次分析的时候,才解决了这个问题。

软件环境EDK10.0.03

Linux host:Cent OS5

移植Linux所需支持包:petalinux

--------------

February 5th, 2009

出于对成本的考虑,很多地方都会使用到spartan系列的fpga,从edk9.2开始,提供的软核microblaze已经可以支持MMU了,所以想尝试在xup spartan3e的板子上实现它,并尝试移植Linux上去,而不再是uclinux。

因为据说支持MMU之后的MicroBlaze大小会比之前大一倍,出于对资源的考虑,外设只是单单选择了一个LED灯,以及串口用于输出。

具体的开启MicroBlaze的方式直接添加以下两个参数到mhs文件的MicroBlaze中。

PARAMETER C_USE_MMU = 3
PARAMETER C_MMU_ZONES = 2

还需要把

PARAMETER C_AREA_OPTIMIZED = 1

这个参数删掉,是不兼容的。这个参数的意思是,spartan3E因为资源有限的问题,所以其 MicroBlaze使用了面积优化。其实,有面积优化的MicroBlaze内部使用3级流水,而没有面积优化的是5级流水。

但是最后出 来的结果却让自己有点失望。因为test mem没有过。而且是很奇怪的方式:
– Entering main() –
Starting MemoryTest for DDR_SDRAM:
Running 32-bit test…PASSED!
Running 16-bit test…FAILED!
Running 8-bit test…FAILED!
– Exiting main() –

 

也 就是说,系统内部链接应该都没有问题,但是在内部优化的地方是有问题的。自己于是开始思考到底哪里有问题呢?

于是新建一个工程,其他什么都 没有变,只把 microblaze的面积优化去掉,也不开启MMU支持,然后编译,test mem的结果是一样的。所以这里有问题。难道spartan3e中其microblaze只能使用面积优化?或者说spartan3E上的 microblaze无法MMU?

 

————————
2009 年3月 24日 晚
今天再次分析这个项目的 时候,偶然的机会想要去生成软件的linker,结果跳出了这样的对话框:
WARNING:MDT -  ***********************************************************************
WARNING:MDT -  **                 MicroBlaze - microblaze_0
WARNING:MDT -  ***********************************************************************
WARNING:MDT -  ** Byte and halfword write instructions cannot be used with “spartan3e”
WARNING:MDT -  ** when data cache size is set to less than 4kB.
WARNING:MDT -  ***********************************************************************
Linker Script generated successfully.

然后发现确实为了资源的问题,自己没有给cpu设置很大的cache,按 照V2P上自己做通过的例子来说,icache和dcache都设置为2k。但 是从上面的warning明显看出来,在Spartan3E的器件上,dcache一定要设置到4k以上。

经过尝试,最后了的结果是 Byte write instructions一定要dcache为8k。icache没有改变,还是2k。这样设置之后,一切正常,Mem test过了。

– Entering main() –
Starting MemoryTest for DDR_SDRAM:
Running 32-bit test…PASSED!
Running 16-bit test…PASSED!
Running 8-bit test…PASSED!
– Exiting main() –

最后的资源为:
Design Summary Report:

Number of External IOBs                          55 out of 232    23%

Number of External Input IOBs                  3

Number of External Input IBUFs              3
Number of LOCed External Input IBUFs      3 out of 3     100%

Number of External Output IOBs                33

Number of External Output DIFFMs            1
Number of LOCed External Output DIFFMs    1 out of 1     100%

Number of External Output DIFFSs            1
Number of LOCed External Output DIFFSs    1 out of 1     100%

Number of External Output IOBs             31
Number of LOCed External Output IOBs     31 out of 31    100%

Number of External Bidir IOBs                 19

Number of External Bidir IOBs              19
Number of LOCed External Bidir IOBs      19 out of 19    100%

Number of BSCANs                          1 out of 1     100%
Number of BUFGMUXs                        5 out of 24     20%
Number of DCMs                            2 out of 4      50%
Number of MULT18X18SIOs                   3 out of 20     15%
Number of RAMB16s                        19 out of 20     95%
Number of Slices                       4564 out of 4656   98%

Number of SLICEMs                    445 out of 2328   19%

Number of LOCed Slices                   62 out of 4564    1%
Number of LOCed SLICEMs               41 out of 445     9%

 

虽然只有一个外设(8个LED小灯),但是资源还是用的很满了。让人觉得在3E 上跑带有MMU支持的系统着实感到吃力,但是成本会很低。接下来自己的系统可以在这个上面移植Linux,而不再是uclinux。

 

 

——————————
2009 年3月25日 0:25
成功移植了linux到spartan3E的板卡上

 

以下是启动信息,可以看出这个 是linux了,而不是uclinux,包括版本号,以及外设地址都重新映射到虚拟地址上了。

Linux version 2.6.20-uc0 (centos@localhost.localdomain) (gcc version 4.1.1) #2 W
ed Mar 25 00:19:41 EDT 2009
setup_cpuinfo: initialising
setup_cpuinfo: No PVR support in CPU.  Using static compile-time info
set_cpuinfo_static: Using static CPU info.
setup_memory: max_mapnr: 0×2000
setup_memory: min_low_pfn: 0×86294
setup_memory: max_low_pfn: 0×88000
On node 0 totalpages: 8192
DMA zone: 64 pages used for memmap
DMA zone: 0 pages reserved
DMA zone: 8128 pages, LIFO batch:0
Normal zone: 0 pages used for memmap
Built 1 zonelists.  Total pages: 8128
Kernel command line:
xps_intc_0_1.00.a INTC at 0×81800000 mapped to 0xFDFFF000
PID hash table entries: 128 (order: 7, 512 bytes)
xps_timer_1_1.00.a TIMER at 0×83C00000 mapped to 0xFDFFE000
disabling early console
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 29836k/32768k available
Calibrating delay loop… 49.35 BogoMIPS (lpj=246784)
Mount-cache hash table entries: 512
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
xgpio0 #0 at 0×81400000 mapped to 0xC2000000 device: 10,185 using IRQ#2
uartlite.0: ttyUL0 at MMIO 0×84000000 (irq = 3) is a uartlite
RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize
Freeing unused kernel memory: 1426k freed
Mounting proc:
Mounting var:
Populating /var:
Running local start scripts.
Mounting /etc/config:
Populating /etc/config:
flatfsd: Nonexistent or bad flatfs (0), creating new one…
flatfsd: Created 3 configuration files (117 bytes)
Mounting sysfs:
Setting hostname:

uclinux login: root
Password:

BusyBox v1.00 (2009.03.25-04:13+0000) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.

~ # ls
bin   dev   etc   home  init  lib   mnt   proc  sys   tmp   usr   var
~ #