{"id":174157,"date":"2013-03-25T12:23:04","date_gmt":"2013-03-25T08:23:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=174157"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=174157","title":{"rendered":"<span class=\"post_title\">\u041a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: \u0447\u0430\u0441\u0442\u044c 2<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/df1\/f22\/da0\/df1f22da00fdada9703701fa2f48e499.jpg\"\/><\/p>\n<p>  <a href=\"http:\/\/habrahabr.ru\/company\/neobit\/blog\/173263\/\">\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0439<\/a> \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u201cHello World\u201d, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. <\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u044c <i>\u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434 <\/i> \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043e\u0442\u043b\u0430\u0436\u0435\u043d \u0447\u0435\u0440\u0435\u0437 GDB, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 Visual Studio \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u043b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u043f\u0438\u0441\u043e\u043a PCI \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>  <b>! \u0412\u0410\u0416\u041d\u041e!<\/b>: \u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 6-\u0442\u0438 \u0448\u0430\u0433\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438). <\/p>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0423\u0447\u0438\u043c\u0441\u044f \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/h4>\n<p>  <b>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/b>: <a href=\"http:\/\/habrahabr.ru\/company\/neobit\/blog\/141067\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 GDB \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443<\/a><\/p>\n<p>  \u041a\u0430\u043a \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u043a\u043e\u0434 kernel.bin? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 kernel.bin \u0441\u0438\u043c\u043e\u0432\u043b\u044b \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a:<\/p>\n<p>  1. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0446\u0438\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 makefile, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b:  <\/p>\n<pre><code class=\"cpp\">CFLAGS  = -Wall -fno-builtin -nostdinc -nostdlib -ggdb3 <\/code><\/pre>\n<p>  2. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u0434\u0438\u0441\u043a \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0441\u044f kernel.bin \u0431\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b strip). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u044c kernel.bin \u0432 makefile:  <\/p>\n<pre><code class=\"cpp\">kernel.bin: $(OBJFILES) \t$(LD) -T linker.ld -o $@ $^ \tcp $@ $@.dbg  \tstrip $@ <\/code><\/pre>\n<p>  \u0442\u043e\u0433\u0434\u0430:<br \/>  <b>kernel.bin<\/b> \u2013 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u2013 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c;<br \/>  <b>kernel.bin.dbg<\/b> \u2013 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u043a\u043e\u0434 \u2013 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0443.<\/p>\n<p>  3. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a:  <\/p>\n<pre><code class=\"bash\">sudo apt-get install cgdb <\/code><\/pre>\n<p>  4. \u041f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:  <\/p>\n<pre><code class=\"bash\">make clean make all sudo make image <\/code><\/pre>\n<p>  5. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c qemu \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430:  <\/p>\n<pre><code class=\"bash\">sudo qemu-system-i386 -s -S -hda hdd.img & <\/code><\/pre>\n<p>  6. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u0430 \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438:  <\/p>\n<pre><code class=\"bash\">cgdb kernel.bin.dbg <\/code><\/pre>\n<p>  7. \u0412 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a qemu \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c breakpoint \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main:  <\/p>\n<pre><code class=\"bash\">(gdb) target remote localhost:1234 (gdb) break main <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/6ee\/c8b\/283\/6eec8b2833e2e2e9ad4e5397eb96452a.jpg\"\/><\/p>\n<p>  8. \u041f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0432 main \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u0435\u0435:  <\/p>\n<pre><code class=\"bash\">(gdb) c (gdb) n (gdb) n <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/8bb\/4cb\/9fa\/8bb4cb9fa7a51fe3d8fbd5debdbae324.jpg\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u044f QEMU, \u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u0436\u0435\u043b\u0435\u0437\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 \u043a \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u2013 \u044d\u0442\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439. <\/p>\n<h4>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438\u0437 Visual Studio<\/h4>\n<p>  <b>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/b>: <a href=\"http:\/\/habrahabr.ru\/company\/neobit\/blog\/151712\/\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 Visual Studio 2010 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e gcc \u0432 Linux <\/a><\/p>\n<p>  \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0438\u0437 Visual Studio? \u0421\u043b\u0435\u0434\u0443\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 Visual Studio, \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 Linux \u2013 \u043e\u043d \u0443\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<p>  1. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 ssh:  <\/p>\n<pre><code class=\"bash\">sudo apt-get install ssh <\/code><\/pre>\n<p>  2. \u0420\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 <b>kernel.bin<\/b> \u043d\u0430 <b>shared directory <\/b>\u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.<\/p>\n<p>  3. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <b>plink <\/b> \u0432 \u043f\u0430\u043f\u043a\u0443<b> tools<\/b> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<p>  4. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 Visual Studio \u0441\u043b\u0435\u0434\u0443\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e:<\/p>\n<p>  <b>\\proj\\kernel.c<br \/>  \\proj\\loader.s<br \/>  \\proj\\common\\printf.c<br \/>  \\proj\\common\\screen.c<br \/>  \\proj\\include\\printf.h<br \/>  \\proj\\include\\stdarg.h<br \/>  \\proj\\include\\screen.h<br \/>  \\proj\\include\\types.h<br \/>  \\proj\\makefile<br \/>  \\proj\\linker.ld<br \/>  \\proj\\tools\\plink.exe<br \/>  \\proj\\kernel\\kernel.sln<br \/>  \\proj\\kernel\\kernel.suo<br \/>  \\proj\\kernel\\kernel.sdf<br \/>  \\proj\\kernel\\vs\\kernel.vcxproj<br \/>  \\proj\\kernel\\vs\\kernel.vcxproj.filters<br \/>  \\proj\\kernel\\vs\\make_vs.props<\/b><\/p>\n<p>  5. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u201d\\proj\\kernel\\vs\\make_vs.props\u201d \u0442\u0430\u043a \u0436\u0435 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;Project xmlns=&quot;http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003&quot;&gt;    &lt;PropertyGroup Label=&quot;RemoteBuildLocals&quot;&gt;     &lt;RblFolder&gt;proj&lt;\/RblFolder&gt;     &lt;RblIncludePath&gt;$(SolutionDir)\\include\\&lt;\/RblIncludePath&gt;     &lt;RblExecute&gt;sudo make image; sudo qemu-system-i386 -hda hdd.img&lt;\/RblExecute&gt;   &lt;\/PropertyGroup&gt;    &lt;PropertyGroup Label=&quot;RemoteBuildSettings&quot;&gt;     &lt;RbHost&gt;192.168.1.8&lt;\/RbHost&gt;     &lt;RbUser&gt;user&lt;\/RbUser&gt;     &lt;RbPassword&gt;123456&lt;\/RbPassword&gt;     &lt;RbRoot&gt; ~\/Desktop\/_habr&lt;\/RbRoot&gt;   &lt;\/PropertyGroup&gt;    &lt;PropertyGroup Label=&quot;RemoteBuild&quot;&gt;     &lt;RbToolArgs&gt; -pw $(RbPassword) $(RbUser)%40$(RbHost) cd $(RbRoot); cd $(RblFolder);&lt;\/RbToolArgs&gt;     &lt;RbToolExe&gt;$(SolutionDir)tools\\plink -batch $(RbToolArgs)&lt;\/RbToolExe&gt;     &lt;RbBuildCmd&gt;$(RbToolExe) make all&lt;\/RbBuildCmd&gt;     &lt;RbRebuildAllCmd&gt;$(RbToolExe) make rebuild&lt;\/RbRebuildAllCmd&gt;     &lt;RbCleanCmd&gt;$(RbToolExe) make cleanall&lt;\/RbCleanCmd&gt;     &lt;RbExecuteCmd&gt;$(RbToolArgs) $(RblExecute)&lt;\/RbExecuteCmd&gt;     &lt;RbIncludePath&gt;$(RblIncludePath)&lt;\/RbIncludePath&gt;   &lt;\/PropertyGroup&gt;    &lt;PropertyGroup Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;     &lt;NMakeBuildCommandLine&gt;$(RbBuildCmd)&lt;\/NMakeBuildCommandLine&gt;     &lt;NMakeReBuildCommandLine&gt;$(RbRebuildAllCmd)&lt;\/NMakeReBuildCommandLine&gt;     &lt;NMakeCleanCommandLine&gt;$(RbCleanCmd)&lt;\/NMakeCleanCommandLine&gt;     &lt;IncludePath&gt;$(RbIncludePath)&lt;\/IncludePath&gt;     &lt;LocalDebuggerCommand&gt;$(SolutionDir) tools\\plink&lt;\/LocalDebuggerCommand&gt;     &lt;LocalDebuggerCommandArguments&gt;$(RbExecuteCmd)&lt;\/LocalDebuggerCommandArguments&gt;   &lt;\/PropertyGroup&gt;    &lt;PropertyGroup Condition=&quot;'$(Configuration)|$(Platform)'=='Release|Win32'&quot;&gt;     &lt;NMakeBuildCommandLine&gt;$(RbBuildCmd)&lt;\/NMakeBuildCommandLine&gt;     &lt;NMakeReBuildCommandLine&gt;$(RbRebuildAllCmd)&lt;\/NMakeReBuildCommandLine&gt;     &lt;NMakeCleanCommandLine&gt;$(RbCleanCmd)&lt;\/NMakeCleanCommandLine&gt;     &lt;IncludePath&gt;$(RbIncludePath)&lt;\/IncludePath&gt;     &lt;LocalDebuggerCommand&gt;$(SolutionDir)tools\\plink&lt;\/LocalDebuggerCommand&gt;     &lt;LocalDebuggerCommandArguments&gt;$(RbExecuteCmd)&lt;\/LocalDebuggerCommandArguments&gt;   &lt;\/PropertyGroup&gt;  &lt;\/Project&gt; <\/code><\/pre>\n<p>  6. \u041c\u0435\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u201d\\proj\\kernel\\vs\\kernel.vcxproj \u201d \u0442\u0430\u043a \u0436\u0435 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:  <\/p>\n<pre><code class=\"xml\">&lt;Import Project=&quot;$(VCTargetsPath)\\Microsoft.Cpp.props&quot; \/&gt;   &lt;Import Project=&quot;$(SolutionDir)\\vs\\make_vs.props&quot; \/&gt;   &lt;ImportGroup Label=&quot;ExtensionSettings&quot;&gt;  <\/code><\/pre>\n<p>  7. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/2a9\/77e\/de4\/2a977ede410c4eaca872174cda30faa2.jpg\"\/><\/p>\n<p>  8. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/006\/4da\/981\/0064da9810211bc47381e733008ce169.jpg\"\/><\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u0434\u0435\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 Visual Studio, \u0445\u043e\u0442\u044c \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 GCC \u043d\u0430 Linux.<\/p>\n<h4>\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 PCI<\/h4>\n<p>  <b>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/b>: <a href=\"http:\/\/habrahabr.ru\/company\/neobit\/blog\/162769\/\">\u041a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 PCI \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a><\/p>\n<p>  \u041a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0448\u0438\u043d\u0443 PCI \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432? \u0421\u043b\u0435\u0434\u0443\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u0434 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PCI):<\/p>\n<p>  1. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0444\u0430\u0439\u043b <b>include\\types.h<\/b>, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430:  <\/p>\n<pre><code class=\"cpp\">typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; <\/code><\/pre>\n<p>  2. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b <b>include\\io.h<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 bitvisor \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 (include\\io.h).<\/p>\n<p>  3. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b <b>include\\pci.h,<\/b> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 PCI. \u041e\u043d \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:  <\/p>\n<pre><code class=\"cpp\">#ifndef _PCI_H #define _PCI_H  #include &quot;types.h&quot;  #define PCI_CONFIG_PORT      0x0CF8 #define PCI_DATA_PORT        0x0CFC  #define PCI_MAX_BUSES        255 #define PCI_MAX_DEVICES      32 #define PCI_MAX_FUNCTIONS    8  #define PCI_HEADERTYPE_NORMAL        0 #define PCI_HEADERTYPE_BRIDGE        1 #define PCI_HEADERTYPE_CARDBUS       2 #define PCI_HEADERTYPE_MULTIFUNC     0x80  typedef union  { \tstruct \t{ \t\tu16 vendorID; \t\tu16 deviceID; \t\tu16 commandReg; \t\tu16 statusReg; \t\tu8 revisionID; \t\tu8 progIF; \t\tu8 subClassCode; \t\tu8 classCode; \t\tu8 cachelineSize; \t\tu8 latency; \t\tu8 headerType; \t\tu8 BIST; \t} __attribute__((packed)) option; \tu32 header[4]; } __attribute__((packed)) PCIDevHeader;  void ReadConfig32(u32 bus, u32 dev, u32 func, u32 reg, u32 *data); char *GetPCIDevClassName(u32 class_code); void PCIScan();  #endif <\/code><\/pre>\n<p>  4. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b <b>pci.c<\/b> \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c (\u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439):<\/p>\n<pre><code class=\"cpp\">#include &quot;types.h&quot; #include &quot;printf.h&quot; #include &quot;io.h&quot; #include &quot;pci.h&quot;  typedef struct  { \tu32 class_code; \tchar name[32]; } PCIClassName;  static PCIClassName g_PCIClassNames[] =  { \t{ 0x00, &quot;before PCI 2.0&quot;}, \t{ 0x01, &quot;disk controller&quot;}, \t{ 0x02, &quot;network interface&quot;}, \t{ 0x03, &quot;graphics adapter&quot;}, \t{ 0x04, &quot;multimedia controller&quot;}, \t{ 0x05, &quot;memory controller&quot;}, \t{ 0x06, &quot;bridge device&quot;}, \t{ 0x07, &quot;communication controller&quot;}, \t{ 0x08, &quot;system device&quot;}, \t{ 0x09, &quot;input device&quot;}, \t{ 0x0a, &quot;docking station&quot;}, \t{ 0x0b, &quot;CPU&quot;}, \t{ 0x0c, &quot;serial bus&quot;}, \t{ 0x0d, &quot;wireless controller&quot;}, \t{ 0x0e, &quot;intelligent I\/O controller&quot;}, \t{ 0x0f, &quot;satellite controller&quot;}, \t{ 0x10, &quot;encryption controller&quot;}, \t{ 0x11, &quot;signal processing controller&quot;}, \t{ 0xFF, &quot;proprietary device&quot;} };  typedef union { \tstruct \t{ \t\tu32 zero \t\t: 2; \t\tu32 reg_num     : 6; \t\tu32 func_num    : 3; \t\tu32 dev_num     : 5; \t\tu32 bus_num     : 8; \t\tu32 reserved    : 7; \t\tu32 enable_bit  : 1; \t}; \tu32 val; } PCIConfigAddres;  void ReadConfig32(u32 bus, u32 dev, u32 func, u32 reg, u32 *data) { \tPCIConfigAddres addr; \t \taddr.val = 0; \taddr.enable_bit = 1; \taddr.reg_num =  reg; \taddr.func_num = func; \taddr.dev_num =  dev; \taddr.bus_num =  bus;\t\t  \tout32(PCI_CONFIG_PORT, addr.val); \tin32(PCI_DATA_PORT, data); \treturn; }  char *GetPCIDevClassName(u32 class_code) { \tint i; \tfor (i = 0; i &lt; sizeof(g_PCIClassNames)\/sizeof(g_PCIClassNames[0]); i++) \t{ \t\tif (g_PCIClassNames[i].class_code == class_code) \t\t\treturn g_PCIClassNames[i].name; \t} \treturn NULL; }  int ReadPCIDevHeader(u32 bus, u32 dev, u32 func, PCIDevHeader *p_pciDevice) { \tint i; \t \tif (p_pciDevice == 0) \t\treturn 1; \t \tfor (i = 0; i &lt; sizeof(p_pciDevice-&gt;header)\/sizeof(p_pciDevice-&gt;header[0]); i++) \t\tReadConfig32(bus, dev, func, i, &p_pciDevice-&gt;header[i]); \t\t \tif (p_pciDevice-&gt;option.vendorID == 0x0000 ||  \t\tp_pciDevice-&gt;option.vendorID == 0xffff || \t\tp_pciDevice-&gt;option.deviceID == 0xffff) \t\treturn 1; \t\t \treturn 0; }  void PrintPCIDevHeader(u32 bus, u32 dev, u32 func, PCIDevHeader *p_pciDevice) { \tchar *class_name; \t \tprintf(&quot;bus=0x%x dev=0x%x func=0x%x venID=0x%x devID=0x%x&quot;, \t\t\tbus, dev, func, p_pciDevice-&gt;option.vendorID, p_pciDevice-&gt;option.deviceID); \t\t\t \tclass_name = GetPCIDevClassName(p_pciDevice-&gt;option.classCode); \tif (class_name) \t\tprintf(&quot; class_name=%s&quot;, class_name); \t\t \tprintf(&quot;\\n&quot;); }  void PCIScan(void) { \tint bus; \tint dev; \t \tfor (bus = 0; bus &lt; PCI_MAX_BUSES; bus++) \t\tfor (dev = 0; dev &lt; PCI_MAX_DEVICES; dev++) \t\t{ \t\t\tu32 func = 0; \t\t\tPCIDevHeader pci_device; \t\t\t \t\t\tif (ReadPCIDevHeader(bus, dev, func, &pci_device)) \t\t\t\tcontinue; \t\t\t\t \t\t\tPrintPCIDevHeader(bus, dev, func, &pci_device); \t\t\t \t\t\tif (pci_device.option.headerType & PCI_HEADERTYPE_MULTIFUNC) \t\t\t{ \t\t\t\tfor (func = 1; func &lt; PCI_MAX_FUNCTIONS; func++) \t\t\t\t{ \t\t\t\t\tif (ReadPCIDevHeader(bus, dev, func, &pci_device)) \t\t\t\t\t\tcontinue; \t\t\t\t\tPrintPCIDevHeader(bus, dev, func, &pci_device); \t\t\t\t} \t\t\t} \t\t} }  <\/code><\/pre>\n<p>  5. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f PCI \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432 kernel.c:<\/p>\n<pre><code class=\"cpp\">#include &quot;printf.h&quot; #include &quot;screen.h&quot; #include &quot;types.h&quot; #include &quot;pci.h&quot;  void main() {        clear_screen();     printf(&quot;\\n&gt;&gt;&gt; Hello World!\\n&quot;);     PCIScan(); } <\/code><\/pre>\n<p>  6. \u0412\u043d\u043e\u0441\u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 makefile:  <\/p>\n<pre><code class=\"cpp\"> OBJFILES = \\ \tloader.o  \\ \tcommon\/printf.o  \\ \tcommon\/screen.o  \\ \tpci.o  \\ \tkernel.o <\/code><\/pre>\n<p>  7. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442:  <\/p>\n<pre><code class=\"bash\">make rebuild sudo make image <\/code><\/pre>\n<p>  8. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:  <\/p>\n<pre><code class=\"bash\">sudo qemu-system-i386 -hda hdd.img <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/4e3\/a30\/c32\/4e3a30c32c8ff56d8d018b133489b0f6.jpg\"\/><\/p>\n<p>  \u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a PCI \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u042d\u0442\u043e \u0442\u0430\u043a \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0432\u0448\u0438\u0441\u044c \u0441 \u0444\u043b\u0435\u0448\u043a\u0438.<\/p>\n<p>  \u041f\u0440\u043e\u0439\u0434\u044f \u0432\u0441\u0435 \u0448\u0430\u0433\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u043c \u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c.    \t \t\t   \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/company\/neobit\/blog\/174157\/\"> http:\/\/habrahabr.ru\/company\/neobit\/blog\/174157\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/df1\/f22\/da0\/df1f22da00fdada9703701fa2f48e499.jpg\"\/><\/p>\n<p>  <a href=\"http:\/\/habrahabr.ru\/company\/neobit\/blog\/173263\/\">\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0439<\/a> \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u201cHello World\u201d, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. <\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u044c <i>\u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434 <\/i> \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043e\u0442\u043b\u0430\u0436\u0435\u043d \u0447\u0435\u0440\u0435\u0437 GDB, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 Visual Studio \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u043b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0441\u043f\u0438\u0441\u043e\u043a PCI \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>  <b>! \u0412\u0410\u0416\u041d\u041e!<\/b>: \u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 6-\u0442\u0438 \u0448\u0430\u0433\u043e\u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438). <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-174157","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/174157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=174157"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/174157\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=174157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=174157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=174157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}