Форум программистов, компьютерный форум, киберфорум
Наши страницы
Низкоуровневое программирование
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Quaentor
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
1

Как происходит чтение данных с диска

01.03.2019, 00:01. Просмотров 1478. Ответов 8

Я пишу не пишу на языке ассемблера, в основном на С++. Спрашиваю, чтобы видеть возможные пути оптимизации при чтении с ПЗУ. Основная мотивация вопроса – узнать, может ли получиться так, что, при считывании большого размера, другой поток может получить возможность считать данные с другого места на диске, учитывая, что у меня еще не все считано(что очень плохо, если это HDD)

Скажем, я делаю системный вызов на чтение 1ГБ памяти с диска.
Есть ли ограничение на считываемый размер(означая, что ОС сама разобьет размер на меньшие части)? Т.е., если его нету, то пока весь размер не считается, все последующие запросы будут блокированы. Если он есть, то он определен железом(чем конкретно?), или его определяет ОС(какой компонент?)?

Где искать информацию на подобного рода вопросы? С процессорами все понятно – документация от производителя; а вот когда дело доходит до ПЗУ, ОЗУ, не так просто найти детальную и достоверную информацию. Или их устройство может точно также разниться?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2019, 00:01
Ответы с готовыми решениями:

Чтение данных из главной загрузочной загрузочной записи жесткого диска
нашла пример CODE SEGMENT ASSUME CS:CODE, DS:CODE, SS:CODE, ESrCODE ;ORG 10OH BEGIN:...

Как происходит происходит простейший вывод сообщения в консоль в MASM
Простите за нубство. Начал читать книгу Калашникова и там в первейшей программе такой код: CSEG...

Как происходит изъятие данных с жёсткого диска на физическом уровне?
И как взаимодействует с др устройствами?

Cтруктура диска повреждена чтение невозможно.как спасти ценную информацию с диска D?
нет доступа к D: структура диска повреждена чтение невозможно-вот такое сообщение получила когда...

Чтение сырых данных с жесткого диска
Здравствуйте. Мне нужно найти потерянные данные (старые исходные коды) в не размеченной области...

8
R71MT
8574 / 1636 / 328
Регистрация: 29.07.2014
Сообщений: 2,679
Записей в блоге: 5
01.03.2019, 17:07 2
Цитата Сообщение от Quaentor Посмотреть сообщение
Есть ли ограничение на считываемый размер
под виндой (драйвер DISK.SYS) ограничений нет, а расширенный сервис биоса int-13h ограничивает 127-секторов за раз.

Цитата Сообщение от Quaentor Посмотреть сообщение
может ли получиться так, что, при считывании большого размера, другой поток может получить возможность считать данные с другого места на диске, учитывая, что у меня еще не все считано
опять-же если винда, то операцию может прервать другой поток, если уровень IRQL этого потока больше твоего. В этом случае твой запрос запоминается и вытесняется более привилегированным.

Цитата Сообщение от Quaentor Посмотреть сообщение
Где искать информацию на подобного рода вопросы?
какую именно информацию?

Добавлено через 8 минут
При вытеснении, в любом случае сектор дочитается до конца, т.к. контроллёр при чтении сектора выставляет BUSY=0 (шина занята) и пока сектор не считается до конца, BUSY не сбросится в единицу. Контроллёр принимает команды только при BUSY=1 и DRDY=1 (Drive Ready - винчестер готов к приему команды).
3
Quaentor
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
01.03.2019, 21:08  [ТС] 3
Цитата Сообщение от R71MT Посмотреть сообщение
опять-же если винда, то операцию может прервать другой поток
Цитата Сообщение от R71MT Посмотреть сообщение
При вытеснении, в любом случае сектор дочитается до конца
Раз другому потоку выдается возможность получить доступ к диску, то получается, что запрошенный размер все-таки разбивается на сектора? Разбивается драйвером?
Тогда, я понимаю, на любой ОС примерно та же ситуация. Но а в теории, будучи драйвером, возможно ли запросить контроллер на чтение всего размера(т.е. это была бы уже проблема контроллера вести счет оставшихся байт на чтение), что в итоге не давало бы другим потокам доступ, пока мой запрос не исполнен?
Цитата Сообщение от R71MT Посмотреть сообщение
какую именно информацию?
Если конкретно – порядок общения(протокол как бы) между процессором и дисковым контроллером; я представляю, что это бы имело подобную информацию: если нужно "это", вызови "такое" прерывание, положи "такие" данные "сюда" и ожидай результат "тут". И отсюда я бы уже понимал, как происходит чтение и чего ожидать. И осталось бы только узнать, как работает дисковый драйвер моей ОС.
Если в общем – устройство таких элементов как ПЗУ, ОЗУ, порядок работы с которыми влияет на производительность. Т.е. это также наличие общей(свойственной всем подобным элементам) информации о наличии буферов, кэшей.
Может у меня завышенные запросы, но хочется чтобы были надежные источники об общем устройстве стандартных компонентов ПК. Может есть какие-то стандарты?
0
R71MT
8574 / 1636 / 328
Регистрация: 29.07.2014
Сообщений: 2,679
Записей в блоге: 5
02.03.2019, 08:05 4
Лучший ответ Сообщение было отмечено Quaentor как решение

Решение

Цитата Сообщение от Quaentor Посмотреть сообщение
то получается, что запрошенный размер все-таки разбивается на сектора? Разбивается драйвером?
по-идее разбивается в любом случае, т.к. после чтения каждого блока/сектора, контроллёр возвращает "код-ошибки" в соответствующем/своём регистре, а "правильный" драйвер должен проверять этот код. Причём без разницы, в каком режиме происходит обмен, PIO или DMA.

Цитата Сообщение от Quaentor Посмотреть сообщение
возможно ли запросить контроллер на чтение всего размера
нет, невозможно. Системный планировщик в любом случае вытеснит твой запрос, если получит прерывание от более привелигированного устройства - например, самой системе потребуется подтянуть страницу из файла подкачки для своих нужд (хотя такая ситуация случается редко, т.к. большинство сис.страниц - невыгружаемые из памяти). Выход один - твой поток должен иметь макс.привилегию.

Цитата Сообщение от Quaentor Посмотреть сообщение
я представляю, что это бы имело подобную информацию: если нужно "это", вызови "такое" прерывание, положи "такие" данные "сюда" и ожидай результат "тут".
Кроме спецификации на ATA/SATA, почитать можно:
М.Гук: "Интерфейсы АТА"
М.Гук: "Аппаратные интерфейсы ПК"
В.Несвижский: "Программирование ЖД"

Так-же, много полезного лежит в статье К.Касперски: "Способы взаимодействия с диском на секторном уровне" (хотя речь в ней и идёт не о жд, а об сидюках).
3
02.03.2019, 08:05
Quaentor
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
02.03.2019, 16:15  [ТС] 5
Цитата Сообщение от R71MT Посмотреть сообщение
по-идее разбивается в любом случае, т.к. после чтения каждого блока/сектора, контроллёр возвращает "код-ошибки" в соответствующем/своём регистре
Ага, вот оно как
Цитата Сообщение от R71MT Посмотреть сообщение
почитать можно
Значит все же в основном к литературе обращаются. Ну оно и понятно, спецификация 660 страниц, а книжка – лишь ~400.

Большое спасибо за помощь!
0
R71MT
8574 / 1636 / 328
Регистрация: 29.07.2014
Сообщений: 2,679
Записей в блоге: 5
04.03.2019, 10:22 6
Цитата Сообщение от Quaentor Посмотреть сообщение
(т.е. это была бы уже проблема контроллера вести счет оставшихся байт на чтение), что в итоге не давало бы другим потокам доступ, пока мой запрос не исполнен?
По-факту, современные диски SATA - это уже не (до)потопные ATA. Например, начиная с SATA-2 (SATA/300) введена фишка под названием NCQ - Native Command Queuing, или "аппаратная очерёдность команд". Если раньше контроллёр АТА мог принимать запросы только с одного устройства, то теперь AHCI может обслуживать сразу несколько запросов. Технология NCQ позволила повысить производительность дисков аж до 30%. Работает она так..

Допустим, поток(А) запросил чтение секторов с номерами: 1,2,8,10.
..а программному потоку(В) понадобились сектора: 3,4,5,6,7.
В этом случае, AHCI обрабатывает запросы сразу обоих потоков, выстраивая их в линейную очередь - первые(2) сектора считывает и отдаёт потоку(А), дальше 5-секторов потоку(В), а потом опять возвращает секторы(8,10) первому потоку.

При таком алгоритме (во-первых) потоки не ждут своей очереди на доступ к диску, а во-вторых, контроллёру не нужно постоянно перемещать головки-чтения в поисках сектора (что отнимает наибольшее время) - все секторы читаются последовательно. AHCI имеет 64-байтный "буфер очереди команд", и если каждый запрос 2-байтный, то получаем очередь из 32-запросов, на чём и основана NCQ. В SCSI данная технология поддерживалась изначально, и АТА мог об этом только мечтать.
0
Quaentor
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
04.03.2019, 19:57  [ТС] 7
Цитата Сообщение от R71MT Посмотреть сообщение
AHCI имеет 64-байтный "буфер очереди команд"
Только, насколько я понимаю, это SATA устройства, что могу иметь NCQ, а AHCI лишь предоставляет интерфейс?
Вычитал из сепцификации, что SATA устройства могут обрабатывать несколько секторов за раз.
Максимальное кол-во секторов на каждый запрос и размер буффера можно узнать через ATA IDENTIFY DEVICE команду. Увидел нужную структуру на MSDN(она описана в в спецификации, с.479), но быстро понял, что мир драйверов – другой мир, и не стал пытаться вытащить нужную информацию программно. И вместо этого, использовал утилиту hdparm на линукс.
Bash
1
sudo hdparm -I /dev/sda | egrep -i 'ncq|multiple sector|depth'
.
мой вывод
Кликните здесь для просмотра всего текста


Queue depth: 32
R/W multiple sector transfer: Max = 1 Current = 1
* Native Command Queueing (NCQ) # '*' --> yes


Похоже используются и программные буфера, которые уже "сливаются" в аппаратные.

R71MT, все верно?
1
R71MT
8574 / 1636 / 328
Регистрация: 29.07.2014
Сообщений: 2,679
Записей в блоге: 5
05.03.2019, 11:31 8
..по сути всё-верно, только о дисках можно говорить бесконечно. Чтобы написать свой конкурентно/способный софт, нужно переворошить тонны литературы, углубляясь всё дальше - без этого никак.

Цитата Сообщение от Quaentor Посмотреть сообщение
а AHCI лишь предоставляет интерфейс?
AHCI - это PCI-устройство, которое является интерфейсом между ОЗУ и девайсами SATA. Его называют ещё адаптером хост-шины или HBA - "Host Bus Adapter", с 32-входными портами. Взаимодействие программ с устройствами AHCI - только через MMIO (все регистры отображены на память), поддержка 1-байтных параметров команд - исключена! Если в двух словах, то AHCI переключает SATA с шины по-умолчанию PCI, на шину PCI-Express.

Цитата Сообщение от Quaentor Посмотреть сообщение
Похоже используются и программные буфера, которые уже "сливаются" в аппаратные.
По ссылке речь идёт об SCSI-мини/портах, которые в иерархии/стеке драйверов расположены между драйвером физ.устройства и самим устройством - т.е. мини/порт это расширение стандартного драйвера. Применительно к ATA/SATA это виртуальные порты, через которые можно управлять так-же и приводами.

Если нет физического/внешнего SCSI-контроллёра, то на любой системе всё-равно будут присутствовать виртуальные порты Scsi(0) и (1). Плюсы их использования - это командные пакеты(SRB) [b]"SCSI Request Block"[b/], вместо 1,2-байтных команд ATA/SATA (по типу расширенного INT-13h).

А на счёт программного доступа к дискам, согласно документации, оски до Win-8 поддерживают следующие IOCTL-коды для DeviceIoControl():
IOCTL_DISK

Код
0x00070000 	IOCTL_DISK_GET_DRIVE_GEOMETRY
0x00070014 	IOCTL_DISK_VERIFY
0x00070020 	IOCTL_DISK_PERFORMANCE
0x00070024 	IOCTL_DISK_IS_WRITABLE
0x00070028 	IOCTL_DISK_LOGGING
0x00070030 	IOCTL_DISK_HISTOGRAM_STRUCTURE
0x00070034 	IOCTL_DISK_HISTOGRAM_DATA
0x00070038 	IOCTL_DISK_HISTOGRAM_RESET
0x0007003c 	IOCTL_DISK_REQUEST_STRUCTURE
0x00070040 	IOCTL_DISK_REQUEST_DATA
0x00070044 	IOCTL_DISK_CONTROLLER_NUMBER
0x00070048 	IOCTL_DISK_GET_PARTITION_INFO_EX
0x00070050 	IOCTL_DISK_GET_DRIVE_LAYOUT_EX
0x00070060 	IOCTL_DISK_PERFORMANCE_OFF
0x000700a0 	IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
0x000700e8 	IOCTL_DISK_GET_PARTITION_ATTRIBUTES
0x000700f0 	IOCTL_DISK_GET_DISK_ATTRIBUTES
0x000700f8 	IOCTL_DISK_IS_CLUSTERED
0x00070140 	IOCTL_DISK_UPDATE_PROPERTIES
0x00070214 	IOCTL_DISK_GET_CLUSTER_INFO
0x00070224 	IOCTL_DISK_GET_PERFORMANCE_INFO
0x000703e0 	IOCTL_DISK_SENSE_DEVICE
0x00070403 	IOCTL_DISK_INTERNAL_SET_VERIFY
0x00070407 	IOCTL_DISK_INTERNAL_CLEAR_VERIFY
0x00070408 	IOCTL_DISK_INTERNAL_SET_NOTIFY
0x00070c00 	IOCTL_DISK_GET_MEDIA_TYPES
0x00071e80 	IOCTL_SFFDISK_QUERY_DEVICE_PROTOCOL
0x00071e8c 	IOCTL_SFFDISK_PARTITION_ACCESS
0x00071e90 	IOCTL_SFFDISK_MMC_SOFT_RESET
0x00071e94 	IOCTL_SFFDISK_MMC_QUERY_EXT_CSD
0x00071e98 	IOCTL_SFFDISK_MMC_QUERY_BKOPS_STATE
0x00074004 	IOCTL_DISK_GET_PARTITION_INFO
0x0007400c 	IOCTL_DISK_GET_DRIVE_LAYOUT
0x0007405c 	IOCTL_DISK_GET_LENGTH_INFO
0x00074080 	SMART_GET_VERSION
0x000740d4 	IOCTL_DISK_GET_CACHE_INFORMATION
0x000740dc 	IOCTL_DISK_GET_WRITE_CACHE_STATE
0x000740dc 	OBSOLETE_DISK_GET_WRITE_CACHE_STATE
0x000740e0 	IOCTL_DISK_GET_CACHE_SETTING
0x00074200 	IOCTL_DISK_GET_SAN_SETTINGS
0x00074208 	IOCTL_DISK_GET_SNAPSHOT_INFO
0x0007421c 	IOCTL_DISK_ARE_VOLUMES_READY
0x00074800 	IOCTL_DISK_CHECK_VERIFY
0x00074804 	IOCTL_DISK_MEDIA_REMOVAL
0x00074808 	IOCTL_DISK_EJECT_MEDIA
0x0007480c 	IOCTL_DISK_LOAD_MEDIA
0x00074810 	IOCTL_DISK_RESERVE
0x00074814 	IOCTL_DISK_RELEASE
0x00074818 	IOCTL_DISK_FIND_NEW_DEVICES
0x00074818 	IOCTL_TAPE_FIND_NEW_DEVICES
0x00079e84 	IOCTL_SFFDISK_DEVICE_COMMAND
0x00079e88 	IOCTL_SFFDISK_DEVICE_PASSWORD
0x0007c008 	IOCTL_DISK_SET_PARTITION_INFO
0x0007c010 	IOCTL_DISK_SET_DRIVE_LAYOUT
0x0007c018 	IOCTL_DISK_FORMAT_TRACKS
0x0007c01c 	IOCTL_DISK_REASSIGN_BLOCKS
0x0007c02c 	IOCTL_DISK_FORMAT_TRACKS_EX
0x0007c04c 	IOCTL_DISK_SET_PARTITION_INFO_EX
0x0007c054 	IOCTL_DISK_SET_DRIVE_LAYOUT_EX
0x0007c058 	IOCTL_DISK_CREATE_DISK
0x0007c064 	IOCTL_DISK_COPY_DATA
0x0007c084 	SMART_SEND_DRIVE_COMMAND
0x0007c088 	SMART_RCV_DRIVE_DATA
0x0007c0a4 	IOCTL_DISK_REASSIGN_BLOCKS_EX
0x0007c0c8 	IOCTL_DISK_UPDATE_DRIVE_SIZE
0x0007c0d0 	IOCTL_DISK_GROW_PARTITION
0x0007c0d8 	IOCTL_DISK_SET_CACHE_INFORMATION
0x0007c0e4 	IOCTL_DISK_SET_CACHE_SETTING
0x0007c0ec 	IOCTL_DISK_SET_PARTITION_ATTRIBUTES
0x0007c0f4 	IOCTL_DISK_SET_DISK_ATTRIBUTES
0x0007c100 	IOCTL_DISK_DELETE_DRIVE_LAYOUT
0x0007c204 	IOCTL_DISK_SET_SAN_SETTINGS
0x0007c20c 	IOCTL_DISK_SET_SNAPSHOT_INFO
0x0007c210 	IOCTL_DISK_RESET_SNAPSHOT_INFO
0x0007c218 	IOCTL_DISK_SET_CLUSTER_INFO
0x0007c220 	IOCTL_DISK_VOLUMES_ARE_READY
0x0007c3cc 	IOCTL_DISK_FORMAT_DRIVE
0x0007d000 	IOCTL_DISK_SIMBAD

IOCTL_SCSI_MINIPORT

Код
0x0004100c 	IOCTL_SCSI_GET_INQUIRY_DATA
0x00041010 	IOCTL_SCSI_GET_CAPABILITIES
0x00041018 	IOCTL_SCSI_GET_ADDRESS
0x0004101c 	IOCTL_SCSI_RESCAN_BUS
0x00041020 	IOCTL_SCSI_GET_DUMP_POINTERS
0x00041024 	IOCTL_SCSI_FREE_DUMP_POINTERS
0x0004d004 	IOCTL_SCSI_PASS_THROUGH
0x0004d008 	IOCTL_SCSI_MINIPORT
0x0004d014 	IOCTL_SCSI_PASS_THROUGH_DIRECT
0x0004d028 	IOCTL_IDE_PASS_THROUGH
0x0004d02c 	IOCTL_ATA_PASS_THROUGH
0x0004d030 	IOCTL_ATA_PASS_THROUGH_DIRECT
0x0004d034 	IOCTL_ATA_MINIPORT
0x0004d038 	IOCTL_MINIPORT_PROCESS_SERVICE_IRP
0x0004d03c 	IOCTL_MPIO_PASS_THROUGH_PATH
0x0004d040 	IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT
0x0004d044 	IOCTL_SCSI_PASS_THROUGH_EX
0x0004d048 	IOCTL_SCSI_PASS_THROUGH_DIRECT_EX
0x0004d04c 	IOCTL_MPIO_PASS_THROUGH_PATH_EX
0x0004d050 	IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT_EX

0x001b0500 	IOCTL_SCSI_MINIPORT_SMART_VERSION
0x001b0501 	IOCTL_SCSI_MINIPORT_IDENTIFY
0x001b0502 	IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS
0x001b0503 	IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS
0x001b0504 	IOCTL_SCSI_MINIPORT_ENABLE_SMART
0x001b0505 	IOCTL_SCSI_MINIPORT_DISABLE_SMART
0x001b0506 	IOCTL_SCSI_MINIPORT_RETURN_STATUS
0x001b0507 	IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE
0x001b0508 	IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES
0x001b0509 	IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS
0x001b050a 	IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE
0x001b050b 	IOCTL_SCSI_MINIPORT_READ_SMART_LOG
0x001b050c 	IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG
0x001b0520 	IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE
0x001b0521 	IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE
0x001b0720 	IOCTL_SCSI_MINIPORT_DSM
0x001b0721 	IOCTL_SCSI_MINIPORT_DSM_GENERAL


Добавлено через 9 минут
здесь человек интересовался про AHCI и пытался найти его в конфиг.пространстве PCI
2
Quaentor
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
05.03.2019, 14:56  [ТС] 9
Цитата Сообщение от R71MT Посмотреть сообщение
только о дисках можно говорить бесконечно
это точно.
Все это очень интересно – устройство ОС, иерархии драйверов и их реализации, компоненты компьютера и их устройство, а дальше и гений схемотехники...
А времени и так едва хватает на текущие интересы. Но когда-нибудь я займусь этим всерьез!
1
05.03.2019, 14:56
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2019, 14:56

Как правильно выводить 3д изображение (чтение происходит из obj)
В obj файле хранится информация о сцене в ненормализованном виде (координаты не от 0 до 1) Так как...

Как можно установить игрушку с диска, если при установке происходит ошибка чтения?
Здравствуйте. Недавно решил установить игру с dvd-диска, диск расцарапанный. Установка встаёт в...

Ini-файл: чтение происходит без проблем, но запись в файл не происходит, почему?
Пытаюсь научиться работать с ini файлам, чтение происходит без проблем но запись в файл не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru