在树莓派上安装并运行FreeBSD
FreeBSD针对树莓派有一个专门的项目在维护,叫做RaspBSD
,地址位于这里:
http://www.raspbsd.org/
这个项目是FreeBSD的commiter,Brad Davis大大在维护。基本上使用这个网站上的img,就可以直接把树莓派给跑起来了。需要注意的是,在我写这篇文章的时候,FreeBSD 12还没有release,因此在Pi3上运行版本12的时候,要注意网站文档里的说明来设置pkg库:
把img给写到tf卡里的过程在本文不详细展开了,建议大家使用Linux机器的dd
命令,直接把RaspBSD提供的img文件写入,这样保证boot分区的格式和内容都没有问题,可以一次点亮树莓派。
关于FreeBSD的基础使用,可以参考它的官方文档:
https://www.freebsd.org/docs.html
FreeBSD的官方文档质量一直很高,建议大家详细阅读。特别是看一下用户管理,以及包管理相关的内容,这些都是基础。
因为RaspBSD的初始分区只使用数G的存储空间,所以默认的分区比较小,基本是不够使的,所以启动了FreeBSD以后,第一件要做的事情是把你的TF卡的所有存储空间都交给根分区,这样就有足够容量安装额外软件了。
使用growfs
命令来做这件事情即可:
就像上面这样,完成分区容量的扩展工作。因为这个是一次性的,所以以后不需要再执行。下面是用到的命令:
service growfs onestart
分区完成后,可以看到我的存储卡的容量都被使用起来了:
接下来讲讲下载FreeBSD的内核源码和编译驱动模块的相关。
树莓派的FreeBSD源代码
树莓派是ARM架构,我使用的树莓派型号是3B,使用的源代码在这里:
http://ftp.freebsd.org/pub/FreeBSD/snapshots/arm64/aarch64/12.0-CURRENT/
把这个下载到BSD本地的/usr/src
目录:
然后把这个src.txz
解压,它会解压出一个src
目录,要把src
里面的东西放到本级/usr/src
目录下。
下面是解压后的目录:
有了这个源码目录,我们就可以编译FreeBSD的驱动模块了。关于编译FreeBSD内核和进行驱动开发,强烈建议大家阅读FreeBSD的这两个开发文档:
FreeBSD Developers’ Handbook https://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/ FreeBSD Architecture Handbook https://www.freebsd.org/doc/en/books/arch-handbook/index.html
这两篇文档里面包含很全面的,把FreeBSD当作开发平台的知识,也介绍了编译内核和Device Driver的详细方法。我们照着文档里给出的样例写个驱动:
https://www.freebsd.org/doc/en/books/arch-handbook/driverbasics.html
样例代码如下:
/*
* KLD Skeleton
* Inspired by Andrew Reiter's Daemonnews article
*/
#include <sys/types.h>
#include <sys/module.h>
#include <sys/systm.h> /* uprintf */
#include <sys/errno.h>
#include <sys/param.h> /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module initialization */
/*
* Load handler that deals with the loading and unloading of a KLD.
*/
static int
skel_loader(struct module *m, int what, void *arg)
{
int err = 0;
switch (what) {
case MOD_LOAD: /* kldload */
uprintf("Skeleton KLD loaded.\n");
break;
case MOD_UNLOAD:
uprintf("Skeleton KLD unloaded.\n");
break;
default:
err = EOPNOTSUPP;
break;
}
return(err);
}
/* Declare this module to the rest of the kernel */
static moduledata_t skel_mod = {
"skel",
skel_loader,
NULL
};
DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);
上面这个driver代码命名为skeleton.c
。这个驱动代码什么也不做,就是在load和unload的时候打印一下内核日志。下面是相关的Makefile
文件:
SRCS=skeleton.c
KMOD=skeleton
.include <bsd.kmod.mk>
上面的KMOD
和相关的include文件,都是FreeBSD的自己的源代码提供的,我们使用就好。此时可以make
来编译了:
这样,我们就编译完了这个模块。目前的问题是这个模块似乎无法正确加载:
root@bsd:/home/weli/work # kldload ./skeleton.ko
kldload: can't load ./skeleton.ko: module already loaded or in kernel
目前还不确定是我使用的问题还是树莓派平台的问题。后续如果有新发现再更新这篇文章。
以上是对FreeBSD在树莓派运行情况的一个记录,希望对大家有帮助。
- 上一篇 搞懂C语言里面的函数指针
- 下一篇 解决Git项目里面冲突的过程记录