summaryrefslogtreecommitdiff
path: root/doc/forum.osdev.org_viewtopic.php_f=2_t=33362.txt
blob: 505d05bcadd058d1b122139f9c6cb1304d7d85e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
   #[1]Feed - OSDev.org [2]Feed - News [3]Feed - All forums [4]Feed - New
   Topics [5]Feed - Active Topics [6]Feed - Forum - Announcements, Test
   Requests, & Job openings [7]Feed - Topic - BOOTBOOT Multi-platform
   Micro-kernel Loader

OSDev.org

   The Place to Start for Operating System Developers
   [8]* Login   [9] * Register [10]The OSDev.org Wiki - Got a question?
   Search this first! [11]* FAQ    [12] * Search
   It is currently Sat Jan 13, 2024 5:46 pm

   [13]View unanswered posts | [14]View active topics

   [15]Board index » [16]Operating System Development » [17]Announcements,
   Test Requests, & Job openings

   All times are UTC - 6 hours

[18]BOOTBOOT Multi-platform Micro-kernel Loader

   Moderators: [19]AJ, [20]01000101, [21]carbonBased, [22]Candy,
   [23]pcmattman, [24]JAAman, [25]Octocontrabass, [26]klange, [27]sortie,
   [28]kmcguire, [29]thepowersgang, [30]chase, [31]Combuster, [32]Owen
[33]Post new topic  [34] Reply to topic  Page 1 of 3
 [ 39 posts ]                           [35]Go to page 1, [36]2, [37]3  [38]Next
     [39]Print view [40]Previous topic | [41]Next topic
   Author Message
   bzt
    Post subject: BOOTBOOT Multi-platform Micro-kernel Loader
   [42]Post Posted: Fri Dec 07, 2018 7:34 pm

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   [43]BOOTBOOT Protocol
   Unlike any existing boot loaders, this loader is not one big bloated
   system. Quite the contrary, it's a set of several independent, very
   thin implementations, all providing the same C/C++ compatible,
   higher-half 64 bit environment on their corresponding platforms. By
   very thin I mean really lightweight, no more than a few kilobytes each:
   boot.bin (512 bytes), bootboot.bin (11k), bootboot.img (30k),
   bootboot.efi (93k)
   It is ideal for hobby OS developers, as it's easy to use and it's very
   flexible. It's much easier to dealt with than GRUB, and also unlike
   with Multiboot you won't need any long mode Assembly trampoline code
   with dirty GDT and paging tricks in your kernel.
   BOOTBOOT can load your higher half, 64 bit-only C/C++ kernel just as-is
   without any hacks. The repository also contains full documentation in
   MD and PDF formats, as well as small ANSI C mkboot utilities to help
   you with the installation. It's a Free and Open Source Sotfware,
   licensed under the terms of MIT license. If you want to use it as a
   reference for your own boot loader, the PDF documentation has a
   detailed description on which firmware interfaces have been used, and
   also the sources are well commented.
   The BOOTBOOT Protocol is very easy to integrate, as it has a totally
   architecture agnostic interface. You just specify some object addresses
   in your [44]linker script, and you're done. The information structure
   is defined in a [45]C/C++ header file and can be used on all platforms.
   It contains information such as boot date and time, timezone, frame
   buffer dimension, platform independent memory map, initrd size,
   pointers to detected system tables (efi, acpi, mp, smbios etc.). Unlike
   other protocols, BOOTBOOT was written with forward-compatibility in
   mind. That is, current implementations support static addresses for
   those variables (Protocol Level 1), but it states that future versions
   (Level 2) should read the symbol table of the kernel to find those
   addresses. Kernels written for the Level 1 loaders will be able to boot
   with the upcoming Level 2 loaders just out-of-the-box.
   The loader is capable of loading monolithic kernels, but mainly focuses
   on micro-kernels with an initrd. It can load the OS from several
   different sources: from ROM, over serial line, from a GPT partition, or
   from a file on a FAT16/32 GPT partition (usually ESP. To avoid
   licensing issues with M$, it's limited to upper case 8+3 filenames).
   The protocol also allows booting over network with TFTP, although the
   reference implementations do not use that (not yet :-) ).
   Current implementations support kernels in ELF64 and PE32+ formats for
   the AArch64 and x86_64 architectures. As for the initrd, they support
   - statically linked executables (for monolithic kernels and statically
   linked micro-kernels like Minix)
   - cpio (all variants: old hp, newc, and crc too. The latter is used by
   the Linux kernel btw.)
   - tar (POSIX ustar, a very beginner friendly format)
   - SFS (both Brendan's and BenLunt's versions)
   - James Molloy's initrd (I assume you're already familiar with his
   tutorial)
   - FS/Z (my operating system's native file system format)
   - any archive or file system format, provided your kernel file is
   contiguous and is the first executable in the initrd.
   The initrd can be gzip compressed, or optionally encrypted (FS/Z only
   feature).
   The repository contains an example [46]hello world kernel that
   demonstrates how to write strings and boxes on the frame buffer in an
   architecture independent way using PSF2 fonts. You are free to use that
   example kernel as a skeleton for starting your own kernel. Kernels
   written in C++ are also supported, but you have to provide a small code
   block at _start that calls your constructors (easiest way is to use a
   linker script to create .text.init or .text.ctors sections or
   .init_array table).
   How to install
   Please note BOOTBOOT is very flexible. What I describe here is just one
   way, which I believe to be the most common use case for hobby OS
   developers.
   1. create a disk image with GPT partitioning table ("dd if=/dev/zero
   of=myimage.dd bs=1M count=256" and "fdisk myimage.dd")
   2. set the first partition's type to ESP, and format it with FAT16 or
   FAT32 (fdisk's type 1, and use "mkfs.vfat -F x")
   3. mount that partition with a loop device ("sudo mount -o loop,user
   myimage.dd somedir" or use "losetup"+"mount /dev/loop0")
   4. create a BOOTBOOT directory there ("mkdir somedir/BOOTBOOT")
   5. create an INITRD with your kernel in it (for example use "find . |
   cpio -H hpodc -o | gzip >somedir/BOOTBOOT/INITRD", for monolithic
   kernels, simply copy your kernel executable as INITRD).
   6. optionally create a text file named BOOTBOOT/CONFIG (will be parsed
   by your kernel)
   7. copy bootboot.bin into that directory as BOOTBOOT/LOADER (I strongly
   suggest to set the SYSTEM attribute for this file)
   8. unmount the disk image
   9. use the x86_64-bios/mkboot.c utility to install a (P)MBR sector on
   your disk image ("./mkboot myimage.dd")
   If you want more control, do the steps 1-6, and choose a loader
   implementation for your platform and desired configuration (you can
   also use multiple loaders in the same image to create multiplatform
   bootable images). The documentation has detailed description of all of
   these scenarios:
   - Raspberry Pi 3 (AArch64)
   - UEFI (x86_64)
   - UEFI for embedded systems (x86_64, in ROM)
   - GRUB Multiboot (x86_64)
   - ISOLINUX / LILO / BOOTLIN / etc. (x86_64)
   - Legacy BIOS boot with any arbitrary boot manager (x86_64, chainloaded
   from VBR)
   - Legacy BIOS boot with a single OS on a forward-compatible GPT disk
   (x86_64, booted from MBR)
   - Legacy BIOS for embedded systems (x86_64, in ROM)
   - CDROM, in El Torito "no emulation" mode (x86_64, hybrid GPT/ISO9660
   image)
   For more information, read the documentation. Before you comment any
   critism about this loader, please read the documentation. It's very
   likely it can do what you think it can't do, as most features and
   options are not mentioned in this brief introductory post.
   Cheers,
   bzt
   [47]Top
    [48] Profile

   mihe
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [49]Post Posted: Sat Dec 15, 2018 3:33 am

                                   Offline
                                    Member
                                   Member

   Joined: Sun Oct 21, 2018 1:37 pm
   Posts: 38
   It looks very interesting, especially because I think I can find some
   guidance for my project in some points where I a a bit stuck, or not
   skilled enough to move forward comfortably, and you seem to cover.
   Thanks for sharing this !
   [50]Top
    [51] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [52]Post Posted: Thu Feb 07, 2019 6:24 pm

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi All,
   I proudly present to you the final release of BOOTBOOT Protocol.
   I've finished co-processor (SSE, Neon) initialization and SMP support
   on all platforms. With those the feature set is now complete, meaning
   from now on I'll only commit bugfixes (if any) and ports for new
   platforms. Specification is now frozen, no further modification on the
   specification will take place.
   Multi Processing was tricky to achive without an interface, but finally
   I have decided to use the simplest method: the same kernel is started
   on all cores, only with different stacks. BIOS platform uses LAPIC IPI
   + SIPI (up to 256 cores) and PIT for sleeping. UEFI utilizes the newer
   PI EFI_MP_SERVICES_PROTOCOL (up to 1024 cores). If there's a need, I
   was thinking about implementing a fallback to the older
   FirmwareMPService Protocol (but I couldn't test it, so I skipped). And
   last but not least, on RPi, well SMP is just working out-of-the-box
   (with fixed 4 cores) :-)
   The bootboot structure had to be changed a bit, few fields were
   rearranged and bootboot.numcores came in (up to 65535 cores). Otherwise
   the structure is the same, 64 bytes architecture independent info, 64
   bytes platform specific pointers (which already included ACPI and MP
   pointers), and the rest is the platform independent memory map.
   Naturally I have updated the PDF documentation as well, and I've
   created an OSDev wiki page for [53]BOOTBOOT. Happy OS development and I
   hope my loader will be useful to you too!
   Cheers,
   bzt
   [54]Top
    [55] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [56]Post Posted: Thu Apr 09, 2020 5:02 am

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi All,
   Lots and lots (and lots) of testing on real hardware. I'd like to say
   thanks to all the testers! Testing the multicore support under UEFI was
   extremely helpful.
   Some minor modifications had to be made: instead of PIT, the BIOS
   version now uses the PS/2 port oscillator for delays. Also minor fixes
   in Multiboot and Linux boot protocol support, they both work perfectly
   now.
   On Raspberry Pi, model 3 was working already, but now model 4 support
   has been added too. Since the firmware code changed, multicore support
   had to be changed a bit too, but now SMP works with the latest firmware
   as well.
   Furthermore, I've added [57]sample bootable images and a very simple
   image creator tool, that can generate hybrid GPT/ISO9660 images with
   your inird. I've also provided a Makefile with several rules for
   testing (booting the images from ROM, via BIOS, via GRUB, from UEFI
   CDROM etc. etc. etc.)
   Cheers,
   bzt
   [58]Top
    [59] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [60]Post Posted: Mon Jun 15, 2020 8:48 pm

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi All,
   New features (sort of). Protocol level 2 is now implemented in the
   reference implementations (UEFI and Raspberry Pi, BIOS remained at
   level 1). This means you are no longer tied to static link addresses,
   you are free to move them around (in the higher half -1G to 0 range).
   The loader will parse your ELF or PE kernel's symbols to find the
   addresses where to map the data. The affected labels:
     * mmio - virtual address of the MMIO area (on platforms that supports
       that),
     * fb - virtual address of the linear framebuffer,
     * bootboot - the main information structure,
     * environment - the arguments to your kernel in an UTF-8 string
     * your kernel's segment (using Elf_Phdr->p_vaddr and
       PE_hdr->code_base).

   There can be one loadable segment (concatenated code, data and bss
   sections) in the kernel. With level 2, the size limit for this is
   raised to 16M (in comparition level 1 has a limit of 2M for info,
   environment, code, data, bss and stack). That must be enough for
   monolithic kernels too. You must be careful where you put these,
   because these might overlap, and there's absolutely no checks (it is
   perfectly valid for a kernel to request mapping of bootboot struct and
   the environment string into the middle of its bss section for example.)
   The repo contains a simple, dependency-free image creator tool, mkimg.
   With that now you can create ESP FAT partition images and hybrid,
   bootable GPT disk / CDROM / DVD images. This means all disk generation
   related issues can be solved using this single file utility, no third
   party tools needed. Just like the loaders, you are free to use this
   tool with your project.
   And last but not least, besides of the C example kernel, now there's a
   Rust example kernel that you can use as a skeleton for your own kernel.
   Cheers,
   bzt
   [61]Top
    [62] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [63]Post Posted: Thu Jun 18, 2020 4:06 am

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi All,
   I've replaced the quick and dirty mkimg tool with a proper, fully
   featured mkbootimg. This one is also dependency-free, with precompiled
   single portable executables available for Windows, MacOSX and Linux.
   It receives a JSON configuration file as input, describing the disk you
   wish to create, and then it saves the resulting disk image. For
   example:
   Code:
   {
       "diskguid": "00000000-0000-0000-0000-000000000000",
       "disksize": 128,
       "align": 1024,
       "config": "initrd.dir/sys/config",
       "initrd": { "type": "tar", "gzip": true, "directory": "initrd.dir"
   },
       "iso9660": 1,
       "partitions": [
           { "type": "boot", "size": 16 },
           { "type": "ntfs", "size": 16, "name": "Win Exchange" },
           { "type": "ext4", "size": 16, "name": "Linux Exchange" },
           { "type": "00000000-0000-0000-0000-000000000000", "size": 32,
   "name": "MyOS usr", "file": "usrpart.bin" },
           { "type": "00000000-0000-0000-0000-000000000000", "size": 32,
   "name": "MyOS var", "file": "varpart.bin" }
       ]
   }
   Numbers are in Megabytes, except "align", which is in Kilobytes (align
   0 means sector alignment for partitions). This tool can create:
     * A compressed initrd image from a directory (currently supports cpio
       and tar, but easily expandable)
     * An ESP FAT boot partition with all the necessary files (including
       the newly created initrd) and boot code in VBR
     * An MBR / GPT / ISO9660 hybrid partitioning table with the boot
       partition on it
     * When creating a hybrid image, it also ensures that the root
       directory, the fat table, and the clusters on the boot partition
       are all 2048 bytes aligned
     * Optionally it can add any number of partitions (well, up to 248),
       and it can fill them up using partition images

   As a bonus, it also checks your kernel for BOOTBOOT compatibility,
   gives detailed error messages, and determines the architecture from
   your executable. It has all the binaries included, so no additional
   files needed (this includes the Raspberry Pi firmware files too, along
   with the Broadcom licence).
   Creating multiarch images also possible simply by using an array:
   Code:
       "initrd": { "type": "tar", "gzip": true, "directory": [
   "initrd.x86", "initrd.arm" ] },
   This will create two initrds, one for each arch and it will put both
   loaders for them into the boot partition (the code is written in a way
   that it can support many architectures, however there's only loader for
   x86_64 and AArch64, so right now it is limited to two).
   The generated images were tested with: FAT16/32: fsck.vfat, TianoCore
   UEFI; GPT: fdisk and gdisk's verify function. All green. :-)
   Hope this will be useful to some of you,
   bzt
   [64]Top
    [65] Profile

   Korona
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [66]Post Posted: Thu Jun 18, 2020 8:28 am

                                   Offline
                                    Member
                                   Member

   Joined: Thu May 17, 2007 1:27 pm
   Posts: 999
   bzt wrote:
   There can be one loadable segment (concatenated code, data and bss
   sections) in the kernel. With level 2, the size limit for this is
   raised to 16M (in comparition level 1 has a limit of 2M for info,
   environment, code, data, bss and stack). That must be enough for
   monolithic kernels too. You must be careful where you put these,
   because these might overlap, and there's absolutely no checks (it is
   perfectly valid for a kernel to request mapping of bootboot struct and
   the environment string into the middle of its bss section for example.)
   Out of curiosity, why did you pick this design? Do you map that segment
   as RWX? That prevents many useful sanity checking ("security") features
   from working, in particular WP and NX. WP and NX have probably caught
   more memory bugs in Managarm than any other measures combined. (I mean
   sure, one can enable it retroactively by some linker script hacks but
   that seems unnecessarily clunky for something that just amounts to
   setting two bits in the bootloader).
   _________________
   [67]managarm: Microkernel-based OS capable of running a Wayland desktop
   (Discord: [68]https://discord.gg/7WB6Ur3). My OS-dev projects:
   [[69]mlibc: Portable C library for managarm, qword, Linux, Sigma, ...]
   [[70]LAI: AML interpreter] [[71]xbstrap: Build system for OS
   distributions].
   [72]Top
    [73] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [74]Post Posted: Thu Jun 18, 2020 10:58 am

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi,
   Thanks for checking out! The answer is in the documentation, but thanks
   for asking!
   Korona wrote:
   Out of curiosity, why did you pick this design? Do you map that segment
   as RWX?
   It uses one boot segment for several reasons:
   First, for simplicity. This is also required by many other boot loaders
   (all that works with raw binaries this is actually a must otherwise you
   can't convert ELFs to raws).
   Second, BOOTBOOT can load PE32+ kernels too, and PE doesn't have the
   concept of multiple, configurable load segments (there's a segment
   pointer for code and one for the data in the header, that's it).
   Third, there's no point in overcomplicating because your kernel will
   switch away from identity mapping and will use its paging tables as
   soon as possible anyway.
   Fourth, BOOTBOOT is a multiplatform loader, and it provides the same
   environment on all platforms. It cannot and should not rely on specific
   CPU features, it tries to keep it as minimal as possible so that it can
   support more platforms. (For example AArch64 has WNX bit too, but x86
   doesn't. If BOOTBOOT were about to utilize that, then it couldn't load
   kernels on x86; not with the same environment that is).
   The Multiboot specification is way too x86 related, and you simply
   can't use that on other platforms. As a result, loaders on other
   platforms create their own, unofficial and incompatible versions of the
   Multiboot spec ([75]read this for example). I put a lot of effort in
   the BOOTBOOT Specification so this can never happen to it. As it
   focuses on the smallest common denominator among platforms, it's
   environment should be available on all platforms, no need for tweaking
   the spec.
   Korona wrote:
   That prevents many useful sanity checking ("security") features from
   working, in particular WP and NX.
   No, not really. My kernel, which is loaded using BOOTBOOT does take
   advantage of both WP and NX security bits (and on AArch64 WNX too), so
   it is doable just fine. From the BOOTBOOT User's Manual, in section
   "Machine State":
   Quote:
   If a kernel wants to separate it's code on a read-only segment and data
   on a non-executable segment for security, it
   can override the page translation tables as soon as it gains control.
   BOOTBOOT Protocol does only
   handle one loadable segment for simplicity (called boot in the example
   linker script, see Appendix).
   Providing memory security is not a job for a bootloader. Your kernel
   will drop identity paging and will use it's own tables anyway. It will
   drop them for sure by the time it creates its first process. So why
   should the loader complicate things? I like simple. This is similar how
   GDT works (with Grub too). It is set up because it's needed, but your
   kernel should set a known GDT according its needs as soon as possible
   anyway.
   In short, the bootloader's job is not to provide full functionality,
   rather to provide the bare minimum to get the system going. For
   example, BOOTBOOT allocates only 1k stack for your kernel per core,
   because it doesn't want to tell you how you should organize your
   memory. 1k is not enough for your kernel that's for sure, but it is
   surely enough to set up paging and stacks the way your kernel wants
   them, and that's about it.
   Cheers,
   bzt
   [76]Top
    [77] Profile

   PeterX
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [78]Post Posted: Thu Jun 18, 2020 12:19 pm

                                   Offline
                                    Member
                                   Member

   Joined: Fri Nov 22, 2019 5:46 am
   Posts: 590
   Great job!
   But why do you call it "micro-kernel" loader? It's seems like
   unnecessary modesty to me. You could load nearly any kernel, don't you?
   And what platforms is it available for so far? If I understood it
   correctly: Legacy-BIOS PCs, UEFI PCs, RaspPi 3 and 4. Correct?
   Greetings
   Peter
   [79]Top
    [80] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [81]Post Posted: Thu Jun 18, 2020 7:36 pm

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   PeterX wrote:
   Great job!
   Thanks!
   PeterX wrote:
   But why do you call it "micro-kernel" loader? It's seems like
   unnecessary modesty to me. You could load nearly any kernel, don't you?
   Well, yes, it can load statically linked images, so it can load
   monolithic kernels too. I call it micro-kernel loader because it has a
   neat feature that no other boot loader: it loads an initrd into the
   memory with a bunch of files, then it locates the kernel amongst them
   (so the kernel is not a separate file as with GRUB, just a regular file
   inside the initrd). This suits primarily the needs of a micro-kernel,
   which requires to load several files on boot before it could access the
   disks.
   PeterX wrote:
   And what platforms is it available for so far? If I understood it
   correctly: Legacy-BIOS PCs, UEFI PCs, RaspPi 3 and 4. Correct?
   Yes, for disks, USB storages and SD cards. Plus it can also boot from a
   CDROM via El Torito (both legacy BIOS and UEFI), and from ROM (via BIOS
   Boot Specification and under UEFI as Option ROM, this is useful for
   embedded systems); you can load it as a Linux kernel (using the
   Linux/x86 boot protocol, e.g. qemu -kernel), and last but not least,
   via GRUB, because it supports Multiboot too. Check out
   [82]https://gitlab.com/bztsrc/bootboot/tree/master/images, along with
   the example images there's a Makefile with lots of qemu commands, one
   for each boot option.
   In the future if I could get decent documentation and my hands on a
   board to test with, then I would like to support more. Beageboard is
   definitely on the bucket list, for example. I was also thinking about
   UltraSparc64, but as it's market is shrinking rapidly I don't think it
   worth the effort any more. Making it to work with Macs also a
   possibility (so far I had only one roadblock, I don't know how to get
   the frame buffer address using UGA, but that's the only one thing.
   Everything else works).
   Greetings
   Peter[/quote]
   [83]Top
    [84] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [85]Post Posted: Fri Jun 19, 2020 9:41 pm

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi All,
   Just a little heads-up. I've upgraded the image creator:
     * It's multilingual now and autodetects OS' language
     * If initrd is given as an image file which is compressed, now that's
       transparently uncompressed to look up the kernel inside
     * New initrd formats has been added, it supports hpodc cpio, POSIX
       ustar, James Molloy's initrd and FS/Z (in lack of an up-to-date
       specification and with no available image creator I had to abandon
       SFS. But if you somehow manage to create an image, you can include
       it with the "file" directive and you should still be able to boot
       from it.)
     * Many JSON tags made optional, the tool now calculates as much
       properties as it can. For example on a partition it's enough to
       specify "type" and "file".
     * You can also use the "directory" directive for partitions, meaning
       you can create partition images from directories on-the-fly.
       Currently supported: tar and FS/Z (easy to add new file system
       drivers, see documentation). Could have added cpio and jamesm too,
       but those play not well with 512 byte sectors.
     * I've updated the FS API to inform it if the image is generated for
       initrd or partition (this is needed for FS/Z, because it supports
       gaps in files, which must be avoided in initrds)
     * On platforms that supports it (that's basically all save Windows)
       symlinks are also parsed and generated into initrds and partition
       images. This depends on S_ISLNK macro and readlink() libc function.

   Cheers,
   bzt
   [86]Top
    [87] Profile

   heemogoblin
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [88]Post Posted: Thu Jul 09, 2020 7:57 am

                                   Offline

   Joined: Sat Jun 27, 2020 8:00 am
   Posts: 13
   Dear All,
   I am somewhat new to OS development and programming but am quite
   competent with the theory and also the implementation of an OS. Since I
   want my OS to make use of modern features I have decided to build it
   for UEFI firmware and x86_64 architecture. Despite being able to write
   a UEFI bootloader, I could not find any way to compile it and get it to
   call my kernel_main. Then I decided to use a premade bootloader, and
   have settled on your BOOTBOOT as it directly takes me to 64 bit mode
   and wrks with UEFI. I have looked at the example kernel and have
   compiled it to get myself an elf kernel.
   Now here is the problem: I don't know how to boot it in virtualbox. To
   be more specific here are some details:
   - I have my kernel elf (the0s.x86_64.elf) in my Documents/OS/The \OS/
   folder.
   - I have downloaded all of the bootboot code and have it ready.
   - I am interested in using the bootboot.efi loader for UEFI systems.
   - I have tried straight-up creating a .img with disk utility and
   partitioning it but that has problems:
   - Whenever I make one, I can only edit one of its partitions.
   - I can only place the bootboot efi code to the system partition and
   unfortunately the other partition for my kernel is blocked. I have
   tried many workarounds, none work.
   - .imgs to virtualbox are floppy controllers and it is 2020.
   - I compiled the mkbootimg and have checked my kernel. It is OK.
   However I have no clue how to use that to create a .iso with uefi
   compatibility and my kernel .elf at Documents/OS/The \OS/.
   - I am quite confused about the config file. It says that the
   kernel=sys/config - does that mean the kernel is at sys/config/<name>
   or is the kernel called config and is at sys/ direcotry? Also it is in
   a specially named partition?
   I would ideally like please some instructions to create a .iso ideally
   or .vmdk with UEFI booting and my kernel on it so I can test out my OS.
   Any way will do, as long as it can run on ubuntu and will give me a
   vmdk or .iso virtualbox will boot.
   Also could you tell me if I can pass an EFI_SystemTable or a pointer to
   one to my kernel entry point? I'd prefer to get my time via the Runtime
   services GetTime function.
   Apologies for being so naive, but I shall be incredibly grateful if you
   could help me. Thanks in advance!
   [89]Top
    [90] Profile

   Octocontrabass
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [91]Post Posted: Sat Jul 11, 2020 10:14 pm

                                   Offline
                                    Member
                                   Member

   Joined: Mon Mar 25, 2013 7:01 pm
   Posts: 4978
   You can use VBoxManage to convert raw disk images to a format
   VirtualBox supports. [92]Here is the documentation.
   I don't see why you're not able to access more than one partition on
   your disk image, though.
   [93]Top
    [94] Profile

   bzt
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [95]Post Posted: Sun Jul 12, 2020 5:17 am

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Thu Oct 13, 2016 4:55 pm
   Posts: 1584
   Hi,
   Yes, @Octoronstabass is right, you can access more partitions.
   heemogoblin wrote:
   Dear All,
   I am somewhat new to OS development and programming but am quite
   competent with the theory and also the implementation of an OS. Since I
   want my OS to make use of modern features I have decided to build it
   for UEFI firmware and x86_64 architecture. Despite being able to write
   a UEFI bootloader, I could not find any way to compile it and get it to
   call my kernel_main. Then I decided to use a premade bootloader, and
   have settled on your BOOTBOOT as it directly takes me to 64 bit mode
   and wrks with UEFI. I have looked at the example kernel and have
   compiled it to get myself an elf kernel.
   Now here is the problem: I don't know how to boot it in virtualbox. To
   be more specific here are some details:
   You create an image, then you configure your VB machine to boot with
   UEFI: "Detials" > "System" > "Motherboard" click "Enable EFI (special
   OSes only)".
   I'd recommend to use mkbootimg, that's what it is for. But if you want
   to make it by hand, here are my answers.
   heemogoblin wrote:
   - I have my kernel elf (the0s.x86_64.elf) in my Documents/OS/The \OS/
   folder.
   Move it into an initrd folder. Your kernel will be loaded as part of
   the initrd along with other files you want/need on boot.
   heemogoblin wrote:
   - I have downloaded all of the bootboot code and have it ready.
   Good.
   heemogoblin wrote:
   - I am interested in using the bootboot.efi loader for UEFI systems.
   For that, you'll need the following files:
   EFI/BOOT/BOOTX64.EFI - move bootboot.efi here
   BOOTBOOT/INITRD - the initrd image with your kernel in it, can be a tar
   or cpio archive, optionally gzip compressed.
   BOOTBOOT/CONFIG - optional, a configuration that will be passed to your
   kernel. The loader uses only two keys if given, "screen=WxH" and
   "kernel=elf_filename_inside_the_initrd" all the others are for your
   kernel.
   heemogoblin wrote:
   - I have tried straight-up creating a .img with disk utility and
   partitioning it but that has problems:
   - Whenever I make one, I can only edit one of its partitions.
   - I can only place the bootboot efi code to the system partition and
   unfortunately the other partition for my kernel is blocked. I have
   tried many workarounds, none work.
   Not sure what disk utility you're using, but you should create a GPT
   disk, with a partition that is FAT formatted and copy the three files
   above to that system partition. Change the type to EFI System Partition
   (this is important, otherwise EFI won't recognize it). The BOOTBOOT
   User's Manual Appendix has an example how to use fdisk and mkfs.vfat
   for this.
   heemogoblin wrote:
   - .imgs to virtualbox are floppy controllers and it is 2020.
   I don't know where you get that, .img files are just images. For
   example Raspberry OS contains an SD card image. My mkbootimg tool
   creates a hybrid CDROM / disk image by that extension.
   heemogoblin wrote:
   - I compiled the mkbootimg and have checked my kernel. It is OK.
   However I have no clue how to use that to create a .iso with uefi
   compatibility and my kernel .elf at Documents/OS/The \OS/.
   If you have compiled mkbootimg, then you don't need the boot loader
   files, as it has them already (data.c). It is well documented, and
   example configurations are provided. Basically you give it two
   arguments:
   Code:
   ./mkbootimg config.json output.img
   The configuration is described in detail in the README (there's an
   example json in it), there's an example json in the source directory,
   and in the [96]images directory you can find the actual json I've used
   to create the example disk images, as well as a Makefile on how to
   invoke it. If you want it to generate a hybrid ISO9660 image, that can
   be used on CDROMs, then in the mkbootimg json configuration, use
   "iso9660=true". Here's my mkbootimg.json:
   Code:
   {
       "disksize": 128,
       "config": "./config",
       "initrd": { "type": "cpio", "gzip": true, "directory": "initrd" },
       "iso9660": true,
       "partitions": [
           { "type": "boot", "size": 16 }
       ]
   }
   This instructs mkbootimg that load the BOOTBOOT configuration from the
   file "./config", create an initrd in gzipped cpio format from the
   contents of the directory "initrd" (copy the0s.x86_64.elf there). Make
   the image 128M in size and CDROM compatible, and generate one ESP
   partition only (if you need it to generate more GPT records, just add
   more elements to the "partitions" array, and you can specify a
   partition image too with "file").
   There's no need to create a filesystem on the boot partition, nor to
   copy files there, the mkbootimg will take care all of that for you.
   heemogoblin wrote:
   - I am quite confused about the config file. It says that the
   kernel=sys/config - does that mean the kernel is at sys/config/<name>
   or is the kernel called config and is at sys/ direcotry?
   I don't know where you get "kernel=sys/config". The "kernel" is the
   name of your kernel inside the initrd image (under the specified initrd
   directory). If you use mkbootimg, you'll have two config files:
     * the json - describes the disk image you want to create
     * BOOTBOOT config - this will be copied to the ESP partition, and it
       is going to be parsed by the loader and your kernel during boot

   In the latter you can specify the name of your kernel inside the initrd
   archive with "kernel=the0s.x86_64.elf", but that's not necessary if
   your elf kernel is the first executable in the archive.
   heemogoblin wrote:
   Also it is in a specially named partition?
   Yes, the ESP is given a fixed name, "EFI System Partition".
   heemogoblin wrote:
   I would ideally like please some instructions to create a .iso ideally
   or .vmdk with UEFI booting and my kernel on it so I can test out my OS.
   Any way will do, as long as it can run on ubuntu and will give me a
   vmdk or .iso virtualbox will boot.
   The mkbootimg generates a disk image file. With "iso9660=true" it is
   going to be a hybrid image, which you can simply rename to ".iso" and
   it will work. For vmdk I'm not sure, I use vdi for VirtualBox. For
   that, use the following command:
   Code:
   VBoxManage convertfromraw yourimage.img yourimage.vdi
   Because this will generate a random UUID for the vdi, and VirtualBox is
   extremely picky about UUIDs matching its configuration, I'd also
   recommend to use the following:
   Code:
   BoxManage internalcommands sethduuid yourimage.vdi (some fix UUID)
   heemogoblin wrote:
   Also could you tell me if I can pass an EFI_SystemTable or a pointer to
   one to my kernel entry point? I'd prefer to get my time via the Runtime
   services GetTime function.
   Again, described in great detail in the BOOTBOOT User's Manual. The
   protocol maps an informational structure for your kernel, which
   contains both the EFI_SystemTable pointer and both the time (which is
   queried by the EFI GetTime service under UEFI).
   heemogoblin wrote:
   Apologies for being so naive, but I shall be incredibly grateful if you
   could help me. Thanks in advance!
   You should read the documentation first :-) Both the READMEs and pdf
   have all the answers for your questions. But sure, ask and I'll try to
   answer.
   Cheers,
   bzt
   [97]Top
    [98] Profile

   zaval
    Post subject: Re: BOOTBOOT Multi-platform Micro-kernel Loader
   [99]Post Posted: Sun Jul 12, 2020 4:03 pm

                                   Offline
                                    Member
                                   Member
                                 User avatar

   Joined: Fri Feb 17, 2017 4:01 pm
   Posts: 633
   Location: Ukraine, Bachmut
   Quote:
   Despite being able to write a UEFI bootloader, I could not find any way
   to compile it and get it to call my kernel_main. Then I decided to use
   a premade bootloader, and have settled on your BOOTBOOT as it directly
   takes me to 64 bit mode and wrks with UEFI. I have looked at the
   example kernel and have compiled it to get myself an elf kernel.
   does your religion allow you to use MSVC? if so, that's so easy to
   compile your OS Loader with it as compiling "hello world". if it
   doesn't, then *shrugs.
   just for the note, despite bzt scares you, that you are required to
   mark a FAT partition as ESP and use only GPT, it's not true. you can
   create MBR with an ordinary FAT partition and be sure - it will be
   recognized by UEFI. since you are only at the start, I'd go this way
   (it's easier and maybe you'd have less troubles), actually, I do
   exactly this way - I created a small .vhd with VBox - thanks god its
   vhds are liked by diskpart (unlike qemu's). and created there a FAT
   partition. UEFI recognizes the disk, FAT formatted volume, and, of
   course, lets me start my OSL. either from the shell or from the Boot
   Manager menu or, finally, by creating a Load Option with the latter, -
   this way. Just don't forget to follow the guidelines and put your OSL
   in \efi\<YourNameAsAnOsVendor> directory, each OSL in its own directory
   (for the same architecture, I don't know why, but UEFI whimsically
   demands this, despite it distinguishes images well by their paths,
   which, of course, are different for two OSLs even lying in the same
   directory).
   Of course, when you create such a disk, vhd in my case, for an easy
   access with diskpart, you can create 2 partitions or more. and then
   your OSL may access your OS boot volume (where your OS resides) either
   by using UEFI simple file system protocol and friends, if this is a FAT
   volume (because, see, bzt, FAT is a required part by the standard, for
   easening interoperability and osdevers lives :D and not for what you
   fantasize) or using block I/O protocols given to you by UEFI for
   reading disk sectors and then making FS related parsing in the OSL by
   your own.
   and at the end, again and again - on this stubborn placement in
   \efi\boot\bootx64.efi. this is not a normal way of putting one's OSL.
   it's just a last resort in an attempt to start something by the Boot
   Manager on non-removable storages. if there is something else on the
   same disk, this thing won't be even touched. I have no idea why people
   don't look farther than this resort point. it is only somewhat and
   questionably good for removable storages, when you are going to install
   something and flash this storage for a one shot. even then, it's not
   necessary, and could mess up with something else, also blindly
   demanding itself to be placed there (and then when you put that other
   thing there, it overwrites the previous one and you find yoursefl in a
   mess). every UEFI has a "load from file" option - you better place your
   stuff in a personalized place and direct Boot Manager to it. it's more
   to bzt with his bootboot. the first time user directs the Boot Manager
   to load your bootboot, then, at the start, bootboot checks how it was
   started (by analyzing BootCurrent variable) and if it's not from its
   own Load Option, which is the case for the first start, asks a user if
   they want to install bootboot to this machine. on "yes", you just
   create a Load Option for bootboot by using SetVariable(), and that's
   it! this is how it should have been done.
   _________________
   [100]ANT - NT-like OS for x64 and arm64.
   [101]efify - UEFI for a couple of boards (mips and arm). suspended due
   to lost of all the target park boards (russians destroyed our town).
   [102]Top
    [103] Profile

        Display posts from previous: [All posts] Sort by [Post time]
                              [Ascending_]  Go
   [104]Post new topic  [105] Reply to topic  Page 1 of 3
    [ 39 posts ]  [106]Go to page 1, [107]2, [108]3  [109]Next

   [110]Board index » [111]Operating System Development »
   [112]Announcements, Test Requests, & Job openings

   All times are UTC - 6 hours

Who is online

   Users browsing this forum: No registered users and 1 guest
   You cannot post new topics in this forum
   You cannot reply to topics in this forum
   You cannot edit your posts in this forum
   You cannot delete your posts in this forum
   You cannot post attachments in this forum
   Search for: ____________________ Go
   Jump to: [   Announcements, Test Requests, & Job openings]  Go

   Powered by [113]phpBB © 2000, 2002, 2005, 2007 phpBB Group

References

   Visible links:
   1. https://forum.osdev.org/feed.php
   2. https://forum.osdev.org/feed.php?mode=news
   3. https://forum.osdev.org/feed.php?mode=forums
   4. https://forum.osdev.org/feed.php?mode=topics
   5. https://forum.osdev.org/feed.php?mode=topics_active
   6. https://forum.osdev.org/feed.php?f=2
   7. https://forum.osdev.org/feed.php?f=2&t=33362
   8. https://forum.osdev.org/./ucp.php?mode=login&sid=3552323bd691ba1e0995756313969b5b
   9. https://forum.osdev.org/./ucp.php?mode=register&sid=3552323bd691ba1e0995756313969b5b
  10. http://wiki.osdev.org/
  11. https://forum.osdev.org/./faq.php?sid=3552323bd691ba1e0995756313969b5b
  12. https://forum.osdev.org/./search.php?sid=3552323bd691ba1e0995756313969b5b
  13. https://forum.osdev.org/./search.php?search_id=unanswered&sid=3552323bd691ba1e0995756313969b5b
  14. https://forum.osdev.org/./search.php?search_id=active_topics&sid=3552323bd691ba1e0995756313969b5b
  15. https://forum.osdev.org/./index.php?sid=3552323bd691ba1e0995756313969b5b
  16. https://forum.osdev.org/./viewforum.php?f=16&sid=3552323bd691ba1e0995756313969b5b
  17. https://forum.osdev.org/./viewforum.php?f=2&sid=3552323bd691ba1e0995756313969b5b
  18. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&start=0&sid=3552323bd691ba1e0995756313969b5b
  19. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=1950&sid=3552323bd691ba1e0995756313969b5b
  20. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=3731&sid=3552323bd691ba1e0995756313969b5b
  21. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=155&sid=3552323bd691ba1e0995756313969b5b
  22. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=1902&sid=3552323bd691ba1e0995756313969b5b
  23. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=2477&sid=3552323bd691ba1e0995756313969b5b
  24. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=67&sid=3552323bd691ba1e0995756313969b5b
  25. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=14234&sid=3552323bd691ba1e0995756313969b5b
  26. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=11616&sid=3552323bd691ba1e0995756313969b5b
  27. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=12891&sid=3552323bd691ba1e0995756313969b5b
  28. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=117&sid=3552323bd691ba1e0995756313969b5b
  29. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=4287&sid=3552323bd691ba1e0995756313969b5b
  30. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=2&sid=3552323bd691ba1e0995756313969b5b
  31. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=1906&sid=3552323bd691ba1e0995756313969b5b
  32. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=4866&sid=3552323bd691ba1e0995756313969b5b
  33. https://forum.osdev.org/./posting.php?mode=post&f=2&sid=3552323bd691ba1e0995756313969b5b
  34. https://forum.osdev.org/./posting.php?mode=reply&f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b
  35. https://forum.osdev.org/viewtopic.php?f=2&t=33362
  36. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b&start=15
  37. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b&start=30
  38. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b&start=15
  39. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&start=0&sid=3552323bd691ba1e0995756313969b5b&view=print
  40. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&view=previous&sid=3552323bd691ba1e0995756313969b5b
  41. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&view=next&sid=3552323bd691ba1e0995756313969b5b
  42. https://forum.osdev.org/./viewtopic.php?p=287331&sid=3552323bd691ba1e0995756313969b5b#p287331
  43. https://gitlab.com/bztsrc/bootboot
  44. https://gitlab.com/bztsrc/bootboot/blob/master/mykernel/link.ld
  45. https://gitlab.com/bztsrc/bootboot/blob/master/bootboot.h
  46. https://gitlab.com/bztsrc/bootboot/tree/master/mykernel
  47. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  48. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  49. https://forum.osdev.org/./viewtopic.php?p=287447&sid=3552323bd691ba1e0995756313969b5b#p287447
  50. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  51. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=18898&sid=3552323bd691ba1e0995756313969b5b
  52. https://forum.osdev.org/./viewtopic.php?p=288396&sid=3552323bd691ba1e0995756313969b5b#p288396
  53. https://wiki.osdev.org/BOOTBOOT
  54. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  55. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  56. https://forum.osdev.org/./viewtopic.php?p=305109&sid=3552323bd691ba1e0995756313969b5b#p305109
  57. https://gitlab.com/bztsrc/bootboot/-/tree/master/images
  58. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  59. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  60. https://forum.osdev.org/./viewtopic.php?p=306460&sid=3552323bd691ba1e0995756313969b5b#p306460
  61. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  62. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  63. https://forum.osdev.org/./viewtopic.php?p=306501&sid=3552323bd691ba1e0995756313969b5b#p306501
  64. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  65. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  66. https://forum.osdev.org/./viewtopic.php?p=306504&sid=3552323bd691ba1e0995756313969b5b#p306504
  67. https://github.com/managarm/managarm
  68. https://discord.gg/7WB6Ur3
  69. https://github.com/managarm/mlibc
  70. https://github.com/qword-os/lai
  71. https://github.com/managarm/xbstrap
  72. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  73. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=3647&sid=3552323bd691ba1e0995756313969b5b
  74. https://forum.osdev.org/./viewtopic.php?p=306507&sid=3552323bd691ba1e0995756313969b5b#p306507
  75. https://github.com/jncronin/rpi-boot/blob/master/MULTIBOOT-ARM
  76. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  77. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  78. https://forum.osdev.org/./viewtopic.php?p=306511&sid=3552323bd691ba1e0995756313969b5b#p306511
  79. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  80. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=25322&sid=3552323bd691ba1e0995756313969b5b
  81. https://forum.osdev.org/./viewtopic.php?p=306521&sid=3552323bd691ba1e0995756313969b5b#p306521
  82. https://gitlab.com/bztsrc/bootboot/tree/master/images
  83. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  84. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  85. https://forum.osdev.org/./viewtopic.php?p=306532&sid=3552323bd691ba1e0995756313969b5b#p306532
  86. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  87. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  88. https://forum.osdev.org/./viewtopic.php?p=307287&sid=3552323bd691ba1e0995756313969b5b#p307287
  89. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  90. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=25855&sid=3552323bd691ba1e0995756313969b5b
  91. https://forum.osdev.org/./viewtopic.php?p=307379&sid=3552323bd691ba1e0995756313969b5b#p307379
  92. https://www.virtualbox.org/manual/ch08.html#vboxmanage-convertfromraw
  93. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  94. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=14234&sid=3552323bd691ba1e0995756313969b5b
  95. https://forum.osdev.org/./viewtopic.php?p=307390&sid=3552323bd691ba1e0995756313969b5b#p307390
  96. https://gitlab.com/bztsrc/bootboot/tree/master/images
  97. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
  98. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17273&sid=3552323bd691ba1e0995756313969b5b
  99. https://forum.osdev.org/./viewtopic.php?p=307402&sid=3552323bd691ba1e0995756313969b5b#p307402
 100. https://ant-upptech.sourceforge.io/?subject=osdev
 101. https://efify.sourceforge.io/
 102. https://forum.osdev.org/viewtopic.php?f=2&t=33362#wrapheader
 103. https://forum.osdev.org/./memberlist.php?mode=viewprofile&u=17546&sid=3552323bd691ba1e0995756313969b5b
 104. https://forum.osdev.org/./posting.php?mode=post&f=2&sid=3552323bd691ba1e0995756313969b5b
 105. https://forum.osdev.org/./posting.php?mode=reply&f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b
 106. https://forum.osdev.org/viewtopic.php?f=2&t=33362
 107. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b&start=15
 108. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b&start=30
 109. https://forum.osdev.org/./viewtopic.php?f=2&t=33362&sid=3552323bd691ba1e0995756313969b5b&start=15
 110. https://forum.osdev.org/./index.php?sid=3552323bd691ba1e0995756313969b5b
 111. https://forum.osdev.org/./viewforum.php?f=16&sid=3552323bd691ba1e0995756313969b5b
 112. https://forum.osdev.org/./viewforum.php?f=2&sid=3552323bd691ba1e0995756313969b5b
 113. http://www.phpbb.com/

   Hidden links:
 115. https://forum.osdev.org/./index.php?sid=3552323bd691ba1e0995756313969b5b