seL4所在的git如下:
https://github.com/seL4/seL4.git
不过我们编译和运行seL4一般不只是用这个git,而是借助seL4test(seL4的测试框架):
https://github.com/seL4/sel4test.git
seL4提供了各种平台上的配置文件,也提供了用于测试seL4的app。
seL4指定了可以运行的平台,按照下面的匹配来编译它(当然还有其他的匹配)。
ARCH | PLAT | ARMV | CPU |
---|---|---|---|
arm | imx31 | armv6 | arm1136jf-s |
arm | omap3 | armv7-a | cortex-a8 |
arm | am335x | armv7-a | cortex-a8 |
ia32 | pc99 |
另外在seL4官方文档中,指出下列平台也可以运行seL4:
Intel platforms
ARM platforms
根据seL4官方文档所说明的支持平台,并参照seL4test工程中的配置文件,我们选择OdroidXU3开发板来运行seL4。下面就是OdroidXU3:
这个平台采用Samsung Exynos5422 Cortex™-A15 2.0Ghz quad core and Cortex™-A7 quad core CPUs。而exynos5422在seL4的支持序列当中。同时这个板子支持的操作系统如下:Ubuntu 14.04 + OpenGL ES + OpenCL on Kernel LTS 3.10和Android 4.4.2 on Kernel LTS 3.10。因此是一款能满足时下开发的较新的开发板。
关于它的相信信息,可以到官网上去查看:
Hardkernel Odroid
通过repo获得seL4test工程。工程根目录下有一个configs文件夹,里面就是根据具体平台所设置的配置文件,我们根据我们的板子,选择 odroidxu3_release_xml_defconfig。把它拷贝到seL4test工程根目录下。
在工程根目录下执行命令: $ make menuconfig
出现如下界面:
进入“Load an Alternate Configuration File”,输入刚才拷贝的配置文件的名字:
ok后,回到上面的界面,进入“Save an Alternate Configuration File”,直接ok。最后Exit退出menuconfig。
然后运行命令: $ make
这样你就会在images目录下发现新生成的seL4的elf格式的镜像文件:
sel4test-driver-image-arm-exynos5
编译成功!
OdroidXU3默认是eMMC启动,也就是说厂商在eMMC中烧写了u-boot和ubuntu的镜像,我们想通过SD卡启动,所以需要做:
板子上有如图所示的开关,左数第一个开关就是控制启动方式:
开关状态 | 启动方式 |
---|---|
ON | eMMC |
OFF | MICROSD |
下面制作SD卡启动盘:
下面是OdroidXU3的eMMC卡或microSD卡的分区表:
如果我们不按照平台指定的SD卡的分区表来烧写u-boot,是不能正确烧写并启动u-boot的。
OdroidXU3官方也提供了如何编译u-boot的手册和烧写u-boot的shell脚本:
xu3 building u-boot
注意:
首先确认目录 u-boot/sd_fuse/hardkernel/下是否存在 bl1.bin.HardKernel、bl2.bin.HardKernel、tzsw.bin.hardkernel,和配置文件sd_fusing.sh。 将自带的u-boot.bin.hardkernel删掉。
安装手册会在根目录编译生成u-boot/u-boot.bin,需要将它拷贝到u-boot/sd_fuse/hardkernel目录下,并重命名为u-boot.bin.hardkernel。
按照手册所说的利用sd_fusing.sh脚本将u-boot烧写到SD卡中。
我们使用minicom在xubuntu下进行串口调试(minicom配置信息采用默认即可),查看板子启动信息,如果u-boot烧写成功,启动后会出现如下界面:
进入u-boot命令模式。
接下来我们先要将上面生成的seL内核镜像放到SD卡中,我们不是用烧写u-boot时的脚本将内核也烧进SD卡中,而是要将SD卡进行分区,然后直接拷贝。
将SD卡分区需要注意以下两点:
1. 第一分区位置要从地址3072开始。原因:MBR的需要占用第一个512byte,fwbl1区需要占用1-30 共15KB,bl2区需要占用31-62 共 16KB,u-boot镜像需要占用63-718 共238KB,tzsw.bin需要占用719-1230,共256KB,u-boot的运行环境需要占用1231-1263 共16KB,u-boot的环境变量需要占用1263-3071。而第一分区存储的是SEL4的内核镜像,为保证u-boot运行,以及不干扰第一分区的读写操作,所以地址设定为3072。
2. 我们将SD卡分为两区(非必须),文件系统类型分别为FAT16(vfat)、LINUX 文件系统(ext4),第一分区应留出足够的空间存储SEL4的内核镜像,至少为3MB以上。
分好区后,将SD卡插入电脑就可以挂载识别了,我们将seL4的内核镜像sel4test-driver-image-arm-exynos5拷贝到SD卡的第一个分区中(为了下面启动seL4内核的方便,我们将内核重命名为sel4)。
大功告成!现在试一下是否可以在OdroidXU3上点亮seL4。
在u-boot命令模式下,依次输入如下命令:
这里显示的是SD卡第一个分区中存放的文件,我们的内核镜像是sel4。
其中0x48000000就是内核在内存中的指定位置。
由于我们使用的是seL4test这个官方提供的框架,编译生成的seL4内核镜像包含了一个叫seL4test-driver的app,所以运行所出的信息实际上是这个app在运行,最后会出现“All is well in the universe”。
至此我们已经在OdroidXU3上成功点亮seL4。