From 05d4a95ccd57aabc99a712ba15c4a1cc16e71f49 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Sat, 30 Sep 2023 22:51:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=B4=20=D0=B8=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- boot/CYRILL1.F16 | Bin 4096 -> 0 bytes boot/CYRILL2.F16 | Bin 4096 -> 0 bytes boot/CYRILL3.F16 | Bin 4096 -> 0 bytes build.py | 2 +- configs/limine.cfg | 4 ++-- include/arch.h | 3 +++ include/cpu.h | 3 +++ include/fb.h | 3 +++ include/tool.h | 6 +++++ kernel/arch.cpp | 17 ++++++++++++++ kernel/cpu.cpp | 15 ++++++++++++ kernel/fb.cpp | 32 ++++++++++++++++++++++++++ kernel/start.cpp | 8 +++++++ kernel/tool.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++ 14 files changed, 146 insertions(+), 3 deletions(-) delete mode 100644 boot/CYRILL1.F16 delete mode 100644 boot/CYRILL2.F16 delete mode 100644 boot/CYRILL3.F16 create mode 100644 include/arch.h create mode 100644 include/cpu.h create mode 100644 include/fb.h create mode 100644 include/tool.h create mode 100644 kernel/arch.cpp create mode 100644 kernel/cpu.cpp create mode 100644 kernel/fb.cpp create mode 100644 kernel/tool.cpp diff --git a/boot/CYRILL1.F16 b/boot/CYRILL1.F16 deleted file mode 100644 index 2a85558f827c46971f68e0100034c8451b11516f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZu!J8R@t6uz;8*g{O4PGpVUq}Wod!7G9ogV~?p^n!&+3Kg!Lfr#f#+_}606v>upZY4z~vVRcO#5HK|z9UhKEor%}y zmzU?)%HJ9M@OC@{jKxAa0;CZ(5d2{8AO;*i-V1*E;q(LGm({~m2vM|1SLs6KKThu- zpI@FI@24M`y%7v{hLhpWAlOjx6sDtzIqYaV0G`4>T`U&Azb0V3D6=Fl%RC9oLIilF zkO_)#h&_#`;2^30^af})M7Y8#R4&_yvnq>Q#@%!}RqITBlUMnhhQF00MPb{6jN}zb zlfFif-;kRW`#bdqNByxYk;6Lw5jl#A@@iTH!KbpY6I_*H6ldipQA_eXIk`i=P8dgO zGGXWnS%xSSLL7w*QFFpkTBjOqmO*rEFK-GiHwvyD4HaoLHUjcb^X-bVyjiXvN=sLi zjA4sF6pK>CEyBQqGzbEd54Y2NR*}mhUm+PUEq;;#F9BK(6?k%Hvkz8_Pwx|w8LQ)x z33CTTer=A+?jdS{$vae*78j8+;?aqP5Bnh<&Km?_xm?~&)xRw&--;Ykc~n3_6|eks zbcGX6ue3qk^NeK6a`r6plPt>${AKC_;X)9;=$GZ_C&5XVx6}PN^t=dPs-fw3c#@CD zIUd3%^9;IQ`MIj*WK`{y59?}q)8HIyLiId!Hug6Yd&-~Bi&w9R!hG6J_X9sm!ocfK zsGVE>l4%CDuUKvkNBDd`uRiCpA7%x*u|UuTr=6$)Ek9Mo$(vdOr_wHQoQk}|1UpW) z{k%#gU}4C7%BITw|AA>6$L+zQBIB^|{pt`~j<)3=GDV33u=rs+Gyp))%X~C}@wfNi z#$)!`J3!WFMHuo3hyDD74z2O!(rleS2pqbB0C9l{$ZG+JJr<>9+uQ%ALV)MZxw(AJ zKBOeYEq{4?DgrUV{*i;)()r{BJY}*zD!|T%qrK4a_M83bcmYc`fdk*33@jJkEZ>zV2%e@1Od;YYfG; z7LDp^rQ2iIUR1)%o4)b+xf^+T_3xdXhoA4_1HTi!9K>Dzlk@gju69p7eJ`(kFVAvM zjXe8PH}=$ymp6U$pK<5v&VKv*-d{VP%E_a3UZo%O^u0atC+f$ypD!Oj{wJuln14ok z?7??EP`Qq~{D~tUK|=4`?;z2N6~G_UN|87f~OV z`3LG_91r*QhMo`o^>VrPxJwC4*(ASR&BKWO28f5~Sv)5pg0s|5Y`!fHZ4 zpZzB_UB;jpK6w4wilz0uy}i}@m%rC1&F3~Y!IkW9W%~EX9BG~wNl($p68_ERM)2+I iSNooH>EZds9~b9`GOv$s%#SOsJ)Ob;0q@4?;bAJ` zyg9x6@ZoZ*^uE{oZa4!BMMInd;s6E&KX`Kx0!|<91wVgx{toc#dNq-aAXvofc%l67 zC-)DVa`SLMdC%l6uh-u%_xn9>OW9+n4o22tL*@W@3jKVsSp2?Az<6FHQC1XLRnLQe22wlx5M`9rAU? zI8u`cL09lH1ioy9fzJ@sCrsli)@U;iqGN42RdBf$FwJNvOD(bGk$;+RL)n_oDPzJI zL__ETXnyiS*bCJO+>1TWv+4C;#M!Kb%YBhAk&NdCJxYKV04;|S@^WV3&xzEa)B6bW z{!ks4Ow{gM+#Z+RL)1LWZ{WE)Pg@Dm=)^*Yejlf^`85U`%jNQJqWR&yU%bObKSQDz}<@1pW^-t;ZW$yP#1Jmh@ zY7g`z@;xU%8vWezmsB&Te#J7|aD>n2^YT-s{uLRzF-On^r&w|f^!#OULCL$e^%qOK zgrU+6CfI58!p*B#+Q;{qPT3T_Usy41!>~D6lxOJYh`0KW$WXLV1WrRLF<>oG$p9-am@zC(i+uYu@a=8l-~1JZ`)>d`(x-sW#Q&M7#!zo@ zfopyc-VNE^1gHR#`DA@u z0gm47cP#;;fBR$m_tT&4-`~Hrf7DoCfK6*}6F7Vz@Tkv$`c$^?F8`zF_${A(vV7U0 zKYBVFj8Q&^vtQ7!cJ0IYr+)8Qg5p|>cGpz8Zy$U1ML8V5mA7<$?gfrt{d;TA!_T+j zfwM#}2VtB3WSoBHtIShJ-tjBl@iX63&CmW+wLaD3_^rJ4pK)WVmc7Bi`D@RoeDY|V zSN9J(@=l-l6LjO-&6kTG{}I$!tbcavp#$G^K>1qknmZogxc_tnw(fVZ$_T9IfgNG( z5r}VcW$E5$G6Hq}K_AIuf;uN~HvnACVqP#V^AB7YftY|g|3v|~ERE;w?XBLwbVGyJ zUe9C$SF*d6>CYpz+jum&c{`|yUu|!BU(ZhL_oRsrFR%W%x;&KNpWcSa$9DPT0<{Ky IJLGu&2WNo&?*IS* diff --git a/boot/CYRILL3.F16 b/boot/CYRILL3.F16 deleted file mode 100644 index badbd7b7b1d37c1dafbd1a754068c3dbec617d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZu!J8K+Q6uyzeRKrH;hFGkdU|bG1tcNg2Ao3HGCev`E6DT)4mH~-GS~G2CGi*S_t7(3C zn2S0u&d%SzKcA_57!1A}&p~6ckmjH?!Un=0yf}zKCwI5Pzj^iM73kN^dMXQ1v`jbY zQt@x6w|CoWdv`m1%i^72Fx;>9hl5~8;VDc<6X&p@?LfGT{LON?{QWTz^R~>AqAZIf zEUf_eN+A;#;ShToPvNno{?ikv*%09ht5BtEBhIQUZW%Yz=~S)r>a(IMo;C8_B(c_Q zk7Xp!CQbSpAU`2DDfTz&503hM7g4}E|EJ|BvgPH}2En`1x)WTMVH9WOJ5fuDB00T5 zzD}7(YBCY%6e zCcr2e!xl*MV@rXTY7=~r20`G`8}6mWyn@R^(XWt~X2Dw$wdC|X zfqpnv$0ZYu`;K?VW%m%Zz~K!%SLbOdBN?4oT%b=Z?Q*nn~>|SGa~Fez90o9}D%bEYOV>K^LB4$uZFLSLHiO-leO* zRN5tuRcifJ3i?ZKj$acF(Nn%gX+XrlSR1 zQvta4H-T)4CUEkk_$A{UX?!6+CHUNiJi=kWI3@cUUzBFj&VLY?0onnCxIh_rDFDR_ z7#c1f#{5$uz>DVGH)P(;Yxa+l(40r))|Y_u&$aZ;Y2MTa>!Sjk{%#yUP)bI7kO=Yd zTJhlB{R_kxDFDqsR4{vzcAm&P8UmqfsX5J4?WX~bdO`u>>ZA$G%}iG&k`X345&rZ> z?#-1u+?g}OQQqnI>i9UbX!ScnOj-7F zDFN$wEdk=c{jvM|>Cf)(@87yVYOF8NwzIa4JUfB-MoM5_Y)^jUTe{$q!fcz`$Wzs~y|P#J;EJa8kdI|A`d zu8{uwOh%y2KiDIEOi=Fxy{+*@)aPaXVHG0~6Hw=$=-;na_a2WC*qKk5FT?hH!3e|z z)cFUk$$b7$%sr2d<)0eVKQCNO=;yQlq^7SitT}%0_^~UN*8TeWTHn9)h6dKXo@o!f zlKoqm{yfrsTemivm!n4b)uWx@>-lT + + +namespace tool { + void format(void (*putc)(char c), const char *format_string, va_list args); +} \ No newline at end of file diff --git a/kernel/arch.cpp b/kernel/arch.cpp new file mode 100644 index 0000000..d8f0e5b --- /dev/null +++ b/kernel/arch.cpp @@ -0,0 +1,17 @@ +#include + + + +namespace arch { + static volatile struct limine_kernel_address_request kernel_address_request = { + .id = LIMINE_KERNEL_ADDRESS_REQUEST, + .revision = 0, + .response = (struct limine_kernel_address_response *)0 + }; + + struct limine_kernel_address_response *kernel_address_response; + + void init() { + kernel_address_response = kernel_address_request.response; + } +} \ No newline at end of file diff --git a/kernel/cpu.cpp b/kernel/cpu.cpp new file mode 100644 index 0000000..3035aa1 --- /dev/null +++ b/kernel/cpu.cpp @@ -0,0 +1,15 @@ +#include +#include + + +namespace cpu { + static bool x87_support = false; + static bool sse_support = false; + static bool avx_support = false; + + void init() { + x87_support = false; + sse_support = false; + avx_support = false; + } +} diff --git a/kernel/fb.cpp b/kernel/fb.cpp new file mode 100644 index 0000000..a63c678 --- /dev/null +++ b/kernel/fb.cpp @@ -0,0 +1,32 @@ +#include + + + +namespace fb { + static volatile struct limine_framebuffer_request framebuffer_request = { + .id = LIMINE_FRAMEBUFFER_REQUEST, + .revision = 0, + .response = (struct limine_framebuffer_response *)0 + }; + + struct limine_framebuffer_response *framebuffer_response; + struct limine_framebuffer *boot_framebuffer; + uint32_t *fb_addr; + uint64_t width; + uint64_t height; + uint64_t pitch; + uint16_t bpp; + + void init() { + framebuffer_response = framebuffer_request.response; + boot_framebuffer = framebuffer_response->framebuffers[0]; + fb_addr = (uint32_t*)boot_framebuffer->address; + width = boot_framebuffer->width; + height = boot_framebuffer->height; + bpp = boot_framebuffer->bpp; + + for (uint64_t i = 0; i < width * height; i++) { + fb_addr[i] = 0x0000FF; + } + } +} \ No newline at end of file diff --git a/kernel/start.cpp b/kernel/start.cpp index 59c1fdf..f54db67 100644 --- a/kernel/start.cpp +++ b/kernel/start.cpp @@ -1,4 +1,8 @@ #include +#include +#include +#include +#include @@ -6,6 +10,10 @@ extern "C" void _start() { asm volatile("cli"); + arch::init(); + cpu::init(); + fb::init(); + for (;;) { asm volatile("hlt"); } diff --git a/kernel/tool.cpp b/kernel/tool.cpp new file mode 100644 index 0000000..8483dff --- /dev/null +++ b/kernel/tool.cpp @@ -0,0 +1,56 @@ +#include +#include +#include + +namespace tool { + // Функция для форматированного вывода + void format(void (*putc)(char c), const char *format_string, va_list args) { + while (*format_string != '\0') { + if (*format_string == '%') { + format_string++; + if (*format_string == '\0') { + break; // Неожиданный конец строки формата + } + if (*format_string == '%') { + putc('%'); // Вывод одного символа '%' + } else if (*format_string == 'd') { + int arg = va_arg(args, int); + // Преобразование целочисленного аргумента в строку и вывод каждого символа + if (arg < 0) { + putc('-'); + arg = -arg; + } + if (arg == 0) { + putc('0'); + } else { + char buffer[10]; // Предполагаем, что максимальное число из 10 цифр + int i = 0; + + while (arg > 0) { + buffer[i++] = '0' + (arg % 10); + arg /= 10; + } + + while (i > 0) { + putc(buffer[--i]); + } + } + } else if (*format_string == 's') { + const char* arg = va_arg(args, const char*); + // Вывод каждого символа строки + while (*arg != '\0') { + putc(*arg); + arg++; + } + } else { + // Неподдерживаемый спецификатор формата + putc('?'); + } + } else { + putc(*format_string); + } + + format_string++; + } + } +} \ No newline at end of file