
- •1. Микропроцессор: понятие и функции.
- •2. Микропроцессор: функции и основные характеристики.
- •1) Выборка команд из озу
- •3. Архитектуры risc и cisc. Отличия, преимущества и недостатки.
- •Недостатки cisc архитектуры
- •4. Гарвардская архитектура.
- •Классическая гарвардская архитектура
- •Отличие от архитектуры фон Неймана
- •5. Архитектура фон Неймана.
- •6. Конвейерная архитектура.
- •7. Спекулятивное выполнение.
- •8. Шинная архитектура. Виды шин используемые в современных системах.
- •9. Понятия микроархитектуры микропроцессора.
- •10. Система команд: основные типы, их преимущества и недостатки.
- •11. Шины данных, адреса и «разрядность эвм». Шина данных.
- •12. Функционирование процессора в реальном и защищенном режимах.
- •13. Bios. Функции и недостатки современных реализаций.
- •Характерные недостатки bios
- •14. Post. Функции и принципы функционирования.
- •15. Uefi. Функции и преимущества по сравнению с bios.
- •Основные преимущество uefi перед bios:
- •16. Прерывания bios.
- •17. Процедура начальной загрузки ос.
- •18. Mbr и его функции.
- •19. Интерфейс acpi.
- •20. Конструкция hdd.
- •Логическая организация дискового пространства
- •Первичный (основной) раздел
- •Расширенный (дополнительный) раздел
- •Пример разбиения жёсткого диска на разделы
- •Структура записи в кэше
- •Характеристики модулей
- •Принципы работы
- •Сегментная адресация в реальном режиме
- •Сегментная адресация в защищённом режиме (селекторная адресация)
- •61) Ос: низкоуровневые функции, драйверы
- •62) Ос: Linux — структура ядра.
- •63) Ос: многозадачность. Реализации.
- •Совместная или кооперативная многозадачность
- •Вытесняющая или приоритетная многозадачность (режим реального времени)
- •64) Ос: многопоточность. Реализации.
- •65) Модули ядра Linux: назначение.
- •66) Модули ядра Linux: загрузка и выгрузка.
- •67) Linux: системные вызовы.
- •68) Linux: методы выполнения системных вызовов.
- •69) Linux: управление памятью.
- •71.Библиотеки: типы и их характеристики.
- •Динамические библиотеки
- •Статические библиотеки
- •72.Разделяемые библиотеки.
- •73.Статические библиотеки.
- •74.Этапы компиляции.
- •75. Компоновка (линковка).
- •76. Загрузка программ на выполнение.
- •77. Компиляоры. Принципы работы.
- •78. Современные компиляторы: общие характеристики.
- •79. Jit. Понятие и функционирование.
- •80. Виртуальные машины (Java etc)
67) Linux: системные вызовы.
Рассмотрим такую полезную вещь, как системные вызовы в ОС Linux. Фактически это интерфейс, который предоставляет ОС (ядро) для осуществления различных высокоуровневых действий: программа делает вызов, например "создать папку" или "перезагрузить компьютер", а ядро заботится о том, как конкретно это сделать (или НЕ сделать, если у программы недостаточно прав).
Всего вызовов насчитывается около 280. Все они имеют номера, которые перечислены в файле unistd.h (его местоположение отличается на разных системах, скорее всего это /usr/include/asm-[x86|x86_64|...]/unistd.h). Кроме того, в динамической библиотеке libc.so.6 имеются обвертки для всех этих вызовов.
В стандарт CL не входит какого-либо способа сделать системный вызов, или вызвать функцию из бинарной библиотеки. Однако, до библиотечных функций в .so можно добраться с помощью FFI. Так что мы могли бы обращатся к libc.so за каждым отдельным вызовом - а их около 300 штук. Вместо этого мы поступим иначе - воспользуемся функцией syscall из libc.so - она делает системный вызов, который делает системные вызовы :) Например - создать папку можно с помощью функции mkdir: mkdir("new path", 0777);
А можно так: syscall(83, "new path", 0777); // где 83 - это номер системного вызова, который создает папку.
У второго варианта есть преимущество - с помощью него можно сделать вызов, только появившийся в ядре, но не описанный в отдельную функцию. Характер возвращаемого значения разный для разных системных вызовов - для одних это просто флаг вышло/не вышло (ноль/не ноль), а для других какое-то значение, имеющее смысл - например дескриптор файла или устройства.
Среди системных вызовов есть как простые, так и достаточно интересные и функциональные. Например fork, для создания точной копии текущего процесса, или exec для запуска программы на исполнение, есть даже system для обрашения к shell-у.
Таким образом, три кита на которых основывается Linux, то есть системные вызовы, библиотечные функции и обособленные программы, каждая из которых выполняет свою роль - всё это доступно в Common Lisp, причём без особого труда.
68) Linux: методы выполнения системных вызовов.
- Каждый вызов определяется в libc. Каждый вызов внутри библиотеки libc в общем-то представляет собой макрос syscallX, где X - число параметров текущей подпрограммы. Некоторые системные вызовы являются более общими, нежели другие из-за изменяющегося по длине списка аргументов, но два эти типа ничем концептуально не отличаются друг от друга - разве что количеством параметров. Примерами общих системных вызовов могут служить вызовы open() и ioctl().
- Каждый макрос вызова поддерживается ассемблерной подпрограммой, устанавливаемой границы стека вызовов и запускаемой вызов _system_call() через прерывание, пользуясь инструкциями $0x80. К примеру вызов setuid представлен как:
- С этой точки зрения системный код вызова не запущен. Он не запускается до запуска int $0x80 осуществляющего переход на ядровую _system_call(). Эта процедура общая для всех системных вызовов. Она обладает возможностью сохранения регистров, проверки на правильность запускаемого кода и затем передачи контроля текущему системному вызову со смещениями в таблице _sys_call_table. Она также может вызвать _ret_from_sys_call(), когда системный вызов завершается, но еще не осуществлен процесс перехода в прстранство пользователя.
- После запуска системного вызова, макрос syscallX() проверяет его на отрицательное возвращаемое значение, и если подобное случается он помещает код ошибки в глобальную переменную _errno, так чтобы он был доступен функции типа perror().