четверг, 25 октября 2007 г.

Мульт.

Занимаясь с ребенком задумали снять мультфильм. Один мультфильм на 15 секунд мы уже делали, но думаю, что надо подойти к делу серьезнее.

Кадры мультфильма раскладываются по сценам. В каждой сцене список фреймов с длительностью каждого. Специальный скрипт перегоняет список фреймов с длительностью в список фреймов для mencoder. Который в свою очередь за два прохода создает качественную avi.

Озвучка для каждой сцены состоит из отдельных вавок, которые с помощью sox (опция pad позволяет сдвигать начало) миксуются в единую вавку. Которая на втором проходе кодирования видео закатывается в avi.

В корневом каталоге естественно находится Makefile, который позволяет все это автоматизировать. :)

Но че-то у меня mencoder последнее время глючит, видимо какие-то проблемы с драйвером контейнера avi, кодирую ровно минуту видео, А плейер потом показывает 4 минуты 31 секунду, а показывает всего мгновенье. Попробовал заместо lavc::mpeg4 использовать xvid - те же яйца, вид сбоку... Вероятно глючит сам контейнер. Вечером пропробую откатиться на прошлые версии mencoder. Ведь раньше я все кодировал без проблем... :( Страно это...


А еще для WorkMap и ради интереса я открыл проект на googlecode (там пока нечего смотреть). Надо сказать, что интерфейс code.google значительно проще, чем наворочанный sf... Да многим ли нужны эти навороты?

воскресенье, 21 октября 2007 г.

Использование памяти...

А тем временем я, наконец то, создал временный хип и уже разместил в нем символы ядра...

С размером временного хипа не все однозначно.
С одной стороны размер памяти известен, и легко можно предсказать сколько памяти потребуется для хранения внутренних таблиц страниц (не путать с таблицами IA32). Так же легко можно предсказать - сколько памяти потребуется для дескрипторных таблиц IA32, потому что их размер фиксированный. Остается только память, необходимая для инициализации модулей и для хранения символов. Модулям много не надо, тем более что они не активизированные, но необходимо учитывать их количество (временно положил по килобайту на модуль).

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

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

А еще пришла в голову интересная мысль, что модули, загружаемые GrUB могут быть вытеснены в своп средствами лоадера, ибо путь к модулям мы знаем! Естественно не все модули могут быть высвоплены. Непосредственные участники процесса должны всегда находиться в памяти (может быть специальный флажек в процессе предусмотреть? всеравно своппингом будет управлять ядро).

пятница, 19 октября 2007 г.

Создавая миры...

Поправить миру крышу, пока он еще вечен...
Екатерина Болдырева

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

Чаще всего новые миры так и оставались необитаемыми и никому не нужными, посещаемые изредка только творцом. Но иногда новые миры интересовали людей. Люди приходили туда, помогали строить, и из пустынного и безжизненного мир превращался в цветущий и многолюдный.

В одном из таких миров жил и Он. Это был хороший мир, синее небо, зеленая трава... Но самое интересное в том, что этот мир менялся. Нет ничего хуже, чем жить и видеть что вокруг практически ничего не меняется. Этот мир менялся очень быстро с каждым днем становясь все лучше и лучше. И обитатели этого мира могли менять все, что им казалось недостаточно хорошим. Эти изменения могли остаться незамеченными, а могли стать неотъемлимой частью этого мира.

Но Он всеравно предпочитал создавать свои. И мир, которым Он занимался сейчас, был уже не первым. Первый мир, который Он создал был не очень удачным. Там толком даже не росла трава. Второй мир не получился сразу, что-то было не так в основах. И только третий мир, чем-то похожий на первый, был неплох. Неплох, но несовершенен. Законы того мира не были продуманы до конца и находиться там долго было невозможно.

И вот наконец он понял, что готов начать все заново. Развивать безнадежный старый мир не имело смысла, он всеравно не смог бы стать полноценным. А кому нужен еще один неполноценный мир? Даже основные миры иногда сотрясаются катаклизмами... Новый мир должен быть совершенным.

Да и Он с уже не тот, что прежде. Теперь Он хотя бы знает что нужно делать и как это должно быть. В этот раз у него все получится...

PS: Я конечно не умею писать... не писатель, читатель наверное :) Просто аналогия позабавила, после чтения "Чистовик" Лукъяненко...

среда, 10 октября 2007 г.

И тут нелогично!

По работе много приходится работать с флэшкой, постоянно пишу на нее что-то, проверяю, опять пишу... И уже вот несколько раз выдергивал флэшку без безопасного извлечения из винды. Да потому что неудобно нифига...

А как было бы удобно? Есть такая идея:
В большинстве своем переносные устройства всегда используются типично. То есть, воткнул, записал или прочитал что-то, выткнул. Ради вытыкания лезть мышкой на панель задач (не знаю как кто, но я копирую с клавиатуры) и говорить - отдай флэшку - НЕУДОБНО!

Чтобы было удобно для начала меняем для таких устройств алгоритм кэширования, который должен собственно работать так, чтобы максимально быстро сбрасывать записываемые данные на диск (мне даже кажется что так нужно делать для всех устройств, но это ИМХО). Дело осталось за малым... Вывести на панель задач индикатор. зеленая лампочка - диск готов к вытаскиванию, красная - не готов. И после записи файла на диск будет достаточно всего лишь дождаться пока диск позеленеет, после чего без всяких лишних телодвижений его можно вытаскивать.

А логика монтирования - может быть это просто пережиток прошлого?

вторник, 9 октября 2007 г.

Костыли и не очень...

Вот думаю, почему так странно сделана загрузка с USB в современных биосах? очень похоже на костыль...

Вытаскиваешь флешку - он тот час же забывает, что диск был выбран... Ну всмысле тот час же после перезагрузки :). Вставляешь, надо пойти в Boot/Hard devices (точно не помню) и установить там в первую очередь флешку... Но все исчезнет с вытаскиванием флешки (тот час же после перезагрузки опять таки).

Не проще ли было в списке устройств рядом c 1-st Floppy установить и USB Drive. Всетаки это removable устройство. При отсутствии с флешки он просто грузился бы с очередного устройства. Думаю было бы логично.

А теперь немного мыслей о системе.

А еще после написания предыдущего поста я подумал, что я пожалуй все буду выделять динамически... В том смысле, что даже дескрипторные таблицы. Очень удобно ИМХО будет. Тем более, что GDT мне нужна весьма порядочная. Поскольку дескрипторы TSS я устанавливаю динамически, то пусть для них будет больше места в таблицe. Думаю, заведу GDT записей на 1000. Малое количество записей в GDT старого ядра вынуждает постоянно переставлять дескрипторы TSS, что не может не сказаться на производительности. Но с другой стороны раздувать GDT на максимальный размер - тоже не имеет смысла. Кому нужны одновременно 8000 нитей?

А еще пришла интересная мысль только что... Можно непосредственно рядом с дескриптором TSS хранить ссылку на его структуру. Просто пометить соседний дескриптор как отсутствующий, но от этого не менее содержательный.

Хотя подумал еще немного и понял, что большого смысла в этом нету. Я и через указатель на TSS спокойно могу достать все необходимые структуры...

четверг, 4 октября 2007 г.

Поглощение памяти...

Есть много различных алгоритмов динамического распределения памяти. Я для себя выбрал один в меру быстрый, но не буду сейчас углубляться в его тонкости. Сейчас я хотел рассказать об одной хитрости, которая позволит не создавать статически выделенную память до перехода в страничный режим.

Любая динамически выделяемая память выделяется блоками. И обычно у каждого блока есть заголовок.. но прежде, чем создать рабочий хип ядра нам необходимо провести ревизию системных ресурсов, и создать списки страниц... То есть память нам нужна еще до того, как ядро войдет в рабочий режим и обзаведется полновесным хипом. Но как это сделать?

Списки страниц могут занимать разное количество памяти. Это зависит от количества собственно памяти в системе. Необходимо создать временный хип, который сможет вместить в себя списки страниц и некоторую другую информацию, определяемую до перехода в страничный режим. Количество памяти нам любезно предоставляет GrUB.
И мы получаем размер, который для удобства округлим до страниц.

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

Осталось только проконтролировать, что оставшегося количества физической памяти хватит на размещение временного хипа. В нынешние времена это конечно не проблема, но если вдруг памяти окажется по настоящему мало (2 мебибайта к примеру) эта проблема может встать остро.

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

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

Вот собственно такие планы на хип нового ядра. На этом на сегодня все.