飞腾派的 FreeBSD 体验

省流总结:使用 Phytium-FreeBSD-SDK 在飞腾派体验 FreeBSD 系统

Phytium-FreeBSD-SDK 项目地址
https://gitee.com/phytium_embedded/phytium-freebsd-sdk

FreeBSD 长期以来被视为操作系统领域的“隐形冠军”,尽管与 Linux 相比,其社区规模和应用生态存在一定差距,但 FreeBSD 在生产力和学习价值方面依然具有独特的优势。

哪些厂商在使用 FreeBSD

  1. 苹果:Darwin 操作系统的核心基于 FreeBSD
  2. 索尼:PS4/PS5 的操作系统基于 FreeBSD
  3. 任天堂:Wii U 的操作系统基于 FreeBSD,Switch 移植了 FreeBSD 网络和文件系统
  4. 威联通:QNAP NAS 设备的操作系统基于 FreeBSD
  5. Beckhoff:TwinCAT/BSD 采用 FreeBSD 操作系统的工业实时操作平台
  6. 腾讯:开源的 f-stack/z-stack 基于 FreeBSD 的网络栈,通过 DPDK
  7. 华为:开源的 liteos-A 采用 FreeBSD 的 USB 栈
  8. 乐鑫 esp32:闭源使用 FreeBSD 的 ieee802.11 无线栈
  9. 此外,BSDRP 、pfSense、m0n0wall、FreeNAS 等开源项目(路由器、防火墙,VPN、NAS 方面)也基于 FreeBSD

为什么要用 FreeBSD

FreeBSD 提供了完整系统,包括内核、构建工具和用户态应用,拥有强大的网络栈和 ZFS 文件系统,并且使用比 GPL 更宽松的 BSD 开源协议,允许用户修改后进行闭源发布,因此,许多商用操作系统采用 FreeBSD 作为基线,或移植其驱动库、协议栈组件

生产力价值

  1. 网络性能
    FreeBSD 的 TCP/IP 协议栈经过高度优化,高效且稳定,是许多网络服务提供商中心节点服务器的首选。例如,Netflix 和 WhatsApp 都曾依赖 FreeBSD 处理高并发网络流量。

  2. ZFS 文件系统
    FreeBSD 集成的 ZFS 文件系统以其强大的数据完整性、快照功能和存储池管理而闻名,成为许多 NAS 服务器的首选系统。

  3. 嵌入式领域
    FreeBSD 全面支持 ARM64 和 RISC-V 架构,驱动支持能力仅次于 Linux,使其在嵌入式系统中占据重要地位。

学习价值

  1. 技术源头
    FreeBSD 为许多操作系统提供了技术参考(比如 RTEMS 和 QNX),其内核驱动框架和系统设计相比 Linux 更加统一且易于理解。

  2. 完整系统
    与 Linux 不同,FreeBSD 不仅仅是一个内核,而是一个包含应用和工具的完整系统,是深入理解计算机体系架构和操作系统原理的理想跳板。


嵌入式开发的挑战

长期以来,FreeBSD 在嵌入式领域的支持相对有限。开发者通常只能在虚拟机或 x86 PC 上体验 FreeBSD,而在类似树莓派的单板计算机(SBC)上运行 FreeBSD 则面临诸多限制,例如:

  • 设备树需要从 Linux 移植。
  • 构建过程无法在非 FreeBSD 系统的个人 PC 上完成。

社区创新与突破

感谢社区开发者们的努力,CheriBSD 项目为 FreeBSD 的构建和移植带来了新的可能性。通过 CheriBuild 项目,开发者可以在 Ubuntu/Debian 环境下交叉构建 FreeBSD 的完整系统,包括内核、rootfs 和基本应用程序。Phytium-FreeBSD-SDK 项目在 CheriBuild 工作的基础上,支持飞腾派/飞腾 E2000等嵌入式开发板,使开发者能够轻松体验 FreeBSD 的完整功能。


功能支持与展望

借助飞腾派和 Phytium-FreeBSD-SDK,开发者可以在嵌入式开发板上 100% 通过源码构建专属的 FreeBSD 系统。这不仅是一个内核,更是一个完整的操作系统,支持以下功能:

  • 内核定制与优化。
  • 完整的 rootfs 构建。
  • 基本应用程序的集成。

为嵌入式爱好者提供了更广阔的实验平台,下面一起来看看支持了哪些功能。

外设支持平台支持情况移植到 RTEMS
UART(PL011)E2000
PhytiumPI
支持
SDMMCE2000
PhytiumPI
支持
PCIeE2000
PhytiumPI
支持
SATAE2000支持
SATA(PCIe)E2000支持
USB-XHCIE2000
PhytiumPI
支持
USB-XHCI(PCIe)E2000支持
NVMe(PCIe)E2000
PhytiumPI
支持
Network(E1000 PCIe)E2000支持
WLAN(RTL8188EU USB)E2000
PhytiumPI
支持
WLAN(RTL8852BE PCIe)E2000支持(使用 UEFI 固件)

飞腾派上体验 FreeBSD

首先下载前文中的 Phytium-FreeBSD-SDK,然后按文档在 x86 Ubuntu 上运行 `make bsdimage` 编译 FreeBSD 系统镜像

从 UBOOT 下启动 FreeBSD

setenv bootcmd 'nvme dev 0; fatload nvme 0:1 0x90100000 /efi/boot/bootaa64.efi;fatload nvme 0:1 0xa0000000 /efi/boot/phytiumpi_firefly.dtb;bootefi 0x90100000 0xa0000000'

saveenv
boot

查看启动中识别的设备,首先是至关重要的调试串口

GDB: debug ports: uart
GDB: current port: uart
simplebus0: <uart@2800c000> mem 0x2800c000-0x2800cfff irq 12 disabled compat arm,pl011 (no driver attached)
uart0: <PrimeCell UART (PL011)> mem 0x2800d000-0x2800dfff irq 13 on simplebus0
uart0: console (115200,n,8,1)
uart0: fast interrupt
uart0: PPS capture mode: DCD
uart1: <PrimeCell UART (PL011)> mem 0x2800e000-0x2800efff irq 14 on simplebus0
uart1: debug port (115200,n,8,1)
uart1: fast interrupt
uart1: PPS capture mode: DCD

然后 是PCIe 设备,我们挂载的 M.2 SSD 识别出来了,它后面作为 FreeBSD 的 rootfs 存储器使用

pcib0: <Generic PCI host controller> mem 0x40000000-0x4fffffff on simplebus0
pcib0: parsing FDT for ECAM0:
pcib0:  PCI addr: 0x0, CPU addr: 0x50000000, Size: 0xf00000
pcib0:  PCI addr: 0x58000000, CPU addr: 0x58000000, Size: 0x28000000
pcib0:  PCI addr: 0x1000000000, CPU addr: 0x1000000000, Size: 0x1000000000
...
pcib0: rman_reserve_resource: start=0x1000100000, end=0x10001fffff, count=0x100000
        secbus=2, subbus=2
pcib1: <PCI-PCI bridge> mem 0x1000000000-0x10000fffff irq 40 at device 1.0 on pci0
pcib0: rman_reserve_resource: start=0x58000000, end=0x580fffff, count=0x100000
pcib1:   domain            0
pcib1:   secondary bus     1
pcib1:   subordinate bus   1
pcib1:   memory decode     0x58000000-0x580fffff
pci1: <PCI bus> on pcib1
pcib1: allocated bus range (1-1) for rid 0 of pci1
pci1: domain=0, physical bus=1
found-> vendor=0x144d, dev=0xa809, revid=0x00
        domain=0, bus=1, slot=0, func=0
        class=01-08-02, hdrtype=0x00, mfdev=0
        cmdreg=0x0006, statreg=0x0010, cachelnsz=8 (dwords)
        lattimer=0x00 (0 ns), mingnt=0x00 (0 ns), maxlat=0x00 (0 ns)
        intpin=a, irq=255
        powerspec 3  supports D0 D3  current D0
        MSI supports 32 messages, 64 bit
        MSI-X supports 13 messages in map 0x10
        map[10]: type Memory, range 64, base 0x58000000, size 14, enabled
pcib1: allocated memory range (0x58000000-0x58003fff) for rid 10 of pci0:1:0:0
nvme0: <Generic NVMe Device> mem 0x58000000-0x58003fff at device 0.0 on pci1
nvme0: attempting to allocate 5 MSI-X vectors (13 supported)
nvme0: using IRQs 42-46 for MSI-X
nvme0: CapLo: 0x3c033fff: MQES 16383, CQR, AMS WRRwUPC, TO 60
nvme0: CapHi: 0x00000030: DSTRD 0, NSSRS, CSS 1, CPS 0, MPSMIN 0, MPSMAX 0
nvme0: Version: 0x00010400: 1.4

在 USB 总线上,我们的无线网卡 RTL8188EU 也识别出来了

root@phytium:~ # dmesg | grep WLAN
ugen0.2: <Realtek 802.11n WLAN NIC> at usbus0
rtwn0: <Realtek 802.11n WLAN NIC, class 0/0, rev 2.00/0.00, addr 1> on usbus0

root@phytium:~ # lsusb
Bus /dev/usb Device /dev/ugen0.2: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
Bus /dev/usb Device /dev/ugen1.1: ID 0000:0000  
Bus /dev/usb Device /dev/ugen0.1: ID 0000:0000 

最后,飞腾派上的 SD 卡也识别出来了

root@phytium:~ # dmesg | grep mmc0                                                                 
mmc0: <MMC/SD bus> on phytium_sdif0
mmc0: Probing bus
mmc0: SD 2.0 interface conditions: OK
mmc0: SD probe: failed
mmc0: MMC probe: OK (OCR: 0x00ff8080)
mmc0: Current OCR: 0x00ff8080
mmc0: Probing cards
mmc0: New card detected (CID 13014e47314d31354c102129ca5c597b)
mmc0: New card detected (CSD d07f01328f5903ffc003ffef8e40007f)
mmc0: Card at relative address 0x0002 added:
mmc0:  card: MMCHC G1M15L 1.0 SN 2129CA5C MFG 05/2022 by 19 0x004e
mmc0:  quirks: 0
mmc0:  bus: 8bit, 200MHz (HS400 with enhanced strobe timing)
mmc0:  memory: 62160896 blocks, erase sector 1024 blocks
mmc0: setting transfer rate to 52.000MHz (HS200 timing)
mmcsd0: 32GB <MMCHC G1M15L 1.0 SN 2129CA5C MFG 05/2022 by 19 0x004e> at mmc0 52.0MHz/8bit/1016-block
root@phytium:~ # dmesg | grep mmcsd0
mmcsd0: taking advantage of TRIM
mmcsd0: cache size 2048KB
mmcsd0: 32GB <MMCHC G1M15L 1.0 SN 2129CA5C MFG 05/2022 by 19 0x004e> at mmc0 52.0MHz/8bit/1016-block
mmcsd0boot0: 33MB partition 1 at mmcsd0
mmcsd0boot1: 33MB partition 2 at mmcsd0
mmcsd0rpmb: 4MB partition 3 at mmcsd0
GEOM: new disk mmcsd0
GEOM: new disk mmcsd0boot0
GEOM: new disk mmcsd0boot1
GEOM: mmcsd0: the primary GPT table is corrupt or invalid.
GEOM: mmcsd0: using the secondary instead -- recovery strongly advised.
root@phytium:~ # 

最后进入系统,通过无线网卡联网,顺利联网,开始工作

root@phytium:~ # ping -S 192.168.50.17 www.baidu.com
PING www.a.shifen.com (153.3.238.127) from 192.168.50.17: 56 data bytes
64 bytes from 153.3.238.127: icmp_seq=0 ttl=53 time=52.003 ms
64 bytes from 153.3.238.127: icmp_seq=1 ttl=53 time=96.695 ms
64 bytes from 153.3.238.127: icmp_seq=2 ttl=53 time=167.337 ms
64 bytes from 153.3.238.127: icmp_seq=3 ttl=53 time=95.593 ms
64 bytes from 153.3.238.127: icmp_seq=4 ttl=53 time=76.438 ms

 `pkg install` 安装软件,

最后看一看系统情况,飞腾派的 4 个核心都 up 起来了,由于 bootefi 存在的问题,只识别了 2G 内存,暂时不影响,rootfs / 放在 minipcie 扩的 M.2 SSD 上,还有一张 sd 卡可以作为存储介质

可以了,目前这些功能可以支撑起基本的嵌入式系统了,后续更多功能等待继续更新,或者去 Phytium-FreeBSD-SDK 仓库提 issue 催更,ˋ(°▽、°) (ˊ▽ˋ*) \___/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值