Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

изменение размера сектора   Найти похожие ветки 

 
Fabo   (2004-09-01 13:36) [0]

Как можно длину какого-нибудь сектора жесткого диска менять с 512 байтов на другую?


 
Digitman ©   (2004-09-01 13:48) [1]

т.е. одного-единственного среди прочих, оставшихся при этом при размере 512 ?

а никак

эта характеристика задается при форматировании всего носителя


 
VMcL ©   (2004-09-01 14:21) [2]

AFAIK, размер сектора нельзя поменять вообще, он всегда 512 байт. А вот кластера можно, но, естественно, при переформатировании.


 
Digitman ©   (2004-09-01 14:23) [3]


> VMcL ©   (01.09.04 14:21) [2]


чтой-то вдруг нельзя ? на то и есть физическое форматирование


 
Sergey Kaminski ©   (2004-09-01 14:44) [4]

Disk Base Table байт 03 указывает кол-во байт на физ. сектор. Эту структуру используют сервисы int 13h.
Только физ. формат


 
Sergey Kaminski ©   (2004-09-01 14:46) [5]

...ирование.
Ссори, случайно кусок слова Ctrl-X. :)


 
Игорь Шевченко ©   (2004-09-01 14:51) [6]

Digitman ©   (01.09.04 14:23) [3]


> чтой-то вдруг нельзя ? на то и есть физическое форматирование


Это достоверная информация ? Я могу сделать размер сектора (пусть на всем диске), скажем, 644 байта ?


 
Digitman ©   (2004-09-01 15:03) [7]


> Игорь Шевченко ©   (01.09.04 14:51) [6]


ну ты зря утрируешь, Игорь
прекрасно же знаешь, что размер сектора при форматировании не может быть выбран "от балды" - он должен быть кратен "заветной" степени двойки ... причем набор допустимых "кратных" значений тоже фиксирован по числу элементов


 
Digitman ©   (2004-09-01 15:08) [8]


> Игорь Шевченко


"когда компьютеры были маленькими" (i80286 был верхом совершенства), а я , соответственно, был еще совсем зеленым и амбициозном в этом деле, "лепил" я как-то раз свою "файловую систему" для "защиты от копирования" из-под MS-DOS ... причем беспардонно содрал ее идею с хорошо известной мне ОС РАФОС, но при этом "нарезал" 5-дюймовый флопик на сектора размером в 1к ... все замечательно, кстати, получалось и так же замечательно работало, хоть и бестолковый труд был в конечном счете


 
Игорь Шевченко ©   (2004-09-01 15:11) [9]

Digitman ©   (01.09.04 15:03) [7]

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


 
Digitman ©   (2004-09-01 15:25) [10]


> Игорь Шевченко ©   (01.09.04 15:11) [9]


> Поправь, если я ошибаюсь


утверждать обратное не буду, но контроллер контроллеру рознь ... разумеется, я о том контроллере, который стоит на борту винта, а не IDE/EIDE/SCSI и иже с ними ..


 
Игорь Шевченко ©   (2004-09-01 15:40) [11]

Digitman ©   (01.09.04 15:25) [10]


> разумеется, я о том контроллере, который стоит на борту
> винта


Некая разновидность RLL-контроллера там, наверное, стоит, хотя, могу и ошибаться, так как не знаю достоверно, что находится на современных винтах. На старых IDE на самом винте стоял интегрированный RLL-контроллер.


 
Dimaxx   (2004-09-02 00:33) [12]

С винтом такие шуточки не пройдут - это не дискета. Этот размер "зашит" на аппаратном уровне. И не нам лезть в аппаратку, если не хочешь проблем на свою голову.


 
Shiza   (2004-09-02 11:25) [13]

Позвольте вмешаться господа в вашу дискуссию. Могу сказать следующее: размер сектора можно изменить, но MS-DOS работает только с секторами размером 512 байт, остальные она неувидит. Но если ваша программа будет читать диск средствами BIOS (13int) то пожалуйста, изменяйте.


 
Игорь Шевченко ©   (2004-09-02 12:22) [14]

Shiza   (02.09.04 11:25)


>  Но если ваша программа будет читать диск средствами BIOS
> (13int) то пожалуйста, изменяйте.


В каком именно месте изменять и есть ли работающий пример такого изменения ?


 
Sergey Kaminski ©   (2004-09-02 17:00) [15]

Игорь Шевченко ©   (02.09.04 12:22) [14]

Int 13, AH = 5
Format Disk Track.

ES:BX указывает на структуру 4-й байт которой содержит код размера сектора. См. также [4].


 
Shiza   (2004-09-02 17:52) [16]

>В каком именно месте изменять...

Начиная с байта с порядковым номером 12 в загрузочном секторе распологается Блок Параметров БИОС (BPB). Вот его структура:

type
BPB=record
SecSize:Word;//количество байт в секторе
...
остальные поля этой структуры не привожу.

>и есть ли работающий пример такого изменения?

Под Win32 немного сложновато, потому что обращение к сервисам 13int напрямую в отношении жестких дисков недопустимо. Но в MSDN есть пример работы с HD под Win32, но он к сожалению на С++.

А вот под DOS, если честно, изменял сектора но на дискете. С жестким диском всё-таки пока страшновато... вот если б был ненужный винт поэксперементировать...


 
Игорь Шевченко ©   (2004-09-03 10:09) [17]

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-03 10:40) [18]

> для 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:45) [19]


> Главное при работе с DeviceIoControl обратиться к 13int


Э....DeviceIoControl вообще-то не обращается к int13....

Shiza   (03.09.04 10:40) [18]


> Изменить размер сектора - можно. Однозначно. Под DOS легко,
> под Win32 сложноее, но МОЖНО.


А ссылку на примерчик можно ? Хоть на С, хоть на чем, абы менял размер сектора у жесткого диска ?


 
Shiza   (2004-09-03 16:25) [20]

>Э....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,&reg,sizeof(reg), &reg, sizeof(reg), &cb, 0); //здесь код 4 и есть код обращения к 13int

Обращается не только к 13 прерыванию, но и к 21, 25 и 26.

>А ссылку на примерчик можно?

Ну, ссылку честно признаться не видел :(
Но... могу тебе написать код, ты его почитаешь, откомпилишь, и сам проверишь. Идёт? Только одно "но". Давай сразу оговоримся, код будет для DOS или для Win32. Под Win32 быстро не напишу по двум причинам: во-первых я работаю главным бухгалтером, и программированием занимаюсь в свободное от работы время, а во-вторых это немного сложнее чем с DOS.


 
Alex Konshin ©   (2004-09-03 20:08) [21]

Проблема только в том, что работает это только флопиков.
Во всяком случае это утверждают те, кто пробовал - мне лично не доводилось.
Я уж не говорю про NT+.
Примеры нужно искать в утилитах форматирования. Их исходники бывают в дистрибутах всяких юниксов среди утилит подготовки диска перед установкой системы.


 
Игорь Шевченко ©   (2004-09-03 22:48) [22]

Shiza   (03.09.04 16:25) [20]


> Ну, ссылку честно признаться не видел :(
> Но... могу тебе написать код, ты его почитаешь, откомпилишь,
> и сам проверишь. Идёт?


Ты меня извини, но Алексу Коншину я склонен доверять больше.

Если он говорит, что это для работает только для гибких дисков, в чем меня и собственный опыт убеждает, то скорее всего, экпериментировать с винчестером смысла не имеет.
Или, действительно, стоит посмотреть исходники для Unix - диски-то одни и те же.

С уважением,


 
Dimaxx   (2004-09-04 00:17) [23]

Пробовал я дискету отформатировать через IOCTL_FORMAT_TRACK_EX с нестандартным кол-вом секторов на дорожке. Фиг! Форматирует только на 1.44, но не на 1.68. Куда уж там размер сектора...


 
Alex Konshin ©   (2004-09-04 21:18) [24]

Вообще-то я не гуру в этом вопросе.
Я не утверждаю, что 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 невозможен, но я допускаю, что я чего-то не заметил. :)


 
Shiza   (2004-09-05 10:22) [25]

>Ты меня извини, но Алексу Коншину я склонен доверять больше.

Как то в форуме был вопрос о том как читать сектора жесткого диска. Я там распинался что читать сектора жесткого диска под Win32 можно и с помощью 13int, на что Алекс мне заметил, что это невозможно. Сначала я ему не поверил, но когда сам попытался прочитать сектор на жестком - получил нефиговую ошибку.
Но... недавно (где-то неделю назад), или в Knowledge Base или в MSDN, нашёл код который читает сектора жесткого диска с помощью 13int. Так что и Алекс Коншин иногда ошибается...

А теперь по теме обсуждения.
Во-первых, определимся, изменяем размер сектора под DOS или под Win32?

Во-вторых, согласны ли вы с тем, что мы обращаемся к прерыванию BIOS, а ему всё равно какой размер у сектора.

В-третьих, если кто-нибудь читал книгу Фаронова В. В. "Turbo Pascal. Практика программирования", то наверняка встретил фразу о том, что изменение размера сектора возможно. Кстати я на каком-то сайте видел эту книгу для чтения он-лайн, кому интересно можете почитать.


 
Игорь Шевченко ©   (2004-09-05 10:49) [26]


> Во-первых, определимся, изменяем размер сектора под DOS
> или под Win32?


А какая разница ? Речь идет о работе с железом в данном случае, а ему по барабану, в какой операционной системе с ним работают.


> Во-вторых, согласны ли вы с тем, что мы обращаемся к прерыванию
> BIOS, а ему всё равно какой размер у сектора.


Речь идет о том, все равно ли самому контроллеру диска или нет.
Если ему все равно, тогда размер сектора можно изменить, вне зависимости от BIOS, операционной системы, и т.д. Если не все равно, тогда изменить размер не удастся ни в BIOS, ни в DOS, ни в Win32.


> В-третьих, если кто-нибудь читал книгу Фаронова В. В. "Turbo
> Pascal. Практика программирования", то наверняка встретил
> фразу о том, что изменение размера сектора возможно.


На дискете - возможно.


> Как то в форуме был вопрос о том как читать сектора жесткого
> диска


CreateFile + SetFilePointer + ReadFile


 
Anatoly Podgoretsky ©   (2004-09-05 11:16) [27]

Интересно в Линуксе 1024 блоки (сектора) это физическое или логическое понятие?


 
Shiza   (2004-09-05 13:47) [28]

Да, господа, плодотворное у нас обсуждение :)

>Речь идет о работе с железом в данном случае, а ему по барабану, в какой операционной системе с ним работают.

То понятно, только вот мне из под DOS легче обратиться к 13int чем из под NT :)

>Интересно в Линуксе 1024 блоки (сектора) это физическое или логическое понятие?

А вот это и правда свежая мысль, надо бы высказаться господа, я пока изучу, и в понедельник думаю что-нибудь скажу...


 
Alex Konshin ©   (2004-09-05 22:21) [29]

Ну вы почитайте документ-то.


 
Shiza   (2004-09-06 11:19) [30]

Ну что, насчёт размера сектора в Линуксе пока утверждать ничего не могу, то что успел прочитать дома на это свет не пролило...
Может чё в интернете найду...

Да, кстати, а чё за сектора у NTFS? А то я если честно с ней не знаком.

>Ну вы почитайте документ-то.

Подожди, дай скачать...


 
Dimaxx   (2004-09-06 23:26) [31]

В Линухе размер сектора логическое понятие. То есть файловая система использует именно этот размер, а физический - все равно останется 512 байт.

NTFS - это совмещение кластерного и потокового метода хранения файлов. У нее тоже есть FAT (вернее MFAT), только немного не такая. У нее фрагментация файлов бывает редко и только в том случае, если записать нефрагментированный файл невозможно (а на самом деле это не так - еще как фрагментируются).


 
Dimaxx   (2004-09-06 23:28) [32]

Пардон, забыл...

Меняется там все равно размер кластера, а не сектора. Он как был полкило, так и останется...


 
Игорь Шевченко ©   (2004-09-07 10:03) [33]


> У нее тоже есть FAT (вернее MFAT), только немного не такая


Еще вернее - MFT, которая вовсе не FAT


 
Shiza   (2004-09-07 10:06) [34]

вВопрос такой родился:

Когда диск отформатирован под NTFS, то 13int не работает. Почему?

>В Линухе размер сектора логическое понятие.То есть файловая система использует именно этот размер, а физический - все равно останется 512 байт.

Интересно, зачем это системе логический сектор, если есть кластер?

И ещё. Вот цитата из книги Фаронова В. В.: "С физической точки зрения все секторы одинаковы - как уже говорилось, их емкость в MS-DOS всегда равна 512 байтам".

Думаю автор не просто так вставил "MS-DOS", как думаете?


 
Игорь Шевченко ©   (2004-09-07 11:25) [35]


> Когда диск отформатирован под NTFS, то 13int не работает.
> Почему?


Работает


> если есть кластер?


Кластер есть логическое понятие. Сектор есть физическое понятие.


> Думаю автор не просто так вставил "MS-DOS", как думаете?


Думаю, что или надо спросить у автора или не выдергивать фразу из контекста.


 
Shiza   (2004-09-07 12:44) [36]

>Ну вы почитайте документ-то.

С моим знанием английского такие документы читать рановато наверное :), но почитав абзацы 4.21 - 4.23, я встретил такие понятия как "Long Physical Sector" и "Long Logical Sector". Даже с моим знанием английского понятно что это понятия разные, и Physical - есть физический, а Logical - есть логический сектор.

Следовательно физический размер сектора может быть нестандартным (512 байт)... но не утверждаю, а предполагаю...

А вы со мной согласны?


 
Игорь Шевченко ©   (2004-09-07 15:45) [37]

"В ходе выполнения процедуры так называемого низкоуровневого форматирования (low-level formatting) на носитель записывается информация, которая определяет разметку носителя на цилиндры и секторы. Структура формата включает в себя  различную служебную информацию: байты синхронизации, идентификационные заголовки, байты контроля четности и т. д. В современных винчестерах такая информация записывается однократно при изготовлении винчестера. Повреждение этой информации при самостоятельном низкоуровневом форматировании пользователем чревато полной неработоспособностью диска и необходимостью восстановления этой информации в заводских условиях"

http://www.athena.vvsu.ru/glax/disk/hdd.HTML

Желающие изменить размер сектора на диске могут проэкспериментировать. У меня лишнего винчестера нету, так что я от экспериментов устраняюсь.


 
Shiza   (2004-09-07 15:53) [38]

Полазив по Интеренту, я пришёл к следующему выводу. Размер сектора жёсткого диска может быть больше 512 байт, но изменить его программными средствами нельзя. Размер сектора зависит от жёсткого диска.


 
Shiza   (2004-09-07 16:03) [39]

http://www.athena.vvsu.ru/glax/disk/hdd.HTML

от туда же:

"Теперь Вы знаете, что на жестком диске имеются цилиндры, головки и сектора. Все эти параметры для каждого жесткого диска есть в BIOS. Вы знаете также, что размер сектора жесткого диска не фиксирован, как это было раньше.

   В настоящее время эти величины используются только для совместимости с DOS, поскольку они не имеют отношения к физической геометрии диска."

Так что, всё-таки можно? :)


 
Alex Konshin ©   (2004-09-07 20:05) [40]

Не, ну вы точно не читатели.
Там же в документе написано, что можно сделать сектор больше 512, но делается это для того, чтобы прикладные программы могли записать туда некую служебную информацию. Почему я говорю "служебную"? А потому что некоторые команды чтения-записи все равно будут читать-писать 512 байт.
А понятие "кластер" - все-таки физическое. И в документе описано, как он может выглядеть при нестандартном размере сектора.
Этот документ описывает ATA версию 8, т.е. ту, что еще пока не реализуется. Если хотите, можете почитать описания свех остальных версий ATA на том же сайте. Уверен, что по subj там будет то же самое.



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.24 c
8-1090928361
П7
2004-07-27 15:39
2004.10.24
Как заставить Flash перерисовывать себя при отображении


6-1091797258
Дмитрий Ботвин
2004-08-06 17:00
2004.10.24
Создание общего ресурса


14-1096547992
aleshap
2004-09-30 16:39
2004.10.24
Таблица - Grid


6-1092379795
Дмитрий Ботвин
2004-08-13 10:49
2004.10.24
Список служб на удаленном компьютере


1-1096978895
Kiwork
2004-10-05 16:21
2004.10.24
Контекстное меню TWebBrowser не работает





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский