![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
изменение размера сектора
Fabo © (2004-09-01 13:36:00)Как можно длину какого-нибудь сектора жесткого диска менять с 512 байтов на другую?
Dimaxx (2004-09-06 23:26:00) [41]В Линухе размер сектора логическое понятие. То есть файловая система использует именно этот размер, а физический - все равно останется 512 байт.
NTFS - это совмещение кластерного и потокового метода хранения файлов. У нее тоже есть FAT (вернее MFAT), только немного не такая. У нее фрагментация файлов бывает редко и только в том случае, если записать нефрагментированный файл невозможно (а на самом деле это не так - еще как фрагментируются).
Shiza (2004-09-06 11:19:00) [42]Ну что, насчёт размера сектора в Линуксе пока утверждать ничего не могу, то что успел прочитать дома на это свет не пролило...
Может чё в интернете найду...
Да, кстати, а чё за сектора у NTFS? А то я если честно с ней не знаком.
>Ну вы почитайте документ-то.
Подожди, дай скачать...
Alex Konshin (2004-09-05 22:21:00) [43]Ну вы почитайте документ-то.
Shiza (2004-09-05 13:47:00) [44]Да, господа, плодотворное у нас обсуждение :)
>Речь идет о работе с железом в данном случае, а ему по барабану, в какой операционной системе с ним работают.
То понятно, только вот мне из под DOS легче обратиться к 13int чем из под NT :)
>Интересно в Линуксе 1024 блоки (сектора) это физическое или логическое понятие?
А вот это и правда свежая мысль, надо бы высказаться господа, я пока изучу, и в понедельник думаю что-нибудь скажу...
Anatoly Podgoretsky (2004-09-05 11:16:00) [45]Интересно в Линуксе 1024 блоки (сектора) это физическое или логическое понятие?
Игорь Шевченко (2004-09-05 10:49:00) [46]
> Во-первых, определимся, изменяем размер сектора под DOS
> или под Win32?
А какая разница ? Речь идет о работе с железом в данном случае, а ему по барабану, в какой операционной системе с ним работают.
> Во-вторых, согласны ли вы с тем, что мы обращаемся к прерыванию
> BIOS, а ему всё равно какой размер у сектора.
Речь идет о том, все равно ли самому контроллеру диска или нет.
Если ему все равно, тогда размер сектора можно изменить, вне зависимости от BIOS, операционной системы, и т.д. Если не все равно, тогда изменить размер не удастся ни в BIOS, ни в DOS, ни в Win32.
> В-третьих, если кто-нибудь читал книгу Фаронова В. В. "Turbo
> Pascal. Практика программирования", то наверняка встретил
> фразу о том, что изменение размера сектора возможно.
На дискете - возможно.
> Как то в форуме был вопрос о том как читать сектора жесткого
> диска
CreateFile + SetFilePointer + ReadFile
Shiza (2004-09-05 10:22:00) [47]>Ты меня извини, но Алексу Коншину я склонен доверять больше.
Как то в форуме был вопрос о том как читать сектора жесткого диска. Я там распинался что читать сектора жесткого диска под Win32 можно и с помощью 13int, на что Алекс мне заметил, что это невозможно. Сначала я ему не поверил, но когда сам попытался прочитать сектор на жестком - получил нефиговую ошибку.
Но... недавно (где-то неделю назад), или в Knowledge Base или в MSDN, нашёл код который читает сектора жесткого диска с помощью 13int. Так что и Алекс Коншин иногда ошибается...
А теперь по теме обсуждения.
Во-первых, определимся, изменяем размер сектора под DOS или под Win32?
Во-вторых, согласны ли вы с тем, что мы обращаемся к прерыванию BIOS, а ему всё равно какой размер у сектора.
В-третьих, если кто-нибудь читал книгу Фаронова В. В. "Turbo Pascal. Практика программирования", то наверняка встретил фразу о том, что изменение размера сектора возможно. Кстати я на каком-то сайте видел эту книгу для чтения он-лайн, кому интересно можете почитать.
Alex Konshin (2004-09-04 21:18:00) [48]Вообще-то я не гуру в этом вопросе.
Я не утверждаю, что subj невозможен для ATA HDD, но сомневаюсь.
Особенно сомневаюсь в том, что его можно делать меньше 512 - слишком многое там завязано на этот размер, например, многие команды возвращают результат именно этого размера.
http://www.t13.org/docs2004/D1699-ATA8-ACS.pdfИиз некоторых оговорок тоже следует, что размер сектора 512.
Например, фраза из описания 48-bit address feature set:
The optional 48-bit Address feature set allow devices with capacities up to 281,474,976,710,655 sectors. This allow device capacity up to 144,115,188,075,855,360 bytes.
Если вы поделите эти две цифры, то увидите, что подразумевается размер сектора 512.
В то же время почитайте параграфы 4.21-4.22. Насколько я понял, можно создавать секторы чуть большего размера (520-528 байт), но разные команды по-разному обрабатывают их. Некоторые все равно будут использовать 512 как размер сектора, например, READ BUFFFER, хотя остальные команды чтения будут читать сектора полностью.
Короче, на мой беглый взгляд выглядит так, что subj невозможен, но я допускаю, что я чего-то не заметил. :)
Dimaxx (2004-09-04 00:17:00) [49]Пробовал я дискету отформатировать через IOCTL_FORMAT_TRACK_EX с нестандартным кол-вом секторов на дорожке. Фиг! Форматирует только на 1.44, но не на 1.68. Куда уж там размер сектора...
Игорь Шевченко (2004-09-03 22:48:00) [50]Shiza (03.09.04 16:25) [20]
> Ну, ссылку честно признаться не видел :(
> Но... могу тебе написать код, ты его почитаешь, откомпилишь,
> и сам проверишь. Идёт?
Ты меня извини, но Алексу Коншину я склонен доверять больше.
Если он говорит, что это для работает только для гибких дисков, в чем меня и собственный опыт убеждает, то скорее всего, экпериментировать с винчестером смысла не имеет.
Или, действительно, стоит посмотреть исходники для Unix - диски-то одни и те же.
С уважением,
Alex Konshin (2004-09-03 20:08:00) [51]Проблема только в том, что работает это только флопиков.
Во всяком случае это утверждают те, кто пробовал - мне лично не доводилось.
Я уж не говорю про NT+.
Примеры нужно искать в утилитах форматирования. Их исходники бывают в дистрибутах всяких юниксов среди утилит подготовки диска перед установкой системы.
Shiza (2004-09-03 16:25:00) [52]>Э....DeviceIoControl вообще-то не обращается к int13
Как же не обращается? В SDK заглянуть можно, и что мы там увидим:
"Windows 95 provides a VxD named VWIN32.VXD that supports a set of control codes that Win32-based applications can use to carry out selected MS-DOS system functions. These system-defined control codes consist of the following values.
Control code (value) Meaning
VWIN32_DIOC_DOS_DRIVEINFO (6) Performs Interrupt 21h Function 730X commands. This value is supported in Windows 95 OEM Service Release 2 and later.
VWIN32_DIOC_DOS_INT13 (4) Performs Interrupt 13h commands
VWIN32_DIOC_DOS_INT25 (2) Performs the Absolute Disk Read command (Interrupt 25h)
VWIN32_DIOC_DOS_INT26 (3) Performs the Absolute Disk Write command (Interrupt 25h)
VWIN32_DIOC_DOS_IOCTL (1) Performs the specified MS-DOS device I/O control function (Interrupt 21h Function 4400h through 4411h)"
ниже идёт код из SDK поэтому не обижайтесь что на С++ :)
hDevice = CreateFile("\\\\.\\vwin32",0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL);
fResult = DeviceIoControl(hDevice, 4,®,sizeof(reg), ®, sizeof(reg), &cb, 0); //здесь код 4 и есть код обращения к 13int
Обращается не только к 13 прерыванию, но и к 21, 25 и 26.
>А ссылку на примерчик можно?
Ну, ссылку честно признаться не видел :(
Но... могу тебе написать код, ты его почитаешь, откомпилишь, и сам проверишь. Идёт? Только одно "но". Давай сразу оговоримся, код будет для DOS или для Win32. Под Win32 быстро не напишу по двум причинам: во-первых я работаю главным бухгалтером, и программированием занимаюсь в свободное от работы время, а во-вторых это немного сложнее чем с DOS.
Игорь Шевченко (2004-09-03 10:45:00) [53]
> Главное при работе с DeviceIoControl обратиться к 13int
Э....DeviceIoControl вообще-то не обращается к int13....
Shiza (03.09.04 10:40) [18]
> Изменить размер сектора - можно. Однозначно. Под DOS легко,
> под Win32 сложноее, но МОЖНО.
А ссылку на примерчик можно ? Хоть на С, хоть на чем, абы менял размер сектора у жесткого диска ?
Shiza (2004-09-03 10:40:00) [54]> для DeviceIoControl и кодов IOCTL_FORMAT_TRACK и IOCTL_FORMAT_TRACK_EX в параметрах форматирования задать размер сектора нельзя.
А необязательно использовать коды IOCTL_FORMAT_TRACK и IOCTL_FORMAT_TRACK_EX. Главное при работе с DeviceIoControl обратиться к 13int, а остальное уже дело только Ваших рук и головы. Господа я ещё забыл о том, что для работы с 13int можно использовать и драйвер виртуального устройства (vxd).
Изменить размер сектора - можно. Однозначно. Под DOS легко, под Win32 сложноее, но МОЖНО.
Игорь Шевченко (2004-09-03 10:09:00) [55]Shiza (02.09.04 17:52) [16]
> А вот под DOS, если честно, изменял сектора но на дискете
Так на дискете и я изменял :)
Sergey Kaminski © (02.09.04 17:00) [15]
Для не-дискет это имеет смысл ?
Почему спрашиваю - потому что в MSDN для DeviceIoControl и кодов IOCTL_FORMAT_TRACK и IOCTL_FORMAT_TRACK_EX в параметрах форматирования задать размер сектора нельзя.
Shiza (2004-09-02 17:52:00) [56]>В каком именно месте изменять...
Начиная с байта с порядковым номером 12 в загрузочном секторе распологается Блок Параметров БИОС (BPB). Вот его структура:
type
BPB=record
SecSize:Word;//количество байт в секторе
...
остальные поля этой структуры не привожу.
>и есть ли работающий пример такого изменения?
Под Win32 немного сложновато, потому что обращение к сервисам 13int напрямую в отношении жестких дисков недопустимо. Но в MSDN есть пример работы с HD под Win32, но он к сожалению на С++.
А вот под DOS, если честно, изменял сектора но на дискете. С жестким диском всё-таки пока страшновато... вот если б был ненужный винт поэксперементировать...
Sergey Kaminski (2004-09-02 17:00:00) [57]Игорь Шевченко © (02.09.04 12:22) [14]
Int 13, AH = 5
Format Disk Track.
ES:BX указывает на структуру 4-й байт которой содержит код размера сектора. См. также [4].
Игорь Шевченко (2004-09-02 12:22:00) [58]Shiza (02.09.04 11:25)
> Но если ваша программа будет читать диск средствами BIOS
> (13int) то пожалуйста, изменяйте.
В каком именно месте изменять и есть ли работающий пример такого изменения ?
Shiza (2004-09-02 11:25:00) [59]Позвольте вмешаться господа в вашу дискуссию. Могу сказать следующее: размер сектора можно изменить, но MS-DOS работает только с секторами размером 512 байт, остальные она неувидит. Но если ваша программа будет читать диск средствами BIOS (13int) то пожалуйста, изменяйте.
Dimaxx (2004-09-02 00:33:00) [60]С винтом такие шуточки не пройдут - это не дискета. Этот размер "зашит" на аппаратном уровне. И не нам лезть в аппаратку, если не хочешь проблем на свою голову.