Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Системный вызов Описание. Создать новый каталог Удалить каталог



Создать новый каталог Удалить каталог

Создать связь с существующим файлом

Удалить связь

Изменить рабочий каталог

Открыть каталог для чтения

Закрыть каталог

Прочитать одну запись каталога

S=mkdir(path, mode) s=rmdir(path) s=link(oldpath, newpath)

S=unlink(path) s=chdir(path)

Dir=opendir(path) s=closedir(dir) dirent=readdir(dir) rewinddir(dir)

Установить указатель в каталоге на первую запись

Рабочий каталог можно изменить при помощи системного вызова chdir. После выполнения этого системного вызова будут по-другому интерпретироваться от­носительные имена путей.

Последние четыре системных вызова в табл. 10.12 предназначены для чтения каталогов. Каталоги могут открываться, закрываться и читаться аналогично обыч­ным файлам. Каждое обращение к системному вызову readdir возвращает ровно одну запись каталога фиксированного формата. Пользователям запрещено писать в каталоги (это делается, чтобы пользователи случайно не нарушили целостности системы). Файлы могут добавляться к каталогу при помощи системных вызовов creat и link, а удаляться с помощью системного вызова unlink. В операционной системе UNIX нет способа обращаться к файлу по расположению его описателя в каталоге, но есть системный вызов rewinddir, позволяющий начать читать откры­тый каталог с начала.

Билет 15.

1)Организация Регионов памяти для процессов.

Подсистема виртуальной памяти управляет распределением оперативной памяти между задачами (процессами). Каждая задача считает, что ей выделен непрерывный участок памяти максимального размера, поддерживаемого на соответствующей архитектуре (для архитектуры x86 это 4GB). Из них первый гигабайт резервируется для себя ядром, второй отдается под код программы и разделяемые библиотеки (оба этих фрагмента ядром защищаются), а два последних гигабайта отдаются собственно программе под ее данные – но это только то, как видит это все программа.

На самом же деле программа занимает только тот объем памяти, с которым она реально работает. Большинство памяти существует только “на бумаге”, т.е. будет предоставлена программе в тот момент, когда она обратится в эту область. Ядро распределяет память страницами фиксированного размера. Процедура, когда страница оперативной памяти объявляется частью адресного пространства процесса, называется отображением этой страницы в адресное пространство процесса.

Соответственно, ядро отображает реально используемые страницы в виртуальное адресное пространство процесса. Когда процесс обращается к некоторой странице своего адресного пространства, ядро проверяет, имеет ли он право на доступ к этой странице, и если проверка пройдена и доступ получен, то ядро переадресовывает обращение на реальный адрес этой страницы. Если это первое обращение к странице, ядро попытается найти свободную страницу и в случае успеха отобразит ее в адресное пространство соответствующего процесса. Размер страницы фиксирован архитектурой процессора, и для x86 ее размер составляет 4096 байт.

Если случается ситуация, когда свободных страниц больше нет, но существует файл подкачки, ядро может убрать одну из наиболее долго не использовавшихся страниц в файл подкачки, и освободившуюся физическую страницу отдать запросившему память процессу. Если же нет ни незанятого пространства в файле подкачки, ни свободных страниц RAM, то развитие событий может быть следующим: либо запросивший память процесс прерван и “убит” системой, либо какой-то другой из процессов (это определяется специфическими алгоритмами) будет “убит” ядром, и освободившаяся память будет передана запросившему память процессу.

На самом деле большинством действий занимается одна из подсистем процессора, называемая MMU – Memory Management Unit, и в действительности ядро просто полагается на его работу и вмешивается в нее только для проведения операций пейджинга (подгрузки/выгрузки страниц в SWAP-файл), или когда возникает ошибка доступа к странице.

Ограничение адресного пространства в 4GB не означает, что система не сможет адресовать более этого объема памяти. На платформе x86 ядро Linux может использовать до 64GB, а ограничение в 4GB накладывается лишь на размер адресного пространства процесса.

2)Алгоритмы перехода процесса в режим ожидания и пробуждения процесса.

Билет 16.

1)системные вызовы для процессоров.

Системные вызовы syscall() в Linux на процессоре x86 выполняются через прерывание int 0x80. Соглашение о системных вызовах в Linux отличается от общепринятого в Unix и соответствует соглашению «fastcall». Согласно ему, программа помещает в регистр eax номер системного вызова, входные аргументы размещаются в других регистрах процессора (таким образом, системному вызову может быть передано до 6 аргументов последовательно через регистры ebx, ecx, edx, esi, edi и ebp), после чего вызывается инструкция int 0x80. Если системному вызову необходимо передать большее количество аргументов, то они размещаются в структуре, адрес на которую передается в качестве первого аргумента (ebx). Результат возвращается в регистре eax, а стек вообще не используется. Системный вызов syscall(), попав в ядро, всегда попадает в таблицу sys_call_table, и далее переадресовывается по индексу (смещению) в этой таблице на величину 1-го параметра вызова syscall() - номера требуемого системного вызова.

В любой другой поддерживаемой Linux/GCC аппаратной платформе (из многих) результат будет аналогичный: системные вызов syscall() будет «доведен» до команды программного прерывания (вызова ядра), применяемой на данной платформе, команд: EMT, TRAP или нечто подобное.

Перейдем к конкретной реализации данных подсистем в архитектуре MIPS.

В архитектуре MIPS версии 2 существует несколько режимов работы для прерываний. Они отличаются базовыми адресами и структурами самих таблиц прерываний.
Для базового адреса есть два режима:

1. В первом процессор, столкнувшись с любым типом исключений, передает управление на адрес фиксированный адрес (0x80000180), размер обработчика составляет 128 байт.

2. Во втором процессор передает управление на адрес, указанный в регистре CP0_EBASE, размер обработчика — 256 байт.


Для структуры таблицы прерываний также есть два режима работы: обычный, когда в ответ на все исключительные ситуации вызывается один обработчик, и векторный, при котором каждому номеру прерывания отводиться свое пространство для обработчика.

Задаются эти режимы в специальных регистрах процессора MIPS. Специальные регистры, в отличие от регистров общего назначения, используются программой для управления самим процессором.

В MIPS такие регистры вынесены в сопроцесор 0. И обращение к ним ведется специальными ассемблерными командами: mfc0 — для чтения регистров, и mtc0 — для записи в регистр.
Регистры адресуются индексом и селектором сопроцессора. Вот несколько важных для обработки системных вызовов регистров:

Название Индекс Селектор Описание
CP0_STATUS     управляющие флаги для процессора
CP0_CAUSE     информация о причине возникновения прерывания
CP0_EPC     адрес команды, которая исполнялась в момент прерывания
CP0_EBASE     базовый адрес процедуры обработки исключения


Возвращаясь к заданию режимов обработки исключений, они задаются в двух регистрах: CP0_STATUS и СP0_CAUSE, имеющих следующий формат.





Дата публикования: 2015-01-24; Прочитано: 208 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...