Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 21.11.2017, 12:51   #1
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию Int 13h 42h максимальный адрес чтения.

Здравствуйте, такой вопрос:
1. У 42h функции дискового прерывания в/в 13h есть расширеный блок параметров, где указывается сколько секторов читать и адрес буфера, так вот, какой максимальный сектор я могу прочитать на диске(имею в виду его адрес)?
2. Какого размера максимально может быть диск 2 ТБ или 1 ЭБ или ещё больше?
Nikolay2015 вне форума Ответить с цитированием
Старый 21.11.2017, 13:29   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,700
По умолчанию

http://www.tldp.org/HOWTO/Large-Disk-HOWTO-4.html
Black Fregat на форуме Ответить с цитированием
Старый 21.11.2017, 22:25   #3
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 293
По умолчанию

1. Есть функция AH=48h - получить параметры устройства. По смещению 10h буфера находится кол-во секторов, стало быть максимальный номер = это значение минус 1.
Код:
INT 13 - IBM/MS INT 13 Extensions - GET DRIVE PARAMETERS
        AH = 48h
        DL = drive (80h-FFh)
        DS:SI -> buffer for drive parameters (see #00273)
Return: CF clear if successful
            AH = 00h
            DS:SI buffer filled
        CF set on error
            AH = error code (see #00234)
BUGS:   several different Compaq BIOSes incorrectly report high-numbered
          drives (such as 90h, B0h, D0h, and F0h) as present, giving them the
          same geometry as drive 80h; as a workaround, scan through disk
          numbers, stopping as soon as the number of valid drives encountered
          equals the value in 0040h:0075h
        Dell machines using PhoenixBIOS 4.0 Release 6.0 fail to correctly
          handle this function if the flag word at DS:[SI+2] is not 0000h
          on entry
SeeAlso: AH=08h,AH=41h,AH=49h,MEM 0040h:0075h

Format of IBM/MS INT 13 Extensions drive parameters:
Offset  Size    Description     (Table 00273)
 00h    WORD    (call) size of buffer
                    (001Ah for v1.x, 001Eh for v2.x, 42h for v3.0)
                (ret) size of returned data
 02h    WORD    information flags (see #00274)
 04h    DWORD   number of physical cylinders on drive
 08h    DWORD   number of physical heads on drive
 0Ch    DWORD   number of physical sectors per track
 10h    QWORD   total number of sectors on drive
 18h    WORD    bytes per sector
---v2.0+ ---
 1Ah    DWORD   -> EDD configuration parameters (see #00278)
                FFFFh:FFFFh if not available
---v3.0 ---
 1Eh    WORD    signature BEDDh to indicate presence of Device Path info
 20h    BYTE    length of Device Path information, including signature and this
                  byte (24h for v3.0)
 21h  3 BYTEs   reserved (0)
 24h  4 BYTEs   ASCIZ name of host bus ("ISA" or "PCI")
 28h  8 BYTEs   ASCIZ name of interface type
                "ATA"
                "ATAPI"
                "SCSI"
                "USB"
                "1394" IEEE 1394 (FireWire)
                "FIBRE" Fibre Channel
 30h  8 BYTEs   Interface Path (see #00275)
 38h  8 BYTEs   Device Path (see #00276)
 40h    BYTE    reserved (0)
 41h    BYTE    checksum of bytes 1Eh-40h (two's complement of sum, which makes
                  the 8-bit sum of bytes 1Eh-41h equal 00h)
Note:   if the size is less than 30 on call, the final DWORD will not be
          returned by a v2.x implementation; similarly for the Device Path info
SeeAlso: #00277,#03196
2. Под адрес отведено значение типа QWORD, т.е. это 1,8E19 секторов. При размере сектора 512 байт, получается максимальный объём почти 1E22, т.е. почти 10 Зеттабайт
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 22.11.2017, 10:19   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,392
По умолчанию

Цитата:
Сообщение от 7in Посмотреть сообщение
т.е. почти 10 Зеттабайт
..только есть одно НО..

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
...я имею в виду его адрес
В м\процессорной системе, адрес определяет архитектура ЦП - IA32 или 64.
Если система 32-битная, то адресная шина тоже 32-бит, которыми можно адресовать (например) 4-Gb памяти. Если на системной шине висит девайс с 8 или 16-битной шиной, то старшие биты системного адреса не учитываются. То есть девайс берёт от шины столько бит, сколько сможет унести.

Поскольку сервис 13h ни какой-нибудь, а расширеный, то он (с расчётом на будущее) настраивается сразу на 64-битный адрес, и выделяет для него 8-байтное поле в своём пакете, по смещению(8). BIOS не в курсе, с каким "монстром" ему придётся иметь дело, но в диапазоне 64-бит он может за себя постоять. Ясно, что с его стороны должна быть поддержка LBA (fn.41h).

Здесь дело в другом..
Пополняющие свалку истории диски ATA, в LBA-режиме поддерживают максимум 28-битный адрес, что при 512-байтном секторе ограничивает их объём до 128-гигов. SATA юзают уже LBA-32/48, увеличивая объёмы дисков до 2 и более терабайт.

Вот формат 16-байтного "адресного пакета" сервиса(42h):
Код:
pack:  db  16        ; размер этого пакета
       db  0         ; ...
       db  127       ; макс.секторов для R/W
       db  0         ; ...
       dd  buff      ; указатель на приёмный буфер (32-бит)

       dw  FFFFh,FFFFh,FFFFh,FFFFh   ; 64-битный LBA адрес сектора
                                     ; ^^^(реально 48-бит для SATA).
;--------------------
buff   db  512 dup(0)
Одним словом, если у тебя LBA-48, то можешь адресовать макс: FFFF.FFFF.FFFFh, 512-байтных логических единиц (секторов). LBA - Logical Block Address. Вот и считай общую ёмкость диска: FFFF.FFFF.FFFFh * 512 = 128 Петабайт.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получаю число из файла, перевожу в int прибавляю к нему и хоп ошибка чтения из памяти ponchic Win Api 3 25.05.2016 18:20
Как узнать номер диска и другие данные для 02h int 13h Max1548 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 25.09.2012 20:23
функция float average(int arrray[],int from,int to) yuliyayuliya Помощь студентам 0 25.04.2011 20:55
Проблема с int 13h, ah = 02h. SoundMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.03.2010 14:22
mov ax,13h int 10h и Borland Pascal виснет..? Siddharta Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 01.07.2008 10:27


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS