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

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

  1. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Потому что bochs.exe без dbg не понимает опцию gui_debug и magic_break. Для них надо два разных bxrc файлы заводить.
     
  2. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    Всё заработало. А вот через что удобно вообще осуществлять сборку Floppy-образа? А то ведь понимаю я что мой алгоритм: получение из ASM байтов, открытие HEX-редактора для вставки полученных байтов в начало файла на 1.44 МБ...издевательский.
     
  3. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Код (Text):
    1. org 0x7C00
    2. ...
    3. rb 510 - ($ - $$)
    4. db 0x55,0xAA
    5. rb (2880 * 512) - ($ - $$) - 1
    6. db 0
    Это самый простой вариант - получается файл с 512 байтами загрузчика и 1,4 МБ - 512 байт нулей.
     
  4. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    Да. Я ещё чуть-чуть поиграюсь и перейду. Я для себя даже составил документ с описанием некоторых структур (надеюсь он откроется у Вас в Ubuntu, лично мне показалось что у Вас Ubuntu).

    Вот сам файл: http://2u.ifolder.ru/19688339
     
  5. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Да. У меня Убунта. OpenOffice должен открыть docx. Максимум форматирование поедет, если оно будет слишком сложным. Я думаю у вас не такой документ.
     
  6. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Комментарии:
    В реальном режиме также доступны 32-битные регистры. А вот 64-битные только в длинном.
    А ещё проверяет сигнатуру 0x55,0xAA в конце. Иначе имеет полное право не загружать.
    И ещё в длинном режиме можно выполнять 32-битный код, если прыгнуть в 32-битный сегмент. Это и делают 32-битные ОС для запуска старых приложений.
    Кстати, посоветую не думать о сегментации и установить сразу два сегмента - код и данные с лимитом в 4 ГБ и всю защиту реализововать уже на уровне таблиц страниц. Потому что сегментация безнадёжно устарела.
    Насчёт lodsb: есть ещё целый набор инструкция для работы с массивами данных. Все они имеют постфикс размера - b (byte), w (word), d (dword), q (qword, только long mode). Вот они:
    lodsb (lodsw, lodsd, lodsq) - загрузка значения из DS:SI / ESI / RSI в регистр AL / AX / EAX / RAX. Увеличение DI на размер значения.
    stosb - Прямо противоположна. Сохранение AL в ES:lol: I
    cmpsb - Сравнение байта слова и т. п. из DS:SI и ES:lol: I и увеличение SI и DI. Результат помещается в FLAGS как при cmp.
    scasb - Сравнение байта ES:lol: I с AL. Результат помещается в FLAGS как при cmp.
     
  7. s3dworld

    s3dworld Сергей

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

    Собственно заглянул я в структуру дескриптора для длинного режима: для пользовательских сегментов там большинство полей игнорируется. А базу и лимит, как я понял, можно вообще не указывать.

    Особое внимание там нужно уделить системным структурам (таблицам и прочему). Уровень привилегий устанавливается на страницу?

    А как вообще осуществляется многозадачность (не аппаратная)? Нужно ли для этого TSS? И как от одной задачи к другой переходить? По времени или ещё как-то?

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

    Может быть на самом деле эти ядра, это нечто другое. Выполняют они какую-нибудь другую функцию (скажем внутри процессора что-то перерабатывают).

    Какова правда программирования многоядерности?
     
  8. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    С многоядерностью не работал - ничего точного не скажу. Без специальных действий дполнительные ядра отключены - можно не беспокоится за них.
    TSS в long mode нужен только для разделения стека ядра и приложения. Это обязательно. Иначе при прерывании на ring3 будет исключение. Программно многозадачность можно делать по разному. Я например делаю так:
    Код (Text):
    1. timer_int_handler:
    2.     push rax rbx rcx rdx rsi rdi rbp r8 r9 r10 r11 r12 r13 r14 r15 [temp_page_flags]
    3.     mov rdx, [current_thread]
    4.     mov [rdx + THREAD.stack_pointer], rsp
    5.     lea rax, [rdx + THREAD.fpu_state]
    6.     fxsave [rax]
    7. @@:
    8.     mov rdx, [rdx + THREAD.next]
    9.     cmp [rdx + THREAD.suspend], FALSE
    10.     jne @b
    11.     mov rbx, [rdx + THREAD.process]
    12.     cmp [rbx + THREAD.suspend], FALSE
    13.     jne @b
    14.     mov rax, [rbx + PROCESS.heap.page_dir]
    15.     mov cr3, rax
    16.     mov rsp, [rdx + THREAD.stack_pointer]
    17.     mov [current_thread], rdx
    18.     mov [current_process], rbx
    19.     lea rax, [rdx + THREAD.fpu_state]
    20.     fxrstor [rax]
    21.     pop [temp_page_flags]
    22.     pop r15 r14 r13 r12 r11 r10 r9 r8 rbp rdi rsi rdx rcx rbx
    23.     invlpg [temp_page]
    24.     mov dword[local_apic_regs + 0xB0], 0
    25.     pop rax
    26.     iretq
    У меня простой циклический переключатель. Без приоритетов. При этом есть разделение адресных пространств и потокой одного процесса. PROCCESS и THREAD у меня структуры с описанием процессов и потокой соответсвенно. При создании потока надо заполнить его стек как будто произошло прерывание:
    1) 16 нулей (регистры и атрибуты временной страницы)
    2) Точка входа
    3) Селектор сегмента кода
    4) Флаги. Например, 0x202
    5) Указатель стека приложения
    6) Селектор сегмента данных (для стека)
    После mov cr3, rax у нас новый катлог страниц, а после mov rsp, ... у нас новый стек в котором сохранено состояние уже другого потока.
    Наверное непонятно объяснил...
     
  9. s3dworld

    s3dworld Сергей

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

    Так переключение задач происходим при каком событии? То есть при завершении задачи, при прохождении интервала в 10 миллисекунд, при вызове какого-то прерывания...?
     
  10. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    По прерыванию от таймера (IRQ0). У меня - каждую 1 мс. Можно и реже. Это вытесняющая многозадачность. Она и в Linux И в Windows. Ещё есть кооперативная, когда приложения сами решают когда отдать управление следующей. Но такие ОС не предназдначены для декстопа.
     
  11. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    А ещё такое: знаю что для программирования операционных систем используют C (именно C, а не C++). Сам как-то писал бинарный код на C (то ли через GCC) по статье (там потом нужно было получать бинарник, а это не так просто было в Windows). Данные располагались в самом верху, поэтому нужна была ассемблерная вставка для перехода на код.

    В общем стоит ли вообще использовать C для разработки? Просто я боюсь что много лишнего будет и не понятного кода.
     
  12. s3dworld

    s3dworld Сергей

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

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Никак не могу найти где в Bochs, при отладке, можно указать точку останова для заданного адреса (то есть хочу проследить пошаговое выполнение именного моего кода с адреса 0x7C00). А то он начинает там всякие тесты или что-то ещё делать. Конечно я там нашёл что можно к следующей команде Step, либо через указанное количество команд Step XX, но так всё равно нужно выискивать свою команду, ждать.
     
  14. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Переключение задач, если оно не аппаратное, происходит тогда, когда это сделает переключалка. А когда она сделает, зависит от автора этой самой переключалки.
     
  15. s3dworld

    s3dworld Сергей

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

    ВОПРОС 1
    ВОПРОС 2
    ВОПРОС 3
    ВОПРОС 4
    ВОПРОС 5
    Я конечно понимаю что Windows, Linux - это разное, но всё же есть мультисистемные программы...мне всё же интересно как лучше осуществить сборку проекта. То есть не просто взять один ASM-файл и в него навключать include. Ведь как-то делается по другому (возможно как в C). Каждый файл превращается в объектный, потом линкуется. Я не знаю. Вот и хочу посоветоваться, как удобнее вести проект и осуществлять сборку, какими программами.
     
  16. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    lb адрес
    в вашем случае lb 0x7C00
    это пишется в командной строке отладчика (такое текстовое поле внизу).
    На ассемблере тоже можно писать мультиситемные программы. Как? Посмотрите хотя бы fasm. Однако мультиархитектурыне программы - нет. То есть если вы написали 32-битное приложение для интеловской архитектуры и позаботились о мультиситемности, то оно у вас будет работать (после перекомпиляции) на всех системах на i386. А на ARM без эмулятора не получится. А на x86-64 получится через 32-битный кодовый сегмент. Если вам нужно, чтобы ваша ОС легко переносилась на другую архитектуру, то однозначно Си. В противном случае асм тоже подойдёт.
    Во-первых,
    А во-вторых, bochs понимает неполные образы дискет. То есть если дать ему 512 байт, то получится прочитать только первый сектор, а остальные будут "сбойными". Но вам то больше и не надо.

    Насчёт строковых команд:
    Я забыл ещё одну - movsb/movsw/movsd/modsq - копирование значения из DS:SI в ES:lol: I и увеличение SI и DI на его размер.
    Также к строковым командам можно добавлять префикс rep. Он выполняет следующую за ним строковую команду CX раз. На каждой итерации CX уменьшается на 1. Поэтому на выходе он обяхательно будет равен 0. Типичные применения rep:
    очистка массива:
    Код (Text):
    1. mov di, array
    2. mov cx, count
    3. xor ax, ax
    4. rep stosw
    копирование массива:
    Код (Text):
    1. mov si, array1
    2. mov di, array2
    3. mov cx, count
    4. rep movsw
    Есть ещё два префикса - repe и repne. У первого условие выхода из цикла помимо CX = 0 ещё и ZF = 0 (сравниваемые числа равны), а у второго ZF = 1 (сравниываемые числа не равны). Типичное применение repe и repne:
    Поиск заданного байта в массиве:
    Код (Text):
    1. mov di, array
    2. mov cx, count
    3. mov al, "!" ; Что искать
    4. repne scasb
    5. jne not_found
    6. di - 1     адрес этого байта
    Сравнение массивов:
    Код (Text):
    1. mov si, array1
    2. mov di, array2
    3. mov cx, count
    4. repe cmpsb
    5. jne .not_equals
    6. ; Массива равны, SI и DI указывают на конец массива + 1
    Функция определения длины NULL-terminated строки ES:lol: I:
    Код (Text):
    1. str_len:
    2.     mov cx, -1 ; Максимальное значение
    3.     xor al, al
    4.     repne scasb
    5.     neg cx
    6.     sub cx, 2
    7.     ret ; В CX длина строки не считая нуля на конце
    И наконец есть аппаратные циклы:
    Код (Text):
    1. mov cx, 256
    2. @@:
    3. mov ah, 0x0E
    4. mov al, "!"
    5. int 0x10
    6. loop @b
    7. ; Этот код выводит восклицательный знак 256 раз
    loop уменьшает CX (ECX/RCX) на 1 и если он после этого не равен нулю передаёт управление на метку указанную в качестве операнда. Важно: в отличии от строковых операций loop сначала сравнивает, а потом уменьшает, поэтому cx = 0 приведёт к повторению 65536 раз, а в 64-битном режиме - аж 2 ^ 64 раз! Если вы знаете, что может получится 0, то делайте дополнительную проверку до цикла и перепрыгивайте цикл при CX = 0. А rep при CX = 0 просто не разу не выполняет команду, поэтому дополнительных проверок не требует.
    И ещё - loop может переходить на +-128 байт. Если цикл больше, то придётся заменить loop на:
    Код (Text):
    1. dec cx
    2. jnz .loop
     
  17. s3dworld

    s3dworld Сергей

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

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Программы которые после перекомпиляции смогут работать и на i386 и на amd64 и на ARM и на PowerPC. На асме такое не написать. Но не всегда это и нужно. И посмотрите моё предыдущее сообщение я его немножко дополнил пока вы писали ответ.
     
  19. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    KIV
    Я уже посмотрел. Большое Вас за это спасибо! А как Вы сами осуществляете сборку проекта?
     
  20. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Поскольку у меня есть своя ФС я написал программу на Си, которая делает образ диска из папки. Причём ещё и ставит в начало образа указанный начальный загрузчик. У меня вот акой шел-скрипт (в винде - bat-файл)
    В папке disk у меня файлы, которые должны попасть на диск.
    Некоторые пользуюся не программами, а пишут специальные макросы fasm и описывают файловую систему в ещё одном исходнике.