Экспериментальный анализ: https://www.zhihu.com/column/c_142990858
Linux - операционная система с открытым исходным кодом. Пользователи могут адаптировать и изменить ядро в соответствии с их собственной системой, необходимыми для настройки систем с более подходящими функциями и более высокой эффективностью работы. Следовательно, компиляция ядра Linux является необходимым основным навыком для развития ядра.
Добавление новых системных вызовов по мере необходимости в системе является общим методом для изменения ядра. Благодаря этому эксперименту читатели должны понимать процесс вызовов системы обработки системы Linux и метода добавления системных вызовов.
(1) Добавьте системный вызов для реализации функции модификации или чтения хорошего значения указанного процесса, и верните последнее значение Nice Value и Priory PRIO процесса. Рекомендуется назвать прототип как:
int mysetnice (pid_t pid, int flag, int gickvalue, void __user * prio, void __user * neable);
Параметр Значение: PID: идентификатор процесса.
Флаг: если значение равно 0, это означает чтение хорошего значения; Если значение равно 1, это означает изменение хорошего значения.
Прио, приятно: текущий приоритет и хорошая ценность процесса. Возвращаемое значение: вернуть 0, когда системный вызов успешно, и верните код ошибки EFAULT, когда системный вызов сбой.
(2) Напишите простой тест приложения, добавленный в (1).
(3) Если в программе вызвана функция ядра Linux, необходимо подробно прочитать исходный код соответствующей функции.
Механизм модуля, предоставленный Linux, может динамически расширять функции Linux без перекомпиляции ядра, и широко используется при реализации многих функций ядра Linux. В этом эксперименте мы узнаем основные концепции, принципы и методы реализации модулей, а затем используем модуль ядра для программы и доступа к основной информации процесса, тем самым углубляя наше понимание концепций процесса и методов программирования модуля мастеринга.
(1) Разработайте модуль, который требует перечисления имен программ, номеров PID, состояния процесса и приоритетов процесса всех потоков ядра в системе.
(2) Разработайте модуль с параметрами, параметры которых являются номером PID процесса. Функция этого модуля состоит в том, чтобы перечислить семейную информацию о процессе, включая название программы и номер PID родительского процесса, процесс брата и детского процесса.
(3) Пожалуйста, прочитайте реализацию исходного кода соответствующих функций ядра, используемых в программе на основе вашей собственной ситуации.
(1) Познакомьтесь с командным интерфейсом Linux.
(2) Благодаря применению программирования соответствующих системных вызовов для управления процессом Linux мы дополнительно углубим наше понимание концепций процесса, прояснили соединение и различия между процессами и программами и понимаем конкретное значение одновременного выполнения процессов.
(3) Благодаря использованию механизма связи с трубопроводом Linux, механизмом связи очереди сообщений и механизмом общего коммуникации памяти, углубляют понимание различных типов методов коммуникации процесса.
(4) Углушить понимание механизма синхронизации семафора посредством применения семафоров POSIX в Linux. (5) Пожалуйста, прочтите и проанализируйте реализацию исходного кода ядра соответствующих системных вызовов на основе вашей собственной ситуации.
(1) Знакомый с обычными командами Linux: Pwd, UserAdd, Passwd, WHO, PS, PSTERE, Kill, Top, LS, CD, MKDIR, RMDIR, CP, RM, MV, CAT, еще, GREP и т. Д.
(2) Реализуйте моделируемую оболочку:
Напишите три различных программы Cmd1.c, CMD2.c и CMD3.c. Функции каждой программы настроены и скомпилированы в исполняемые файлы cmd1, cmd2 и cmd3 соответственно. Затем напишите программу для моделирования функции программы Shell. Он может создать дочерний процесс для соответствующей команды на основе строки, введенной пользователем (представляющий соответствующее имя команды) и позволить ей выполнить соответствующую программу. Родительский процесс ждет завершения дочернего процесса, а затем ожидает получения следующей команды. Если полученная команда выходит, родительский процесс заканчивается; Если полученная команда является недопустимой командой, отображается команда, не найденная », и вы продолжаете ждать.
(3) Внедрить программу коммуникации трубопровода:
Родительский процесс создается трубопровод, а затем создаются 3 дочерних процесса, и эти три дочерних процесса используют конвейер для связи с родительским процессом: дочерний процесс отправляет информацию, а родительский процесс и другие три ребенка получают информацию после всех отправок сообщений. Конкретное содержание связи может быть разработано по желанию в соответствии с вашими собственными потребностями, и необходимо проверить различные ситуации в процессе блокировки и записи, проверить размер по умолчанию трубопровода и использовать механизм семафора POSIX для достижения взаимоисключающего доступа к конвейеру между процессами. Запустите программу, чтобы наблюдать фактическое количество байтов, читаемых и записи процессом, и процесс блокировки и пробуждения при различных обстоятельствах.
(4) Используйте механизм связи очереди сообщений Linux, чтобы реализовать связь между двумя потоками:
Напишите программу для создания двух потоков: поток отправителя и поток приема, где поток отправителя запускает Function Sender (), который создает очередь сообщений, а затем петли, чтобы ждать, пока пользователь введите строку символов через терминал, отправляя строку символов в поток приемника через доход от сообщения, пока пользователь не войдет в «Выход»; Наконец, он отправляет сообщение «конец» в потоку приемника и ждет ответа приемника. После ответного сообщения он отображает полученную информацию на экране терминала, удаляет соответствующую очередь сообщений и заканчивает работу программы. Поток приемника запускает rete (), который получает сообщения от отправителя через очередь сообщения и отображает сообщение на экране терминала, пока не получит сообщение с «End». В настоящее время он отправляет сообщение ответа «над» отправителю, заканчивая запуск программы. Используйте безымянные семафоры для достижения синхронизации и взаимного исключения между двумя потоками.
(5) Используйте механизм связи общей памяти Linux, чтобы реализовать связь между двумя процессами:
Напишите отправителя программы, которая создает общую память, а затем ждет, пока пользователь введет строку символов через терминал и отправляет строку символов в приемник через общую память; Наконец, это ждет ответа приемника. После получения ответного сообщения он отображает полученную информацию ответа на экране терминала, удаляет общую память и заканчивает работу программы. Напишите программу приемника, которая получает сообщения от отправителя через общую память, отображает сообщение на экране терминала, а затем отправляет сообщение ответа «над» отправителю через общую память, заканчивая запуск программы. Используйте названный семафор или System V Semaphore для достижения взаимоисключающего и синхронного использования общей памяти с помощью двух процессов.
Благодаря управлению конкретным пространством хранения файлов, физической структуре файлов, структуре каталогов и операциях файлов, мы углубим наше понимание внутренней структуры данных, функций и процесса реализации файловой системы.
(1) Откройте виртуальное пространство дисков в памяти в качестве разделения хранилища файлов и реализуйте простую файловую систему в одной пользовательской системе задач на основе многоуровневых каталогов. При выходе из файловой системы виртуальная файловая система должна быть сохранена на диск в качестве файла, чтобы в следующий раз ее можно было восстановить в виртуальном диске в памяти.
(2) Распределение места хранилища файлов может быть выполнено с помощью явного распределения ссылок или других методов.
(3) Вы можете выбрать битовые диаграммы или другие методы для управления бесплатным дисковым пространством. Если растровая карта используется для управления пространством хранения файлов и использования явного распределения ссылок, то растровый карта можно объединить в жир.
(4) Структура файлового каталога принимает многоуровневую структуру каталогов. Для простоты можно использовать индексные узлы, каждый элемент каталога должен содержать такую информацию, как имя файла, физический адрес, длину и т. Д., А файлы чтения и записи также могут быть защищены с помощью элементов каталогов.
(5) Требуются следующие команды операции: