diff --git a/.gitignore b/.gitignore index 8190e339..b81ed121 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ *.BIN* *.MAP Boot/ +ZealOS-*.iso +sync_repo.sh +sync_vm.sh diff --git a/README.md b/README.md index 09fd4249..839a1d45 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,15 @@ Features in development include: - For running in a VM: Intel VT-x/AMD-V acceleration enabled in your BIOS settings. (Required to virtualize any 64-bit operating system properly.) - Working knowledge of the C programming language. -Every commit contains a "ZealOS-YYYY-MM-DD-HH_MM_SS.iso" in the root of master, which is a timestamped ISO build of that commit. Use this ISO for installation: see the Wiki for guides on installing in [VirtualBox](https://github.com/Zeal-Operating-System/ZealOS/wiki/Installing-(Virtualbox)), [VMWare](https://github.com/Zeal-Operating-System/ZealOS/wiki/Installing-(VMWare)), and [bare-metal](https://github.com/Zeal-Operating-System/ZealOS/wiki/Installing-(Bare%E2%80%90metal)). +To create a Distro ISO, run `build_iso.sh` in the `build/` directory. After creating an ISO, see the Wiki for guides on installing in [VirtualBox](https://github.com/Zeal-Operating-System/ZealOS/wiki/Installing-(Virtualbox)), [VMWare](https://github.com/Zeal-Operating-System/ZealOS/wiki/Installing-(VMWare)), and [bare-metal](https://github.com/Zeal-Operating-System/ZealOS/wiki/Installing-(Bare%E2%80%90metal)). ### Contributing -This is basically a read-only repository. Everything happens inside the OS, as intended by Terry. After you've installed the latest release in a VM and made your changes, you can run the `K.CC` file in the Home/ directory to build a Distro ISO. Then, use either the `mnt.sh` or `export.ps1` script to merge your changes & Distro ISO to the repo. +There are two ways to contribute. The first way involves everything happening inside the OS, as intended by Terry. After you've built the latest ISO, installed to a VM, made your changes, and powered off the VM, you can run the `sync_repo.sh` script to merge your changes to the repo. -Alternatively, you can put individual files into a folder, and run `RedSeaISO("MyChanges.ISO", "/Home/Folder");` to package them into an ISO, then use the mount scripts to export the ISO. +Alternatively, you can edit repo files using an external editor, outside of the OS. -Afterwards, you can make a pull request on the `master` branch. (Make sure to include either the new Distro ISO or package ISO in the pull request, since all other files on the repo are read-only and overwritten each commit: all merges are done manually.) +Afterwards, you can make a pull request on the `master` branch. ## Background diff --git a/ZealOS-2021-10-31-04_58_12.iso b/ZealOS-2021-10-31-04_58_12.iso deleted file mode 100755 index 1daf14be..00000000 Binary files a/ZealOS-2021-10-31-04_58_12.iso and /dev/null differ diff --git a/build/AUTO.ISO b/build/AUTO.ISO index 975f47ef..70153a23 100755 Binary files a/build/AUTO.ISO and b/build/AUTO.ISO differ diff --git a/build/ZealOS-2021-10-31-04_17_20.iso b/build/ZealOS-2021-10-31-04_17_20.iso deleted file mode 100755 index cb31c07b..00000000 Binary files a/build/ZealOS-2021-10-31-04_17_20.iso and /dev/null differ diff --git a/build/build_iso.sh b/build/build_iso.sh index 30c716e9..e20f5a99 100755 --- a/build/build_iso.sh +++ b/build/build_iso.sh @@ -1,7 +1,11 @@ #!/bin/bash + +# Build Distro ISO using AUTO.ISO minimal auto-install as bootstrap to merge codebase, recompile system, and export ISO + # Run this script inside build/ directory + echo "Making temp HDD, running auto-install" -qemu-img create -f raw ZealOS.raw 256M +qemu-img create -f raw ZealOS.raw 192M qemu-system-x86_64 -machine q35,kernel_irqchip=off,accel=kvm -drive format=raw,file=ZealOS.raw -m 2G -smp $(nproc) -rtc base=localtime -cdrom AUTO.ISO -device isa-debug-exit echo "Mounting" sudo rm /mnt/* -r @@ -11,6 +15,8 @@ sudo qemu-nbd -c dev/nbd0 -f raw ./ZealOS.raw sudo partprobe /dev/nbd0 echo "Merging with src/" sudo mount /dev/nbd0p1 /mnt +rm ../src/Home/Registry.CC # we use Registry for auto-iso process, don't want to overwrite +rm ../src/Home/MakeHome.CC # unneeded file sudo cp -r ../src/* /mnt/ sudo sync echo "Files copied, unmounting" @@ -27,6 +33,7 @@ sudo qemu-nbd -c dev/nbd0 -f raw ./ZealOS.raw sudo partprobe /dev/nbd0 sudo mount /dev/nbd0p1 /mnt echo "Extracting Distro ISO" +sudo rm ./ZealOS-*.iso # comment this line if you want lingering old ISOs sudo cp /mnt/Tmp/MyDistro.ISO.C ./ZealOS-$(date +%Y-%m-%d-%H_%M_%S).iso sudo chown -R $USER:$USER ./ZealOS-*.iso echo "Files copied, unmounting" @@ -36,4 +43,5 @@ sudo rm /mnt/* -r sudo sync echo "Deleting temp HDD" rm ./ZealOS.raw -echo "Done" +echo "Done, build/ contents:" +ls diff --git a/build/outline.txt b/build/outline.txt deleted file mode 100644 index 93c225ca..00000000 --- a/build/outline.txt +++ /dev/null @@ -1,35 +0,0 @@ - -Auto-ISO Host QEMU Build Distro ISO for VM Install: - Process: - - make new HDD for a quick install - - boot AUTO.ISO with hdd - - do mini-install and then reboot w/ mount hdd then copy src/-->hdd - - reboot, recompile kernel, reboot, run K.CC with DoDistro - (- copy hdd-->src maybe? not "needed" to just make the Distro ISO) - - export Distro.ISO to Host - - delete temp HDD, finish - -Auto-ISO: - Required Stages/Steps: - - automatically installs to first identified hard disk. - - this could maybe just mimic how current VM install works, - just don't bother asking any questions for user input. - - copy src over hdd - - reboot (TO HDD), recompile Kernel, reboot, run K.CC-->DoDistro - - export Distro.ISO to src/ - - poweroff, done. - - Thoughts: - - implement a "GOOD" file somewhere that is made at the end, - check for this after running the auto ISO and bail if not found? - - Notes: - - the Auto HDD bootloader will need to change. - it has to auto-boot into the C Drive to do this process... - so removing&skipping the prompt will be required - - - - - - diff --git a/build/sync_repo.sh b/build/sync_repo.sh index 6d67e731..d7f64438 100755 --- a/build/sync_repo.sh +++ b/build/sync_repo.sh @@ -1,12 +1,15 @@ #!/bin/bash + # Sync VM --> repo +# (wipe src/, copy VM to src/. To copy over src/ in-place, comment out the `rm -rf ../src/*` line.) + sudo modprobe nbd echo "Edit this script first to pick your VM path & file!" exit # Comment this line out # Uncomment ONE of the next lines and edit it to point to your VM HDD - sudo qemu-nbd -c dev/nbd0 ~/VirtualBox\ VMs/ZealOS/ZealOS.vdi +# sudo qemu-nbd -c dev/nbd0 ~/VirtualBox\ VMs/ZealOS/ZealOS.vdi # sudo qemu-nbd -c dev/nbd0 ~/vmware/ZealOS/ZealOS.vmdk # sudo qemu-nbd -c dev/nbd0 ZealOS.qcow2 @@ -16,6 +19,7 @@ echo "removing src/ files" rm -rf ../src/* echo "copying src/ files from root of mounted hdd" sudo cp -r /mnt/* ../src/ +sudo rm ../src/Boot/BootMHD2.BIN.C echo "src/ files copied" echo "unmounting..." sudo umount /mnt @@ -23,5 +27,6 @@ sudo qemu-nbd -d /dev/nbd0 echo "unmounted hdd" echo "set perms" sudo chown -R $USER:$USER ../src/* +mv ../src/Tmp/AUTO.ISO.C ./AUTO.ISO echo "finished." git status diff --git a/build/sync_vm.sh b/build/sync_vm.sh index 6acadf15..a9d524d5 100755 --- a/build/sync_vm.sh +++ b/build/sync_vm.sh @@ -1,12 +1,17 @@ #!/bin/bash + # Sync repo --> VM +# (copy src/ to VM. Kernel code changes won't be reflected in VM until running BootHDIns; to recompile kernel.) + +# Run this script inside build/ directory + sudo modprobe nbd echo "Edit this script first to pick your VM path & file!" exit # Comment this line out # Uncomment ONE of the next lines and edit it to point to your VM HDD - sudo qemu-nbd -c dev/nbd0 ~/VirtualBox\ VMs/ZealOS/ZealOS.vdi +# sudo qemu-nbd -c dev/nbd0 ~/VirtualBox\ VMs/ZealOS/ZealOS.vdi # sudo qemu-nbd -c dev/nbd0 ~/vmware/ZealOS/ZealOS.vmdk # sudo qemu-nbd -c dev/nbd0 ZealOS.qcow2 diff --git a/mnt.sh b/mnt.sh deleted file mode 100755 index e1a6231f..00000000 --- a/mnt.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -echo "mounting..." -sudo modprobe nbd -sudo qemu-nbd -c dev/nbd0 ~/VirtualBox\ VMs/ZealOS/ZealOS.vdi #Replace with path to disk -#sudo qemu-nbd -c dev/nbd0 ~/vmware/ZealOS/ZealOS.vmdk #Replace with path to disk -sudo partprobe /dev/nbd0 -sudo mount /dev/nbd0p1 /mnt -echo "mounted .vdi" - -echo "removing src/ files" -rm -rf src/* -echo "copying src/ files from root of mounted .vdi" -sudo cp -r /mnt/* src/ -echo "src/ files copied" - -echo "removing doc/ files" -rm -rf docs/* -echo "copying docs/ files from HTML/ folder of mounted .vdi" -sudo cp -r /mnt/HTML/* docs/ -echo "docs/ files copied" - -echo "unmounting..." -sudo umount /mnt -sudo qemu-nbd -d /dev/nbd0 -echo "unmounted .vdi" -echo "set perms, update ISO." -sudo chown -R $USER:$USER src/* -sudo chown -R $USER:$USER docs/* -rm ZealOS-* -mv src/Tmp/MyDistro.ISO.C ./ZealOS-$(date +%Y-%m-%d-%H_%M_%S).iso -mv src/Tmp/AUTO.ISO.C ./build/AUTO.ISO - -echo "removing duplicates" -rm -rf ./src/HTML/* - -echo "finished." -git status diff --git a/src/Misc/Auto/AutoDistro.CC b/src/Misc/Auto/AutoDistro.CC index 5ec46b1d..89d9d664 100755 --- a/src/Misc/Auto/AutoDistro.CC +++ b/src/Misc/Auto/AutoDistro.CC @@ -3,10 +3,9 @@ // Used by host OS to create a full Distro ISO synced with GitHub repo. #define STD_DISTRO_DVD_CONFIG "TB\nScale2Mem(2048,0x40000)\nT\n\n1024\n768\n\n\n" - + U0 MakeMyISO(U8 *_out_iso_filename) {//Does everything with current drive. -//If you have not recompiled $FG,2$Kernel$FG$ and defined your CD/DVD drive, use $LK,"Mount",A="MN:Mount"$. U8 *out_iso_filename = FileNameAbs(_out_iso_filename); if (!DriveIsWritable) { @@ -45,7 +44,4 @@ U0 MakeMyISO(U8 *_out_iso_filename) DelTree("/Distro"); Free(out_iso_filename); } - MakeMyISO("/Tmp/AUTO.ISO.C"); - -// Study the account examples $LK,"Config Strs",A="FL:::/Demo/AcctExample/TOS/TOSConfig.CC,1"$, $LK,"Update Funs",A="FL:::/Demo/AcctExample/TOS/TOSDistro.CC,1"$. diff --git a/src/Misc/Auto/AutoFullDistro0.CC b/src/Misc/Auto/AutoFullDistro0.CC new file mode 100755 index 00000000..f4a605d1 --- /dev/null +++ b/src/Misc/Auto/AutoFullDistro0.CC @@ -0,0 +1,29 @@ +U0 Auto() +{ + I64 i, ata_port = -1; + CAHCIPort *port; + U8 *in_str; + + for (i = 0; i < AHCI_MAX_PORTS; i++) + + { + if (Bt(&blkdev.ahci_hba->ports_implemented, i)) + { + port = &blkdev.ahci_hba->ports[i]; + if (port->signature == AHCI_PxSIG_ATA) + { + ata_port = i; + break; + } + } + } + + BootMHDIns('C'); + in_str = MStrPrint("Sleep(700);In(\"CC\\n%d\\n\\n1024\\n768\\n\\n\\n\");", ata_port); + OnceDrive('C', in_str); + Free(in_str); + in_str = MStrPrint("BootHDIns;OnceFlush;Once(\"#include \\\"/Misc/Auto/AutoFullDistro1\\\";;Auto;\");Reboot;"); + OnceDrive('C', in_str); + OutU8(0x501,0x31); +} +Auto; \ No newline at end of file diff --git a/src/Misc/Auto/AutoInstall.CC b/src/Misc/Auto/AutoInstall.CC index 54a7996c..4ee5c6ac 100755 --- a/src/Misc/Auto/AutoInstall.CC +++ b/src/Misc/Auto/AutoInstall.CC @@ -96,12 +96,7 @@ U0 VMInstallWiz() BootMHDIns('C'); } - in_str = MStrPrint("Sleep(300);In(\"CC\\n%d\\n\\n1024\\n768\\n\\n\\n\");", ata_port); - OnceDrive('C', in_str); - Free(in_str); - in_str = MStrPrint("BootHDIns;BootMHDIns('c');OnceFlush;" - "Once(\"#include \\\"/Misc/Auto/AutoFullDistro1\\\";;Auto;\");Reboot;"); - OnceDrive('C', in_str); + Copy("::/Misc/Auto/BootMHD2.CC", "C:/System/Boot/BootMHD2.CC"); //////////////////////////////////// @@ -117,8 +112,9 @@ Bool DoInstall(Bool prompt_reboot) DocBottom; VMInstallWiz(); res = TRUE; - OutU8(0x501,0x31); - return res; + OnceDrive('C', "PopUp(\"#include \\\"/Misc/Auto/AutoFullDistro0\\\";\");"); + BootRAM("C:" BOOT_DIR_KERNEL_BIN_C); + return res; } Bool OSInstall(Bool prompt_reboot=TRUE) diff --git a/src/Misc/Auto/BootMHD2.CC b/src/Misc/Auto/BootMHD2.CC new file mode 100755 index 00000000..204af735 --- /dev/null +++ b/src/Misc/Auto/BootMHD2.CC @@ -0,0 +1,122 @@ +#define MODULE_SIZE 2 * BLK_SIZE +#define BOOT_HIGH_LOC_MHD2 ((BOOT_RAM_LIMIT - (BOOT_STACK_SIZE + MODULE_SIZE)) >> 4) + +DefinePrint("DD_BOOT_HIGH_LOC_MHD2", "%08X", BOOT_HIGH_LOC_MHD2 << 4); + +asm { +USE16 +BMHD2_START:: + MOV U32 FS:[0], 'B' + 0x2000 + ('2' + 0x2000) << 16 + + MOV AX, BOOT_HIGH_LOC_MHD2 + MOV ES, AX +//This copies this bootloader's code to 0x$TX,"00096A00",D="DD_BOOT_HIGH_LOC_MHD2"$ + MOV AX, CS + MOV DS, AX + MOV U32 [BMHD2_OLD_CS_RIP - BMHD2_START], EBX + MOV U8 [BMHD2_BIOS_DRIVE_NUM - BMHD2_START], DL + + MOV CX, MODULE_SIZE + XOR SI, SI + XOR DI, DI + REP_MOVSB + + MOV AX, BOOT_HIGH_LOC_MHD2 + MOV DS, AX + +//The assembler doesn't support 16-bit very well. + DU8 0xEA; //JMP BOOT_HIGH_LOC_MHD2:BMHD2_HISTART + DU16 BMHD2_HISTART - BMHD2_START, BOOT_HIGH_LOC_MHD2; + +BMHD2_BOOT_MESSAGE:: + DU8 256 DUP(0); + +BMHD2_BIOS_DRIVE_NUM: DU8 0; +BMHD2_PAGE: DU8 0; +BMHD2_BLK_ARRAY:: DU64 8 DUP(0); + +BMHD2_DAP: DU8 16, 0, 1, 0; //One block at a time +BMHD2_DAP_BUF: DU16 0, 0; +BMHD2_DAP_BLK:: //64-bit +BMHD2_DAP_BLK_LO: DU32 0; +BMHD2_DAP_BLK_HI: DU32 0; + +BMHD2_PUT_CHAR:: + MOV AH, 0xE + MOV BL, 7 //Might be foreground color on some BIOS's + MOV BH, U8 [BMHD2_PAGE - BMHD2_START] + INT 0x10 +BMHD2_RET:: + RET +BMHD2_PUTS:: +@@1: LODSB + TEST AL, AL + JZ BMHD2_RET + CALL BMHD2_PUT_CHAR + JMP @@1 + +BMHD2_GETCHAR: + XOR AH, AH + INT 0x16 + PUSH AX + MOV AH, 0x0E + MOV BX, 0x07 + INT 0x10 + POP AX + RET + +BMHD2_HISTART: + MOV AH, 0xF + INT 0x10 + MOV U8 [BMHD2_PAGE - BMHD2_START], BH //Video page + + MOV U32 FS:[0], 0 +@@5: MOV SI, BMHD2_BOOT_MESSAGE - BMHD2_START + CALL BMHD2_PUTS +// CALL BMHD2_GETCHAR + MOV AL, '1' // go directly to C:/ + CMP AL, '0' + JB @@5 + CMP AL, '8' + JAE @@5 + AND EAX, 7 + + MOV EBX, U32 BMHD2_BLK_ARRAY - BMHD2_START[EAX * 8] + MOV EAX, U32 BMHD2_BLK_ARRAY + 4 - BMHD2_START[EAX * 8] + + TEST EBX, EBX + JNZ @@10 + TEST EAX, EAX + JZ @@5 + +@@10: MOV U32 [BMHD2_DAP_BLK_LO - BMHD2_START], EBX + MOV U32 [BMHD2_DAP_BLK_HI - BMHD2_START], EAX + + MOV AX, U16 [BMHD2_OLD_CS_RIP - BMHD2_START] + SHR AX, 4 + ADD AX, U16 [BMHD2_OLD_CS_RIP + 2 - BMHD2_START] + MOV U16 [BMHD2_DAP_BUF + 2 - BMHD2_START], AX //ES:0000 + MOV SI, BMHD2_DAP - BMHD2_START //DS:SI=DAP + MOV DL, U8 [BMHD2_BIOS_DRIVE_NUM - BMHD2_START] + MOV AH, 0x42 + INT 0x13 + + POP EBP + POP EDX + POP EBX + POP ECX + XOR EAX, EAX + POP GS + POP FS + POP ES + POP DS + POPF + +//The assembler doesn't support 16-bit very well. + DU8 0xEA; //JMP xxxx:yyyy +BMHD2_OLD_CS_RIP: + DU16 0, 0; +BMHD2_END:: +//Continues here $LK,"::/System/Boot/BootHD.CC",A="FF:::/System/Boot/BootHD.CC,START"$ +#assert BMHD2_END - BMHD2_START < MODULE_SIZE +} diff --git a/src/Misc/Auto/HomeSys.CC b/src/Misc/Auto/HomeSys.CC index 2c56fe2d..34730b54 100755 --- a/src/Misc/Auto/HomeSys.CC +++ b/src/Misc/Auto/HomeSys.CC @@ -1,8 +1,5 @@ -//Place this file in /Home and change -//anything you want. - U0 UserStartUp() -{//Run each time a user a spawned +{ DocTermNew; Type("::/Doc/Start.DD"); LBts(&Fs->display_flags, DISPLAYf_SHOW); @@ -12,7 +9,7 @@ U0 UserStartUp() } U0 ServerStartUp() -{//Run each time a server task is spawned. +{ DocTermNew; LBts(&Fs->display_flags, DISPLAYf_SHOW); WinToTop; @@ -30,9 +27,9 @@ U0 StartUpTasks() WinTileVert; "Boot Time:%7.3fs\n", tS; XTalk(user, "Cd; #include \"Once\";\n"); - Silent; //no output to screen - Silent(OFF); //no output to screen -} + Silent; + Silent(OFF); +} StartUpTasks; diff --git a/src/Misc/Auto/Once.CC b/src/Misc/Auto/Once.CC index 8df509cd..251cdf81 100755 --- a/src/Misc/Auto/Once.CC +++ b/src/Misc/Auto/Once.CC @@ -5,9 +5,7 @@ //first terminal window upon start-up. //See $LK,"Once",A="FF:~/HomeSys.CC,Once"$ and $LK,"Home Files",A="FF:::/Doc/GuideLines.DD,/Home Files"$. -//Delete the rest from this file. - -U0 Tmp() +U0 Tmp() { OnceExe; switch (sys_boot_src.u16[0])