Несколько вопросов начинающего

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 6 окт 2010.

  1. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    конечно лучше:
    1) код становится намного читабельнее, не отвлекаешься на лишние названия
    2) не надо придумывать кажыдй раз разные имена, думать, что они значат, искать их по коду и т.д. Когда видишь ссылку на анонимную метку, сразу подсознательно ищешь ближайшие две собачки, а не пытаешься перерыть половину кода в поисках, куда же идет прыжок
    3) лично у меня весь код идет с табуляцией в единичку; анонимная метка как раз встает перед инструкцией и не смещает ее - очень удобно и код смотрится красиво
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Miyamoto
    MSoft+1, но я метки пишу на отдельных строчках и все равно красиво
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Miyamoto
    Лично для меня ничем. Я обычные метки и буду использовать. А вообще на деле, это лучше тем, что не нужно задумываться как обзывать метки (а то вдруг ты одинаковые имена меткам дал). Я вообще лишь про это всё хотел узнать, только лишь из-за того, что не понимал что происходит в чужом коде.
     
  4. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго дня!

    Я запутался с менеджером памяти. Вот если у меня всё будет идти по страничкам, то я не понимаю следующего...

    В Windows ведь тоже используется механизм страничной адресации. А вот в языке C++ есть команды new/delete для выделения/освобождения памяти. Вот мне и интересно, ведь я могу указать так:

    Код (Text):
    1. char* p=new char[8];
    И мне выделится именно 8 байт (с учётом того, что char занимает 1 байт). И если я зайду за границу этого массива:

    Код (Text):
    1. char a=p[12];
    То произойдёт ошибка и приложение будет закрыто. Так как же это всё делается? И разве я могу конкретно выделить указанное количество байт для пользования программы? А то мне кажется что минимум что я смогу - так это 4 КБ выделить. То есть динамически открывать для программы новые странички. Если в текущей открытой странички есть место, то давать указатель на свободное место в страничке. А если места уже нет, то добавлять новую страничку. Да и как тогда происходит вылов обращения за несуществующий диапазон для массива?

    Собственно вот это меня пока смущает. А так можно было бы уделить одно прерывание для менеджера памяти и в зависимости от выбранной функции (например в EAX), производить: выделение страницы, выделение байт данных, освобождение страницы, освобождение байт данных. Но как тогда освобождать массив (видимо нужно будет в памяти хранить ещё и его размер).
     
  5. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    Для выделения памяти используется менеджер памяти, который берет память у системы по 4kb, а твоему коду уже выдает меньшие куски. Менеджер ведет базу выданых кусков.
    P.S. на самом деле это практически базовые знания. Непонятно, как можно писать какую-то ОС, не понимая этого. Да и литературу приводимую ты наверное так и не читал...
     
  6. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    Под менеджеров памяти подразумевается обслуживающий код в самом приложении. А вообще по-научному это называется куча :)
     
  7. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    barmaley57
    Так вот я понимаю что он выделяет кусок (точнее я про это думал). И фиксирует что он выдал. Но как же идёт определение того, что программа зашла за указанный диапазон выделенной памяти? Или в пределах 4 КБ программа сможет везде ссылаться?
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    barmaley57
    Это в винде, а не по научному, называется куча. Только вот вопрос чего.
    s3dworld
    Контролем выхода за границы массива может занимать как автоматизированный, так и узкоспециализированный код. Под автоматизированным контролем я понимаю контроль со стороны системы за целостностью блоков выделенной памяти. В самом простом случае его можно организовать примерно так. Каждый выделенный блок для приложения помещается между промежуточными блоками безопасности фиксированного размера (скажем по 16-64 байта). При каждом выделении или освобождении (а может в каких-либо других механизмах, допустим в механизме динамического формирования строк) памяти проверяются данные в блоках безопасности как перед, так и после выделяемого/освобождаемого блока с целью определения выхода за его размер. Блоки безопасности заполняются какими-либо данными, которые система сможет безболезненно проверить и, которые с большой вероятностью не будут использоваться программой. Под узкоспециализированным методом контроля понимается код, который компилятор встраивает в приложение для контроля выхода индексов за границы массива и т.д. и т.п.
    По хорошему да. Но механизмы системы должны оперативно это предотвращать. Но как это сделать уже вы сами придумаете.
     
  9. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    max7C4
    Собственно не понимаю как ОС может контролировать выход. Предположим если я напишу:

    Код (Text):
    1. char* p=0;
    2.  
    3. p=new char[1024];
    Предположим что у меня выделится страничка (размер 4 КБ) и программе (точнее указателю p) будет передан адрес начала это странички. И вот я решил записать сюда:

    Код (Text):
    1. p[2048]=0xFF;
    Если посмотреть, то это абсолютно не ошибочная команда (ошибка не должно произойти), так как 2048 принадлежит к 4 КБ памяти странички. По сути в 2048 может быть использовано для другого указателя или вообще не определены в программе, но страничка то для программы эта доступна. И как же тогда я смогу определять выход за границы? Или можно настроить прерывание, которое будут срабатывать каждый раз, при обращении к памяти?! Хотя по сути такое прерывание было бы тупостью (сколько же времени тогда выполнялись бы программы).
     
  10. barmaley57

    barmaley57 New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2009
    Сообщения:
    58
    Звучит очень стрёмно!
     
  11. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    Зачем это контролировать? Если приложение выходи за границы массива, то это проблемы самого приложения, главное чтобы ОС от этого была защищена. В обычных приложениях винды можно без проблем "прогуляться" за границами выделенного массива до конца страницы куда был выделен блок памяти функцией локального выделения.
     
  12. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    shm
    Действительно. Пожалуй Вы правы.
     
  13. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго дня!

    Как считаете, стоит ли после загрузчика писать код на C/C++? Не уверен что на C++ можно, но на C ведь точно можно с помощью GCC. Только на сколько я знаю - это хорошо прокатывает если делаешь из под Linux. Слышал что Windows не позволяет получать сырые бинарники. Вот я и думаю, может стоит писать на языке высокого уровня?
     
  14. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Только хорошо прожаренные получаются!!!

    Там этого кода - кот наплакал, пиши на чём хочешь....

    Учитесь формулировать мысли. А то я понял только после того, как накатал 100500 строк гневного текста. ;)
     
  15. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    s3dworld, вы когда-нибудь разбирали дизассемблированный файл, написанный на языке высокого уровня?
    А на асме? Проверьте и заметьте разницу. Тем более смысл писать на языке высокого уровня - ведь вам всё равно придётся писать вствки на асме. Ядро пишется на асме! Лучший вариант, а я бы вам посоветовал бы Рихтера почитать (знаю, форточки, но про оргранизацию памяти ему было бы полезно почитать ). Для просто-напросто базовых знаний. Вы собрались писать ось совершенно не разбирая в данном вопросе.
     
  16. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вообще, я поставил перед собой задачу написать операционную систему настолько примитивную, что она будет хуже MS-DOS. Но в отличии от MS-DOS она будет работать в защищённом режиме работы процессора (P-Mode). Система будет однозадачной и текущая задача (программа) будет иметь полный контроль над компьютером. Следовательно никто не мешает программе перейти в режим реальных адресов (R-Mode), в режим виртуальной совместимости с предыдущими процессорами (V-Mode) и даже в длинный режим (L-Mode). Собственно такое позволение позволит программам работать с любым оборудованием. А вот сама система будет уметь работать только лишь с устройством клавиатуры, подключённое к PS/2, и с floppy-дисководом.

    Я придумал файловую систему, которая будет размещена на дискете. Эта файловая система будет очень простой. Она не будет содержать папок (каталогов). Максимальное количество файлов будет ограничено, так же как и будет ограничен максимальный размер файла. Операционная система будет грузиться с дискеты и сохранять результат своей работы туда же. В качестве программы, будет написана только программа notepad.app, представляющая из себя простой блокнот.

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

    Для программ будут доступны ряд прерываний, которые будут обслуживать файловую систему, клавиатуру, видеоадаптер.

    При входе в систему видеоадаптер будет работать в текстовом режиме. Но никто не мешает программам переводить видеоадаптер в графический режим.

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

    Теперь бы мне научиться работать с клавиатурой и floppy-дисководом из защищённого режима, не переходя в реальный или виртуальный режим. Подскажи те хорошие статьи.
     
  17. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Igor1024
    Разбирал. И честно говоря, всегда не понимал какого хрена так много лишнего кода в первом случае.
     
  18. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Запутался со стеком. Помогите полностью разобраться в его работе.

    Собственно что такое стек, я знаю (хотя точного определения дать не смогу, да и много их). Для меня, стек - это область памяти для временного хранения данных. Мне всё равно в какую сторону эта область данных растёт, но как уже принято - стек растёт от старших адресов к младшим. Кстати, а почему именно так? Ведь если выделять для стека определённую область, какая разница тогда куда ему расти?

    Немного я поспешил, сказав что всего у меня будет три дескриптора. Из будет четыре:

    1. Нулевой дескриптор;
    2. Дескриптор сегмента кода;
    3. Дескриптор сегмента данных и стека;
    4. Дескриптор сегмента данных видеобуфера.

    Таким образом у меня регистры DS, ES, FS и SS будут указывать на дескриптор сегмента данных и стека, а регистр GS будет указывать на дескриптор сегмента данных видеобуфера. Разумеется ESP будет указывать именно туда, где я хочу чтобы начинался стек. Так а зачем нужен регистр ЕВР? Статья Регистры (http://www.codenet.ru/progr/asm/regs.php) ничего мне не пояснила:

    Далее, я собираюсь делать без многозадачности, следовательно без переключения задач. Таким образом, когда будет происходить прерывание (любого типа), процессор перейдёт к коду обработчика прерывания, у меня ведь не будет никакого своего стека, будет использоваться всё тот же. Так ведь? Вроде бы стек другой используется только при переключении задач. В общем я никак эту тонкость не уловил. Поясните, пожалуйста.
     
  19. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    s3dworld
    Потому что именно такой порядок предполагают команды PUSH, POP, CALL, RET и т.д. На других процессорах порядок может быть другим (в родной системе команд ARM он вообще произвольный, хотя в Thumb уже фиксированный).

    А что мешает не использовать сегментацию, а просто отобразить все 4 гигабайта каждого сегмента на одни и те же 4 гигабайта линейного адресного пространства, как это делается во всех коммерческих ОС?

    Без него вполне можно прожить. В системе команд 8086 (16-разр) нельзя было адресоваться относительно SP, поэтому для адресации данных в стеке был предусмотрен специальный регистр -- BP (предполагается, что SP постоянно меняется, ну а BP остаётся при выполнении одной подпрограммы постоянным). В 32- и 64-разрядных процессорах такого ограничения нет, поэтому EBP/RBP можно использовать как обычный РОН, а всю адресацию вести относительно ESP/RSP -- только, естественно, надо учитывать его возможные изменения.

    Нет, не так. Стеки переключаются не только при переключении задач, но и при изменении уровня привилегий процессора. Если вся работа делается в нулевом кольце, тогда нет и переключения стека, иначе оно всё равно происходит. Для этого, собственно, и нужен единственный ТСС, даже если аппаратная многозадачность не используется.
     
  20. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    SII
    У меня всё будет только в одном нулевом уровне привилегий. Разве для этого мне обязательно создавать TSS?