OSDev

для всех
Текущее время: 29 апр 2024, 01:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 23 май 2012, 16:12 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
scuter писал(а):
я вроди беру адрес VESA LFB и записываю туда картинку,
неужели такое в процессоре предусмотрено,
перенаправление адресов памяти процессора на адрес памяти другого устройства.
хотя спасибо запояснение теперь понятно что монитор всё равно будет показывать даже если установить GDT IDT.



Ты ставиш GDT IDT для защищённого режима, процессор и VESA здесь причём?
Картинка 1024*768*4=3145728 байт в реальном 16 режиме нету, этот 32битный режим(он устанавливается только там а пользуются им в 32битном), бери VESA LFB и спокойно пользуйся в защищённом.
Памяти в 32битном режиме 4гига, но верхние адреса для работы с памятью устройств используется, тем самым отбирая немного памяти у компа.
Лучше пользоваться 64битном, там можно иметь мноого аперативки, видео памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 12 апр 2015, 21:33 
Аватара пользователя

Зарегистрирован: 21 ноя 2013, 17:00
Сообщения: 10
Откуда: Russia, Magnitogorsk
У меня похожая проблема...
@Bochs всё работает ok
@QEMU TripleFault и соотв. ребут сразу после jmp gdt_code:pmode
Код:
Triple fault
CPU Reset (CPU 0)
EAX=00000011 EBX=00000143 ECX=000003e8 EDX=2193f401
ESI=00012d3e EDI=000015d8 EBP=0000253e ESP=00004000
EIP=00000380 EFL=00207006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA]
CS =2000 00020000 0000ffff 00009b00 DPL=0 CS16 [-RA]
SS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
DS =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA]
FS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
GS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
LDT=0000 00000000 00000000 00008200 DPL=0 LDT
TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl
GDT=     00000000 00000000
IDT=     00040408 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=00000000 CCD=00000011 CCO=LOGICW 
EFER=0000000000000000
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000

GDT= 00000000 00000000 - это разве нормально? Может код видеобиоса портит мою GDT ???
На реальном железе: раньше работало, после замены в/карты на Radeon HD7770 - ребут в том же месте...
Очень долго мучал, искал ошибки в коде, но всё безуспешно...
ЗЫ VESA инициализирую ДО перехода в PMODE, работаю через LFB

ПАМАГИТЕ КТО ЧЕМ МОЖЕТЕ!!! :shock: :(

_________________
Пилю ось)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 12 апр 2015, 23:01 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
При переходе в защищенный режим место завершения ошибки и место её возникновения может быть не связано. Одна из причин то что эммулятор выполняет за раз несколько команд.
Поэтому я стараюсь всё перепроверять. И по хорошему дизассемблировать 10 команд до и после.

Цитата:
Может код видеобиоса портит мою GDT ???
Если разработчики quemu путают GDT c GDTR то вам этого делать не стоит.
GDT портить не может. А вот GDTR не исключаю. Хотя вероятность этого очень мола.
Это легко проверить если от дизассемблировать код видео биоса и сделать поиск перехода в защищенный режим. Но как я сказал что вероятность мола, то я бы вначале поискал ошибку в другом месте.

Цитата:
GDT= 00000000 00000000 - это разве нормально?

Нет. Это не нормально. Но эмуляторам я не доверяю.

Надо смотреть код перехода в защищенный режим. А вообще я бы посоветовал переходить в защищенный режим с включенными прерываниям.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 08:34 
Аватара пользователя

Зарегистрирован: 21 ноя 2013, 17:00
Сообщения: 10
Откуда: Russia, Magnitogorsk
pavia писал(а):
Поэтому я стараюсь всё перепроверять. И по хорошему дизассемблировать 10 команд до и после.
Надо смотреть код перехода в защищенный режим. А вообще я бы посоветовал переходить в защищенный режим с включенными прерываниям.

Код:
;-------------------------------------------------------------------------------
        lgdt    [GDT_OFFSET]
        mov     word[SYS_DATA+PDESCR+limit],IDT_SIZE-1
        mov     word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET
        mov     word[SYS_DATA+PDESCR+base_m],(DATASG>>12)
        mov     byte[SYS_DATA+PDESCR+attr_1],FLAGS_DS
        mov     byte[SYS_DATA+PDESCR+attr_2],0
        lidt    [SYS_DATA+PDESCR]
;-------------------------------------------------------------------------------
; открываем адресную линию A20
        in      al,92h
        or      al,2
        out     92h,al
;       mov     al,20h          ; сигал EOI для разблокирования уровня
;       out     020h,al         ; IRQ клавиатуры и нижележащих
;       out     0A0h,al
;-------------------------------------------------------------------------------
;%include       "_8253.asm"
;set8253
%include        "_8259.asm"
set8259
;set8259new
;-------------------------------------------------------------------------------
        mov     byte[SYS_DATA+ps2_resolution],3
        mov     byte[SYS_DATA+ps2_samplerate],200
        call    ps2init
;-------------------------------------------------------------------------------
        smsw    ax
        or      ax,1
        lmsw    ax
;       mov     eax,cr0
;       or      ax,1
;       mov     cr0,eax

        jmp     GDT_CODE<<3:p_mode
;-------------------------------------------------------------------------------
p_mode:
        mov     ax,GDT_SCRN<<3
        mov     ds,ax
        mov     es,ax
        xor     ax,ax
        mov     di,ax
        mov     cx,80*25
rep     stosw
;-------------------------------------------------------------------------------
;       mov     ax,GDT_CODE<<3
;       mov     fs,ax           ;Error @286
;       mov     gs,ax
        mov     ax,GDT_DATA<<3
        mov     ds,ax
        mov     ax,GDT_STCK<<3
        mov     ss,ax
        mov     ax,GDT_FLAT<<3
        mov     fs,ax
        mov     ax,GDT_SCRN<<3
        mov     gs,ax
;       mov     sp,INIT_SP
        mov     ax,GDT_TSS0<<3
        ltr     ax      ;80286 uses 16-bit(short) TSS

Прикол в том, что без инициализации VESA, в текстовом режиме все работает - и в qemu и на реальном железе (Pentium D820)
Ошибка возникает именно на jmp GDT_CODE<<3:p_mode - уверен в этом, т.к. ставил jmp $ до(виснет) и после(ребут)
Естественно имеется обработчик исключений, но до него дело не доходит, что странно... Сразу Triple Fault и ребут...
VESA инициализирую практически в самом начале...

_________________
Пилю ось)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 09:40 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
1) Как инициируешь GDTR? И GDT?
2)
Тут ошибка, не учитывается переполнение.
Код:
mov     word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET
mov     word[SYS_DATA+PDESCR+base_m],(DATASG>>12)

Можешь проверит при DSEG=9b00h и IDT_OFFSET=5000h
Надо
((DATASG<<4)+IDT_OFFSET)&0ffffh
((DATASG<<4)+IDT_OFFSET)>>16

C GDTR тоже самое скорее всего.

3) Я таки не понял у вас код для 286 который не мог адресовать больше 16 МБайт. Как вы с LFB собрались работать не понятно!
Почему код в p_mode: 16 битный?

Цитата:
jmp GDT_CODE<<3:p_mode
В дизассемблере инструкцию проверяли правильно генерируется или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 10:14 
Аватара пользователя

Зарегистрирован: 21 ноя 2013, 17:00
Сообщения: 10
Откуда: Russia, Magnitogorsk
pavia писал(а):
1) Как инициируешь GDTR? И GDT?

Код:
;Set up GDT
        mov     si,GDT
        add     si,bp
        mov     di,GDT_OFFSET
        mov     cx,GDT_ENTRIES<<2
rep     movsw
;skipped
        lgdt    [GDT_OFFSET]

pavia писал(а):
2)
Тут ошибка, не учитывается переполнение.
Код:
mov     word[SYS_DATA+PDESCR+base_l],((DATASG<<4)&0fff0h)+IDT_OFFSET
mov     word[SYS_DATA+PDESCR+base_m],(DATASG>>12)

Можешь проверит при DSEG=9b00h и IDT_OFFSET=5000h
Надо
((DATASG<<4)+IDT_OFFSET)&0ffffh
((DATASG<<4)+IDT_OFFSET)>>16

C GDTR тоже самое скорее всего.

Спасибо, исправил... Только вот GDT располагается намного раньше 0xFFFF - так что не думаю, что эта ошибка была критичной...
Код:
INT_OFFSET      equ     8h
INT_SIZE        equ     4*100h
IDT_OFFSET      equ     INT_OFFSET+INT_SIZE
%ifdef  USE_X64
IDT_SIZE        equ     16*100h
%else
IDT_SIZE        equ     8*100h
%endif
GDT_OFFSET      equ     IDT_OFFSET+IDT_SIZE
GDT_NULL        equ     0
GDT_STCK        equ     1       ;08h
GDT_CODE        equ     2       ;10h
GDT_DATA        equ     3       ;18h
GDT_SCRN        equ     4       ;20h
;skipped
FLAGS_CS        equ     10011010b       ;9ah    ;P|DPL|11|C|R|A
FLAGS_DS        equ     10010010b       ;92h    ;P|DPL|10|E|W|A
FLAGS_US        equ     FLAGS_CS|(RPL<<5)       ;11111010b      ;0fah
FLAGS_ES        equ     FLAGS_DS|(RPL<<5)       ;11110010b      ;0f2h
;skipped
;структура для описания дескрипторов сегментов
struc   descr
        limit   resw    1       ;00h    Граница, биты 0..15
        base_l  resw    1       ;02h    база, биты 0..15
        base_m  resb    1       ;04h    база, биты 16..23
        attr_1  resb    1       ;05h    байт аттрибутов 1       ;P|DPL|S|TYPE
        attr_2  resb    1       ;06h    байт аттрибутов 2       ;G|D/B/X|L|AVL|LIM16-19
        base_h  resb    1       ;07h    база, биты 24..31
endstruc
;pdescr         istruc  descr
;               iend
;GDT
GDT             istruc  descr   ;00h
;               at limit,       dw      GDT_SIZE-1
                at limit,       dw      0xFFFF
                at base_l,      dw      ((DATASG<<4)&0xFFFF)+GDT_OFFSET
                at base_m,      db      (DATASG>>12)
                iend
gdt_stck        istruc  descr   ;08h
                at limit,       dw      0xFFFF
                at base_l,      dw      (STCKSG<<4)&0xFFFF
                at base_m,      db      (STCKSG>>12)
                at attr_1,      db      FLAGS_DS        ;P|DPL|0|TYPE
;               at attr_2,      db      0       ;G|X|0|AVL|LIMIT
                iend
gdt_code        istruc  descr   ;10h
                at limit,       dw      code_size-1
                at base_l,      dw      (CODESG<<4)&0xFFFF
                at base_m,      db      (CODESG>>12)
                at attr_1,      db      FLAGS_CS        ;P|DPL|11|C|R|A
;               at attr_2,      db      0       ;G|D|L|AVL|LIMIT
                iend
gdt_data        istruc  descr   ;18h
                at limit,       dw      0FFFFh  ;data_size-1
                at base_l,      dw      (DATASG<<4)&0xFFFF
                at base_m,      db      (DATASG>>12)
                at attr_1,      db      FLAGS_DS        ;P|DPL|10|E|W|A
;               at attr_2,      db      0       ;G|B|0|AVL|LIMIT
                iend
gdt_scrn        istruc  descr   ;20h
%ifdef  USE_VESA
                at limit,       dw      0xFFFF
                at base_l,      dw      (VESASG<<4)&0xFFFF
                at base_m,      db      (VESASG>>12)
%else
                at limit,       dw      0xFFF
                at base_l,      dw      (SCRNSG<<4)&0xFFFF
                at base_m,      db      (SCRNSG>>12)
%endif
                at attr_1,      db      FLAGS_ES
                at attr_2,      db      11011111b       ;G|X|0|AVL|LIMIT
;%ifdef USE_LFB
;               at limit,       dw      0xFFFF
;               at base_l,      dw      (FLATSG<<4)&0xFFFF
;               at base_m,      db      (FLATSG>>12)
;               at base_h,      db      (FLATSG>>16)
;               at attr_1,      db      FLAGS_DS
;%endif
                iend

pavia писал(а):
3) Я таки не понял у вас код для 286 который не мог адресовать больше 16 МБайт. Как вы с LFB собрались работать не понятно!
Почему код в p_mode: 16 битный?

А вот это особый момент... Изначально, чисто ради интереса, я стал писать под 80286 (ибо их у меня аж ДВА штуки)))
И теперь код по большей части так и остался 16-битным... Переделать на 32/64-бит пока не получилось... Хотя TSS 32-битные...
Кстати, вопрос: в NASM достаточно использовать директиву BITS ?
И еще есть проблема при переделывании на 32/64 - я так понимаю надо заменить всё 16-битные команды 32-битными? Верно?
Ибо у меня сразу всё виснет, а bochs ругается мол неверный префикс LOCK итп
НО! В bochs ведь работает!
Код:
00163568000i[CPU0 ] | IOPL=3 ID vip vif ac vm rf NT of df IF tf sf zf af PF cf
00163568000i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00163568000i[CPU0 ] |  CS:0010( 0002| 0|  0) 00020000 0000ffff 0 0
00163568000i[CPU0 ] |  DS:0038( 0007| 0|  0) 01000000 5fffffff 1 0
00163568000i[CPU0 ] |  SS:0008( 0001| 0|  0) 00060000 0000ffff 0 0
00163568000i[CPU0 ] |  ES:0038( 0007| 0|  0) 01000000 5fffffff 1 0
00163568000i[CPU0 ] |  FS:0050( 000a| 0|  0) 00000000 ffffffff 1 1
00163568000i[CPU0 ] |  GS:0020( 0004| 0|  0) e0000000 00ffffff 1 0

pavia писал(а):
Цитата:
jmp GDT_CODE<<3:p_mode
В дизассемблере инструкцию проверяли правильно генерируется или нет?

да, там всё ок...
Код:
0000037E  0F01E0            smsw ax
00000381  83C801            or ax,byte +0x1
00000384  0F01F0            lmsw ax
00000387  EA8C031000        jmp word 0x10:0x38c
0000038C  B82000            mov ax,0x20

_________________
Пилю ось)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 11:36 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Код:
                at base_l,      dw      ((DATASG<<4)&0xFFFF)+GDT_OFFSET
                at base_m,      db      (DATASG>>12)

Тут тоже надо исправит и забыть про эту ошибку.
Так в коде ничего не видно. Предлагаю перед установкой бита CR0.PE
Сделать отладочный вывод. И смотреть что портится. Проверяйте всё по порядку.
Вначале.SGDT
Потом проверить выравнивание базы. И самое главное придел.
Затем дескриптор CS сегмента.


Цитата:
IOPL=3
вот это не нормально должен быть 0.

Цитата:
НО! В bochs ведь работает!
Это основы тестирования. Прохождения теста не означает отсутствия ошибок. А виду того что проверить все параметры невозможно. То отгадать где и когда произойдёт ошибка невозможно.

Цитата:
И еще есть проблема при переделывании на 32/64 - я так понимаю надо заменить всё 16-битные команды 32-битными? Верно?
Ибо у меня сразу всё виснет, а bochs ругается мол неверный префикс LOCK итп

Я считаю что проще переписать. Так как не надо будет корячится с расчётами и обрабатывать переполнения.
А так достаточно изменить кодовую таблицу при помощи use32.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 12:16 
Аватара пользователя

Зарегистрирован: 21 ноя 2013, 17:00
Сообщения: 10
Откуда: Russia, Magnitogorsk
Цитата:
Тут тоже надо исправит и забыть про эту ошибку.

Да-да, исправил) Просто сюда кинул до исправления...
Цитата:
Сделать отладочный вывод

А как его сделать-то, если уже перешли в граф.режим? Снова вернуться в текстовый?
Попробовал сейчас... В режим 108h (80*25) не переходит... Как быть?
Цитата:
IOPL=3 вот это не нормально должен быть 0.

Ну, если я правильно понимаю, при IOPL=3 любая задача с любым CPL имеет доступ ко всем портам - не думаю, что на данный момент это критично...
Хотя, странно...
Код:
IOPL            equ     0       ;!!!
EFLAGS          equ     (IOPL<<12)|(1<<9)|(0<<8)        ;IF=1,TF=0

Где я мог ошибиться?

ЗЫ Блин... Ну без весы-то работает везде!!!

_________________
Пилю ось)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 12:52 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
А как его сделать-то, если уже перешли в граф.режим? Снова вернуться в текстовый?
Попробовал сейчас... В режим 108h (80*25) не переходит... Как быть?

Вместе LFB если не путаю должны работать оконный режим можешь выводить графику в A000h:0000h - A000h:FFFFh.

Код:
{Получить указатель на шрифт}
procedure GetCharMap;
assembler;
asm
 PUSHA
 MOV AX,1130h;
 MOV BH,03h;
 INT 10h;
 MOV Word PTR [CharMap+2],es;
 MOV Word PTR [CharMap+0],bp;
 POPA
 RET
end;


{Вывод текста на экран} {для режима CGA 320x200x8Бит под нужное переделать несложно}
procedure WriteText(x,y:Integer; s:String; Color:Byte);
var yy,b,c,i,j,k:Word;
begin
for i:=1 to Length(S) do
 begin
 yy:=Word(y)*Width;
 c:=Byte(s[i]);
 for j:=0 to 7 do
  begin
  b:=CharMap^[c*8+j];
  for k:=0 to 7 do
   if b shl k and 128<>0 then
    begin
    Buffer^[yy+x+k]:=Buffer^[yy+x+k] xor Color;
    end;
  yy:=yy+Width;
  end;
 x:=x+16;
 end;
end;



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VESA отваливается что делать
СообщениеДобавлено: 13 апр 2015, 13:22 
Аватара пользователя

Зарегистрирован: 21 ноя 2013, 17:00
Сообщения: 10
Откуда: Russia, Magnitogorsk
pavia писал(а):
Цитата:
GDT= 00000000 00000000 - это разве нормально?

Нет. Это не нормально. Но эмуляторам я не доверяю.

Вот же ж ёмаё... Действительно, GDT не загружается...
Поставил jmp reboot перед jmp pmode, и вижу следующее:
Без %define USE_VESA всё OK:
Код:
CPU Reset (CPU 0)
EAX=000000fe EBX=00000143 ECX=000003e8 EDX=2193f401
ESI=00010000 EDI=000015e0 EBP=00000000 ESP=00004000
EIP=000008aa EFL=00247006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=1
ES =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA]
CS =2000 00020000 0000ffff 00009b00 DPL=0 CS16 [-RA]
SS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
DS =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA]
FS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
GS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
LDT=0000 00000000 00000000 00008200 DPL=0 LDT
TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl
GDT=     00040c10 0000ffff
IDT=     00040410 000007ff

А если определить USE_VESA, то видим:
Код:
CPU Reset (CPU 0)
EAX=000000fe EBX=00000143 ECX=000003e8 EDX=2193f401
ESI=00012d3e EDI=000015e0 EBP=0000253e ESP=00004000
EIP=000008f8 EFL=00207006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=1
ES =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA]
CS =2000 00020000 0000ffff 00009b00 DPL=0 CS16 [-RA]
SS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
DS =4000 00040000 0000ffff 00009300 DPL=0 DS16 [-WA]
FS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
GS =1000 00010000 0000ffff 00009300 DPL=0 DS16 [-WA]
LDT=0000 00000000 00000000 00008200 DPL=0 LDT
TR =0008 00000580 00000067 00008900 DPL=0 TSS32-avl
GDT=     00000000 00000000
IDT=     00040410 000007ff

Т.е. почему-то портится GDT... Как я и предполагал... Буду разбираться...)

_________________
Пилю ось)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB