From 007018790a1e758177fb8b786e741151a9528833 Mon Sep 17 00:00:00 2001 From: xamidev Date: Sun, 14 Jul 2024 10:22:42 +0200 Subject: [PATCH] Add: GDT, entry initializing for code and data segments --- com1.out | Bin 66 -> 100 bytes gdt.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ gdt.h | 8 ++++++++ iso/boot/kernel.elf | Bin 14400 -> 14564 bytes kernel.elf | Bin 14400 -> 14564 bytes kmain.c | 7 ++++++- loader.s | 17 ++++++++++++++++ makefile | 2 +- os.iso | Bin 491520 -> 491520 bytes 9 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 gdt.c create mode 100644 gdt.h diff --git a/com1.out b/com1.out index 7d4bdc4ffff621f594d73db282ade9432b0bba94..a4fd5dac498d349677f191b46c72b7ddd33de8e5 100644 GIT binary patch delta 56 zcmZ=tnP6y~nU`6TnV6GVm71d9?h>MqnpaYknOe-i#Src3=jI=)z>u9=v0036V2KxX2 diff --git a/gdt.c b/gdt.c new file mode 100644 index 0000000..65dc5c5 --- /dev/null +++ b/gdt.c @@ -0,0 +1,48 @@ +#include "gdt.h" + +struct gdt_entry +{ + unsigned short limit_low; + unsigned short base_low; + unsigned char base_middle; + unsigned char access; + unsigned char granularity; + unsigned char base_high; +} __attribute__((packed)); + +struct gdt_ptr +{ + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + +struct gdt_entry gdt[3]; +struct gdt_ptr gp; + +extern void gdt_flush(); + +void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) +{ + gdt[num].base_low = (base & 0xFFFF); + gdt[num].base_middle = (base >> 16) & 0xFF; + gdt[num].base_high = (base >> 24) & 0xFF; + + gdt[num].limit_low = (limit & 0xFFFF); + gdt[num].granularity = ((limit >> 16) & 0x0F); + + gdt[num].granularity |= (gran & 0xF0); + gdt[num].access = access; +} + +void gdt_install() +{ + gp.limit = (sizeof(struct gdt_entry)*3) - 1; + gp.base = (unsigned int)&gdt; + + gdt_set_gate(0, 0, 0, 0, 0); + + gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); + gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); + + gdt_flush(); +} diff --git a/gdt.h b/gdt.h new file mode 100644 index 0000000..2607869 --- /dev/null +++ b/gdt.h @@ -0,0 +1,8 @@ +#ifndef GDT_H +#define GDT_H + +void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); + +void gdt_install(); + +#endif diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 5315e60523c9d818b31fbe73fba136bf67ff0b22..4fafbb55e0a28451e849db49d5488045d35bf9e3 100755 GIT binary patch delta 2596 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 OsK3B`tc+;8Nc1nHD@dsT diff --git a/kernel.elf b/kernel.elf index 5315e60523c9d818b31fbe73fba136bf67ff0b22..4fafbb55e0a28451e849db49d5488045d35bf9e3 100755 GIT binary patch delta 2596 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 OsK3B`tc+;8Nc1nHD@dsT diff --git a/kmain.c b/kmain.c index 8cd6cef..b15b916 100644 --- a/kmain.c +++ b/kmain.c @@ -1,14 +1,19 @@ #include "stdio.h" #include "serial.h" +#include "gdt.h" int kmain(int retvalue) { + + gdt_install(); // serial testing init_serial(); + log("serial connection established", 3); - log("Kernel started", 2); + log("initialized GDT entries", 2); + log("kernel started", 2); clear(); diff --git a/loader.s b/loader.s index 0d3f9ce..bdf1dd1 100644 --- a/loader.s +++ b/loader.s @@ -14,6 +14,7 @@ align 4 extern kmain loader: + cli ; mov eax, 0xCAFEBABE push dword 42 call kmain @@ -21,6 +22,22 @@ loader: .loop: jmp .loop +global gdt_flush +extern gp + +gdt_flush: + lgdt [gp] + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + jmp 0x08:flush2 + +flush2: + ret + section .bss align 4 kernel_stack: diff --git a/makefile b/makefile index 1559535..2f40e62 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -OBJECTS = loader.o kmain.o stdio.o io.o string.o serial.o +OBJECTS = loader.o kmain.o stdio.o io.o string.o serial.o gdt.o CC = gcc CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -c LDFLAGS = -T link.ld -melf_i386 diff --git a/os.iso b/os.iso index 6c0640a01768c23841b6f07e9b7b96fc813349d7..33455f4aead94dfba949c0068f2dfcf3ee780010 100644 GIT binary patch delta 3254 zcma)8eNa@_6~FJYU*HN4SP+U?H^fA0lq?9wU~7$nA8`yxnr+Io3~B`d8L9$F$JWBS z30b;AknPM>s)6~>ARV@pegJ~Vi#N=FG1@NYY4J1RIg9Q`UTDJ99AoNP{c+N?`9 zC#RU7o+q5o+hRiIVcP-QDZ`?q6jPEpEjc;OoYJ=Bgj*{d{KFZ8NyVKzV|uqo$WeZw z#h};8gUVUbo8;3s^=^v#PrZ&Db_xTLK9lIa%qJHxv6H1lZcB-dk2(V1A<-&lZC`dI z7kI3I;jEyk8!-5@8dx}Lu~X>vNBtj(4f#!`2L4N8FZvRDadaIQ){XiTEB+`TF+-Y? zU#k$WsT)!<8`>1Pz+#=!hfzww);MQ6*`s#)n8p)Mh$oyqXQxIX z@lt`Ez7zIbODG{$*Yq+%+z0izWCasq^XLkLs%_IANqWJpSp=eAd4SJvS&VWS*pJLzRhEBH!tQZ_{zv0B8u<{ zGoGYz>6f)in8L99YnbS6@-bnTGVX`9_hLCO86HjTb zayf+ky`J9IUPt+?u1DDLZ|EnQ85CT-ku{&9DcT;$R+omkPtgt3J;oAFQxBaPyA=I4 z{kEXpg-orkrb}Dip@~B5aqO$D-{i1dbYx6aZxgC^PK34pI% z*J}=`5u=@%&(hV}^^mPD8{2!9j%jwF?CQ7JE9Yo}HWsqgwVPF*qw6#`Q5tnT>pw?d z(H?Sb=bpIaew=VdO{&qc~y^Ej(%pv%hJ zWgYS90t&BlU&nJz9cv)OvD4tN#MpPv*e%lzi@s{uVbSGP9UBTYL1)qT-4SKVer!lo zm>7kLlo_7^pQHC-d5-OGVUBW(4)Y>pR)?C&V%2b1yJgz;#YFI+;%CkRSsWV*hkdPb z>QwFoWNLLCh$JNML)&ubmf*bdNL98ca4nqsx#Q(^8uC9Tgyh%b@?@a|wcrj3RMbHs z^VIE~<;69)NAZMbmmBEv*n;AM(t_PZ1&4F@nzp9DY|1SzJyeieLiV%I8)#?w<}W3w z1icx35Pcl|>OUkY;`aa7lVE#z0sDnG?$ZO?0RPd_^ZvHMeTqHA8pq;}NAJF81bm`e>SaLXv{8YVvHT?hU$Wu{zxr zM8Ce`(yLTN1icZx0#(CFm759Im(klM*%#+&JdN_Q@kScWmNrryP4u!S8mW{ooe;bp($W5Yk$AlGM4@ySN|>J$sT0Q}y4mVAM(Ts!s6d_ey8;@k3* zX-P_kJeO$k6`mt8fl}dQluffb?jz#?Yv*I;1NJE&_dj5>7ZBsZ17>WZ-`dRmU4*^) zp(Hgyp7TfFl^vQuU4y;@`qDr>FHDhKm{uV=lnEU)r`)UNHR4Sm(YQuy=W!hH)&RW; z__YB1IB;tKUJ3l?0Q?m2pl045f2*Vh;AaR)Ccg|IHo#ya0B;6!*R^pyy2l zp24_gkthe}dj9vSM3Rl&dXeyL=Mz2y?t}v+ zq2<6L>|^})3BY<_esA#kiNL-7RY%Yuk`CNWMQoGL-%jAs#fp8oKz;~D=pe^)4g~UZ;3?Rj_Uo;{_YlzI$9CYZxr8Wr8(35-Rt|>^APP{@ zME`_80w0HiReszJ><$R%0uDkzeja#29|M0DB$Atcd=2;p{QcOEZvpc!BHs8iZv*T6 z72D2BHU{F;0E2%4b5s6E;sL(FxEUEM72$XK>#)aX6}mw5!11i_efra&eS1sU>MpuP zlUGz$lAp{Db};-!JLu3Fh@823)|I04YVtiz1l;K!MvVbMx0!h)IlRzOAplt^G)xa=SDc!53V2F z8aCELmjzD)P6JM{s1N9CLL#gFfM%`~adhyNLLNcqr-)YyA0z~?|GD-Z-1xDSX?khA j+JX<(H+kSCOgu`(R#B&|9H5m0L6rll$^mubfTrW$9>%0# delta 2590 zcma)-dr(wm6u`fG*uA@p;9fuwMIM6oAjRd4T8yGJsWT#`la%y}9YkZ7D!MaM2 z;;3sLKutj7;S2_0B8jm?>gs4=<+GXoa5PDl31WSbc{|_UyRc2v^v!;I&hMOa&v(A_ z-A8_YSblz3eSN-<&M@An2gU^YHLkO45v-|O?uVF?V@;+cQ(|(mKF$=EU`ie|Sm#=T zy$7*zt>wUoVG+p@v8E}eq$#Gv#*rnRI-&CO@(~dlp4=L2o8|9XC09oxSnm=>>wC6X z#b0Af3;d^F&o)~Hdw>!W)RytW5Fv$Z40DY!OwXmBQEqQhYu(kB9l#a7mWQYi#69*A zYE|~3S6yQjZ0f52QCNo>;){z!4 z#AdDXxj=Wr;;nP+#tB0Nv8^miSvf07kx6R1ogG;ory#jcVd-T`>McZBH(g#vEfb<# zB?%K15v6Ys0>v%YPh1y*>kYZS5=-E_!Lfx9C8kKEN;ta^!UU=5?Ls(YT(;PkF?0K) zaK<`Q4UAbF`c+=VmXkm(t2nO$ChBygo7)fL)(YqrN7DASpW((zcuseR-WTR}GgehXig=Vj zn})Y5;WgbXm*Wnm9fp|Hm%8~WWy`Wmr`|Qy;_xZ9yzH{gQf<$=Y?&@wqG}6p*|NIv z*kK6wUE%UE#fJ}$z&K$J#(xUUdC_-d`E{CmX*STjLbL7{S$_OKXE4PrA0l=r8_)Rz zO^^IRa-w?ihaO4l&|C!>!&XIizW=){cRi(JeOLu!rz|46$DhaP!}Z%B%~w0q;sv+P zwEJi@jGiJkjphN`BsJVMBIthsP47OOUk#D4x(}DsKoIVz20d)+!+q5d2H1xuxKncC zP0nMS*w1B*6GzvO?04dn8uA~%&o2&xOZV{u&f+7itbynx>FMBt{5^V`p25b)vK&YH zK%r~S@ETbJnKX2`XC5QeQjU-N@fj`;_2XaL8Glb_IC)PwLW`XJ01>&`W#Hdu}Pc8bMj)JP@aMB-gO?s$Qv5Hs44a=pl=64%m(-0?GscMQbm32ZJIexiVbYQhD? zS7`x<%5Mr ze}x#x&j+ToKn_;5zzpnZf#vw-X?PLqPD3une+8FOXoZoGx57q2!dM$*7|Q9bO`jVUf<-n6 p5iiCwc1yscHhN@_B{qF)gE-x8=}3Vc3hZ75c1?j@TV)qd{sor6-&Ozs