在 FPGA 上实现路由器

最近在做 FPGA 上硬件的路由器,感觉接近一个基本可用的阶段了吧,大概谈一谈做这个的思路、过程和踩过的坑。 首先,做实验用的板子是 Alinx AX7021,FPGA 是 Xilinx xc7z020clg484-2,扩展板上有 4PL+1PS 个网口和千兆 KSZ9031RNX PHY,采用的接口是 RGMII。一开始做的自然是做 RGMII,但是遇到了困难,RGMII 在千兆模式下传输的是 DDR 信号,而时序和延迟就是个比较麻烦的事情。一开始先直接拿 Xilinx 的 AXI Ethernet IP 来用,然后上 ILA 看到了 IDDR 后的信号,第一次看到了完整的以太网帧,从 Preamble 和 SFD 到最后的 FCS。于是就特别振奋,想着手写 RGMII,先做收,再做发。确实,收很容易,很快就做出来了,但是写总是出问题,当时也不懂跨时钟域的一些问题,总之各种没调出来。于是就退而求其次,选择了 Xilinx 的 Tri Mode Ethernet IP 了。 Tri Mode Ethernet IP 有很多选项,为了简单,直接采用了 AXI-Stream 的接口,不要 AXI4-Lite 什么的,都不要,因为我需要直接写剩余的逻辑。其他东西能省也都省掉了。这个 IP 确实很给力,很快就可以完成收和发的操作了,这次终于知道了怎么处理跨时钟域的问题 — XPM FIFO ASYNC,一下推进了很大的进度。 既然可以收,也可以发了,就扩展到多个网口。这个 IP 中可以选择 Shared Logic 在内部,也可以在外部,研究了一下发现,应该是一个放内部,其余选外部,然后接起来就可以了。不过目前为了简单,还是只用了俩端口。在这个基础上,就开始解析收进来的以太网帧了。 第一步自然是填 ARP 表,自然问题来了,如果多个网口同时进来数据,怎么保证 ARP 表读写的正确性?自然就想到总线上需要做仲裁,于是写了一个简单的总线仲裁,顺带学习到了 unique case(z) 和 priority case(z) 的语法。然后 ARP 表怎么实现呢,大概就是一个哈希表,然后表里维护了(IP,MAC,PORT)三元组,然后实现了一些冲突和覆盖的处理逻辑,做这些的同时也对各个模块编写相应的测试。有了 ARP 表,就可以在解析以太网帧的时候,拆解出里面的信息,然后请求 ARP 表总线,然后写入。

Read More

jiegec.xyz 域名即将停用

最早买域名的时候,买的是 jiegec.xyz,后来发现了更好的域名,于是这个老域名一直就是一个简单的网页转址。很快,它就要过期了,我也不打算续费了,大家继续用我的新域名吧。 P.S. 忽然发现我之前配的 acme.sh 没有配自动 nginx -s reload ,所以之前 ssl 证书时间凉了。

Read More

每周分享第 20 期

写到了第 20 期了!最近几期总是在咕咕。 Rust 的科学计算库 https://github.com/rust-ndarray/ndarray https://github.com/jturner314/ndarray-stats Rust Crate 生态可视化 https://rfdonnelly.github.io/crate-galaxy/ 在地址栏里做动画 http://matthewrayfield.com/articles/animating-urls-with-javascript-and-emojis/#%F0%9F%8C%92 Ruby 3 也要加类型了 https://twitter.com/darkdimius/status/1119115657776209920 verilog 的 MAC + 简易网络栈 https://github.com/alexforencich/verilog-ethernet

Read More

每周分享第 19 期

忽然想起来忘了这件事情两天。。 Pock 在 Touchbar 中显示并控制 Dock https://pock.pigigaldi.com/ MacBook touchbar+keyboard+touchpad Linux 驱动 https://github.com/roadrunner2/macbook12-spi-driver Kendryte K210 上的 GBA 模拟器 https://github.com/44670/mgba-k210 Rust 生成 PDF 文件的库 https://github.com/J-F-Liu/lopdf 中科大用 Rust 编写 FreeRTOS 的实验 https://github.com/OSH-2019/x-rust-freertos Google 发布 Cloud Code 插件,直接在 k8s 上调试运行 https://cloud.google.com/blog/products/devops-sre/announcing-cloud-code-accelerating-cloud-native-application-development 通过 libusb 跨平台的 usbip server https://github.com/jwise/pyusbip Linux 下 BCM43602 Firmware 问题的不完美解决方法 https://bugzilla.kernel.org/show_bug.cgi?id=193121 给树莓派上电的新方法 https://youtu.be/X2vF9KAEJx8 Docker 里跑 Deepin Wechat 的镜像 https://github.com/bestwu/docker-wechat.git NS Switch 的包管理器 https://switchbrew.org/wiki/Main_Page

Read More

rCore 软路由实现

最近在研究软路由在 rCore 上的实现,但限于硬件限制,目前先在虚拟机里测试。软路由大概要做这些东西: 1. 抓包,解析包里的内容 2. 查路由表,找到下一跳在哪 3. 查 ARP,知道下一跳的 MAC 地址 4. 减少 TTL,更新 IP Checksum 5. 把包发出去 第一步直接拿 smoltcp 的 Raw Socket 即可,但是目前只能抓指定 IP Protocol 的包,我用的是 ICMP,但其他的就还抓不了,需要继续改 Smoltcp 源代码。 第二步用的是之前刚修好的 treebitmap 库,它提供了路由表的查询功能,目前路由表还是写死的,之后会用已经部分实现好的 Netlink 接口读取出来。 第三步则是 ioctl 发请求,然后从 smoltcp 内部的 ARP cache 里读取。 第四步很简单,不用多说。 第五步则需要指定出端口,用了一个 index,放在一个特定的 sockaddr 中。 最后的效果就是,能双向转发 ping 通。 网络拓扑: 可以,这很玄学。 后续在想在真机上实验,但是还缺一个网卡驱动,不然就可以用神奇的办法来做这个实验了。

Read More

每周分享第 18 期

不咕不咕 Alfred pwgen workflow https://github.com/deanishe/alfred-pwgen 魔改主板,在老主板上放 16GB 内存 https://readhacker.news/s/3Zty4 Mesalink TLS 库的 Rust 实现 https://github.com/mesalock-linux/mesalink 实测可用 Rust 写的 STM32 应用 https://github.com/lupyuen/stm32-blue-pill-rust 开源 PCIe 核 https://github.com/enjoy-digital/litepcie 欢迎投稿。

Read More

高云 FPGA 踩坑

最近拿到了高云 FPGA GW2A-18 开发版,想在这上面做一些小工程。不过首先要配置好环境什么的。官方提供了 Linux 和 Windows 的两套工具,自然是拥抱 Linux 咯,但是由于官方适配的是 Redhat 系的操作系统,所以用 Debian 系的时候出现了若干问题,后面会谈到怎么解决的。 首先是官网下载了它的软件,大概有 IDE,综合器,布线器和 Programmer 四个工具,然后开始跑,发现缺少了 libcrypt.so.1.0.0。上网搜了一下解决方案,需要重新编译 openssl-1.0.0,于是下载并且编译了 openssl-1.0.0t 并且把 .so 的路径调好了,这时候就可以打开 IDE 了。然后发现需要 License,这个很简单,去官网申请一下,一天邮件就下来了。 接下来配置 License,IDE 很容易,直接选择邮件里发下来的 node-locked License 即可。不过 Synplify Pro 的 Linux 版本不支持直接单文件 node-locked 的 License,只允许跑 SCL … 不过高云也提供了 SCL 的下载,和 IDE 的 License Server 放在一起,安装完以后,在得到的 License 里加上两行: SERVER ${hostname} ${hostid} ${port} VENDER snpslmd /path/to/scl/2018.06/linux64/bin/snpslmd 然后把 $LM_LICENSE_FILE 指向这个文件路径,就可以了。这一部分感谢 @Jackey-Huo。 随手写了一个简化版的点亮数字人生(没有数码管),得到了 bistream,准备往板子里刷,然后问题出现了: ImportError: /path/to/Gowin_YunYuan_V1.9.0Beta_linux/Programmer/bin/librt.so.1: symbol __vdso_clock_gettime version GLIBC_PRIVATE not defined in file libc.

Read More

每周分享第 17 期

对不起咕咕了两天。。 关于 rel=“noopener” 的一些细节 https://mathiasbynens.github.io/rel-noopener Microsft Defender 推出 macOS 版 https://arstechnica.com/gadgets/2019/03/microsoft-ships-anti-virus-for-macos-as-windows-defender-becomes-microsoft-defender/ 基于 Docker 的快速启动在线 Linux box https://github.com/instantbox/instantbox rust 在窗口中显示 fb 的库 https://github.com/emoon/rust_minifb Vue 列表空间,为大量数据设计 https://github.com/tangbc/vue-virtual-scroll-list musl 各平台的交叉编译工具链 https://musl.cc/ 在线的 markdown 转 pdf https://md2pdf.netlify.com/ 一本关于 C64 的书 http://10print.org/ 转自 dram “haskutil tql,自动更新 import,自动 {-# LANGUAGE #-} ,自动填 hole” https://github.com/EduardSergeev/vscode-haskutil ZFS on Linux 加入 TRIM 支持 http://www.phoronix.com/scan.php?page=news_item&px=ZFS-On-Linux-TRIM-Lands 又一个体现 JS 玄学之处的网站 https://getify.github.io/coercions-grid/

Read More

静态编译 sqlite3

最近 rCore 支持了动态链接库,于是想着在测试 sqlite 的时候直接用动态的,不过出现了玄学的问题,它会访问一个不存在的地址,看代码也没看出个所以然来。所以研究了一下 sqlite 的静态编译。首先在 configure 的时候尝试了一下: $ ./configure CC=x86_64-linux-musl-gcc --disable-shared --enabled-static 发现 libsqlite 确实是静态了,但是 sqlite3 并不是。一番研究以后,发现是 libtool 的原因,只要这样编译: $ make LTLINK_EXTRAS=-all-static 就可以编译出静态的 sqlite3 : sqlite3: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped

Read More

每周分享第 16 期

继续沉迷写 OS +1 C++ 的一个比较 fancy 的 format 库 https://github.com/fmtlib/fmt Rust 的 rsync 替代品 https://github.com/wchang22/lumins VirtIO 1.1 要发布了 https://github.com/oasis-tcs/virtio-docs/commit/3b4130f3a8910dad89b8166e06e58806b9c60943 向二维码嵌入图片的工具 http://cgv.cs.nthu.edu.tw/Projects/Recreational_Graphics/Halftone_QRCodes/ Google Chrome 发出奇怪的 DNS 请求的原因 https://unix.stackexchange.com/questions/363512/chrome-dns-requests-with-random-dns-names-malware 转换 .HEIC 到 .jpg 的批量方案:alias heic="magick mogrify -monitor -format jpg *.HEIC" ref: Apple SE 以打代码来练打字的网站 https://typing.io/ VSCode 网页 server https://github.com/codercom/code-server 奇特的 Rust 网页栈实现 https://japaric.github.io/jnet/jnet/index.html H265 解析 gui https://github.com/virinext/hevcesbrowser 之前介绍过 H264 的 Awesome Rust Embedded https://github.com/rust-embedded/awesome-embedded-rust 新的 SiFive 产品 https://www.crowdsupply.com/sifive/hifive1-rev-b Wireshark 3.0.0 发布 https://www.wireshark.org/docs/relnotes/wireshark-3.0.0.html

Read More