{"id":258799,"date":"2015-06-06T23:55:02","date_gmt":"2015-06-06T19:55:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=258799"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=258799","title":{"rendered":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 OS \u043d\u0430 Go+asm Part 0x00"},"content":{"rendered":"<p>     \t\u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a %username%.<\/p>\n<p>  \u0417\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043c\u043d\u0435 \u043f\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435. \u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u041e\u0421, \u0432 \u043a\u043e\u043d\u0446\u0435-\u043a\u043e\u043d\u0446\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u041e\u0421, \u043f\u0443\u0441\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0443\u0447\u0435\u0431\u043d\u0443\u044e.<\/p>\n<p>  \u041a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044f \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043b\u044e \u044f\u0437\u044b\u043a Go \u043d\u0443, \u0438 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u043c. \u0427\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u2014 \u043f\u043e\u0434 \u0445\u0430\u0431\u0440\u0430\u043a\u0430\u0442\u043e\u043c.<br \/>  <a name=\"habracut\"><\/a><\/p>\n<h1>Step 0x00<\/h1>\n<p>  \u041f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0443\u043c\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438 \u0441\u043f\u0435\u043a\u0443 multiboot.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u0444\u0430\u0439\u043b multiboot.s)  <\/p>\n<pre><code>MBOOT_PAGE_ALIGN    equ 1&lt;&lt;0 MBOOT_MEM_INFO      equ 1&lt;&lt;1 MBOOT_HEADER_MAGIC  equ 0x1BADB002 MBOOT_HEADER_FLAGS  equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO MBOOT_CHECKSUM      equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS)  [BITS 32]  [GLOBAL mboot] [EXTERN code] [EXTERN bss] [EXTERN end]  mboot:   dd    MBOOT_HEADER_MAGIC   dd    MBOOT_HEADER_FLAGS   dd    MBOOT_CHECKSUM   dd    mboot   dd    code   dd    bss   dd    end   dd    start  [GLOBAL start] extern go.kernel.Load ;\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 Go  start:   push  ebx   cli   call  go.kernel.Load ;\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u044f\u0434\u0440\u0430   jmp   $ <\/code><\/pre>\n<p>  \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b kernel.go \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f:  <\/p>\n<pre><code class=\"go\">package kernel  function Load(){ \/\/\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0435 \u044f\u0434\u0440\u043e \u043f\u043e\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 } <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b link.ld  <\/p>\n<pre><code>ENTRY(start) SECTIONS {      .text 0x100000 :     {         code = .; _code = .; __code = .;         *(.text)         . = ALIGN(4096);     }      .data :     {         data = .; _data = .; __data = .;         *(.data)         *(.rodata)         . = ALIGN(4096);     }      .bss :     {         bss = .; _bss = .; __bss = .;         *(.bss)         . = ALIGN(4096);     }      end = .; _end = .; __end = .; } <\/code><\/pre>\n<p>  \u0438 Makefile  <\/p>\n<pre><code>SOURCES=multiboot.o kernel.go.o  GOFLAGS= -nostdlib -nostdinc -fno-stack-protector -fno-split-stack -static -m32 -g -I. GO=gccgo ASFLAGS= -felf NASM= nasm $(ASFLAGS) OBJCOPY=objcopy  LDFLAGS=-T link.ld -m elf_i386    all: $(SOURCES) link  clean:  \trm *.o  kernel   link: \tld $(LDFLAGS) -o kernel $(SOURCES)   %.go.o: %.go \t$(GO)\t$(GOFLAGS) -o $@ -c $&lt;  %.o: %.s \t$(NASM) $&lt; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 make \u0432 \u0434\u0438\u0440\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0444\u0430\u0439\u043b kernel, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e qemu:<\/p>\n<p>  <b>qemu-system-i386 -kernel .\/kernel<\/b><\/p>\n<p>  \u042f\u0434\u0440\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c )<\/p>\n<h1>Step 0x01<\/h1>\n<p>  \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0437\u0434\u043e\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043c\u0438\u0440\u043e\u043c.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 multiboot.s \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:  <\/p>\n<pre><code>global __go_runtime_error global __go_register_gc_roots global __unsafe_get_addr  __unsafe_get_addr:   push ebp   mov ebp, esp   mov eax, [ebp+8]   mov esp, ebp   pop ebp   ret  __go_register_gc_roots: __go_runtime_error:   ret <\/code><\/pre>\n<p>  \u0444\u0443\u043d\u043a\u0446\u0438\u044f __unsafe_get_addr \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c uin32 \u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 Go<\/p>\n<p>  \u0414\u0440\u0443\u0433\u0438\u0435 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0442\u044b\u0447\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b screen.go  <\/p>\n<pre><code class=\"go\">package screen  var ( \tframeBuffer      *[totalMax]uint16 \/\/\u0421\u0442\u0430\u0440\u0448\u0438\u0435 8 \u0431\u0438\u0442 - \u0441\u0438\u043c\u0432\u043e\u043b, \u043c\u043b\u0430\u0434\u0448\u0438\u0435 - \u0435\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \tcursorX, cursorY uint8 )  const ( \tframeBufferAddr = 0xB8000 \tmaxX            = 80 \tmaxY            = 25 \ttotalMax        = maxX * maxY \twhiteOnBlack    = 0x07 ) \/\/\u041d\u0438\u0436\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f Go \u043d\u0430\u0434 \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 __unsafe_get_addr \/\/extern __unsafe_get_addr func getAddr(addr uint32) *[totalMax]uint16  func Init() { \tcursorX = 0 \tcursorY = 0 \tframeBuffer = getAddr(frameBufferAddr) \/\/\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0438\u0434\u0435\u043e\u0431\u0443\u0444\u0435\u0440\u0443 }  \/\/\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0435\u0441\u044c \u0432\u0438\u0434\u0435\u043e\u0431\u0443\u0444\u0435\u0440 \u043d\u0443\u043b\u044f\u043c\u0438 func Clear() { \tfor i := 0; i &lt; totalMax; i++ { \t\tframeBuffer[i] = 0 \t} \tcursorX = 0 \tcursorY = 0 }  \/\/\u041c\u0435\u043d\u044f\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0443\u0440\u0441\u043e\u0440\u0430 func SetCursor(x, y uint8) { \tcursorX = x \tcursorY = y }  \/\/\u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043c \u044d\u043a\u0440\u0430\u043d \u0435\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d func scroll() { \tif cursorY &gt;= maxY {  \t\tfor i := 0; i &lt; 24*maxX; i++ { \t\t\tframeBuffer[i] = frameBuffer[i+80] \/\/\u0421\u043c\u0435\u0449\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0432\u0432\u0435\u0440\u0445 \t\t} \t\tfor i := 24 * 80; i &lt; totalMax; i++ { \t\t\t\/\/\u041e\u0447\u0438\u0449\u0430\u0435\u043c \u043d\u0438\u0436\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \t\t\tframeBuffer[i] = 0x20 | (((0 &lt;&lt; 4) | (15 & 0x0F)) &lt;&lt; 8) \t\t\tframeBuffer[i] = 0 \t\t} \t\tcursorY = 24 \t\tcursorX = 0 \t} }  \/\/\u0412\u044b\u0432\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 func putChar(c byte) { \tswitch c { \tcase 0x08: \/\/backspace \t\tif cursorX &gt; 0 { \t\t\tcursorX-- \t\t} \tcase 0x09: \/\/tab \t\tcursorX = (cursorX + 8) & (8 - 1) \tcase '\\r': \/\/return \t\tcursorX = 0 \tcase '\\n': \/\/new line \t\tcursorX = 0 \t\tcursorY++ \tdefault:  \t\tif c &gt;= 0x20 { \/\/\u0412\u0441\u0435 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \t\t\tframeBuffer[cursorY*80+cursorX] = uint16(c) | (((0 &lt;&lt; 4) | (15 & 0x0F)) &lt;&lt; 8) \t\t\tcursorX++ \t\t} \t} \tif cursorX &gt;= 80 { \/\/\u0415\u0441\u043b\u0438 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440 \t\tcursorX = 0 \t\tcursorY++ \t} \tscroll() }  \/\/\u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 func PrintStr(s string) { \tfor i := 0; i &lt; len(s); i++ { \t\tputChar(s[i]) \t} } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430\u0448 \u043c\u043e\u0434\u0443\u043b\u044c screen \u043a \u044f\u0434\u0440\u0443 \u2014 \u0432 kernel.go \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c import \u00abscreen\u00bb, \u0442\u0430\u043c \u0436\u0435, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438 Load() \u043f\u0438\u0448\u0435\u043c:  <\/p>\n<pre><code class=\"go\">\tscreen.Init() \tscreen.Clear() \tscreen.PrintStr(&quot;Hello Habrahar!&quot;) <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043a\u0430\u043a \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Makefile \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:  <\/p>\n<pre><code>%.gox: %.go.o \t\t$(OBJCOPY) -j .go_export $&lt; $@ <\/code><\/pre>\n<p>  \u0418 \u0442\u0430\u043c \u0436\u0435, \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e SOURCES \u043c\u0435\u0436\u0434\u0443 multiboot.o \u0438 kernel.go.o \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c screen.go.o \u0438 screen.gox<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 make \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c qemu \u0441 \u043d\u0430\u0448\u0438\u043c \u044f\u0434\u0440\u043e\u043c. \u0414\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f   \t\t\t\t<\/p>\n<div class=\"polling\">\n<form action=\"\/json\/polling\/\" class=\"poll\" method=\"post\">\n<div class=\"poll_title\">\u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u0443?<\/div>\n<p>  \t\t<input type=\"hidden\" name=\"post_id\" value=\"259719\"\/> \t\t<input type=\"hidden\" name=\"polling_question_id\" value=\"13633\"\/>  \t\t<\/p>\n<table class=\"answer\">\n<tr>\n<td class=\"input\"> \t\t\t\t\t<input type=\"radio\" id=\"vv67285\" \t\t\t\t\t\tclass=\"radio js-field-data\" \t\t\t\t\t\tname=\"variant[]\" \t\t\t\t\t\tvalue=\"67285\" \/> \t\t\t\t<\/td>\n<td class=\"label\"> \t\t\t\t\t<label for=\"vv67285\">\u0414\u0430<\/label> \t\t\t\t<\/td>\n<\/tr>\n<tr>\n<td class=\"input\"> \t\t\t\t\t<input type=\"radio\" id=\"vv67287\" \t\t\t\t\t\tclass=\"radio js-field-data\" \t\t\t\t\t\tname=\"variant[]\" \t\t\t\t\t\tvalue=\"67287\" \/> \t\t\t\t<\/td>\n<td class=\"label\"> \t\t\t\t\t<label for=\"vv67287\">\u041d\u0435\u0442<\/label> \t\t\t\t<\/td>\n<\/tr>\n<\/table>\n<p class=\"total\">\u041d\u0438\u043a\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b. \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043d\u0435\u0442.<\/p>\n<\/p><\/form>\n<p class=\"for_users_only_msg\">\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a href=\"https:\/\/habrahabr.ru\/auth\/login\/\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/p>\n<\/p><\/div>\n<div class=\"clear\"><\/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\/post\/259719\/\"> http:\/\/habrahabr.ru\/post\/259719\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a %username%.<\/p>\n<p>  \u0417\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043c\u043d\u0435 \u043f\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435. \u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u041e\u0421, \u0432 \u043a\u043e\u043d\u0446\u0435-\u043a\u043e\u043d\u0446\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u041e\u0421, \u043f\u0443\u0441\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0443\u0447\u0435\u0431\u043d\u0443\u044e.<\/p>\n<p>  \u041a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044f \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043b\u044e \u044f\u0437\u044b\u043a Go \u043d\u0443, \u0438 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u043c. \u0427\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u2014 \u043f\u043e\u0434 \u0445\u0430\u0431\u0440\u0430\u043a\u0430\u0442\u043e\u043c.  <\/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-258799","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/258799","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=258799"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/258799\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}