- Русские Блоги
- [Передача] Android анализ процесса инициализации Ueventd
- Процесс запуска ueventd
- Функция ueventd_main и связанные функции
- Обработка и разбор ueventd.rc
- Функция инициализации — device_init
- обработка сообщений
- Русские Блоги
- Маленькие знания Android — процесс запуска системы в глубине глубокой поддержки Android (ON)
- Функция ввода процесса init
- Анализ init.rc.
- Начать зиготе
Русские Блоги
[Передача] Android анализ процесса инициализации Ueventd
ueventd в основном отвечает за ряд задач, таких как создание узлов устройств и установка разрешений. Сервис использует uevent для мониторинга сообщений, отправляемых драйвером для дальнейшей обработки.
ueventd на самом деле является тем же двоичным файлом, что и init, но просто занял другую ветвь.
Процесс запуска ueventd
system / core / init / Android.mk видит, что ueventd — это просто ссылка на init
Затем вызовите ueventd_main в system / core / init / init.c в соответствии с именем запуска
Общий код ueventd относительно прост, в основном из трех частей:
- Разбор ueventd.rc
- Инициализация информации об устройстве
- Петля опроса случайное сообщение
Функция ueventd_main и связанные функции
Обработка и разбор ueventd.rc
Эта часть очень проста по сравнению с init.rc, ничего особенного. Главным образом через файл rc для управления разрешениями узла каталога. Такие как:
Детали не должны быть расширены, вы можете в основном понять.
Инициализация устройства
При загрузке устройства ядро отправляет события uevent в пространство пользователя через сокет. В init, получив эти события uevent, создается узел устройства. Основная функция — device_init ()
Функция инициализации — device_init
uevent_open_socket();
Это сокет для открытия события. Событие здесь состоит в том, чтобы использовать событие ядра в netlink для уведомления функции пользовательского режима (NETLINK_KOBJECT_UEVENT), которая является очень хорошим способом для ядра и пользовательского режима для выполнения двунаправленной передачи данных.В дополнение к eventd, netd и vold также используют uevent.
В функции инициализации обратите внимание на функцию «холодной загрузки», которая буквально означает «холодный запуск», функция которой заключается в повторном использовании драйверов, добавленных до запуска uventd. Позвольте им снова отправить сообщение о событии, и номер верхнего уровня обрабатывается целевым образом.
Здесь он перебирает устройства в / sys / class, / sys / block и / sys / devices:
write (fd, «add \ n», 4) активирует ядро, повторно отправляет событие события add handle_device_fd (), отвечает на сообщение о событии и обрабатывает его.
обработка сообщений
После того, как инициализация завершена, программе-демону нужно только опросить новое событие события.По прибытии опроса она вызывает handle_device_fd (); чтобы обработать ее, вы можете посмотреть на эту функцию:
Функция состоит в том, чтобы получить сообщение о событии, отправленное ядром, и затем проанализировать это сообщение, чтобы обработать соответствующее событие сообщения.
Основная функция handle_device_event заключается в создании / удалении узлов устройства на основе отправленного события и обновлении некоторых разрешений узла настройками разрешений, описанными в ueventd.rc.
Если у вас есть сопроцессор, вам необходимо загрузить прошивку сопроцессора. Ниже приведена инструкция по загрузке прошивки сопроцессора. Разрабатывайте дочерний процесс
Источник
Русские Блоги
Маленькие знания Android — процесс запуска системы в глубине глубокой поддержки Android (ON)
Процесс запуска процесса init
Обзор процесса init.
Система Android основана на Linux, процесс INIT — первый процесс пользовательского пространства в системе Android, номер процесса 1, код исходного кода INIT находится в каталоге System / Core / init. Поскольку процесс init — первый процесс пользовательского пространства системы Android, он в основном отвечает за следующие две вещи:
Анализируйте конфигурацию init.rc, затем запустить различные собственные процессы системы, такие как Zygote Processing, ProuscingFlesser процессы и медиа-процессы.
Инициализируйте и начать атрибуты службы.
Функция ввода процесса init
Функция ввода INIT является основной, код следующим образом:
Примечание 1 Судействуя текущий процесс — UEVENTD. Процесс init создает подраздел UEVENTD и довериет работу созданного файла узла устройства в UEVENTD. UEVENTD в основном отвечает за создание узлов оборудования, а также настроек власти. Служба дополнительно обрабатывается с помощью UVENT для мониторинга отправленного сообщения.
UEVENTD создает файл узла устройства двумя способами.
«Холодная пробка» основана на предварительно определенном устройстве информации, а затем создает файлы узлов устройства при запуске UEVENTD. Этот тип файла узла устройств также известен как файлы статического узла.
«Горячая пробка», то есть в запуске системы, когда устройство вставлено в порт USB, UEVENTD получит это событие для динамически создания файлов узлов устройств для вставленного устройства. Этот тип узла узла оборудования также известен как файлы динамических узлов.
Примечание 2 Судействуя текущий процесс — WatchDogd. Система Android сталкивается с различным оборудованием и программным обеспечением под длительным прогоном. Чтобы решить эту проблему, Android разработал класс Watchdog в качестве программного обеспечения для наблюдения за темами в Systemserver. После того, как проблема, Watchdog убьет процесс системного двигателя. После родительского процесса Systemserver Zygote получает смерть сигнала системы Systemserver, он убьет себя. После того, как зиготе процесс умирает, процесс INIT убьет все дочерние процессы в процессе Zygote и перезапустить Zygote.
Примечание 3 Определите, следует ли перезагрузить, если он перезагружается, если оно срочно, установите соответствующий процессор сообщений.
Примечание 1 Добавить переменные среды. Примечание 2 Получение этого запуска — это первая фаза запуска системы, если это первая фаза, введите следующее, если оператор, создайте и смонтируйте соответствующую файловую систему.
Пять типов файловых систем, созданных и установленных выше, показаны ниже:
TMPFS: виртуальная файловая система памяти, которая хранит все файлы в виртуальной памяти, если вы удалите файловую систему TMPFS, то все содержимое ниже не будет существовать. TMPFS может использовать RAM или использовать раздел Exchange, который изменит размер на основе ваших действительных потребностей. Скорость TMPFS очень удивительна, ведь она находится в оперативной памяти, то есть производительность все еще очень отлично. Поскольку TMPF проживает в оперативной памяти, его содержание не будет продолжаться. После выключения питания содержание TMPF исчезло, что также является корневой причиной TMPFS.
Devpts: предоставляет стандартный интерфейс для Pseudo Terminal, а его стандартный крючок является / dev / pts. Пока открывается первичное составное устройство / dev / ptmx of pty, в / dev / pts создается новый файл устройства pty.
PREC: очень важная виртуальная файловая система, которую можно рассматривать как интерфейс внутренней структуры данных ядра, через которые мы можем получить системную информацию, а также модифицировать определенные параметры ядра во время выполнения.
SYSFS: аналогично файловой системе ProC, это также виртуальная файловая система, которая не учитывает какое-либо дисковое пространство. Обычно он скрыт в каталоге / SYS. Файловая система SYSFS представлена ядром Linux2.6, которое пересекает устройство и организацию шины, подключенную к системе в иерархический файл, так что они могут получить доступ в пространстве пользователя.
SELinuxFS: Используется для поддержки файловой системы SELinux, SELinux предоставляет набор правил для записи файлов политики безопасности, который называется языком политики SELINUX.
ПРИМЕЧАНИЕ 1. Инициализация Framework Framework AVB (Android Verified Boot), AVB в основном используется для предотвращения вмешательства системных файлов, а также содержать функции, которые предотвращают обратную связь системы, чтобы избежать использования систем отката и использование предыдущих уязвимостей. ПРИМЕЧАНИЕ 2. SELINUX_INITIALIZE Запускает SELinux.
Примечание 1 Инициализируйте службу недвижимости через функцию Property_Init, Примечание 3 Запустите службу свойств через функцию Start_Property_Service. Примечание 2 Функции обработки сигналов сигнала_handler_init Установка подпрограмма, когда процесс дочернего процесса ненормально выходит, процесс INIT будет схватить информацию о исключительной информации. После того, как она будет зафиксировать эту информацию об исключении, будет вызываться соответствующая настройка функции захвата. Например, детский процесс процесса init Process Zygote, процесс INIT отражает эти исключительные данные, вызовут функцию DILL_Signal () для перезапуска процесса Zygote.
ПРИМЕЧАНИЕ 1. Анализ профиля INIT.RC и выполните команды, соответствующие подпрограмму в примечании 2, то есть команда, настроенная в файле init.rc. Перезапустите мертвое обслуживание на примечаниях 3.
Анализ init.rc.
Язык, используемый в init.rc, называется языком Android INITAL, переведен — это «язык инициализации Android», язык INITAL имеет пять типов выражений соответственно соответственно:
Действие: действие содержит серию команды.
Команда: команда в языке init.
Сервис: сервис, созданный процессом init.
Опция: Параметры конфигурации для сервисов.
Импорт: представляя другие профили.
Синтаксис действия действия заключается в следующем:
Trigger здесь — это триггер, выполненный действием. Когда условие запуска выполняется, команда будет выполнена. Trigger имеет следующие две категории:
Trigger события: срабатывает при возникновении указанного события. Мероприятие может быть выпущено командой «Trigger», или процесс INIT выдан функцией QueueeVenttrigger ().
Свойство триггер: срабатывает, когда указанное свойство удовлетворяет значение.
Команда в действии — это команда определения языка INIT, все поддерживаемые команды следующие:
команда | Формат параметра | Описание |
---|---|---|
bootchart_init | — | Начать bootchart. |
chmod | octal-mode path | Изменить доступ к файлам |
chown | owner group path | Изменить владелец файла и группы |
class_start | serviceclass | Запустите службу указанной категории |
class_stop | serviceclass | Остановить и «отключить», чтобы указать услугу категории |
class_reset | serviceclass | Остановите службу указанной категории, но не «отключить» |
copy | src dst | Копировать файл |
domainname | name | Установите доменное имя |
enable | servicename | Включите службу отключенным |
exec | [seclabel[user[group]]] — command [argument]* | Детский процесс для выполнения указанной команды |
export | name value | Переменная экспорта среды |
hostname | name | Установите имя хоста |
ifup | iterface | Сетевая карта онлайн |
insmod | path | Установите модуль указанного пути |
load_all_props | — | Нагрузка атрибутов из / System, / Vendor и другие пути |
load_persist_props | — | Загрузка постоянных атрибутов |
loglevel | level | Установите уровень журнала ядра |
mkdir | path[mode][owner][group] | Создать каталог |
mount_all | fstab[path]*[—option] | Установите файловую систему и импортировать указанный файл .rc |
mount | typedevicedir[flag]*[options] | Установите файловую систему |
powerctl | — | Внутренняя реализация |
restart | service | Перезапустить сервис |
restorecon | path[path]* | Установка контекста безопасности файла |
restorecon_recursive | path[path]* | Рекурсивная версия Restorecon |
rm | path | Unlink (2) для указанного пути |
rmdir | path | Удалить папку |
setprop | namevalue | Установите значение атрибута |
setrlimit | resourcecurmax | Rlimit для указанных ресурсов |
start | service | Начать сервис |
stop | service | Вне услуги |
swapon_all | fstab | Компас fs_mgr_swapon_all в указанном файле |
symlink | targetpath | Создать цепочку |
sysclktz | mins_west_of_gmt | Уточните системное тестовое тело |
trigger | event | Вызвать событие |
umount | path | UMMount указанная файловая система |
verity_load_state | — | Внутренняя реализация |
verity_update_state | mount_point | Внутренняя реализация |
wait | path[timeout] | Ожидание файла до таймаута, если вы существуете, вернитесь напрямую |
write | pathcontent | Написать содержимое в указанный файл |
Сервис — это исполняемый файл, который начался процесс INIT, синтаксис экспрессии сервиса выглядит следующим образом:
Вариант — это модификация службы, которая влияет на процесс инициализации и при запуске службы. Все поддерживаемые варианты отображаются в:
Option | Формат параметра | Описание |
---|---|---|
critical | — | Логотип — это критическая система системы, которая заставит систему перезапустить в режим восстановления, если вы выходите несколько раз. |
disabled | — | Не сможет выразить звезду, поскольку категория автоматически начинается |
setenv | name value | Установите переменные среды для процесса запуска |
socket | nametypeperm[user[group[seclabel]]] | Создать сокет домена Unix |
user | username | Переключите пользователь перед выполнением сервиса |
group | groupname[groupname]* | Изменить группу перед выполнением службы |
seclabel | seclabel | Переключайте SecLabel перед выполнением службы |
oneshot | — | Одноразовый сервис, не перезапустите после смерти |
class | name | Укажите категорию службы |
onrestart | — | Выполните команду, когда служба перезапускается |
writepid | file. | PID, написанный в детский процесс к указанному файлу |
Импорт — это ключевое слово вместо команды, вы можете загрузить другие файлы .rc через это ключевое слово в файле .rc, его синтаксис выглядит следующим образом:
Путь может быть еще одним файлом .rc или папка. Если это папка, все файлы под этой папкой импортируются, но не зацикливается файлы в подкаталоге.
Начать зиготе
INIT.RC Файл имеет следующий код конфигурации:
В начале файла INIT.RC используйте оператор типа импорта для введения сценариев загрузки ZyGote, где RO.Zygote представляет разные файлы в соответствии с разным контентом, начиная с Android 5.0, Android начинает поддерживать 64-битные программы, Zygote имеет 32 Биты и 64-битные, как показано ниже:
Код для init.zygote64.rc выглядит следующим образом:
Служба используется для уведомления процесса init для создания процесса под названием Zygote. Этот процесс выполняет путь к / System / bin / app_process64. Следующий код проходит параметр, передаваемый в App_Process64, а класс главным образом относится к классному значению Отказ Добавьте объект сервиса в список сервисов при расстановке оператора типа службы.
Вернитесь и посмотрите профиль init.rc:
CLASS_START — это команда, соответствующая функция do_class_start, используемая для начала класса для службы, который является предыдущим ZyGote, поэтому основной Main Class_Start используется для запуска Zygote, функция do_class_start определяется в spotins.cpp, код как следует:
Функция FOREACHSERVICEINCLASS будет проходить список Service Lin, найдите ClassName Zygote и выполните функцию startifnobabled, код следующим образом:
Если сервис не устанавливает опцию отключенной опции в соответствующем RC-файле, вызывается функция запуска, и функция запуска выглядит следующим образом:
Источник