GRUB's real architecture is exactly this: a tiny 446-byte MBR stage 1 loads a larger stage-1.5, which loads the full filesystem-aware GRUB core — the same 'far jump plus re-init segments' pattern you build here. Forgetting to reload DS/ES/SS after the far jump to stage 2 is a classic bug that makes the second stage read garbage data despite the jump itself succeeding.