Загрузка.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 9 Aug 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    что то простое,текстовое, ты мне в личку кидал параметры
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 DooD тогда советую сделать такую схему:
    1) Boot sector
    + расположен в нулевом секторе
    + занимает 1 сектор (512) байт
    + имеет в себе код:
    - настройка стека
    - настройка первоначального текстового режима (80*25)
    - чтение следующего сектора в память
    - вывод сообщения о своей загрузке
    - грузит в ближайший свободный сегмент(по оффсету 100h) ядро из файловой системы
    - передаёт управление на него если оно найдено было
    - или выводит сообщение что отсутствует ядро

    + в себе хранит данные
    - параметры диска (кол-во секторов + кол-во секторов на дорожке + кол-во дорожек на стороне + кол-во сторон)
    - первый сектор файловой системы (2 байта достаточно)

    2) Второй сектор - чисто функции
    + преобразование линейного адреса сектора в дисковый
    + загрузка файла в память из файловой системы (работа только с корневым каталогом)
    + функцию вывода сообщений на экран (чтобы не писать постоянно одно и тоже)

    3) ядро
    + расположено хз где.
    + имеет любой размер но не более 64 кил - 100h байт (чтобы целиком вместилось в один сегмент)
    + по факту это стандартный COM файл с org 100h
    + выполняет код:
    - опять настраивает сегментные регистры (уже с учетом того где оно находится)
    - настраивает стек (который выше себя)
    - ставит обработчик прерываний на реализуемые им функции. Допустим можно как в DOS - прерывание 21h (т.е. тупо записывает адрес обработчика по адресу 0000:0084 (4 байта сегмент + смещение))
    - в обработчике 21h прерывания проверяет значение регистра AH и на основе этого выполняет нужную функцию.

    Если с загрузочным сектором проблем не должно возникнуть, то второй сектор делается так
    1) преобразование линейного адреса сектора в дисковый - можешь взять из моего исходника, только подправь с учётом того, какая дискета (это из бутсектора возьмешь)
    2) функцию вывода сообщений на экран - это проблем не составит
    3) а вот функция чтения файла из ФС в оперативу - это сложнее уже. Но всё только кажется, на самом деле тут намного проще.

    К приму можно заюзать самописную систему на основе FAT16. Основная идея в следующем
    1) в Boot секторе находится адрес сектора корневого каталога.
    2) первые 2 сектора заняты Boot сектором и его продолжением.
    3) дискета (1 440 килобайтаная) максимум имеет 2 880 секторов. значит каждый сектор можно идентифицировать 2-мя байтами. (т.е. максимум можно поддерживать до 32 метров накопители)
    4) после второго сектора идет таблица секторов которая содержит массив из WORD. Кол-во элементов в массиве = кол-во секторов. значит для дискеты это будет 5760 байт (~12 секторов)
    в этой таблице записаны связи секторов. По значениям
    0 - свободный сектор
    1 - последний сектор
    2 - сбойный сектор
    любое другое значение является номером следующего сектора для файла.
    Эту таблицу всю придется тоже загрузить сразу в память. благо она не большая. И загрузить её можно сразу из boot сектора

    5) таблица файлов содержит такую структуру
    - 8 байт имя
    - 3 байта расширение файла
    - 1 байт тип файла
    - 4 байта размер файла
    - 2 байта - номер первого сектора файла (если файл нулевой длинный то можно указать 0 типа не заюзан сектор)
    т.е. 18 байт каждый элемент таблицы. значит в 512 байт (1 сектор) влезет инфа о 28 файлах (для корневого хватит) к тому же еще останется 8 байт свободных. их можно заюзать так метку тома ))) хотя можно и игнорить. хотя 1 байт выделить под кол-во уже записанных файлов.
    6) чтобы считать файл (допустим в ds:si указан адрес имени файла, а ES:BX адрес куда засунуть файл)
    и вот из BOOT сектора берешь адрес таблицы файлов. проходишься по всем элементам её и ищешь нужное имя. Если нашел, то берешь номер сектора начала файла. Считываешь его.
    Затем берешь этот номер сектора и используешь как индекс в таблице секторов. И берешь от туда 2 байта. которые указывают на следующий сектор. Далее считываешь следующий сектор но уже BX передвинув на 512 байт. и повторяешь заново, пока не упрешься в значение меньше 3-х.
    т.е. сама функция которая загрузит файла по такому механизму довольно проста и максимум байт 200 байт.

    Вот таким вот образом уже есть основы файловой системы и прочая хрень.
    Запись файла тоже проста и имеет принцип:
    1) в таблице секторов нашел свободный сектор
    2) записал 512 байт файла в этот сектор. затем ищещь второй свободный сектор, когда нашел, то в таблицу в поле первого записываешь номер второго, далее всё повторяешь.
    3) записываешь в таблицу файлов данные
    4) сохраняешь таблицу секторов обратно на дискету.
    5) сохранил таблицу файлов тоже

    Удаление файла:
    1) в таблице ищещь файл
    2) берешь номер первого сектора
    3) в таблице файлов удаляешь запись
    4) сохраняешь таблицу файлов
    5) пробегаешься по таблице секторов и ставишь 0 для всех секторов которые были заняты файлом
    6) сохраняешь таблицу секторов


    Но это уже в ядре можно делать. А в бут секторе только функция приметивного чтений без учёта каталогов.

    Первоначально создать файловую систему очень просто. пишешь любую прогу которая сделает следующее (создаст файл и будет вписывать туда)
    1) впишет бутсектор (сразу занесет адрес таблицы файлов )
    2) впишет второй сектор
    3) впишет пустую таблицу секторов (только пометит какие сектора заняты за таблицей файлов + составит список секторов для файла ядра)
    4) после таблицы секторов впишет 1 элемент таблицы файлов.
    5) сам файл ядра будет лежать в следующих секторах.
    Это даже в HEX редакторе можно сделать. Или вообще на стадии компиляции.
     
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    окей, спс.еще буду спрашивать:)