(评论)
(comments)

原始链接: https://news.ycombinator.com/item?id=43950709

Hacker News 上的一篇讨论帖关注 NetBSD 对旧款 32 位 x86 硬件的持续支持,重点突出了其内核数学模拟功能。这与逐渐淘汰或面临 i386 支持挑战的 Linux 和 OpenBSD 形成对比(尤其是在 32 位 OpenBSD 上的 Rust 编译)。NetBSD 的交叉编译能力避免了这个问题。 评论者们讨论了在旧硬件上运行现代软件的实用性,并举例说明了从古老系统中恢复数据的案例。一位用户指出,NetBSD 的浮点模拟代码类似于 Robert F. Illyes 的 Forth 83 实现。他们还提到,对于资源有限的系统,Forth 提倡使用定点算术作为浮点算术的替代方案。

相关文章
  • (评论) 2025-05-08
  • (评论) 2025-05-11
  • (评论) 2025-05-11
  • 2025-05-11
  • (评论) 2025-05-11

  • 原文
    Hacker News new | past | comments | ask | show | jobs | submit login
    NetBSD 10.x Kernel Math_emulation (mezzantrop.wordpress.com)
    52 points by jaypatelani 23 hours ago | hide | past | favorite | 6 comments










    I saw this a few days ago, nice, especially since Linux is dropping support for older hardware. Even OpenBSD is slowly limiting i386 (32bit) support:

    https://www.openbsd.org/i386.html

    NetBSD so far has no plans to drop 32bit x86 support, and it is always nice to be able to run a modern UN*X on older hardware. IIRC, porting NetBSD to a new platform is quite easy when compared to other systems. This is due to how their HAL (hardware abstraction layer) is designed.

    Today I saw in the OpenBSD @misc mailing list one of the issues they are having with i386 is rust is too large for them to compile on a i386 system. That means software packages that need rust are being removed from their packages.

    This does not affect NetBSD because they allow cross-compiling of everything on their systems.



    Compiling rust on a 32 bit system is a several year old issue. Enough of us made a fuss about it that the rust build system was fixed enough that this became possible again.

    If rust doesn't compile on an i386 system with 4 gigs of memory, then that's very odd. I don't know much about rust, but I was still able to get it to compile for earmv6hf on a Raspberry Pi 3 with 1 gig of RAM. Perhaps the OpenBSD people need to try some of the things we've already figured out.

    https://mail-index.netbsd.org/tech-pkg/2025/05/09/msg031137....



    OpenBSD runs perfectly fine under i386, atom user there.

    I don't care about Rust and it's killer app Firefox, there are tons of alternatives for i686. From Luakit to Vimb.



    This sort of platform support is cool, but it's a sign when existing hardware is failing & the platform support is shown with emulation

    If uou run ancient hardware, use ancient software. Preservation efforts in keeping an image of that ancient software available makes sense (which becomes harder as modern build systems pull from network to build)



    Sometimes it's useful to be able to run modern software on ancient hardware.

    I once made an image of a hard disk so old it wouldn't work on anything newer than a Pentium. I plugged in a USB PCI card+USB stick and booted a modern-ish at the time Debian Live CD.

    It took over 5 minutes to decompress just the kernel and a hour to copy the HDD to the USB stick, but it did work. The time delta between the oldest and newest component on that system was well over 20 years, sometimes this is what you have to do with what you have on hand.



    On math FP emulation, by looking up the code it seems pretty close to the code from Robert F. Illyes for Forth 83.

    Forth implementation in Eforth it's like this:

        ( FORTH-83 FLOATING POINT.
          ----------------------------------
          COPYRIGHT 1985 BY ROBERT F. ILLYES
                PO BOX 2516, STA. A
                CHAMPAIGN, IL 61820
                PHONE: 217/826-2734  )     HEX
        : ZERO  OVER 0= IF DROP 0 THEN ;
        : FNEGATE 8000 XOR ZERO ;
        : FABS  7FFF AND ;
        : NORM  >R 2DUP OR
                IF BEGIN DUP 0< NOT
                   WHILE D2* R> 1- >R
                   REPEAT SWAP 0< - ?DUP
                   IF R> ELSE 8000 R> 1+ THEN
                ELSE R> DROP THEN ;
        : F2*   1+ ZERO ;
        : F*    ROT + 4000 - >R UM* R> NORM ;
        : FSQ   2DUP F* ;
        : F2/   1- ZERO ;
        : UM/   DUP >R UM/MOD SWAP R>
                OVER 2* 1+ U< SWAP 0< OR - ;
        : F/    ROT SWAP - 4000 + >R
                0 ROT ROT 2DUP U<
                IF   UM/ R> ZERO
                ELSE >R D2/ FABS R> UM/ R> 1+
                THEN ;
        : ALIGN 20 MIN 0 DO D2/ LOOP ;
        : RALIGN 1- ?DUP IF ALIGN THEN
                1 0 D+ D2/ ;
        : FSIGN FABS OVER 0< IF >R DNEGATE R>
                8000 OR THEN ;
        : F+    ROT 2DUP >R >R FABS SWAP FABS -
                DUP IF DUP 0<
                        IF   ROT SWAP  NEGATE
                             R> R> SWAP >R >R
                        THEN 0 SWAP RALIGN
                THEN SWAP 0 R> R@ XOR 0<
                IF   R@ 0< IF 2SWAP THEN D-
                     R> FSIGN ROT SWAP NORM
                ELSE D+ IF 1+ 2/ 8000 OR R> 1+
                        ELSE R> THEN THEN ;
        : F-    FNEGATE F+ ;
        : F<    F- 0< SWAP DROP ;
        ( FLOATING POINT INPUT/OUTPUT ) DECIMAL
        CREATE PL 3 , HERE  ,001 , ,   ,010 , ,
                  ,100 , ,            1,000 , ,
                10,000 , ,          100,000 , ,
             1,000,000 , ,       10,000,000 , ,
           100,000,000 , ,    1,000,000,000 , ,
        : TENS  2* 2* LITERAL + 2@ ;     HEX
        : PLACES PL ! ;
        : SHIFTS FABS 4010 - DUP 0< NOT
                ABORT" TOO BIG" NEGATE ;
        : F#    >R PL @ TENS DROP UM* R> SHIFTS
                RALIGN PL @ ?DUP IF 0 DO # LOOP
                ". HOLD THEN #S ROT SIGN ;
        : TUCK  SWAP OVER ;
        : F.    TUCK <# F# #> TYPE SPACE ;
        : DFLOAT 4020 FSIGN NORM ;
        : F     DFLOAT POINT TENS DFLOAT F/ ;
        : FCONSTANT F 2CONSTANT ;
        : FLOAT DUP 0< DFLOAT ;
        : -+    DROP SWAP 0< IF NEGATE THEN ;
        : FIX   TUCK 0 SWAP SHIFTS RALIGN -+ ;
        : INT   TUCK 0 SWAP SHIFTS  ALIGN -+ ;
        1.      FCONSTANT ONE DECIMAL
        34.6680 FCONSTANT X1
        -57828. FCONSTANT X2
        2001.18 FCONSTANT X3
        1.4427  FCONSTANT X4
        : EXP   2DUP INT DUP >R FLOAT F-
                F2* X2 2OVER FSQ X3 F+ F/
                2OVER F2/ F-     X1 F+ F/
                ONE F+ FSQ R> + ;
        : FEXP  X4 F* EXP ;
        : GET   BL WORD DUP 1+ C@ "- = TUCK -
                0 0 ROT CONVERT DROP -+ ;
        : E     F GET >R R@ ABS 13301 4004 */MOD
                >R FLOAT 4004 FLOAT F/ EXP R> +
                R> 0< IF F/ ELSE F* THEN ;
        : E.    TUCK FABS 16384 TUCK -
                4004 13301 */MOD >R
                FLOAT 4004 FLOAT F/ EXP F*
                2DUP ONE F<
                IF 10 FLOAT F* R> 1- >R THEN
                <# R@ ABS 0 #S R> SIGN 2DROP
                "E HOLD F# #>     TYPE SPACE ;
    
    the float abs function it's literally the same, operating over the same bits.

    On the lack of floating point on some arch, Forth itself (even ANS Forth) encourages you to follow a fixed point philosophy unless it's absolutely neccesary, because you can always scale up the magnitudes on big 32 bit machines.

    And Pi can be prise enough by using scaling with 'double' (for 16 bit machines) numbers:

    100.000 355 113 m*/ d. 314159 ok







    Consider applying for YC's Summer 2025 batch! Applications are open till May 13


    Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact



    Search:
    联系我们 contact @ memedata.com