Nano Hash - криптовалюты, майнинг, программирование

Синтаксис ассемблерного кода x86

Я пытаюсь понять основы операционных систем и нашел курс по этому вопросу в OCW (название 6.828). Я нашел код загрузчика в лабах курса, пробовал, но не понял следующую часть кода:

# Enable A20:

#   For backwards compatibility with the earliest PCs, physical

#   address line 20 is tied low, so that addresses higher than

#   1MB wrap around to zero by default.  This code undoes this.

seta20.1:
inb     $0x64,%al               # Wait for not busy
testb   $0x2,%al
jnz     seta20.1

movb    $0xd1,%al               # 0xd1 -> port 0x64
outb    %al,$0x64

seta20.2:
inb     $0x64,%al               # Wait for not busy
testb   $0x2,%al
jnz     seta20.2

movb    $0xdf,%al               # 0xdf -> port 0x60
outb    %al,$0x60

Как мы проверяем, занят ли порт 0x64 и почему этот порт используется для включения бита A20? Далее, чтобы заставить чип работать в 32-битном режиме, конфигурация GDT выполняется следующим образом:

# Switch from real to protected mode, using a bootstrap GDT

# and segment translation that makes virtual addresses 

# identical to their physical addresses, so that the 

# effective memory map does not change during the switch.

lgdt    gdtdesc
# Bootstrap GDT
.p2align 2                                # force 4 byte alignment
gdt:
SEG_NULL                # null seg
SEG(STA_X|STA_R, 0x0, 0xffffffff)   # code seg
SEG(STA_W, 0x0, 0xffffffff)         # data seg

gdtdesc:
.word   0x17                            # sizeof(gdt) - 1
.long   gdt                             # address gdt

Что делает приведенный выше код? Что означают строки, начинающиеся с «.»? Кроме того, существует два формата ассемблерного кода: .S и .asm. В чем разница между ними?


Ответы:


1

Как мы проверяем, занят порт 0x64 или нет?

Это прямо здесь. Если установлено bit #1 (значение 2), порт занят.

почему этот порт используется для включения бита A20

Исторические причины. Эту функцию было легко подключить к контроллеру клавиатуры. Так же, как строка сброса процессора.

Что делает приведенный выше код?

Настраивает GDT с тремя дескрипторами: null, code и data. Я не буду здесь объяснять, что такое GDT и как работает сегментация защищенного режима. Я надеюсь, что это описано в учебнике, или обратитесь на osdev.org.

Что означают строки, начинающиеся с «.»?

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

судя по всему, существует два формата ассемблерного кода: .S и .asm.

Есть 2 (точнее 3, считая .s и .S отдельными) общих расширений для файлов сборки. Версии .s обычно предназначены для набора инструментов gnu, а .asm — для других. Существует более двух форматов, почти по одному на ассемблер. Это просто часто используемые расширения для файлов, они не определяют содержимое.

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

30.01.2015
  • Что подразумевается при настройке GDT под командами SEG_NULL, SEG(STA_X, 0x0, 0xffffffff)....? А что делают директивы .word и .long в gdtdesc? 31.01.2015
  • SEG_NULL и SEG - это макросы, определенные ранее, не показанные в вашем вопросе. GDT — это таблица, содержащая данные, описывающие сегменты. Эти данные настраиваются с помощью макросов. gdtdesc, в свою очередь, описывает GDT, как говорится в комментарии, размер и расположение. Он нужен для инструкции LGDT. 31.01.2015

  • 2

    Как мы проверяем, занят ли порт 0x64 и почему этот порт используется для включения бита A20?

    Вы проверяете 3-й бит с этого порта. Более подробно:

    inb     $0x64,%al ; read byte from port 0x64
    testb   $0x2,%al  ; check 3rd bit
    jnz     seta20.1  ; if not 0, check again
    

    Почему именно этот порт, а не другой — вопрос только решения. Это может быть любое число. На самом деле это не актуально. Для получения дополнительной информации вы можете проверить это.

    Что делает приведенный выше код?

    Готовится к переключению из реального режима в защищенный режим.

    Что означают строки, начинающиеся с «.»?

    Это директивы ассемблера. Они не генерируют код, но могут использоваться для других целей. Например, .p2align используется для выравнивания данных/кода по некоторым кратным байтам, .word объявляет слово (в данном случае со значением 0x0017) и т. д.

    кажется, есть два формата кода сборки .S и .asm, в чем разница между ними?

    Это просто расширения (не путайте с форматом файла). На самом деле они ничего не значат. Файлы кода являются текстовыми файлами.

    30.01.2015
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..