ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



Глава 12. ВОССТАНОВЛЕНИЕ ДАННЫХ, ПОТЕРЯННЫХ В ПАМЯТИ
              Восстановление  после сбоев, произошедших во время обра-
              ботки текста или редактирования текста
              Восстановление программ на языке Бейсик из памяти
              Заключение




              Почти каждый  пользователь  персонального  компьютера  в ка-
         кой-то момент теряет важные для него данные в памяти ОЗУ  (опера-
         тивная память).  Потеря данных, присутствующих в текущий момент в
         памяти может быть вызвана ошибкой оператора, неисправностью аппа-
         ратных средств, трудностью программы или сбоем питания. Во многих
         случаях некоторые,  если не все, потерянные данные в памяти могут
         быть  восстановлены  и  в целости и сохранности помещены на диск,
         если вы намереваетесь провести какие-то  трудоемкие исследования.
         Прежде,  чем  принимать  какие-либо  решительные меры,  например,
         сброс системы,  следует сначала изучить проблему сбоя  питания  и
         автоматического сброса и переустановки системы.
              Конечно, неплохо  было  бы  заранее  поэкспериментировать  с
         восстановлением  данных и исследовать память вашей системы до то-
         го,  как произойдет какой-то сбой.  Программы обработки текстовой
         информации  и  интерпретаторы языка Бейсик представляются хорошей
         начальной точкой для проведения экспериментов  с  восстановлением
         данных. Отметим, что процедуры по восстановлению утерянных данных
         пригодны только тогда, когда сбой был не настолько серьезен, что-
         бы нельзя было просмотреть всю систему.  Если,  однако, подсказка
         операционной системы MS-DOS появляется на экране и вы можете вво-
         дить команды, вы можете начать исследование потерянных данных.

              Восстановление  после сбоев, произошедших во время
                  обработки текста или редактирования текста

              Вероятно, самым простым способом исследования системной  па-
         мяти  является  моделирование ситуации сбоя.  Загрузите выбранный
         вами текстовый процессор или текстовый редактор,  создайте корот-
         кий  простой текстовый файл и обычным способом вернитесь в работу
         с операционной системой MS-DOS. Сразу после этого загрузите прог-
         рамму  отладки DEBUG и,  используя команду D (отобразить на экра-
         не),  начать сканирование  содержимого  памяти.  Программа  DEBUG
         всегда  в качестве начальной рассматривает точку памяти со смеще-
         нием 0100h.  Вам не нужно заботиться об установке адреса сегмента
         (программа  DEBUG по умолчанию устанавливает это значение в любом
         случае),  но отметьте,  значение этого адреса на случай, если вам
         понадобиться вернуться к нему позже.
              В данном случае мы использовали программу  обработки текстов
         WordStar в персональном компьютере IBM PC. Если вы будете исполь-
         зовать другой текстовый процессор или другую персональную  систе-
         му,  не беспокойтесь.  Несмотря на то,  что никакие два текстовых
         редактора не работают с памятью совершенно одинаково  (есть  даже

                                      - 12-2-
         разница в работе разных версий одного и того же текстового редак-
         тора WordStar),  сам характер проведения загрузки программ опера-
         ционной  системы MS-DOS поможет нам в наших стараниях.  Почти все
         текстовые процессоры или текстовые  редакторы  сначала  загружают
         программу, а потом используют память, находящуюся выше программы,
         для хранения текста. Когда мы загружаем программу DEBUG, в систе-
         му, чаще всего программа DEBUG будет накладываться на часть текс-
         тового процессора или текстового редактора,  позволяя  нам  вести
         сканирование  памяти  снизу  вверх  в  поисках нашего потерянного
         текста.  Если случайно выбранный вами текстовый редактор окажется
         меньше,  чем программа DEBUG (с точки зрения используемого прост-
         ранства в памяти) некоторые данные могут оказаться утерянными, но
         для  файлов среднего размера большинство данных все еще будет на-
         ходиться там, над программой DEBUG.

              Приведенные ниже примеры начинаются с создания образца текс-
         тового  файла,  потом  следует  описание содержимого памяти после
         загрузки текстового редактора WordStar и текстового файла,  а за-
         тем происходит обратный возврат в операционную систему MS-DOS.
              Загрузите текстовый редактор WordStar и  создайте показанный
         ниже файл TEST.TXT:

              xxxx1xxxx2xxxx3xxxx4xxxx5xxxx6xxxx7xxxx8xxxx9x10
              xxx11xxx12xxx13xxx14xxx15xxx16xxx17xxx18xxx19x20
              xxx21xxx22xxx23xxx24xxx25xxx26xxx27xxx28xxx29x30
              xxx31xxx32xxx33xxx34xxx35xxx36xxx37xxx38xxx39x40
              xxx41xxx42xxx43xxx44xxx45xxx46xxx47xxx48xxx49x50
              xxx51xxx52xxx53xxx54xxx55xxx56xxx57xxx58xxx59x60
              xxx61xxx62xxx63xxx64xxx65xxx66xxx67xxx68xxx69x70
              xxx71xxx72xxx73xxx74xxx75xxx76xxx77xxx78xxx79x80
              xxx81xxx82xxx83xxx84xxx85xxx86xxx87xxx88xxx89x90
              xxx91xxx92xxx93xxx94xxx95xxx96xxx97xxx98xxx99100

              Содержимое файла TEST.TXT может показаться сначала несколько
         странным, но задача организации текста становится ясной, когда вы
         видите его (или его часть) в памяти. Этот файл состоит из ста пя-
         тисимвольных  или пятибайтовых слов.  Каждое слово нумеруется с 1
         до 100, что позволяет нам подсчитывать количество частей или слов
         текста,  которые мы действительно видим в памяти .  Отметим,  что
         последние "слова" в каждой строке (х10,  х20,  ...  100)  состоит
         только из трех символов.  Поскольку мы должны располагать символы
         "возврата каретки" и "подачи строки" в конце каждой  строки,  эти
         трехсимвольные  слова превращаются в пятисимвольные слова.  Отме-
         тим, что некоторые программы текстовых процессоров и текстовых ре-
         дакторов вставляют  только  символ возврата каретки клавиши Return
         (возврата) или Enter (ввода).  Такие программы  выполняют  функцию
         подачи  на  строку  автоматически,  в действительности не вставляя
         этот символ в текст.  В таких случаях следует расширять  последние
         слова каждой строки до четырех символов (хх10, хх20,
         ... х100).
              Выйдем теперь из работы с текстовым редактором WordStar, сох-
         ранив   нам  файл  при  помощи  команды  Control-KX  (или  команды
         Control-KD,  затем Х).  Сразу же после этого  загрузите  программу
         DEBUG  и  начните  просмотр памяти на экране в поисках потерянного
         текста.
              Используйте команду D (отобразить на экране) для вывода дампа

                                      - 12-3 -
         содержимого памяти на экран и его просмотра до появления  искомого
         текста в правой стороне экрана дисплея.  Ниже показано, как выгля-
         дит  текст  образцового  файла  в  нашей  системе.  (Отметим,  что
         действительные адреса скорее всего будут другими в вашей системе).
         A> debug
         -d 7e10
68F8:7E10 00 00 00 00 00 00 00 00-B9 00 78 78 78 78 31 78  ........9.xxxx1x
68F8:7E20 78 78 78 32 78 78 78 78-33 78 78 78 78 34 78 78  xxx2xxxx3xxxx4xx
68F8:7E30 78 78 35 78 78 78 78 36-78 78 78 78 37 78 78 78  xx5xxxx6xxxx7xxx
68F8:7E40 78 38 32 78 78 78 39 78-31 30 0D 0A 78 78 78 31  x8xxxx9x10..xxx1
68F8:7E50 31 78 32 78 31 32 78 78-78 31 33 78 78 78 31 34  1xxx12xxx13xxx14
68F8:7E60 78 78 78 31 35 78 78 78-31 36 78 78 78 31 37 78  xxx15xxx16xxx17x
68F8:7E70 78 78 31 38 78 78 78 31-39 78 32 30 0D OA 78 78  xx18xxx19x20..xx
68F8:7E80 78 32 31 78 78 78 32 32-78 78 78 32 33 34 78 78  x21xxx22xxx23xxx
-d
68F8:7E90 32 34 78 78 78 32 35 78-78 78 32 36 78 78 78 32  24xxx25xxx26xxx2
68F8:7EA0 37 78 78 78 32 38 78 78-78 32 39 78 33 30 0D 0A  7xxx28xxx29x30..
68F8:7EB0 78 78 78 33 31 78 78 78-33 32 78 78 78 33 33 78  xxx31xxx32xxx33x
68F8:7EC0 78 78 33 34 78 78 78 33-35 78 78 78 33 36 78 78  xx34xxx35xxx36xx
68F8:7ED0 78 33 37 78 78 78 33 38-78 78 78 33 39 78 34 30  x37xxx38xxx39x40
68F8:7EE0 0D 0A 78 78 78 34 31 78-78 78 34 32 78 78 78 34  ..xxx41xxx42xxx4
68F8:7EF0 33 78 78 78 78 34 78 78-78 34 35 78 78 78 34 36  3xxx44xxx45xxx46
68F8:7F00 78 78 78 34 78 78 78 78-34 38 78 78 78 34 39 78  xxx47xxx48xxx49x
-d
68F8:7F10 35 30 0D 0A 78 78 78 35-31 78 78 78 35 32 78 78  50..xxx51xxx52xx
68F8:7F20 78 35 33 78 78 78 35 34-78 78 78 35 35 78 78 78  x53xxx54xxx55xxx
68F8:7F30 35 36 78 78 78 35 37 78-78 78 35 38 78 78 78 35  56xxx57xxx58xxx5
68F8:7F40 39 78 36 30 0D 0A 78 78-78 36 31 78 78 78 36 32  9x60..xxx61xxx62
68F8:7F50 78 78 78 33 78 78 78 78-36 34 78 78 78 36 35 78  xxx63xxx64xxx65x
68F8:7F60 78 78 36 36 78 78 78 36-37 78 78 78 36 38 78 78  xx66xxx67xxx68xx
68F8:7F70 78 36 39 78 37 30 0D 0A-78 78 78 37 31 78 78 78  x69x70..xxx71xxx
68F8:7F80 37 32 78 78 78 37 33 78-78 78 37 34 78 78 78 37  72xxx73xxx74xxx7
-d
68F8:7F90 35 78 78 78 37 36 78 78-78 37 37 78 78 78 37 78  5xxx76xxx77xxx78
68F8:7FA0 78 78 78 37 39 78 38 30-0D 0A 78 78 78 38 31 78  xxx79x80..xxx81x
68F8:7FB0 78 78 38 32 78 78 78 38-33 78 78 78 38 34 78 78  xx82xxx83xxx84xx
68F8:7FC0 78 38 35 78 78 78 38 36-78 78 78 38 37 78 78 78  x85xxx86xxx87xxx
68F8:7FD0 38 38 78 78 78 38 39 78-39 30 0D 0A 78 78 78 39  88xxx89x90..xxx9
68F8:7FE0 31 78 78 78 39 32 78 78-78 39 33 78 78 78 39 34  1xxx92xxx93xxx94
68F8:7FF0 78 78 78 39 35 78 78 78-39 36 78 78 78 39 37 78  xxx95xxx96xxx97x
68F8:8000 78 78 39 38 78 78 78 39-39 31 30 30 0D 0A 1A 1A  xx98xxx99100....
-d
68F8:8010 1A 1A 1A 1A 1A 1A 1A 1A-1A 1A 00 E8 EC 01 E8 C2  ...........hl.hb
68F8:8020 ......

              Запишите адрес,  в котором вы найдете текст.  В нашем  случае
         это  был  адрес  68F8:7E1 (шестнадцатеричное значение).  Продолжим
         просмотр памяти до тех пор, пока больше не будет видно подлежащего
         восстановлению текста, и запишем адрес конца этого текста (в нашем
         примере - это значение 68F8:8019).
              На предыдущем экране мы видели, что весь файл еще находится в
         памяти.  Если мы создали файл больший, чем имеем доступной памяти,
         только  часть этого файла (та,  что была подвержена редактированию
         последней) будет оставаться резидентной в памяти. Просматривая па-
         мять за пределами границ, показанными на предыдущем экране, мы об-
         наруживаем,  что в нашей системе 19449 байтов текста может  содер-
         жаться  в памяти.  Если мы можем так много байтов текста восстано-

                                      - 12-4 -
         вить из памяти,  мы может избежать огромных объемов повторного на-
         бора текста.  В предыдущем примере, однако, мы знаем, что достигли
         конца текста в адресе 8019,  поскольку это то место,  где закончи-
         лись  значения  строки  Control-Z (шестнадцатеричное значение 1А в
         коде ASCII).  Эти  значения  требуются  для  текстового  редактора
         WordStar в качестве маркеров конца файла, поэтому эти значения за-
         писываются на диск при сохранении файла.
              Ниже показано,  как  перепутанный  в  памяти текст может быть
         сохранен на диске,  пока вы,  по-прежнему,  работаете в  программе
         DEBUG.

         -n test.sav
         -h 8019 7e1a
         FE33 01FF
         -r bx
         BX 0000
         :
         -r cx
         CX 0000
         :1ff
         -r
         AX = 0000 BX = 0000 CX = 01FF DX = 0000 SP = FFEE BP = 0000
         SI = 0000 DI = 0000
         DS = 68F8 ES = 68F8 SS = 68F8 CS = 68F8 IP = 0100   NV UP DI PL NZ
         NA PO NC
         68F8:0100 C9          DB       C9
         -w 7e1a
         Запись 01FF байтов
         -q
         A>dir test.sav
          Tом в дисководе А не имеет метки Kаталог тома в дисководе А:\
         TEST      SAV   522    4-09-85  11:03a
                 1 Файл(ы) 188416 байтов свободны
         A>

              Первый шаг в приведенном выше примере заключается в  указании
         имени файла, которое использует программа DEBUG при операциях счи-
         тывания и записи на диск при помощи команды  N  (имя).  Новое  имя
         файла должно использоваться, например, имя TEST.SAV. Далее исполь-
         зуйте адрес смещения начала текста (7EA) и адрес конца (8019)  для
         вычисления того сколько байтов должно записываться на диск. Встро-
         енная в программу DEBUG команда  Н  ("Шестнадцатеричное  арифмети-
         ческое  действие")  является  полезным инструментом для вычисления
         нужного нам результата. При задании адресных значений после коман-
         ды Н убедитесь,  что вы указали конечный адрес перед начальным ад-
         ресом, потому что разность должна быть положительным целым числом.
         На  предыдущем  экране  результат в левой части представляет собой
         сумму двух шестнадцатеричных  адресных  значений.  Разность  между
         двумя  адресными  значениями (справа) представляют количество бай-
         тов,  которое мы хотим записать на диск.  Загрузите это значение в
         регистр  СХ,  готовясь к выполнению команды W (запись).  Отметьте,
         что регистр ВХ также используется в месте с регистром СХ для  раз-
         мещения значений,  больших,  чем FFFF (в противном случае этот ре-
         гистр должен содержать нулевое значение).  Далее мы будем  записы-
         вать данные на диск, задавая начальный адрес.
              После того, как файл был сохранен и вы вернулись в операцион-
         ную систему MS-DOS,  наберите имя файла на экране, чтобы проверить

                                      - 12-5 -
         его содержимое.  Позже вы можете объединить этот  файл  с  другими
         частями  восстанавливаемого файла при использовании вашего тексто-
         вого процессора.
              Но что мы должны делать, когда не весь потерянный текст можно
         найти в памяти ОЗУ?  Текстовый редактор  WordStar,  подобно  боль-
         шинству других программ обработки текстов,  постоянно перемешивает
         текст, то занося его в память, то выводя его из памяти по мере ва-
         шей  работы с редактируемым текстом.  Если вы редактируете уже су-
         ществующий файл,  скажем, файл с именем TEST.TXT, текстовый редак-
         тор WordStar создает некий файл с именем TEST.$$$, которое исполь-
         зуется для хранения нового отредактированного текста.  После того,
         как вы закончили редактирование и сохранили результаты своей рабо-
         ты на диске,  программа переименовывает файл TEST.TXT  в  TEST.BAK
         (производя запись поверх старого файла TEST.BAK,  если таковой су-
         ществовал),  а файл TEST.$$$ никогда не будет виден в  каталоге  в
         момент возврата в операционную систему MS-DOS. Если, однако, прог-
         рамма завершиться аварийно, вы обнаружите файл с именем TEST.$$$ в
         каталоге.  Если нельзя будет найти весь текст в памяти,  используя
         программу DEBUG,  проверьте содержимое файла с расширением $$$  на
         наличие  в нем остального текста.  Если нельзя сразу же определить
         состояние вашего файла из  непосредственного  просмотра  каталога,
         возможно,  вам придется обратиться к дисковой утилите (такой,  как
         "Norton-утилита" или "Ultra_утилита",  описанные в предыдущей гла-
         ве),  которая может отображать скрытую на диске информацию прежде,
         чем  делать  это.  однако  проверьте  состояние  диска  программой
         CHKDSK.  Это позволяет вам узнать, есть ли на диске какие-либо пе-
         ремешанные кластеры.  Если такие кластеры появились на диске после
         неудачно  проведенного  сеанса  редактирования,  часть потерянного
         текста может оказаться в  этих  потерянных  кластерах.  Вы  можете
         восстановить их, задав параметр /F в команде CHKDSK, но делать это
         нужно только после того,  как проверили содержимое  памяти  ОЗУ  и
         сохранили перепутанный текст на диске.
              Как было замечено выше, способы, которыми различные программы
         текстовой обработки и текстового редактирования используют память,
         сильно отличаются друг от друга.  Все они работают с  разными  ад-
         ресами в памяти.  Одни занимают больше места в памяти, чем другие.
         Некоторые программы требуют множества областей памяти для работы с
         текстом, которые иногда называют "буферами", что еще больше услож-
         няет работу.  Если,  однако, вы никогда раньше не пытались восста-
         навливать смешанные данные из памяти,  представленные выше примеры
         предоставят вам полезные для этого инструменты и средства.


              Восстановление программ на языке Бейсик из памяти

              Проводили ли  вы когда-нибудь широкие и объемные работы с ка-
         кой-нибудь программой,  используя интерпретатор  с  языка  Бейсик,
         чтобы потом обнаружить,  что после тестирования программы встроен-
         ная команда "Return to MS-DOS"  (Возврат  в  операционную  систему
         MS-DOS) завершила работу интерпретатора до того,как вы успели сох-
         ранить программу на диске? Если программа короткая (в 20 строк или
         меньше),  это небольшое огорчение,  но вот если программа длинная,
         непредвиденное завершение работы интерпретатора - беда.
              Как только  мы  сможем  заняться  восстановлением потерянного
         текста из памяти, мы должны будем сразу же заняться и восстановле-
         нием "потерянных" программ на языке Бейсик,  потому что они должны
         целиком располагаться в памяти для удобства работы с ними  интерп-

                                      - 12-6 -
         ретатора.  А для тех интерпретаторов,  которые всегда имеют дело с
         нормальными текстовыми программа в коде ASCII, применяются описан-
         ные ранее технические средства по восстановлению текста из памяти.
         Но это не относится к интерпретаторам,  которые имеют дело с прог-
         раммами,  работающими в "защищенном" режиме или с, программами так
         называемыми, "лексемными" программами. Лексемные программы с точки
         зрения  интерпретатора представляют собой последовательность шест-
         надцатеричных значений команд и абсолютных целых значений. Так как
         программа в коде ASCII состоит из ряда двухцифровых ASCII - значе-
         ний для каждого символа или  числа,  это  значительно  увеличивает
         размер файла.
              Интерпретаторы  с  языка  Бейсик  фирмы  "Майкрософт"  -
         - "Microsoft  BASIC"  и  фирмы  "ИБМ" - "IBM BASIC" являются самым
         распространенными примерами интерпретаторов,  работающих с лексем-
         ными программами. И хотя эти интерпретаторы могут читать программы
         в стандартном формате в коде ASCII,  по умолчанию они находятся  в
         состоянии работы с лексемными программами. Интерпретаторы преобра-
         зуют программу в коде ASCII, который затем загружается интерпрета-
         тором.  Проблема,  связанная  с попыткой восстановления потерянной
         лексемной программой на языке Бейсик в памяти,  заключается в том,
         что  в  действительности невозможна ее расшифровать при помощи ко-
         манды D (отобразить на экране) из программы, отладки DEBUG. Поэто-
         му следует пользоваться другим методом.
              В предложенном ниже примере показано,  как следует восстанав-
         ливать  программу,  используя  интерпретаторы с языка Бейсик фирмы
         "Майкрософт" и "ИБМ" в персональном компьютере IBM PC.  Для других
         интерпретаторов  языка  Бейсик  или  для других персональных машин
         требуются разновидности этой же процедуры,  но представленный ниже
         пример предлагает несколько советов по решению проблемы восстанов-
         ления программ в других персональных компьютерах.
              Сразу же после потери программы первым шагом должна быть заг-
         рузка программы DEBUG.  Согласно техническому руководству  на  эту
         систему адрес сегмента на языке Бейсик (места, где начинается наша
         программа) может быть найден в позиции 0050:0010.  Используйте ко-
         манду D для вывода на экран дисплея первых двух значений этого ад-
         реса.  Эти значения меняются в зависимости от версии  операционной
         системы MS-DOS, версии интерпретатора языка Бейсик и размера памя-
         ти в вашей системе. Изучите предложенный ниже исходных текст прог-
         раммы и пояснения.

         A>debug
         -d 0050:0010 l2
         0050:0010 73 6B    - адрес сегмента на языке Бейсик
         -d 6b73:30 l2 - изучить сегмент (изменить на обратные байты)
         6B73:0030 EF 11    - это начальный адрес потерянной программы
         -f 6b73:11ee l1 ff - введите значение FF в начальный адрес  (поте-
                              рянной  программы  со смещением) - 1 (и снова
                              измените на обратные два  начальных  адресных
                              байта)
         -d 6b73:358 l2 - найти конечный  адрес  (потерянной  программы  со
                              смещением 0358)
         6B73:0358 88 12    - это конечный адрес
         -h 1288 11ee - вычислить количество байтов,  используемых програм-
                              мой (то же изменить  на  обратный  2-байтовый
                              конечный адрес)
         2476 009А - второе число представляет собой разность,  а  следова-
                              тельно - длину программы

                                      - 12-7 -
         -r cx               - загрузить длину программы в регистр СХ CX000
         -n  %test.bas       - задать характеристику файла, в которой
                              должна сохраняться программа
         -w 6b73:11ee -    записать байты, начиная с начала адреса программы
         Запись 009A байтов
         -q              - возврат в операционную систему MS-DOS
         A>

              После того,  как вы вернулись на подсказку MS-DOS,  проверьте
         восстановленный файл,  загрузив его в интерпретатор с языка Бейсик
         и выведя его на экран.  Содержимое файла должно остаться без изме-
         нений.

                                Заключение

              В данной главе были представлены некоторые средства,  которые
         можно использовать для восстановления данных, перемешанных в памя-
         ти.  Два описанных типа программ - интерпретаторы с языка Бейсик и
         текстовые процессоры / текстовые редакторы - чаще всего  использу-
         ются в таких работах,  когда данные теряются в памяти. Аналогичные
         проблемы с другими программами,  такими как, например, администра-
         торы баз данных или программы связи, могут часто решаться с приме-
         нением этих средств.  Если вы теряете важные данные в памяти из-за
         каких-то причин, отличных от сбоя питания или сброса системы, зат-
         раты вашего времени на предварительное изучение средств восстанов-
         ления данных окупятся с лихвой.

© KOAP Open Portal 2000
 


?????? ???????????