From b127d7b130a15121c50ec258f2abb280c6e6e7d0 Mon Sep 17 00:00:00 2001 From: JTEpic Date: Sun, 25 May 2025 13:25:36 -0500 Subject: [PATCH] Fixes to bootloader and linker --- .../Part_3/bootloader/Makefile | 5 +++++ .../Part_3/bootloader/bin/boot.bin | Bin 512 -> 512 bytes .../Part_3/bootloader/bin/kernel.bin | Bin 518 -> 541 bytes .../Part_3/bootloader/bin/os.bin | Bin 5126 -> 5149 bytes .../Part_3/bootloader/build/completeKernel.o | Bin 2928 -> 3212 bytes .../Part_3/bootloader/build/kernel.asm.o | Bin 1936 -> 1968 bytes .../Part_3/bootloader/build/kernel.o | Bin 1676 -> 2032 bytes .../Part_3/bootloader/src/boot.asm | 16 +++++++++++++++- .../Part_3/bootloader/src/kernel.asm | 4 ++-- .../Part_3/bootloader/src/kernel.c | 6 +++++- .../Part_3/bootloader/src/kernel.h | 4 ++-- .../Part_3/bootloader/src/linkerScript.ld | 8 ++++---- 12 files changed, 33 insertions(+), 10 deletions(-) mode change 100644 => 100755 How_to_write_a_bootloader/Part_3/bootloader/bin/kernel.bin diff --git a/How_to_write_a_bootloader/Part_3/bootloader/Makefile b/How_to_write_a_bootloader/Part_3/bootloader/Makefile index 021f0d5..9661f70 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/Makefile +++ b/How_to_write_a_bootloader/Part_3/bootloader/Makefile @@ -12,6 +12,11 @@ all: dd if=./bin/kernel.bin >> ./bin/os.bin dd if=/dev/zero bs=512 count=8 >> ./bin/os.bin +qemu: + # Use 32 bit qemu when using debugger on this 32 bit OS + qemu-system-x86_64 -hda ./bin/os.bin + #qemu-system-i386 -hda ./bin/os.bin + clean: rm -f ./bin/boot.bin rm -f ./bin/kernel.bin diff --git a/How_to_write_a_bootloader/Part_3/bootloader/bin/boot.bin b/How_to_write_a_bootloader/Part_3/bootloader/bin/boot.bin index 8857245c01c838fcf9e455b962e7e5d93fe2e726..96d39b12fc0d3323ed394d98c5fc5e16d92d7945 100644 GIT binary patch delta 83 zcmV-Z0IdIj1b_q_`nUi9j@XXCj?laSeEYNjumjByy8sZ5!@B?gkr5OOSbPs4zzhKo pBEafikue?tK#@=$621Tc0RX=M01yDV01yBG{PU!-ZgT+wRjLAe!y literal 518 WcmaFyn~`A@jNA|i?R+{R_Amh7`UO}3 diff --git a/How_to_write_a_bootloader/Part_3/bootloader/bin/os.bin b/How_to_write_a_bootloader/Part_3/bootloader/bin/os.bin index 8af68a948c1c2ad49063575f237794f12351808b..c073d45bfc5856eb4198f9e9d05c0c20f3ef56ca 100644 GIT binary patch delta 135 zcmV;20C@j~D4i%A`nUi9j@XXCj?laSeEYNjumjByy8sZ5!@B?gkr5OOSbPs4zzhKo zBEafikue?tK#@=$621Tc0RX=M01yDV01yBG{PU!-ZgT+%RjTOu0RRB&{<9GT_W>VO piRFXr5XVLQ0Dubsi$(m#07#2P{DZ&(#sF!M$-}b|1oaP*kPD=TG|>P6 delta 100 zcmV-q0Gt1vD26C8`nUi9j@XXCj?laSeEYiq5VioafUyF#0JH+I2+b366Z#JU7EOE) zAixX(4g6==%Y)Aq4#a233jWkX^&GAq4yn Gk)Q;vc_nZF diff --git a/How_to_write_a_bootloader/Part_3/bootloader/build/completeKernel.o b/How_to_write_a_bootloader/Part_3/bootloader/build/completeKernel.o index cdbcae09cb07f20a04f73422d867238084f1b65d..f6296c8417b3885dd8f8b84769b963e6a6c577fb 100644 GIT binary patch literal 3212 zcmeHIO>7%Q6n?ww4W>?9=ZBDzR@noAAe435Mo1|H(uUAfY6}8_K!D8JUOQIeU9(=d zp+YoLg~X49K;i%bBrbr&g`yrfaDWOZ0*>4`gMD z=FQBTH?wCKjz6Gjnkdr5kgg`O_r@5Rj@X0@%T3BP;=gWeZf^c|Wt;7P<-d}FrI&v> z_j}>ng$-HH$*T(+mt+zBxi9rg(s=#5ujJ_b{2^=N=*gu!to_sW0eedJA~kxHp3GK~ zuA~Ys#@_=LY!-r@p8Dv$IwjCGW)=_ThR5=LQ>n9gRJM#X=abIY409~!C0ZSXNa=?Mktxg z!;nlZiylBfz5%V!V`N9OM7hzP`huBkw28XJ2#V~ zac< z9c5wUi7EXuydR|nCuoCX=#CJYHm18kK1b6b@76EU?|XLUAVM)S!{$)k%y-OP=xe4n ztK(gQxd11;IGdVi&u4oxnU`Q=&5%?=59hNl>PPy_C%=IM>>aP&sC#bJsw_K!#5GcC zIt@=ynb!QwOj4ZIWHan|?rh!l+@Mi`>I9YL*_P{tjZU)__||0IntX7|nrw&F*}B)k z$jMp__0$d>uiEhHa;i~v{p(YE+Y?{8o|7awvMXI7O7Jzh?SBl^7``+a$z4`91GSMR zLs-RKG9)f~WicfA2_*(YateyLA-y|v)^L}MsA|%Be^-HI$iTLLUPk`d97uUkABC>! zi{88&iV7Tk)wM|8B9+6q;7X{JAjCk75FN!F-QOGHx@LXfMhyBCIrIoeI=Dks|Kvl| zk(M_T`v>Ik`@v+s`#arwkqjF<(|vfG0Y1*Fv$YPUwhTZnwp*_{}CRn%G3EZn;x0 zIf3KVU0|`=>XbdFNxkdR@M^xoopL#FPo>e-hUcdBT7dD&9jj5|s$ba>F$9McUf?#7Zqd`JSb!p5@;lM!|4)8V zEy0hR#CV)j5!cQ(n{Z`s!Ea6}DQpIEdLQf9hXosBG6!lO{FO1TqVw0-$1`x)>33NT zN?}hyPS5*3=3Rr0^U|*7U4@*E_Yo50!=^}KFTkK=V#5gVmU2pAXCSBN9YNBWOU}!C zspfqRays650K7+vcvhrW(9-c10Tf_kJic5i-aC*PPo3M(0G@@eh#1?430L-|?a%Ah znm$eZR6P3qs0JmNikUvD2^^{gfNu`h$@P(Q532Sc$|BB#e|$xZMdE9l_In)ry%-^J Hr~Li~I8J8H literal 2928 zcmeHHO>7%g5T5ng#^A(q;sB|NgbxIQz-zbALt4_h2{atqAXHTqR8?57H@2yF*VL28HxHzq=M%OrtMaIZCj5`TCzHvH<$vYB)PXA>{`T?pA7p2H`*eMM zXZOm}^%E`Yq}7tg(1l#miTt!5sUgu*{}yEBhp#wA%2~)NKAlGuYc-?LY2I){-yK?Z zaFs^Kz?m6ko-kVHUN`_*{%7{FaSs z(JZZ%Y6V~{Su)y;fMcyvE1Q+$6+ntr+yyw#9WyJZ%V)|PWg6S7pKcuk_6)PjQ;ah1 zR2K1{Tr-qn$dN+;B~nOgU%i&Q1MnscrmW%rNO%%0qI%#Y_q9-CI1;QBjI%l1VRebC zNPrtUF~oSUw2;q#06SZskm|$vO6g{9Yq7BPBLHyVGuF2^Hq@7_H@tZ4yPG}Ncf)}L z)efEh=E(Kq!PpyxLA}wdH(qJg8&TZd?D=CvHum>J*NtM^?+*N)s&vn@2mb8Q9clIh z&uvBy;LeTai-9xtkT_~~f*>9ScGnG6t@mNGuN7Nn&LB-aUdn0;K4^x_nW1C+gBdUN zhvxLfIlVHcFU{$-Ielg3ea*|ClVu=S6+aoi)65G?e;sx`pUdz+OI=ZwQAftgwX zbUxBSN!!1Nj}pe|UO5cMlgMM>jc<`7RWjx3&FAdsIeM9LNo1G2EOJ@#tBPMEN4!Ih z7WS1rQ1&D*;ztgao~Vs)ZOEGO_dX=2gabvxtUo*mkL&xH>rd)}5pM&piedkUi<1Ajl5iAfDA zXQvaoZ)JBG4t#e8erQnn_CxG|T9cY^1}zQ)HuqoBTld5oXma;g`=Nni$H$?gDKIgr858S&9P^5E= zpl9n_$G&aYxG!HAUEhI{+u)==a4&#oajfqXES(#o)X?x93W~JvTj*M*>viA`C@9jt zFQ8}ZyM=xA9PowH^?j}6HaO`k;8+jq(>Ut4v2<>T@+M%Y6JNIW8Icr1dhjbhF`iRhzO(ku1ghi* zP*5Nt3M42gscHOEQXTxH7XGuI*F>*e!}9cN~0N~nkbI%4CIrJeGfQ}v4Dlp1eGdS zm$95Qw9gKQ#CIJwk=f0-cfY}Hz~<(CHA}P#8|Q^M$@>Jd8*c>X1=xhd*Mvc2_U!@J zV8N3366kK;8ZMISwOQL)XNyD_sfs*c>MKHw*Tk<*bSUV zy+z+~M-=4F74AKShU4B-0KNsc_`KBw>-ni^`dw{e-Sfhwtq*b-7FdS zx09Ck)27k7*}at{SuY7&+W7a9?I25nZPUqg5C+lI^C&b~ug%L--OncfRuoF%Da+@TbDw4%v*ES1gXN@_@LN{ZxpL)PWu70>^Q6Lhb>_-ub-5Fdyyjzeb}Gufw~D zoHxc@INm?w#rVcbZEdR2J(?FVZ4U2T@#R^62j4hYMGuE6dU4Wifk)(lC`J zThFz^?@{adwNKHH@0WBPtQgv67QZ>uoeDdPos$3sk<6MErnPhvYakb}8gno+jnxis z^ls!x&vwV8ZFT->Z~(Ayj{Ef_s?yh$M9

ce584alVmn22{N}+>(p0=R1qlRu2$l4&c*Ci^SmsL^43A8s^EuD?->bC6zwicZq zbWX_6)@W$|vvCf&LvR^FJE_L$LQI%Nm_#wJ!EbIHw)5;<%LeMmA=G!Mm&N^DdSw+C Rm271@=iNT$4LBej{RaNue+vKr diff --git a/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.o b/How_to_write_a_bootloader/Part_3/bootloader/build/kernel.o index 77c100a8a832abca7929c86d8142c93e94c125ff..4f998f174f293f3b9cc20dcaeb1181a04734c6e4 100644 GIT binary patch literal 2032 zcmcIlOK%%h6h3$C389m?NnDk_BpbvdNMsx!EK)EnO+#B$l?ob!K*$=~*Y+rxnJ_bM z3PLJURjCylx?slwA-4R2vH&59V1>kQKw`m$9TJtw_sz_8CfUG-Bb|G`^SpD|90b#xgXc>%g2sO6{ccqO2hPM^zn_R>YVu)U6{T)q~bO zEtZzzoIvIaX}tor;d3F;roU^m6l@R}pkZm?yI>3Wp!FR+KXb9`VrP{P+lPjBZEPRF zIC#)z#*+EADgda&sw2$DwWyb*N*% z2i1#vqxQBAQ-2(6$5C@>*j#!YaY@>555qAsmj;7a>m>EUz8?{B|XIUHqS&+x)phS9k$&X3Y3KRYu0`Bd z68Bp9=excCbCaS+*krPsoLgHv*<3`!o-VqDzR!UlfRw0@re~_vTev4)vLRmXE4AsH z)|pxR-5(HO93{!?HB^;99~exz_jOR;TcIM^L{CyG^6&)b`OZFlW}jY@1BHd(y1+r3 z9JxFwB778lX0w#oc7gICk;8@L+f$gq$0%))rzjDZ4KwWRLfl=P+C8BVQ||iTfSKU$cmOF>$x{#ofjH;y+?SChoH$ z&NzNST>hV!TljsXJK*v;&X)SZKOA!o*5y+%RK>l00c9R+&TGzYW`(g|LE-y0#5yGA QmE*2pqc1a0zL>aw07ISqw*UYD literal 1676 zcma)6y>HV{5Wg2EP)Hh@mXB6tFhik8#3_h@76SbMDj`(F(6Oo<=Ov9A+m-F0A|WA$ zO0WQ8VL?m`{1FHtA$CUo0sa7HhH^jqU2(I(N$2~%cX#iepWeBDS1CmTiY)po5q+{U z%hi<3(m2&<{l(AM8(*O*rrKf}P}yLipDKus7+QG9jIvS@AN7t@P0ds%%2su{T2tdk z#?BBG9J)1SRTs+F%kyO@7bo8?PqF)1#sZ_91WrSlo(RjX_3_R9RceR_7~KN$qN+0}uLdLD~z zx81lMdIO&m$BkAPCjHQD>xgJ|Wo5yh<*F{4lF;QC<358T^<<<{EI#M{Fc|?%WT`r` zS6Ch`Eq`MNG303ePK)$wKW7@caZEIux%gPD$%AF?U3Au=J3;(WF{RX^V?%OzNFE)M zD|Fmw(AzjJ?_i7>lTA3=2E|Sl_EUUJ&CpYZVv7{Fa}IQb=)BR_jUM?`DVs6;u+^ZG zpj-sz44Itxv7fjtrb(31E#VTqn~>9X6PKJ;9Fr6A#osdl_@3vZzew4Sm zksEaNp@4ob&=SD;$?-xTYmyJ^M6R#7r2mC!cEtUoR{(kx9VxGmjX|2Y|=; zD&?{dY`|SZ#qT96Co-4xD}H;%PfQ=!ko~VS4bBBTW6ak#nd=uXQ0hZoth~SvR(xjx kv%x!qA9&=FU163!a?oio29O7UH<|aFW#LU~$v)!u2X7Le0RR91 diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm b/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm index a2d73ea..4e11386 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/boot.asm @@ -18,10 +18,17 @@ start: mov ss, ax ; Set stack segment (SS) to 0x00 mov sp, 0x7c00; Set stack pointer (SP) to 0x7c00, top of the bootloader segment sti ; Enable interrupts, allowing them to occur again + + ; set video mode, al 03h is a text mode, this also clears the screen + mov AH, 00h + mov AL, 03h + int 0x10 ;Load kernel -mov bx, KERNEL_LOAD_SEG +mov bx, KERNEL_LOAD_SEG ; Load segment +mov es, bx +mov bx, 0x0000 ; Load offset (SEG*16 + OFFSET) mov dh, 0x00 mov dl, 0x80 mov cl, 0x02 @@ -89,6 +96,13 @@ PModeMain: or al, 2 out 0x92, al + ; Copy kernel from 0x10000 to 0x100000, where we jump to, as protected mode can access past 1MB now + mov esi, 0x10000 ; Source + mov edi, KERNEL_START_ADDR ; Destination + mov ecx, 4096 ; num sectors * 512 bytes + cld + rep movsb + jmp CODE_OFFSET:KERNEL_START_ADDR diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm index d8e5c35..c33f825 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.asm @@ -5,6 +5,6 @@ extern kernel_main _start: call kernel_main - jmp$ + jmp $ -times 512-($ - $$) db 0 \ No newline at end of file +times 510-($ - $$) db 0 \ No newline at end of file diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c index 422e3a9..43824fc 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.c @@ -1,5 +1,9 @@ #include "kernel.h" +#define VIDEO_MEMORY 0xb8000 + void kernel_main(){ - + unsigned char *video = (unsigned char *)VIDEO_MEMORY; + video[0] = 'H'; + video[2] = 'i'; } \ No newline at end of file diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h index 846a76f..1b78527 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/kernel.h @@ -1,5 +1,5 @@ -#ifndef KENREL_H -#define KENREL_H +#ifndef KERNEL_H +#define KERNEL_H void kernel_main(); diff --git a/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld b/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld index 895a479..4f94cc8 100644 --- a/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld +++ b/How_to_write_a_bootloader/Part_3/bootloader/src/linkerScript.ld @@ -3,22 +3,22 @@ OUTPUT_FORMAT(binary) SECTIONS { . = 0x0100000; - .text : ALIGN(4096) + .text : ALIGN(16) { *(.text) } - .rodata : ALIGN(4096) + .rodata : ALIGN(16) { *(.rodata) } - .data : ALIGN(4096) + .data : ALIGN(16) { *(.data) } - .bss : ALIGN(4096) + .bss : ALIGN(16) { *(COMMON) *(.bss)