ТОП 10:

Встроенные переменные интерпретатора



 

$# — число аргументов;

$* — все аргументы, передаваемые интерпретатору ($@);

$- — флаги передаваемые интерпретатору;

$? — возвращение значения последней выполненной команды;

$$ — номер процесса интерпретатора;

$! — номер процесса последней команды, запущенной с &;

 

Правила сопоставления шаблонов в интерпретаторе

 

* — задание любой строки, в том числе и пустой.

? — любой одиночный символ;

"..." — задает в точности ...; ""('') защищает от спецсимволов;

\c — задает с буквально;

a|b — только для выражения выбора, a или b.

 

Значения переменных

 

$var — значение var;

${var-thing} — значение var, если оно определено, в противном случае thing;

${var=thing} — значение var, если var не определено, то присваивается значение thing;

${var?строка} — если var определено — $var, в противном случае выводится строка и инт. прекращает работу;

${var+thing} — thing, если $var определено, в противном случае ничего.

 

Метасимволы

 

| — конвейер (связь выходного потока одной программы с выходным потоком другой);

& — асинхронный запуск;

; — последовательное выполнение;

> — помещение выходного потока;

>> — добавление выходного потока;

* — любая строка;

? — любой символ;

[ccc] — задает любой символ из [ссс] в имени файла;

`...` — инициирует выполнение команды;

( ) — инициирует выполнение команды в порожденном shell;

{ } — инициирует выполнение команды в текущем shell;

$1 — заменяется аргументом командного файла;

$var — значение переменной var в программе на языке shell;

${var} — значение var;

\ — перевод строки;

'...' — непосредственное использование;

"..." — непосредственное использование, после того, как $`...` и \ будут интерпретированы;

# — остальная строка — комментарий;

p1&&p2 — выполнить p1, в случае успеха p2;

p1||p2 — выполнить p1, в случае неудачи p2;

2>file — переключить поток диагностики на файл;

2>&1 — поместить стандартный поток диагностики в выходной

поток;

1>&2 — добавление выходного потока к стандартному потоку

диагностики.

 

Варианты заданий на выполнение

 

Вариант 1. Разработать программу, отправляющую почту (содержимое файла) группе пользователей, выбираемых из общего списка (хранящегося в другом файле) в интерактивном режиме. Например, вы отвечаете "Y" для тех, кому надо посылать, "N" — не надо, "Q" — конец выбора.

 

Вариант 2. Разработать программу, выводящую через определенный интервал времени информацию о пользователях в системе: кто вошел, кто вышел.

 

Вариант 3. Разработать программу, выполняющую в зависимости от ключа один из 3–х вариантов работы:

- с ключом /n дописывает в начало указанных текстовых файлов строку с именем текущего файла;

- с ключом /b создает резервные копии указанных файлов;

- с ключом /d удаляет указанные файлы после предупреждения.

 

Вариант 4. Разработать программу создающую, копирующую или удаляющую файл, указанный в командной строке, в зависимости от выбранного ключа (замещаемого параметра) /n , /c , /d.

 

Вариант 5. Разработать программу, добавляющую вводом с клавиатуры содержимое текстового файла (в начало или в конец в зависимости от ключей (замещаемого параметра) /b /e).

 

Вариант 6. Разработать программу, регистрирующую время своего запуска в файле протокола run.log и автоматически запускающую некоторую программу (например, антивирусную и т. п.) по пятницам или 13 числам.

 

Вариант 7. Разработать программу, копирующую произвольное число файлов заданных аргументами из текущего каталога в указываемый каталог.

 

Вариант 8. Разработать программу, которая в интерактивном режиме могла бы дописывать в файл текст, удалять строки из файла, и распечатывать на экране содержимое файла.

 

Вариант 9. Разработать программу, которая бы запускала бы какой-либо файл один раз в сутки. То есть, если файл запускается первый раз в сутки, то он запускает какой-либо файл. Если ваш файл уже запускали сегодня, то ваш файл ничего не делает.

 

Вариант 10. Разработать программу, которая получала бы в качестве параметра какой-либо символ и в зависимости от второго параметра вырезала или сохраняла в заданном файле все строки начинающиеся на этот символ.

 

Вариант 11. В некотором файле храниться список пользователей ПК и имя их домашних каталогов. Необходимо разработать программу, которая просматривает данный файл и в интерактивном режиме задает вопрос – копировать текущему пользователю (в его домашний каталог) какой-либо заданный файл (в качестве параметра) или нет. Если «Да» то программа копирует файл.

 

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

 

Вариант 13. Разработать программу (аналог команды wc), которая бы получала бы в качестве аргумента имя текстового файла и выводила на экран информацию о том, сколько символов, слов и строк в текстовом файле.

 

Вариант 14. Разработать программу (аналог команды tail), которая печатает конец файла. По умолчанию – 10 последних строк. Явно можно задать номер строки, от которой печатать до конца.

 

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

 

Вариант 16. Разработать программу, которая формировала бы ежемесячный отчет об изменениях в рабочем каталоге (файлы созданные, удаленные).

 

Вариант 17. Разработать программу, разбирающую содержимое письма (файл или входной поток), выделяющую заголовок письма с адресом отправителя (поля From: или From) и отправляющую содержимое письма без заголовка обратно отправителю.

 

Вариант 18. Разработать программу, которая изменяет текстовый файл так, что четные и нечетные строки меняются местами.

 

Вариант 19. Разработать программу, которая бы в зависимости от параметров, строила бы выборку по какому бы условию (числовые значения) из табличного файла.

 

Вариант 20. Разработать программу, которая инвертирует текстовый файл или его строки.


ЛАБОРАТОРНАЯ РАБОТА №3 «Исследование структур основной памяти – conventional memory»

 

Цель работы

 

Изучить структуру системных таблиц реального режима Windows и организацию цепочек блоков памяти.

 

Организация хранения байтов в памяти

 

При просмотре памяти имейте в виду, что двухбайтовые слова хранятся в виде {младший байт}{старший байт} – т.е. порядке обратном естественному представлению многоразрядного числа.

То же самое относится к порядку расположения слов в двойном слове – сначала младшее слово, потом старшее. Всегда действует общий принцип – младшее лежит в ячейке памяти с младшим адресом. Таким образом, полный 4-х байтный указатель (например, на таблицу таблиц) 1234:5678H будет в дампе памяти выглядеть как:

 

78 56 34 12

\ / \ /

| |___ старшее слово с переставленными байтами

|

|_________ младшее слово с переставленными байтами

 

Информация о структурах памяти

 

Это список указателей, каждый из которых представляет собой двойное слово (4 байта). Старшее слово – это сегментный адрес, младшее – смещение в сегменте. Например, для указателя, у которого сегментный адрес=1234H, а смещение 5678H, абсолютный физический адрес ячейки памяти образуется, как сумма смещения и сегментного адреса * 16 (т.е. сегментный адрес сдвинут влево на 1 шестнадцатиричный разряд):

1234 H 0110 H 0112 H

+ 5678H + 0026H + 0006H

-------- --------- ---------

=179B8H =01126H =01126H

 

Таким образом 0110:0026 – это тоже, что и 0112:0006 !

 

Структура таблицы таблиц

 

Данная структура является НЕДОКУМЕНТИРОВАННОЙ и используется для изучения низкоуровневой информации о структурах памяти.

 

Смещение Длина Содержимое
-2 сегм. адр. 1 MCB
указ. на 1 DPB
+ 4 указ. на список таблиц открытых файлов
+ 8 указ. на первый драйвер DOS (CLOCK$)

 

Структура блока управления памятью (MCB)

 

MCB – Это НЕДОКУМЕНТИРОВАННЫЙ управляющий блок, который используется при распределении, модификации и освобождении блоков системной памяти.

 

Смещение Длина Содержимое
+0 'M'(4dH) – за этим блоком есть еще блоки 'Z'(5aH) – данный блок является последним
+1 Владелец параграф владельца (для FreeMem); 0 = владеет собой
+3 Размер число параграфов в этом блоке распределения
+5 0Bh Зарезервировано
+10h ? Блок памяти начинается здесь и имеет длину (Размер*10H) байт

 

Замечания:

- блоки памяти всегда выровнены на границу параграфа («сегмент блока»);

- блоки M-типа: следующий блок находится по (сегмент блока + Размер):0000;

- блоки Z-типа: (сегмент блока + Размер):0000 = конец памяти (a000H=640K).

 

В любом MCB указан его владелец – сегментный адрес PSP программы владельца данного блока памяти. А в PSP есть ссылка на окружение данной программы, в котором можно найти имя программы – путь ее запуска.

 

Следует помнить, что сама программа (и PSP в том числе) и ее окружение сами располагаются в блоках памяти. Поэтому, в MCB блока памяти самой программы в качестве хозяина указан собственный адрес самого себя.

Когда программа в реальном режиме начинает выполнение, DS:0000 и ES:0000 указывают на начало PSP этой программы. Информация PSP позволяет выделить имена файлов и опции из строки команд, узнать объем доступной памяти, определить окружение и т.д.

Использование окружения. Окружение не превышает 32K байт и начинается на границе параграфа. Смещение 2cH в PSP текущей программы содержит номер параграфа окружения.

Вы можете найти нужное 'имя' серией сравнений строк ASCIIZ (Строка ASCIIZ, используемая во многих функциях DOS и в языке C, представляет собой последовательность символов ASCII, заканчивающуюся байтом 00H), пока не дойдете до пустой строки (нулевой длины), что указывает конец окружения. Обычно 'имя' в каждой строке окружения задано прописными буквами, но это необязательно.

Одна типичная операция с окружением используется программами типа оболочки, которые запускают вторичную копию COMMAND.COM. Такие программы обычно ищут 'имя' «COMSPEC» и используют соответствующее 'значение', как полный путь интерпретатора команд DOS ── программы, запускаемой через функцию DOS 4bH .

Некоторые программы требуют, чтобы оператор поместил информацию для приложения в окружение посредством команды SET. Приложение может использовать такую информацию при каждом выполнении. Например, текстовый процессор может отыскивать в окружении 'имя' «DICTIONARY» и использовать соответствующее 'значение' как имя файла со словарными данными.

Более подробную информацию о структурах памяти можно получить из справочника TECH Help!

 

Задание на выполнение

 

1. Подготовиться к работе, используя материалы лекций, данное пособие, справочник TEACH-HELP.

 

2. Познакомиться с работой одной из программ, позволяющих просмотреть содержимое ОЗУ в виде шестнадцатиричного дампа – например, PEEK.COM (во время работы доступен HELP – F1, карта памяти – F8 и информация о блоке памяти – F6).

 

3. Найти в памяти таблицу таблиц (для получения ее адреса – запусти lol.com), познакомиться с ее содержимым и посмотреть указатель на 1 MCB (упр. блок памяти).

 

4. Проследить в памяти цепочку блоков, определяя их принадлежность и сравнивая с информацией из карты памяти (F8).

 

5. Написать отчет о найденной цепочке блоков памяти с их адресами и размерами (в файле MEMBLOCK.TXT)


ЛАБОРАТОРНАЯ РАБОТА №4 «Изучение файловой системы FAT»

 

Цель работы

 

Знакомство со структурой системной области диска и принципами организации файловой системы FAT.

 

Логическая структура дисков

 

Диски (точнее, дискеты и жесткие диски) – это внешние запоминающие устройства, которому операционная система обеспечивает стандартную поддержку. При этом операционная система задает логическую структуру носителя, которым может быть дискета или раздел жесткого диска.

Эта структура создается командой FORMAT и превращает носитель в последовательность логических секторов, нумеруемых с нуля. Размер каждого сектора – 512 байтов.

Любой диск, отформатированный в FAT, состоит из:

- загрузочного сектора (логический сектор 0);

- нескольких (обычно двух) копий таблицы размещения файлов (FAT);

- корневого каталога;

- области данных, где размещаются подкаталоги и файлы.

 

Загрузочный сектор. Загрузочный сектор – это логический сектор диска с номером 0. Он содержит программу начальной загрузки ОС с данного диска (если диск системный) или сообщение об отсутствии системы на диске, если ее там нет. Начальная область загрузочного сектора содержит, кроме того, блок информации о диске.

 

Смещение Длина Содержимое Комментарий
+0 JMP **** Переход на начало загрузчика
+3 OEM Название фирмы и версия ОС
+0Bh SectSize Количество байтов в секторе
+0Dh ClustSize Количество секторов в кластере
+0Eh ResSecs Количество резервных секторов
+10h FATCnt Количество FAT
+11h RootSize Макс. число элементов корневого каталога
+13h TotSecs Общее число секторов на носителе
+15h Media Описатель носителя
+16h FATSize Количество секторов в одной FAT
+18h TrkSecs Количество секторов на дорожке
+1Ah HeadCnt Количество головок (поверхностей диска)
+1Bh HidnSec Количество скрытых секторов (может быть использовано при разбиении диска на разделы)
1Eh   Размер заголовка

 

Примечания:

 

1. Поле OEM может содержать любые 8 байтов. Оно не используется ОС.

2. Часть загрузочного сектора со смещениями с 0Bh по 15h называется блоком параметров BIOS (BPB). BPB – это таблица параметров диска, которая используется драйверами дисков.

3. Резервные сектора располагаются между загрузочным сектором и первой FAT.

4. Описатель носителя совпадает с первым байтом FAT.

5. Для чтения загрузочного сектора можно использовать Int 25h с DX=0 или функции BIOS, точнее:

- для дискет: читать через Int 13h головку 0, дорожку 0, сектор 1;

- для жестких дисков: читать таблицу разделов для получения головки, дорожки и сектора начала раздела диска.

6. Информация, хранящаяся в загрузочном секторе, позволяет вычислить номер логического сектора по номеру кластера, его содержащего. Следующие формулы описывают единственный документированный метод такого расчета.

а) Вычислить размер корневого каталога в секторах, учитывая, что один элемент каталога состоит из 32 байтов:

 

RootSectors = (RootSize * 32) / SectSize;

 

б) Вычислить количество секторов, отведенных под FAT:

 

FATSectors = (FATSize * FATCnt);

 

в) Вычислить номер первого сектора области данных:

 

DataStart = ResSecs + FATSectors + RootSectors;

 

г) Вычислить логический номер первого сектора в данном кластере:

Sector = DataStart + ((Cluster-2) * ClustSize).

 

Системные файлы. В дополнение команда FORMAT формирует таблицу размещения файлов (FAT) и директорий диска. Обе эти структуры тесно связаны с организацией доступа к файлам. На каждом диске имеется две копии FAT. Эта таблица имеет исключительное значение при обслуживании файлов, поэтому в случае потери первой копии FAT, система получает доступ ко второй.

Если в командной строке FORMAT указан параметр /s, то на форматируемый диск записываются копии системных файлов. В DOS имеется три системных файла — IO.SYS, MSDOS.SYS и COMMAND.COM.

Системные файлы хранятся на диске, с которого загружается операционная система. Файлы записываются в строго определенном порядке и имеют строго определенное месторасположение.

 

Структура директория. Директорий – это таблица-описание содержимого диска. Каждому файлу в таблице соответствует одна запись. Запись занимает 32 байта, разбитых на 8 участков или полей. В каждое поле записывается информация, используемая системой при обслуживании файла. В таблице приводится краткое описание содержимого каждого поля.

 

Название поля Короткий адрес Описание
Имя файла 0-7 Имя файла. Если имя состоит менее, чем из 8 символов, то оно дополняется пробелами. Если в первом байте поля находится одно из следующих значений, это означает: - 00Н — Данная запись не заполнена и ранее не заполнялась данными. Если система обнаруживает такую запись, то она целиком пропускается, что сокращает время поиска требуемого файла. - Е5Н Запись относится к уничтоженному файлу. При уничтожении файл физически остается на диске, а в соответствующей ему записи директория в поле «имя файла» изменяется значение первого байта. Программы восстановления «стертых» файлов основаны именно на этой особенности. - 2ЕН Запись относится к директорию или поддиректорию. Если второй байт этого поля имеет то же значение, то в 26 и 27 байтах данной записи записан номер первого кластера родительского директория. Родительский директорий является корневым, если эти байты равны 00Н. (Строение кластеров рассматриваются ниже).
Расширение 8-10 Расширение имени файла. Если расширение занимает менее трех байтов, то оно дополняется пробелами.
Атрибуты Атрибуты файла. Атрибуты определяются комбинацией битов 11-го байта записи. Система считает, что файлу присвоен данный атрибут, если соответствующий бит равен 1. Если он равен 0, принимается, что данный атрибут не установлен. Бит Атрибут файла (если значение бита равно 1) 0 «Только чтение». Файл можно только читать. При любой попытке записи в файл, генерируется сообщение об ошибке. 1 «Скрытый файл». При введении команды DIR имя файла с этим атрибутом не выводится на экран. 2 «Системный файл». Системные файлы используются при загрузке. 3 «Метка тома». Переменные в поле «имя файла» и «расширение» составляют метку данного диска. Все остальные поля этой записи не просматриваются. Запись должна входить в корневой директорий и быть на диске единственной. 4 «Поддиректорий». Запись относится к поддиректорию. 5 «Архив». Означает, что данный файл был обработан, а не откопирован командой BACKUP. При использовании BACKUP для копирования файла, архивный бит очищается.
Для нужд системы 12-21 Резервируются для системного пользования.
Метка времени 22-23 «Маpкеp времени». Содержит время создания файла или последней его коppектиpовки. Нумерация битов начинается с первого бита 22-го байта. Байт 22 включает биты 0-7, байт 23 — биты 8-15. В битах 11-15 записывается значение часа (0-23), в битах 5-10 — значение минут (0-59), в битах 0-4 — значение секунд (0-59). Числа хранятся в двоичном представлении.
Метка даты 24-25 «Маpкеp даты». Содержит дату создания файла или последней его коppектиpовки. Нумерация битов начинается с первого бита 24-го байта. Байт 24 включает биты 0-7, байт 25 — 8-15. Биты 9-15 используются для хранения значения года (1980=0), биты 5-8 — для хранения значения месяца (1-12), биты 0-4 — значения дня месяца (1-31). Числа хранятся в двоичном представлении.
Начальный кластер 26-27 «Начальный кластер». По значению этого поля определяется начальный адрес файла на диске.
Размер файла 28-31 «Размер файла». В первом слове (байты 28 и 29) хранится последняя часть значения, во втором (байты 30 и 31) — первая. В обоих случаях крайний значащий байт — первый.

 

Таблица размещения файлов. Директорий — это таблица-описание содержимого диска. Таблица размещения файлов представляет собой карту с адресами файлов на диске. Каждому файлу в таблице соответствует группа записей, описывающих его физическое расположение на диске. Операционная система разбивает файл на кластеры. Размер кластера на жестком диске зависит от количества логических дисков, на которые он был разбит при форматировании.

Кластерам присваиваются номера в соответствии с их физическим расположением на диске. Первый кластер расположен непосредственно за директорием, второй — непосредственно за первым кластером и т.д.

На односторонних дискетах номера кластеров возрастают в порядке возрастания номеров сегментов. Кластеры последовательно заполняют сектора на дорожке диска. За кластером, занимающим последний сегмент на дорожке, следует кластер, занимающий первый сегмент следующей дорожки. При этом номер кластера увеличивается на 1. На двухсторонней дискете нумерация производится следующим образом. На 0-ой стороне номера кластера возрастает в порядке возрастания номеров сектора. Затем кластеры начинают заполнять дорожку с тем же номером на стороне 1, и опять нумерация кластеров возрастает с ростом номеров сегментов. Заполнив дорожку на стороне 1, кластеры продолжают заполнять следующую дорожку с первого сегмента на стороне 0. Нумерация кластеров возрастает непрерывно.

При вычислении номера кластера по таблице размещения файлов первым шагом системы является получение номера первого кластера файла. Этот номер находится в 26-27 байтах соответствующей записи директория. Затем вычисляется номер второго кластера. Для этого значение первого номера умножается на 1,5 и целая часть полученного произведения рассматривается как адрес слова в таблице размещения файлов. Это слово представляет собой необработанный номер кластера (рассчитываемый номер в неявном виде).

Затем полученное слово обрабатывается следующим образом. Если номер первого кластера четный, то номер следующего кластера — это число из трех младших шестнадцатиричных цифр слова. Если он был нечетным, то номер следующего кластера состоит из трех старших цифр слова.

Чтобы найти номер следующего кластера, номер второго кластера опять умножается на 1,5. Затем по адресу, равному целой части произведения, из таблицы выбирается слово и обрабатывается аналогичным образом: если номер второго кластера четный, отбрасывается старшая цифра, если нечетный – младшая. Полученное шестнадцатиричное число из трех цифр принимается за номер следующего кластера.

Этот процесс повторяется до тех пор, пока полученное в результате число не попадет в интервал значений FF8-FFF. Номера с этими значениями обозначают последний кластер файла.

Процедура вычисления номера кластера на дисках с большой памятью аналогична рассмотренной выше процедуре. На большом диске помещается более 4 096 кластеров, поэтому запись таблицы размещения не может состоять из 1,5 байтов. Под нее отводится 2 байта. Номер первого кластера считывается из директория и затем увеличивается вдвое. Произведение рассматривается как адрес следующего кластера внутри таблицы. То есть слово (2 байта) с полученным результатом представляет собой номер следующего кластера. Первым в таблице записан младший байт, вторым — старший.

В следующее таблице приведен список номеров кластера, интерпретирующихся операционной системой особым образом.

 

Значение Интерпретация
(0)000 Свободный кластер
(F)FF0-(F)FF6 Кластер, используемый для системного пользования
(F)FF7 Запорченный кластер
(F)FF8-(F)FFF Последний кластер файла
(X)XXX Кластер входит в цепочку

 

Задание на выполнение

 







Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.239.167.74 (0.018 с.)