Ядро Linux

He стоит забывать, что самой главной программой операционной системы является ее ядро, которое в Linux состоит из статического стартового модуля  в формате ELF executable и динамически пристыковываемых программных модулей формата ELF relocatable.

Для выполнения процедуры начальной загрузки , стартовый модуль упакован в «самораспаковывающййся» gzip-архив формата bzimage (big zipped image), который состоит из, программы распаковки и, собственно,- запакованного стартового модуля.

В листинге ниже проиллюстрирован процесс ручного извлечения стартового модуля из архива /boot/vmlinuz-3.i3.0-49-generic формата bzimage, который предварительно копируется в /tmp/vmlinuz.

Сначала, при помощи поиска сигнатуры 1fsb0800, являющейся признаком заголовка gzip-архива, находится смещение запакованного стартового модуля. Затем, отступая один блок skip=1 размером bs=18109 байт от начала /tmp/vmlinuz, извлекается запакованный стартовый модуль в файл /tmp/vmlinux.gz.

Наконец, стартовый модуль распаковывается в файл /tmp/vmlinux, который действительно оказывается статически скомпонованной (т. е. не использующей библиотеки ELF shared object) исполняемой ELF-программой.

Ядро операционной системы

fitz@ubuntu:~$ uname -r

3.13.0-49-generic

fitz@ubuntu:~$ file /boot/vmlinuz -3.13.0-49-generic

/boot/vnlinuz-3.13.0-49-generic: regular file, no read permission

fitz@ubuntu:~$ ls -l /boot/vmlinuz-3.13.0-49-generic

-rw——-  1 root root 5937168 марта 25 2018 /boot/vmlinuz-3.13.0-49-generic

fitz@ubuntu:~$ sudo file /boot/vmlinuz-3.13.0-49-generic

/boot/vmlinuz-3.13.0-49-generic: Linux kernel x86 boot executable bzimage, version 3.13.0-49-generic

(buildd@komainu) #81~precise1-Ubuntu SMP Wed , RO-rootFS, swap_dev 0x5, Normal VGA

fitz@ubuntu:~$ sudo cat /boot/vmlinuz-3.13.0-49-generic > /tmp/vmlinuz

fitz@ubuntu:~$ grep -aboP ‘\x1f\x8b\x08\x00’ /tmp/vmlinuz

18109:
fitz@ubuntu:~$ dd skip=1 bs=18109 if=/tmp/vmlinuz of=/tmp/vmlinux.gz

326+1 записей получено

326+1 записей отправлено

скопировано 5919059 байт (5,9 МВ), 0,0113558 с, 521 МВ/с

fitz@ubuntu:~$ file /tmp/vmlinux.gz

/tmp/vmlinux.gz: gzip compressed data, from Unix, max compression

fitz@ubuntu:~$ gunzip -c /tmp/vmlinux.gz >./tmp/vmlinux
gzip: /tmp/vmlinux.gz: decompression OK, trailing garbage ignored

fltz@ubuntu:~$ file /tmp/vmlinux
/tmp/vmlinux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[shal]=0xefl57e499a84b8027135b5cde271440fcd44a3a5, stripped

Динамические модули загружаются в пространство ядра и пристыковываются к стартовому модулю позднее, уже при работе операционной системы при помощи системных утилит insmod или modprobe

. Для отстыковки и выгрузки ненужных модулей предназначена системная утилита rmmod, для просмотра списка (см. листинг ниже) загруженных модулей — lsmod, а для идентификации свойств и параметров  модулей утилита modinfo. Загрузка и выгрузка модулей реализуется специальными системными вызовами init_module и delete_module, доступ к списку загруженных модулей при помощи файла /proc/modules псевдофайловой системы proc, а идентификация свойств и параметров модулей — чтением специальных секций ELF-файлов модулей.

Модели ядра

fitz@ubuntu:~$ lsmod
Module                                             Size   Used  by

. . .                                   . . .                                    . . .
1915                                            733300    4

. . .                                   . . .                                    . . .
btusb                                            27671       0

. . .                                   . . .                                    . . .
uvcvideo                                      72275       0

. . .                                   . . .                                    . . .
r8169                                            62856      0

. . .                                   . . .                                    . . .
fitz@ubuntu:~S> modinfo i915
filename:                 /lib/modules/3.13.0-49-generic/kernel/drivers/gpu/drm/1915/1915. kо
license:                    GPL and additional rights
description:            Intel Graphic

. . .                                   . . .                                    . . .                                     . . .                              . . .

fitz@ubuntu: ~$ file /lib/modules/3.13.0-49-generic/kernel/drivers/gpu/drm/1915/1915. kо

lib/modules/3.13.0-49-generic/kernel/drivers/gpu/drm/1915/1915. kо: ELF  32-bit LSB
relocatable, Intel 80386, version 1 (SYSV),
BuildID[sha1]=0x8e55af4617e7299b37468c6befl69d43df5152a5, not stripped

 

Динамические модули ядра зачастую являются драйверами устройств, что проиллюстрировано в листинге ниже при, помощи утилит lspci и lsusb, которые сканируют посредством псевдофайловой системы sysfs списки обнаруженных ядром на шинах PCI и USB устройств и обслуживающих их драйверов.

Драйверы устройств

fltz@ubuntu:~$ lspci  -k

. . .                                   . . .                                    . . .                                     . . .                              . . .

00:02.0 VGA compatible controller: Intel … integrated Graphics Controller (rev 09)

Subsystem: Samsung Electronics Co Ltd Device c0b6

Kernel driver In use: 1915

Kernel modules: 1915

. . .                                   . . .                                    . . .                                     . . .                              . . .

02:00.0 Ethernet controller: Realtek   …    8168B   …  Gigabit Ethernet controller (rev 06)

Subsystem: Samsung Electronics Co Ltd Device c0b6

Kernel driver in use: r8169

Kernel modules: r8169

fitz@ubuntu:~$ lsusb -t

/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|_ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
| Port 3: Dev 15, If 0, Class=’bInterfaceClass … andled’, Driver=btusb, 12M
| Port 3: Dev 15, If 1, Class=’bInterfaceClass … andled’, Driver=btusb, 12M
| Port 4: Dev 4, If 0, Class=stor., Driver=usb-storage, 480M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehcl-pci/2p, 480M
| Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M
| Port 4: Dev 3, If 0, Class=’blnterfaceClass … ed’, Driver=uvcvldeo, 480M
| Port 4: Dev 3, If 1, Class=’bInterfaceClass … ed’, Driver=uvcvideo, 480M

Добавить комментарий