Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создадим О/С (перемешено из форума "Операционные системы")

419
19 декабря 2002 года
Mitja Gladkih
284 / / 19.12.2002
Все-все-все!
Подключайтесь к созданию новой мультизадачной операционной системы!
[email]gladkih@hot.ee[/email]
Страницы:
419
10 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by (C)dragon


Да, лучше всего именно програмным методом через таймер, но лучше использовать таймер локального APIC, чем внешний таймер, так будет намного быстрее.


Мда. Я считал всегда, что то, что делает сам процессор происходит быстрее. И мне удобнее. Есть над чем подумать.
Интересно поразмышлять над вашей фразой "надо не через TSS, а через таймер ":)
Ну сработал таймер, а дальше ведь надо на задачу переключатся, сохранять т.н. контекст процессора.
Вот я вас и спрашивал - сохранять ли ПОЛНЫЙ контекст КАЖДОГО процесса или нет? То-есть, должны ли быть процессы АБСОЛЮТНО друг от друга независимыми

Получилось ли у кого что-нибудь по линии неработающего на Аварде ядра?

1.9K
10 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by Mitja Gladkih

Мда. Я считал всегда, что то, что делает сам процессор происходит быстрее. И мне удобнее. Есть над чем подумать.
Интересно поразмышлять над вашей фразой "надо не через TSS, а через таймер ":)
Ну сработал таймер, а дальше ведь надо на задачу переключатся, сохранять т.н. контекст процессора.
Вот я вас и спрашивал - сохранять ли ПОЛНЫЙ контекст КАЖДОГО процесса или нет? То-есть, должны ли быть процессы АБСОЛЮТНО друг от друга независимыми



Ну естественно должны.

419
10 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Вот! Еще вопросик по поводу оргструктуры:
В МенуэтОСе программа постороена по принципу общего цикла - то-есть, когда
происходит прерывание от какого-то источника, кроме таймера, оно обрабатывается, и данные сохраняются, ставятся соответствующие флаги.
Когда же происходит прерывание от таймера, то(здесь и начинается собственно, действо) программа смотрит, не нажата ли клавиша на клавиатуре, на мыши и т.д.
ели да - переходит куда положено, если нет - идет далее, просто главный цикл.
Мне это не очень нравится.
Вспомните Visual Basic и Visual C.
Там каждому событию в программе выделяется особая подпрограмма, ну там
key_down или что еще. Произошло данное действо - вызывается такая подпрограмма. Неудобно это тем, что(по крайней мере, в VB это так) если надо где-то среди программы подождать, пока не нажмут клавишу(ну художественная задумка такая), придется либо в подпрограмме key_down вести таблицу, что нажато, а что - нет, или просто один флаг, в другом месте - это анализировать.
Либо оформить нужный кусок в виде подпрограммы и вызывать ее из key_down.
Но если это главный код, так не сделаешь.
Мне это не нравится.
В MN-DOS будет сделано так:
Если по алгоритму надо отдельную подпрограмму, создается процесс, вызывается специальная регистрирующая функция, в качестве аргумента в одном из регистров - адрес начала процесса. Если возникает потребность в ожидании вне специального процесса, вызывается та же функция, но со смещением следующей команды. Какие идеи?
419
10 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Я тут подумал - это ж сколько команд и усилий надо, чтобы сохранить контекст программно... А возможно ли вообще сохранить ВСЕ ТЕ данные? Что-то мне кажется, что TSS все же быстрее будет...
Кстати, в одном из документов вроде советов по программированию на Ассемблере нашел т.н. Puzzle: Сколько команд минимум надо, чтобы заполнить содержимым AL верхнюю часть EAX и AH? Ответ был довольно прикольным...
Это по поводу оптимизации.
Есть ли у кого пособие :), где расписаны команды процессора и их длина в байтах, может быть, кол-во циклов. Был у меня, да сгинул со старым НЖМД.
Да, народ! Кто из дизайнёров помнит, как сделать, чтобы текст в Тех. подробностях был мааленьким, но с полосой прокрутки. А то что-то у меня не выходит.
1.8K
10 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by Mitja Gladkih

Мда. Я считал всегда, что то, что делает сам процессор происходит быстрее.



Как правило все наоборот - чем сложнее команда, тем дольше ее выполняет процессор по сравнению с аналогичной последовательностью простых команд. Ну вот тебе навскидку пара примеров:
ENTER
LEAVE
LOOP
LODSx
SCASx


Цитата:

И мне удобнее. Есть над чем подумать.
Интересно поразмышлять над вашей фразой "надо не через TSS, а через таймер ":)
Ну сработал таймер, а дальше ведь надо на задачу переключатся, сохранять т.н. контекст процессора.
Вот я вас и спрашивал - сохранять ли ПОЛНЫЙ контекст КАЖДОГО процесса или нет? То-есть, должны ли быть процессы АБСОЛЮТНО друг от друга независимыми



Конечно!

1.8K
10 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by Mitja Gladkih
Я тут подумал - это ж сколько команд и усилий надо, чтобы сохранить контекст программно... А возможно ли вообще сохранить ВСЕ ТЕ данные?



Безусловно. Единственное, что нужно от TSS - это ESP0 и SP0, т.е. достаточно иметь по одной TSS на микропроцессор, только для того, чтобы пользовательские приложения могли осуществлять системные вызовы.

Цитата:

Что-то мне кажется, что TSS все же быстрее будет...



Уже давно все проверили и такты посчитали :) Ни одна из современных ОС TSS не использует. TSS - это такой атавизм вроде реального режима - избавиться легко, но потеряешь совместимость с кучей ПО :)

419
10 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Ребята! Поставил на сайт системы чат, теперь можно там общатся.
Если кому надо поговорить СО МНОЙ, в будни - за два, в выходные - за день напишите об этом на [email]mndos@narod.ru[/email].
419
10 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Безусловно. Единственное, что нужно от TSS - это ESP0 и SP0


А до этого на вопрос должны ли быть процессы независимыми, ты ответил:

Цитата:
Конечно!


Но в таком случае регистры процессов будут смешиваться, а это не хорошо...
(изивиняюсь за жутко "кривой" язык, просто устал сильно.)

Наблюдается любопытная тенденция - все мои респонденты делятся на тех, кто занимается теоритическими вопросами, и тех, кто критикует ту или иную реализацию их...

1.8K
11 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by Mitja Gladkih

А до этого на вопрос должны ли быть процессы независимыми, ты ответил:

Но в таком случае регистры процессов будут смешиваться, а это не хорошо...



Почему регистры будут смешиваться? Я говорил, что вместо использования TSS для сохранения контекста процессора, быстрее сохранить его вручную. Но проблема в том, что для переключения из третьего кольца в нулевое TSS все таки понадобится (она должна хранить регистры стека нулевого кольца). Все другие современные процессоры не имеют аналогов TSS, а реализуют ту или иную форму команды SYSCALL предназначенной именно для системного вызова. Начиная с Pentium II интеловские процессоры имеют команду SYSENTER и если я ничего не перепутал, TSS теперь не нужна вообще (впрочем я могу ошибаться)

Вот кстати программное переключение:
http://www.o3one.org/sources/oz_kernel_486.s

Цитата:

Наблюдается любопытная тенденция - все мои респонденты делятся на тех, кто занимается теоритическими вопросами, и тех, кто критикует ту или иную реализацию их...


Да, все мы разные :)

3.2K
11 марта 2003 года
SmartWasp
13 / / 03.03.2003
Цитата:
Originally posted by Mitja Gladkih

А до этого на вопрос должны ли быть процессы независимыми, ты ответил:

Но в таком случае регистры процессов будут смешиваться, а это не хорошо...
(изивиняюсь за жутко "кривой" язык, просто устал сильно.)

Наблюдается любопытная тенденция - все мои респонденты делятся на тех, кто занимается теоритическими вопросами, и тех, кто критикует ту или иную реализацию их...

Да, тяжело вам... Объясняю все по порядку(по поводу переключения задач). Во-первых, TSS нам нужен только для переключения стека супервизора, побитовой карты ввода-вывода и для реализации VM86.
Все остальное легче делать ручками, а собственно и делать-то нечего. Почему? Смотрите: переключение задач возможно только после прерывания(таймера или системного вызова) одной задачи, при этом ВЕСЬ контекст уже сохранен процедурой обработки прерывания! Остается только перегрузить стек и указатель комманд и TR, а т.к. задача до этого ОБЯЗАТЕЛЬНО была прервана(т.е. она находилась в режиме ядра!), то весь ее контекст УЖЕ сохранен и востановиться автоматически коммандой возврата из обработчика прерывания(надеюсь механизм их обработки у вас уже проработан).... Единственная сложность -- старт новой задачи, но это обходиться 2 путями:
* использовать модель процессов UNIX -- тогда весь контекст наследуеться от предка
** просто имитировать возврат из прерывания
На конец, шлю соответствующий фрагмент из STiNG/0.00a на так любимом вами АСМЕ...
------
Если чего-то не понятно -- обращайтесь...

419
11 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by SmartWasp


Ну и что НОВОГО ты этим сказал? Это и так было понятно...

419
11 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by Lonesome


Я говорил о том, что в твоем ответе наблюдалось противоречие, примерно такое
Да, мы должны, но все же этого делать не следует... :D

419
11 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Все это, конечно, хорошо, но после очередного прерывания, если процесс слишком долгий, его надо "вырубить" - принцип разделения процессорного времени все же действует.
И, если не секрет, откуда такие сведения о TSS? Где можно об этом почитать подробнее?
419
11 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by SmartWasp
после прерывания(таймера или системного вызова) одной задачи, при этом
ВЕСЬ контекст уже сохранен процедурой обработки прерывания!


Что-то я ничего не понял! Кто УЖЕ сохранил контекст? К. ядра-то сохраняется автоматически, а процессов - нет.

3.2K
11 марта 2003 года
SmartWasp
13 / / 03.03.2003
Цитата:
Originally posted by Mitja Gladkih

Что-то я ничего не понял! Кто УЖЕ сохранил контекст? К. ядра-то сохраняется автоматически, а процессов - нет.


Давайте определимся, что такое контескст задачи. Контесктом мы называем всю информацию, которая описывает состояние задачи в данный момент времени:
1. Регистры общего назначения
2. Сегментные регистры
3. Указатель команд
4. Адресное пространство(при использовании страничной организации памяти его описывает регистр CR3)
(1) При входе в обработчик перывания НЕОБХОДИМО сохранить *регистры* общего назначения данной задачи. Это ясно. Собственно при вызове прерывания автоматически сохраняется eip, cs, eflags. остается только сохранить сегментные регистры. Ок.(Все эти данные сохраняються в стеке "старой" задачи)
(2) Эти же регистры должны быть восстановлены при возврате из обработчика прерывания...
Так вот, именно переключение происходит до выполнения (2)! А это означает, что любая НЕАКТИВНАЯ задача находиться после выполнения (1), но до выполнения (2). Таким образом вся информация сохранена и мы можем спокойно переключать cr3 загружать ss:esp и eip(только надо не забіть установить eip "старой" на спец. точку возврата).... О "старой" задаче мы не переживаем...

-----------------------
Для большей убедительности вышесказанного шлю еще больше исходников STiNG/0.00a....
-----------------------
Если вам все понятно, то зачем же говорить глупости? Sorry за грубость и хамство ...
-----------------------

:) :)

1.8K
11 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by Mitja Gladkih
Все это, конечно, хорошо, но после очередного прерывания, если процесс слишком долгий, его надо "вырубить" - принцип разделения процессорного времени все же действует.
И, если не секрет, откуда такие сведения о TSS? Где можно об этом почитать подробнее?



news:alt.os.development - очень полезный ресурс :)

3.2K
11 марта 2003 года
SmartWasp
13 / / 03.03.2003
Цитата:
Originally posted by Mitja Gladkih

Если по алгоритму надо отдельную подпрограмму, создается процесс, вызывается специальная регистрирующая функция, в качестве аргумента в одном из регистров - адрес начала процесса. Если возникает потребность в ожидании вне специального процесса, вызывается та же функция, но со смещением следующей команды. Какие идеи?


Мда... бред... Учите теоретические вопрросы создания ОС!

419
11 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by SmartWasp

Мда... бред... Учите теоретические вопрросы создания ОС!


Чтооо? Это чё, конкретный наезд? :D Ладно, если без шуток: Если что-то не понял - так и напиши. По-моему, все четко, но может, кому-то и покажется бредом...

419
11 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Лично для меня - это просто игра слов, не более...
3.7K
13 марта 2003 года
MegaBoss
4 / / 13.03.2003
Цитата:
Originally posted by Mitja Gladkih
Вот сделаю ядро в минимальном объёме, чтобы несколько задач и переключение в ткстовом режиме, тогда выложу исходники.

Всё же, кто знает как в З/Р ВЕСА запрограммировать, напишите, пожалуйста... буду благодарен неизмеримо.



Брось ты этот З/Р. гадость это, пользы нет один гимор.

1.9K
13 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by MegaBoss


Брось ты этот З/Р. гадость это, пользы нет один гимор.



Гыгыгы точно real mode forever :D

1.8K
13 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by MegaBoss


Брось ты этот З/Р. гадость это, пользы нет один гимор.



Ышшо один юморист? А то был тут один до тебя, говорил, что все процессоры совместимы %)

3.5K
13 марта 2003 года
AnyKey
5 / / 24.02.2003
Цитата:
Originally posted by Lonesome


Ышшо один юморист? А то был тут один до тебя, говорил, что все процессоры совместимы %)



Действительно юморист, а что, хмм... Я - электронщик и сейчас разрабатываю новый тип процессора, для ххх. Так вот - в ядре камня(пока еще и камня то нету, только куски - прототипов модулей ядра), точнее в дешифраторе команд, есть одна фича, в кратце, а иначе и не выйдет - посредством загрузки программно в специальную память дешифратора таблиц перекодировки команд, процессор к примеру, сможет работать как любой иной любой иной фирмы... Однако только на уровне интерфейса комманд, на деле архитектура его этого пока не позволяет(работа над ним, стоит уйму денег, из-за этого в последнем квартале 2002 мы сорвали график работы), пока...

1.9K
14 марта 2003 года
kswapd
93 / / 08.02.2003
Mitja, я порылся в исходнике твоего "ядра" :) и вот что обнаружил (см. приаттаченный файл). Может поможет. Мои комментарии начинаются с ";*** ". Сильно не ругать если что не так - давно не асмовал.
1.8K
14 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by kswapd
Mitja, я порылся в исходнике твоего "ядра" :) и вот что обнаружил (см. приаттаченный файл). Может поможет. Мои комментарии начинаются с ";*** ". Сильно не ругать если что не так - давно не асмовал.



Ничего, что я тоже поругаю? :)

Цитата:


;*** А в ss то что? Может там страшное что-то :)
;*** Вот ты в sp 0fffh загоняешь, а может ss где то в районе 6c0+ оказался,
;*** вот тебе стек код и перепишет. Хотя может и бред, но имхо ситуация реальная :)
;*** Исходя из этих причин есть маленькая вероятность, что следующие операции все порушат



Насчет стека замечание верное. До установки SS использовать стек - дело гиблое :)

Цитата:


; MOV EAX,CR0
;
;*** Здесь лучше использовать
; bts eax, 0
;
;*** вместо OR EAX,1
;*** bts жрет 4 байта, or - 5
;



Оптимизаторы, блин :) Вот как надо: or al, 1. Или inc al - обе команды занимают по два байта.

Цитата:


; MOV CR0,EAX ; собственно переход в защищенный режим
;
;*** А еще лучше (имхо):
mov ax, 1
lmsw ax

;*** В общем я надеюсь, этот вариант заработает везде :) Попробуй, у меня такого
;*** asm'а нету, скомпилить не могу.


Нет, это не лучше! Это отвратительно! :) Цитирую интеловское System Programming Guide: The LMSW and SMSW instructions operate on bits 0 through 15 of control register CR0. These instructions are provided for compatibility with the 16-bit intel 286 processor. Programs written to run on 32-bit IA-32 processors should not use these instructions. Instead, they should access the control register CR0 using the mov instruction.

Я бы прислушался к советам Intel :)

1.9K
14 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by Lonesome


Ничего, что я тоже поругаю? :)



Ничего :)

Цитата:


Оптимизаторы, блин :) Вот как надо: or al, 1. Или inc al - обе команды занимают по два байта.



Ну можно и так :) Но mov ax, 1 лучше, т.к. не надо считывает значение cr0 (оно и не нужно в принципе)

Цитата:

Нет, это не лучше! Это отвратительно! :) Цитирую интеловское System Programming Guide: The LMSW and SMSW instructions operate on bits 0 through 15 of control register CR0. These instructions are provided for compatibility with the 16-bit intel 286 processor. Programs written to run on 32-bit IA-32 processors should not use these instructions. Instead, they should access the control register CR0 using the mov instruction.

Я бы прислушался к советам Intel :)



Да, я знаю что это только для совместимости с 286, но ведь - работает! :D Кстати Linux именно так в З/Р переходит :) И если эту команду в Intel оставили, то уже не уберут никогда. По сути сам реальный режим тоже присутствует из-за совместимости, и ничего, используем его :)

1.9K
14 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by Lonesome


Оптимизаторы, блин :) Вот как надо: or al, 1. Или inc al - обе команды занимают по два байта.



Ну тогда уж inc ax - 1 байт :D

1.8K
14 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by kswapd


Ну тогда уж inc ax - 1 байт :D



Блин, такими темпами оптимизации мы скоро кернел в бутсектор запихнем :D

1.8K
14 марта 2003 года
Lonesome
112 / / 27.01.2003
Цитата:
Originally posted by kswapd


Да, я знаю что это только для совместимости с 286, но ведь - работает! :D Кстати Linux именно так в З/Р переходит :)



Да, я знаю, что Linux так переходит :) Наверно в 1991 году Linus еще всех тонкостей не знал, а потом лень было менять :) Но есть прблема - биты 6-15 регистра CR0 сейчас зарезервированы и помещать в них 0 - не очень хорошая идея.

1.9K
15 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by Lonesome


Да, я знаю, что Linux так переходит :) Наверно в 1991 году Linus еще всех тонкостей не знал, а потом лень было менять :) Но есть прблема - биты 6-15 регистра CR0 сейчас зарезервированы и помещать в них 0 - не очень хорошая идея.



Хмм даже если Intel выпустит новый процессор в котором эти биты будут использоваться, заменить lmsw на mov дело двух секунд :) В Linux даже не надо заботиться о размере, потому как переход в з/р не в бутсекторе. Кстати, может заменить и Линусу патч отправить? Хмммм... :D

419
16 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Ладно с оптимизацией. Согласен, лучше, просто ну понравилось мне так... :)
А про то, что LMSW и парную инструкцию лучше не использовать, я тоже слышал.
Вроде, как даже это не считается стандартом, т.е. в каком-то процессоре этой команды может не быть.
Про стек. Стек определяется еще в загрузчике. при переходе на ядро-то не меняется.
И еще: Во всех подобных ситуациях я обращаюсь к примеру MenuetOS - она у меня почти везде работает. И критичные инструкции я сравниваю с инструкциями Menuet.
Кажется, вырисовывается дотация :) на новый НЖМД для моего лаптопа, значит, разаработки разморозятся.
419
16 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
;*** А в ss то что? Может там страшное что-то :)


Смотри выше.

Цитата:
;*** А вот это зачем? Может я не понял чего...
; mov ax, REALSTART-2 ; организуем стек


Да это все копирование. Случайно продублировал.

Цитата:
;*** Гы, а cld забыл :)) Может в другую сторону копируешь, черт его знает...


Точно в нужную, да и в оригинале она есть. А в "отладочном" варианте забыл.

1.9K
17 марта 2003 года
kswapd
93 / / 08.02.2003
Тогда где бы посмотреть на исходник загрузчика, может там что не так?
1.9K
17 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by kswapd
Тогда где бы посмотреть на исходник загрузчика, может там что не так?



Уже нашел :) Copyright смешной :)))

419
17 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Цитата:
Originally posted by kswapd


Уже нашел :) Copyright смешной :)))


А это так... не серьезно. Основоное назначение - бирка.

419
17 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Ах, да!
Я попробовал в максимально усеченном варианте - и со старым, и с новым стеком работает. А полный и с cld, и без, с новым стеком, со старым - все равно не работает. По-моему, дело в другом.
1.9K
18 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by Mitja Gladkih
Ах, да!
Я попробовал в максимально усеченном варианте - и со старым, и с новым стеком работает. А полный и с cld, и без, с новым стеком, со старым - все равно не работает. По-моему, дело в другом.



Выложи где нибудь максимально усеченный вариант и полный.

419
20 марта 2003 года
Mitja Gladkih
284 / / 19.12.2002
Вот. И он-то работает. GDT ни при чем.
Пробовал IDT размещать в ядре, а смещения не из вспомогательной таблицы в сааамом низу текста запихивать, а оставлять равными IRQ0 и EXCDUMMY.
Теперь не перезагружается, а зависает. Прогресс не стоит на месте! :D
3.8K
20 марта 2003 года
rcz
4 / / 20.03.2003
Цитата:
Originally posted by Mitja Gladkih
Все-все-все!
Подключайтесь к созданию новой мультизадачной операционной системы!
[email]gladkih@hot.ee[/email]




Тоже когда-то была мечта написать свою ОСь. Писал на асме. Была реализована тоже многозадачность, страничная адресация, ввод/вывод... Но Столкнулся с проблемой - всю ось на асме написать нереально. Советую переходить на С(или другой ЯВУ) и чем раньше, тем лучше. Ессесно с асм вставками. На этом моя ось остановилась.
Компилятор хороший нашел только djgpp/gcc.

1.9K
21 марта 2003 года
kswapd
93 / / 08.02.2003
Цитата:
Originally posted by rcz



Тоже когда-то была мечта написать свою ОСь. Писал на асме. Была реализована тоже многозадачность, страничная адресация, ввод/вывод... Но Столкнулся с проблемой - всю ось на асме написать нереально. Советую переходить на С(или другой ЯВУ) и чем раньше, тем лучше. Ессесно с асм вставками. На этом моя ось остановилась.
Компилятор хороший нашел только djgpp/gcc.



Ты его не убедишь, он ярый фанатик асма :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог