Лекция 1 - Среда исполнения. Среда исполнения введение
Скачать 155.5 Kb.
|
Программа, показывающая расположение сегментов текста, данных и стекаЭта программа показывает расположение переменных различных классов хранения в виртуальном адресном пространстве программы. 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 Взаимодействие процессовКаждый процесс имеет родительский процесс. Процесс 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 интерпретирует команды пользователя и выполняет их как порожденные процессы. |