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