Главная страница

Лекция 1 - Среда исполнения. Среда исполнения введение


Скачать 155.5 Kb.
НазваниеСреда исполнения введение
Дата24.03.2022
Размер155.5 Kb.
Формат файлаdoc
Имя файлаЛекция 1 - Среда исполнения.doc
ТипПрограмма
#412377
страница3 из 7
1   2   3   4   5   6   7

Программа, показывающая расположение сегментов текста, данных и стека




Эта программа показывает расположение переменных различных классов хранения в виртуальном адресном пространстве программы.

2 Описание макроподстановки для печати адресов переменных.

3 Объявление внешних переменных etext, edata и end

4 Инициализация внешней статической переменной. Это класс хранения используется для закрытия доступа к переменным извне данного файла.

5 Инициализированные и неинициализированные внешние переменные.

10 Инициализированные и неинициализированные статические переменные.

11 Инициализированные и неинициализированные локальные переменные.

13 Печать виртуальных адресов пользователя внутри текстового сегмента.

16 Печать адресов инициализированных статических и внешних переменных.

19 Печать адресов неинициализированных статических и внешних переменных.

22-25 Печать адресов локальных переменных, включая аргументы командной строки

29 Вызов sub1(), она также печатает адреса переменных.

Файл: tds_loc.c

ВЫЗОВ: $tds_loc 1 main at 800000f4 and sub1 at 80000246 2 end of text segment at 8000305c 3 s at 80005064 4 b at 80005068 5 d at 8000506c 6 end of initialized data at 800058d0 7 a at 80005b2c 8 c at 800058d0 9 end of uninitialized data at 8000634c 10 m at c00200d4 11 n at c00200d5 12 argc at c00200a4 13 argv at c00200a8 14 argv[0] at c002007c 15 t at 800058d4 16 p at c00200d8 17 v at c0020100 ПРОГРАММА, ПОКАЗЫВАЮЩАЯ РАСПОЛОЖЕНИЕ СЕГМЕНТОВ ТЕКСТА, ДАННЫХ И СТЕКА 1 #include 2 #define PRADDR(A) printf(#A " at %p\n", &A) 3 extern etext, edata, end; 4 static char s = 'S'; 5 int a, b = 1; 6 7 main(int argc, char *argv[]) 8 { 9 void sub1(int); 10 static int c, d = 1; 11 char m, n = 'n'; 12 13 printf("main at %p and sub1 at %p\n", main, sub1); 14 printf("end of text segment at %p\n", &etext); 15 16 PRADDR(s); PRADDR(b); PRADDR(d); 17 printf("end of initialized data at %p\n", &edata); 18 19 PRADDR(a); PRADDR(c); 20 printf("end of uninitialized data at %p\n", &end); 21 22 PRADDR(m); PRADDR(n); 23 PRADDR(argc); PRADDR(argv); 24 for (b = 0; b

Взаимодействие процессов


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

Первый «нормальный» процесс, который имеет пользовательский код, порождается sched и имеет pid=1. По умолчанию, этот процесс исполняет програму /sbin/init. При загрузке ядра можно указать, что запускать в качестве init. Это может быть полезно при восстановлении системы после аварии, но при нормальной работе не используется.

Init — это процесс, порождающий все другие пользовательские процессы. Он читает командный файл /etc/inittab (см. inittab(4)) и запускает все остальные задачи в системе, используя fork(2) и exec(2). inittab определяет, какие процессы должны быть порождены на конкретном уровне запуска системы (runlevel). В обычном inittab Unix System V содержится запуск скриптов из каталогов /etc/rc?.d, где символ ? меняется в зависимости от уровня запуска. Уровень запуска 2 обычно соответствует многопользовательскому уровню, когда пользователям разрешено входить в систему. Скрипты в каталоге /etc/rc2.d определяют, какие файловые системы должны монтироваться и какие процессы-демоны (daemon) должны быть запущены. В частности, в многопользовательском режиме init запускает ttymon для консоли и контроллер сервисов sac.

/usr/lib/saf/sac - контроллер сервисов в Unix SVR4. Он стартует, когда машина переводится в многопользовательский режим. Главная функция sac — чтение командного файла /etc/saf/_sactab и запуск определенных в нем программ, например менеджера графических дисплеев gdm(1M) и сервера удаленного входа в систему sshd(1M). Далее sac опрашивает эти программы и отслеживает их статус. Sac позволяет управлять сервисными процессами при помощи команд svcs(1M) и sacadm(1M), подобно тому, как это делается в OS/2 и Windows командами net start и net stop. В других Unix-системах, сервисные процессы запускаются напрямую скриптами из /etc/rc?.d или даже из /etc/inittab.

. /usr/lib/saf/ttymon обслуживает терминалы. Он устанавливает переменную среды TERM (тип терминала) и определяет активность терминального порта и выдает приглашение входа в систему. После ответа на приглашение входа в систему, ttymon запускает программу /bin/login.

. login проверяет регистрационное имя пользователя и его пароль. При успешной проверке, login запускает поверх себя командный интерпретатор shell, определенный в файле passwd или в другой БД учетных записей. login производит установку следующих переменных среды исполнения:

HOME=шестое поле в файле паролей

LOGNAME=регистрационное имя пользователя

MAIL=/var/mail/[регистрационное имя пользователя]

PATH=/usr/bin

SHELL=седьмое поле файла паролей (установка происходит, только если 7-ое поле не равно нулю)

. После того как login запускает поверх себя shell, то shell сначала читает команды из файла /etc/profile, а затем из файла $HOME/.profile, если этот файл существует. Затем shell выдает приглашение для ввода команды. После этого shell интерпретирует команды пользователя и выполняет их как порожденные процессы.
1   2   3   4   5   6   7


написать администратору сайта