高云 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 ,准备往板子里刷,然后问题出现了:

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.

Read More

交叉编译 Nginx 1.14.2 到 RISC-V

最近又把一定的精力放到了 RISC-V 64 上的 rCore 用户态程序的支持上,同时也借到了 HiFive Unleashed 板子,所以有真实硬件可以拿来跑了。在这之前先在 QEMU 上把能跑的都跑起来。 由于 rCore 对 glibc 的支持一直有问题,RISC-V 也不例外,所以还是选择用 musl 来做这件事情。一般搜索,终于找到了 Linux 下能用的 musl-riscv-toolchain 。编译好工具链以后,很多需要 libc 的用户态都能跑了,于是想着试一下 nginx 的编译。试着编译了一下,遇到了各种问题,最后搜到了交叉编译Hi3536上面使用的nginx,里面的方法解决了这个问题。最后总结出了这样的 patch : diff --git a/nginx-1.14.2/auto/cc/name b/nginx-1.14.2/auto/cc/name index ded93f5..d6ab27a 100644 --- a/nginx-1.14.2/auto/cc/name +++ b/nginx-1.14.2/auto/cc/name @@ -7,7 +7,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then ngx_feature="C compiler" ngx_feature_name= - ngx_feature_run=yes + ngx_feature_run=no ngx_feature_incs= ngx_feature_path= ngx_feature_libs= diff --git a/nginx-1.14.2/auto/lib/openssl/make b/nginx-1.14.2/auto/lib/openssl/make index 126a238..7a0e768 100644 --- a/nginx-1.14.2/auto/lib/openssl/make +++ b/nginx-1.

Read More

在古老的 OS 上运行一个干净的新的环境

由于某些课程的原因,需要在一个 CentOS 7 上跑一些编译和运行代码。看到这么古老的软件,我心想不行,肯定要找新一些的软件来用。首先想到的是 tmux ,于是按照网上的脚本 很快装了一个 tmux 2.8 版本,果然好了很多。但是常用的很多软件依然是个问题。试了一下最近比较新的 code-server ,因为ABI问题跑不起来。 于是开始想玩骚操作。首先想到的是 Gentoo Prefix ,不过既然是别人的机器,还是算了。又找了 fakeroot 配合 alpine rootfs 的方案,但编译不过,估计是内核版本问题。又试了一下 fakechroot ,但它需要配合 fakeroot 使用,这就凉了。 然后又找了一些替代方案。一是 uchroot ,但由于 CMake 版本太老也编译不过。最后发现了 PRoot ,直接提供 prebuilt 然后很容易就可以跑起来: $ ./proot -b /proc -b /dev -r $CHROOT /bin/busybox sh 于是就进到了 alpine 的 rootfs 中,下载地址。进去以后发现没有编辑器,于是出来把 apk 的源改了,加了 resolv.conf ,就成功地安装了很多很新的软件了。

Read More

每周分享第 15 期

继续沉迷写 OS 嵌入 graphics for rust 可以绘制 bmp 了 https://wapl.es/rust/2019/03/04/embedded-graphics-0.4.7-bmp-support.html rustup component history 方便 nightly 日期选择 https://rust-lang.github.io/rustup-components-history/index.html grpcurl 用于 grpc 调试 https://github.com/fullstorydev/grpcurl grafana 6.0 is out http://docs.grafana.org/guides/whats-new-in-v6-0/ 康哥推荐的写论文工具: https://github.com/stsewd/ieee-pandoc-template

Read More

每周分享第 14 期

最近沉迷写 OS ,没怎么搜罗新的东西( 用 Docker 做交叉编译 https://github.com/dockcross/dockcross#dockcross tar inplace extraction 有意思的思路 https://gitlab.com/antonok/taro los 16.0 发布 基于 Android Pie https://lineageos.org/Changelog-22/ Rust 1.33.0 Pin 进入 stable https://blog.rust-lang.org/2019/02/28/Rust-1.33.0.html Rust 用于编写 cli 软件的工具库 https://rust-lang-nursery.github.io/cli-wg/index.html 自动使用 CI 发布二进制 prebuilt 的模板 https://github.com/japaric/trust 转换 gif 到 xlsx 很神奇 https://github.com/pugwonk/gif2xlsx/blob/master/README.md Go REPL https://github.com/cosmos72/gomacro 基于区块链的论坛海星 其实是区块链数据库 https://github.com/CovenantSQL/CovenantForum Rime emoji 嵌入输入法 https://github.com/rime/rime-emoji 一个神奇的数据库 https://github.com/mit-pdos/noria 一个讲内核的 gitbook https://richardweiyang.gitbooks.io/kernel-exploring/ 用 React 写桌面控件 http://tracesof.net/uebersicht/

Read More

在 rCore 上运行 nginx

阿 西 吧 nginx 终于能在 rCore 上跑了 orrrrrrrz 通过这半个多月来的大量开发,我和王润基 @wangrunji0408 学长算是终于完成了第一个 milestone:跑起来一个 nginx 。遇到了很多困难,大概有这些: syscall 实现不全。各种方面都缺,然后 nginx 在编译的时候又检测到比较新的 OS 版本,所以很多 syscall 都用了新的来替代老的,例如 readv/writev pread/pwrite accept4 等等,所以这方面做了一些工作。另外,还有很多新的 syscall 进来,太多了我就不细说了,基本上一个commit做一点一个commit做一点这个样子。 nginx 用到了 SSE 的寄存器 xmm ,但是之前是没有开的。所以把 sse 打开,然后切换上下文的时候把 sse 通过 fxsave 保存和 fxrstor 恢复(有意思的是,as居然不认这俩,只好手动写字节码),然后为了 16bit 的对齐又写了几行汇编代码。这块问题不大,今天一会就搞定了。但是如果要性能更高一些的话,可能需要在第一次使用 xmm 的时候再开始保存,大概就是加一个bit的事情。 文件系统有点崩。实现还是有很多 BUG ,表现就是需要经常重新 mksfs 一下,再重启加载完好的 fs ,有时候强制关机一下就又崩了。 内存管理做了一些改变。为了实现更加完整的 mmap mumap 和 mprotect ,又发现了一些新的 BUG 在里面,然后慢慢修复了。就是实现的有点粗暴。 死锁问题。这个其实现在还会出现,只是还没调出来,也不会百分百出现。我们计划在锁上面做一些死锁检测,例如记住是谁上锁的,等等。现在就遇到一个很玄学的死锁问题。 然后代码也是一边在写一边在重构吧,很多地方现在都写得很粗暴,FIXME和TODO留了很多,很多地方也写得不够优雅。以后再慢慢重构+优化吧。 截图留念: 再往前的话,还有很多小的问题,例如网卡的中断启用了但没有改 mask ,所以啥也没收到,靠 QEMU Tracing 找到问题。还有一个很有意思的现象,就是如果 elf 的 program header 没有 phdr 这个项的时候,我们发现,可以通过第一个load(如果加载了完整的 elf 头的话),我们可以从这里推断出 phdr 的地址(load的虚拟地址加偏移),然后丢到 auxv 里去让 musl 配置 tls。总之这些都解决了。也不用去考虑兼容 litc 了,已经全部向 linux 靠拢了,稳。

Read More

实现网络的 syscall

有了网卡驱动,接下来要做的就做网络的 syscall 了。为了测试,首先在 busybox 里找可以用来测试的 applet ,由于没有实现 poll ,所以 nc telnet 啥的都用不了。最后选择到了 ping 和 pscan 上。 ping大家都很了解,pscan就是一个扫端口的,对一个ip连续的若干个端口发起 tcp 请求。这就要求我提供 raw socket和tcp socket状态的支持。由于网络栈本身是异步的,但 read connect 这些函数在不调 setsockopt 的前提下又是同步的,然而现在又没有 signal 可以用,要是 block 了就再也出不来了。于是就采用了 Condvar 的办法,拿一个全局的条件变量,当 poll 不到内容的时候,先把线程拿掉,等到网络栈更新了,再恢复。这样至少不会把 cpu 也 block 住。 然后就是把 socket 部分改了又改吧,数据结构的设计改了几次,为了解决 ownership 问题上锁啊也有点多,但是也更细了,虽然实际上可能没有必要,因为上面还有大的锁。不过性能还不是现在考虑的重点,关键还要先把 send recv accept bind listen 啥的写得差不多了,然后还有把 poll/select 实现了,这个很关键。 中间遇到的最大的坑就是,接收 pci interrupt 的时候总是啥也没有,然后靠万能的 qemu trace 发现,原来是 mask 掉了,所以啥也收不了,然后最后的解决方案就是用 MSI Interrupt #55 搞定了这个问题。至于为啥是 55 呢,因为 23 + 32 = 55 啊(误

Read More