⌨ Labor omnia vincit ☮

openSUSE :: kernel of the day

Posted in Linux Kernel, SuSE [ru] by anaumov on 09.01.2017

suseДля тех, кто по той или иной причине хочет использовать последнюю версию ядра, но постоянно пересобирать ее вручную нет ни времени ни желания, openSUSE проект делает это за нас. Идея Kernel Of The Day – предоставить тестерам и прсто kernel инженерам последнюю git-версию ядра в виде RPM пакета. Это devel проект для ядра, в котором собираются версии для последующего тестирования и отправлки в tumbleweed. Делается это также с целью получить feedback от сообщества в виде bugreports или просто в ML/IRC.

Процесс полностью автоматизированный. Вы подключаете репозиторий и обновляетесь (каждый раз как пакет с новым ядром доступен для установки) как и обычно.

Версия unstable, поэтому имеет смысл не перезаписывать каждый раз старое ядро, а добавлять новое. Это не работает автоматически. Для этого надо отредактировать /etc/zypp/zypp.conf. Добавьте две строчки:

multiversion = provides:multiversion(kernel)
multiversion.kernels = latest,running

Подробнее о multiple kernel.

Добавлю, что система ломатеся. Ломается достаточно часто. Только что, к примеру, у меня поломался dracut на ядре 4.9.0-2. Я не cмог загрузиться, т.к. он связан с LUKS, а я использую шифрование. Откатился назад на 4.8.13.
Интерсно, что именно сломано, почему и как починить. Это как раз ответ на вопрос “зачем мы этим занимаемся?”. Если бы этого не произошло, я вряд бы ли стал разбираться глубже в dracut. Проект таким способом предоставляет идеальную трейнинг площадку для энтузиастов, где обучение проходит в играющей форме 🙂

Advertisements

wikidevi.com

Posted in Linux Kernel by anaumov on 08.01.2017

Хочу поделиться ссылочкой на интересную БД wifi адаптеров. Я помню, как еще каких-то семь-десять лет назад у пользователей GNU/Linux были проблемы их с поддержкой. Сегодня ситуация на много лучше, но проблема как будто осталась. Мы знаем о поддерживаемом ядром чипе, но не знаем в каких устройствах используется этот чип. Мы заходим на страницу магазина, но видем лишь цену, производителся и название конкретных моделей. Если повезет, то в комментариях кто-то напишет, что та или иная железка заработала в GNU/Linux.

Проект wikidevi.com собрал для нас информацию более чем о 5К Wireless адаптеров. Информация включает в себя фотографии устройства и самой платы, информацию о чипсете и драйвере, используемом в Linux (а также версия ядра, начиная с которой есть его поддержка), страну производитель, страницу оф. поддержки производителем и другие полезные ссылки, типа темы на форуме, где пользователи делятся своими впечатлениями и просто опытом, как завести устройство, если оно не завелось автоматически.

Например, я беру первый попавшийся wifi адаптер на amazon, в описании к которому отсутствует “Linux” как поддерживаемая ОС. Пускай это будет Linksys AE3000. Вот что я нахожу о нем на wikidevi: wikidevi: Linksys_AE3000. Как видим, официальной поддержки нет (хотя ожидается в драйвере rt2800usb). Но есть патч, который исправляет эту проблему начиная с версии 3.12. На wiki есть ссылка на solved-тему форума, откуда мы узнаем, что

After installing the hacked module and loading it, I had to edit the wireless configuration menu to enter my network name and the device hardware address. I am not yet familiar with Debian, so had to dig around a while to find things. After that the device was recognized and my network came up. The real key is to get the hacked source code for the chipset. I believe you have seen where to get that.

Другими словами, если руки растут из нужного места, то устройство у вас заработет.

Другим примером может быть TP-LINK_TL-WN822N_v2. Откуда я узнаю, что начиная с версии 2.6.36 (2010-10-20) ядро поддеживает этот USB адаптер. Модуль называется ath9k_htc. В магазине о поддеожке Linux ни слова, но теперь мы знаем, что проблем с устройством не будет 🙂

Linux Kernel 4.7 Update for openSUSE

Posted in Linux Kernel, SuSE [ru] by anaumov on 18.07.2016

Пару дней назад вышло ядро 4.7. В связи с этим наш репозиторий Tumbleweed в скором будущем будет обновлен. Для тех же, кому по той или иной причине нужны самые свежие версии ядер, собраные для openSUSE (не только Tumbleweed), существует специальный kernel-репозиторий. Там лежат ядра, собранные сразу же после официального релиза (в тот же день). Доступны сборки не только для x86, но и для ARM и Power. Есть vanilla.

Установка не предствляет из себя ничего сложного – самое обычное обновление rpm-пакета.
Я только что обновил ядро на одной из своих тестовых систем. Это 32-битный x86 нетбук c установленной (где-то в середине июня) Tumbleweed.

# uname -pr
4.6.2-1-pae i686

# zypper ar -f http://download.opensuse.org/repositories/Kernel:/HEAD/standard/Kernel:HEAD.repo                                                               
Adding repository 'Kernel builds for branch master (standard)' ...............................[done]
Repository 'Kernel builds for branch master (standard)' successfully added                                                                                                         
Enabled     : Yes                                                                                                                                                                  
Autorefresh : Yes                                                             
GPG Check   : Yes                                                             
Priority    : 99                                                              
URI         : http://download.opensuse.org/repositories/Kernel:/HEAD/standard/


# zypper lr
# | Alias               | Name                                       | Enabled | GPG Check | Refresh
--+---------------------+--------------------------------------------+---------+-----------+--------
1 | Kernel_HEAD         | Kernel builds for branch master (standard) | Yes     | ( p) Yes  | Yes    
2 | openSUSE-20160613-0 | openSUSE-20160613-0                        | No      | ----      | Yes    
3 | packman             | packman                                    | Yes     | (r ) Yes  | Yes    
4 | repo-debug          | openSUSE-Tumbleweed-Debug                  | No      | ----      | Yes    
5 | repo-non-oss        | openSUSE-Tumbleweed-Non-Oss                | Yes     | (r ) Yes  | Yes    
6 | repo-oss            | openSUSE-Tumbleweed-Oss                    | Yes     | (r ) Yes  | Yes    
7 | repo-source         | openSUSE-Tumbleweed-Source                 | No      | ----      | Yes    
8 | repo-update         | openSUSE-Tumbleweed-Update                 | Yes     | (r ) Yes  | Yes

Значит новый репозиторий называется Kernel_HEAD. Хорошо, я хочу обновиться только из него:

# zypper dup -r Kernel_HEAD
Retrieving repository 'Kernel builds for branch master (standard)' metadata --------------------[\]

New repository or package signing key received:

  Repository:       Kernel builds for branch master (standard)    
  Key Name:         Kernel OBS Project 
  Key Fingerprint:  4529410A B52F94C4 03BAB484 ECEEF210 03579C1D  
  Key Created:      Mi 22 Apr 2015 14:25:51 CEST                  
  Key Expires:      Fr 30 Jun 2017 14:25:51 CEST                  
  Rpm Name:         gpg-pubkey-03579c1d-5537934f                  


Do you want to reject the key, trust temporarily, or trust always? [r/t/a/? shows all options] (r): a
Retrieving repository 'Kernel builds for branch master (standard)' metadata ...................[done]
Building repository 'Kernel builds for branch master (standard)' cache ........................[done]
Loading repository data...
Reading installed packages...
Computing distribution upgrade...

The following 2 NEW packages are going to be installed:
  kernel-default-4.7.rc7-2.1.g152f160 kernel-pae-4.7.0-1.1.g24f30d5

The following 2 packages are going to be upgraded:
  kernel-firmware ucode-amd

The following 2 packages are going to change vendor:
  kernel-firmware  openSUSE -> obs://build.opensuse.org/Kernel
  ucode-amd        openSUSE -> obs://build.opensuse.org/Kernel


2 packages to upgrade, 2 new, 2  to change vendor.
Overall download size: 156.5 MiB. Already cached: 0 B.
After the operation, additional 372.8 MiB will be used.
Continue? [y/n/? shows all options] (y): y

После установки просто перезагружаемся и наслаждаемся работой нового ядра.

> uname -pr
4.7.0-1.g24f30d5-pae i686

Обновляя ядра, вы не только становитесь привлекательнее для девушек, но и помогаете проекту в качестве beta-тестера. Помните, что Tumbleweed это не самое-самое свежее ПО. Это коллекция уже протестированных вместе компонентов.
“Стоит ли мне учавстовать в этом? А вдруг я себе что-то сломаю?”, – подумает ленивец. Нет, вероятность того, что произойдет креш системы очень мал. Прежде чем ядро официально выпустят, оно пройдет серию тестов.
Если креш все же произошел, всегда можно загрузить старое ядро, в котором вы работали прежде (и где все работало). В этом случае вы очень поможете, если не поленитесь сообщить нам о возникшей проблеме.
Посмотреть список установленных ядер можно вот так:

# zypper se -si 'kernel*'
Loading repository data...
Reading installed packages...

S | Name            | Type    | Version              | Arch   | Repository                                
--+-----------------+---------+----------------------+--------+---------------------------------------
i | kernel-default  | package | 4.6.2-1.2            | i586   | (System Packages)                         
i | kernel-default  | package | 4.7.rc7-2.1.g152f160 | i586   | Kernel builds for branch master 
i | kernel-firmware | package | 20160712-137.1       | noarch | Kernel builds for branch master 
i | kernel-pae      | package | 4.6.2-1.2            | i686   | (System Packages)                         
i | kernel-pae      | package | 4.7.0-1.1.g24f30d5   | i686   | Kernel builds for branch master 

Как видете, старое ядро никуда не делось. Я отправляю всех интересующихся к 12 главе нашего руководства. Там описана Multiple Kernel магия для zypper.

Обновившись, я протестировал сейчас, к примеру, LUKS и совместимость с проприетарным broadcom модулем для wireless. Все работает как и прежде, значит я иду дальше – перехожу к обновлению на своих ARM embedded-системах, чтобы удостовериться, что и там все работает как надо. Счастливо 😉

kernel-russian@kernelnewbies.org

Posted in C, Linux Kernel by anaumov on 24.11.2014

FLРешил немного расширить тематику нашей рассылки. Отныне тут можно пообщаться не только о ядре Linux, но и о обычном системном программировании.

Проекту уже несклько лет, но его продвижением никто не занимается. Трафик очень низкий, поэтому, думаю, никто не будет против, если рассылку можно будет использовать и для обычного системного или сетевого программирования на C. Если вы используете один из дистрибутивов GNU/Linux и интересуетесь С, не стесняйтесь подписываться, задавать вопросы, подкидывать идеи и просто принимать участие в обсуждении.

Кстати, пару часов назад я создал группу на github.com для этого проекта. Теперь нам не нужно выкладывать код то там то тут. Все активные учасники могут работать с проектами в одном месте (без необходимости ожидать подтверждения на разрешение сделать push).

New openSUSE kernel available for testing

Posted in Linux Kernel, SuSE [ru] by anaumov on 10.01.2014

Сегодня утром были пересобраны desktop ядра 3.11.10. Был добавлен патч, исправляющий проблему с зависанием (минут на 20) во время установки системы (на этапе инициализации разделов: seeking for Linux partitions). Проблема заключалась в запуске blkid(8) для устройства /dev/fd0.

Тестируем:

  • Найти машину, на которой получится воспроизвести проблему
  • Отключить floppy в BIOS
  • Установить систему
  • Включить floppy в BIOS
  • Убедиться, что yast2 partitioner зависает
  • Устанавливать новое ядро ​​и перезагрузиться
  • Убедиться, что yast2 partitioner больше не зависает 🙂

Эта проблема не связана с новым YaST, который недавно был переписан. Баг тянется еще с openSUSE 12.2 (патч добавлен и в SLE-SP3).

Если BIOS не позволяет отключить floppy, просто добавте brokenmodules=floppy как параметр при загрузке. При этом не забудьте проверить modprobe.conf посте успешной установки (во время тестирования).

openSUSE :: Atheros TL-WN822N

Posted in Linux Kernel, SuSE [ru] by anaumov on 01.09.2013

TL-WN822N-atherosЦикл тестирования следующей версии нашего любимого дистрибутива в самом разгаре. Сейчас я работаю с четвертой milestone и хотел бы коротко рассказать о внешнем USB wifi-адаптере TL-WN822N от компании TP-LINK. Он соборан на основе седьмого и девятого поколения чипов Atheros Communications.

В июле 2008 г. компания Atheros решила сменить политику, наняла двух ключевых разработчиков Linux: Луиса Родригеса (исп. Luis Rodriguez) и Йоуни Малинена (фин. Jouni Malinen), выпустивших открытые драйверы для работы устройств 802.11n в Linux. Atheros также опубликовала часть исходного кода их бинарного HAL под лицензией ISC в целях помощи сообществу в добавлении поддержки чипов Atheros 802.11a/802.11b/802.11g. Компания стала принимать активное участие в разработке драйвера ath9k для Linux, с поддержкой всех нынешних 802.11n чипсетов.

Итак, драйвера ath9k и ath9k_htc открыты и включены в ядро. Тем не менее, ожидаемого результата после включения этого устройства мы не получим… но обо всем по порядку.
Читать дальше…

openSUSE :: Encrypted File Systems

Posted in Linux Kernel, SuSE [ru] by anaumov on 22.07.2013

Криптография – наука о шифрах – очень глубокая, требующая изучения, тема, история которой насчитывает более четырех тысяч лет. Это один из основных инструментов, использующихся при защите информации. Спецслужбы бывшего Советского Союза, США, Франции и других стран вкладывали огромные средства в разработку криптостойких алгоритмов для своих информационных каналов, параллельно пытаясь вскрывать чужие. Сегодня этими технологиями мы пользуемся каждый день, даже не задумываясь об этом.
Причин зашифровать информацию может быть несколько. К примеру, у вас есть любого рода секретная информация, которая ни в коем случае не должна попасть к кому-то конкретно, а может вы просто хотите оградить свою личную жизнь от чужих глаз. Мы теряем нетбуки или флешки, а на них, как правило, конфиденциальная информаця. Просто поломка носителя это уже печально, но на много хуже, когда наша информация попадает в чужие руки. Можно лишь догадываться как будет использованна эта информация, и надеяться, что она не будет использованна нам во вред.
В этом посте я расскажу о методе шифрования файловых систем (ФС) в openSUSE 13.1-m3, которая собрана на основе последней на данный момент stable-версии ядра – 3.10.0.
Читать дальше…

Yet another method to find PCI vendor and device ID

Posted in Linux Kernel by anaumov on 17.11.2012

Первым шагом написания драйвера для PCI устройства является определение его Vendor ID и Device ID. Существует много способов найти их. Кто-то советует смотреть документацию к устройству, более распространенным способом является просто заглянуть в файл include/linux/pci_ids.h. Ок, если я кернел-разработчик, то у меня естественно есть этот файл, а также я могу сделать что-то типа

> /sbin/lspci -n -s 02:00.0
02:00.0 0200: 11ab:4364 (rev 12)

…но что делать, если мне понадобился Vendor ID и Device ID на какой-нибудь, возможно даже не моей машине, где во-первых нет этого файла, а во-вторых мне также нужны Class code, BAR0-BAR5, Subvendor ID и Subdevice ID, которых lspci с ключами -n и -s не показывает?

Информацию об этом можно вытянуть из sysfs (рассматривается случай, если устройство уже зарегистрированно). Пусть это будет, к примеру, Ethernet-карта; cмотрим её адрес:

> /sbin/lspci | grep Ethernet
02:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8056 PCI-E Gigabit Ethernet Controller
05:04.0 Ethernet controller: Marvell Technology Group Ltd. 88E8001 Gigabit Ethernet Controller

Ок, карт две, с адресами 02:00.0 и 05:04.0 соответсвенно. Более подробно PCI-дерево можно увидеть через тот же lscpi, но с ключем -t (tree).

> /sbin/lspci -t
-[0000:00]-+-00.0
           +-01.0-[01]--
           +-1a.0
           +-1a.1
           +-1a.7
           +-1b.0
           +-1c.0-[04]----00.0
           +-1c.4-[03]--+-00.0
           |            \-00.1
           +-1c.5-[02]----00.0
           +-1d.0
           +-1d.1
           +-1d.2
           +-1d.7
           +-1e.0-[05]--+-03.0
           |            \-04.0
           +-1f.0
           +-1f.2
           +-1f.3
           \-1f.5

Я показываю этот вывод для того, чтобы вам легче было отследить откуда я узнал адрес /sys/devices/pci0000:00/0000:00:1c.5/0000:02:00.0/:

> l /sys/devices/pci0000\:00/0000\:00\:1c.5/0000\:02\:00.0/driver
lrwxrwxrwx 1 root root 0 Nov 16 22:04 /sys/devices/pci0000:00/0000:00:1c.5/0000:02:00.0/driver \
-> ../../../../bus/pci/drivers/sky2/

Да, это то устройство, и работает оно под управлением модуля sky2.
Второе висит на skge:

> l /sys/devices/pci0000\:00/0000\:00\:1e.0/0000\:05\:04.0/driver
lrwxrwxrwx 1 root root 0 Nov 17 00:12 /sys/devices/pci0000:00/0000:00:1e.0/0000:05:04.0/driver \
-> ../../../../bus/pci/drivers/skge/

Каждое PCI устройство имеет область памяти (256-байт), которая содержит его конфигурацию. Эта информация является ключевым для определения марки и возможности PCI-карт. Находится она в config-файле, в том же каталоге. Прочитать её дамп можно с помощью od:

> od -x /sys/devices/pci0000\:00/0000\:00\:1c.5/0000\:02\:00.0/config

0000000 11ab 4364 0407 0010 0012 0200 0008 0000
0000020 c004 fa7f 0000 0000 8801 0000 0000 0000
0000040 0000 0000 0000 0000 0000 0000 1043 81f8
0000060 0000 fa7c 0048 0000 0000 0000 010a 0000
0000100 0000 01f0 8000 01a0 5001 fe03 2000 1300
0000120 5c03 83fc ffff ffff 0000 0100 e005 0081
0000140 300c fee0 0000 0000 41a1 0000 0000 0000
0000160 0200 0000 0000 0000 0000 0000 0000 0000
0000200 0000 0000 7000 0000 0000 0000 a882 00e8
0000220 0000 0000 0000 0000 0000 0000 0000 0000
*

Первые два бита – это Vendor ID [11ab]. Дальше (смещение 2 бита) – Device ID [4364]. Class code находится со смещением 10 бит [0200]. BAR0 – BAR5 (base address register) со смещением с 16 по 39 бит [c004…0000]. Subvendor ID имеет смещение 44 [1043], и наконец Subdevice ID имеет смещение 46 бит [81f8].

Кстати, зная Vendor и Device ID, мы можем заглянуть на pcidatabase.com и попробовать узнать побольше об этом устройстве:

Пройдя дальше по ссылке я узнал немного о производителе и других его разработках.

check point

Один важный момент, который я хотел бы рассмотреть в конце – это отсутствие информации об устройстве с device ID 4364 в include/linux/pci_ids.h. Как вы видете, там есть лишь vendor ID 11ab. Значит ли это, что карта с этим ID не поддерживается ядром? Нет, карта работает отлично, и ядро находит устройство без каких-либо проблем. Проверить это можно с помощью API ядра: pci_get_device(), которая находит (или не находит) устройство и pci-enable-device(), которая включает его.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/pci.h>

#define VENDOR_ID       0x11ab
#define DEVICE_ID       0x4364

static int __init pci_start(void)
{
        struct pci_dev *pdev;
        pdev = pci_get_device(VENDOR_ID, DEVICE_ID, NULL);

        if(!pdev)
                printk("Device not found\n");
        else {
                printk("Device found\n");

                if(pci_enable_device(pdev)) {
                        printk("Could not enable the device\n");
                        return NULL;
                }
                else
                        printk("Device enabled\n");
        }
        return 0;
}

static void __exit pci_exit(void)
{
        printk("Bye bye");
}

module_init(pci_start);
module_exit(pci_exit);

MODULE_LICENSE("GPL");

Почему так происходит, я не знаю. Возможно вы, уважаемые мои читатели, сможете подсказать мне это? 😉

Don’t Panic

Posted in Linux Kernel by anaumov on 22.07.2011

Порой бывает непросто разобраться в неполадках работы ядра Linux. Поиск причины, приводящей к kernel panic, требует воспроизведения ситуации, вызывающей некорректное поведение ядра, а также сбора информации, на основании которой можно сделать какие-то выводы. Проблема в том, что kernel panic иногда вешает систему полностью, и в этом случае даже не знаешь с какой стороны подступиться и что вообще делать с “заблокированной” машиной.

В этом посте я описал в общих чертах некоторые методы, которые помогут разобраться с причиной возникновения kernel panic.
Читать полностью…

Linus Torvalds and Greg Kroah-Hartman @ LinuxCon Japan 2011

Posted in Linux Kernel by anaumov on 29.06.2011

openSUSE 11.4 :: Kernel Update

Posted in Linux Kernel, SuSE [ru] by anaumov on 30.04.2011

Первое обновление (2.6.37.6-0.5) ядра для openSUSE 11.4 доступно в Update репах. Исправленно много ошибок. Для обновления, как и обычно, достаточно просто сделать:

> zypper up

Upstream ядра, начиная с 2.6.37.2 до 2.6.37.6 включительно:
ChangeLog-2.6.37.2
ChangeLog-2.6.37.3
ChangeLog-2.6.37.4
ChangeLog-2.6.37.5
ChangeLog-2.6.37.6

[Nouveau] Tester wanted: Timing management

Posted in hacking, Linux Kernel by anaumov on 16.10.2010


Трое ребят работают над созданием свободного драйвера для nVidia карточек, а именно – над таймингами чипов. Так как спецификации закрыты, они решили обратиться за помощью к сетевому сообществу. Им нужна помощь в reverse engineering’е vBIOSов nVidia видеокарт, для получения данных об их таймингах.

Если у тебя nVidia карточка, ты можешь помочь им, предоставив некоторую инфу о начинке своей видяхи.
Читать полностью…

Russian kernelnewbies mailing list

Posted in Linux Kernel by anaumov on 11.09.2010

Небольшая, но все же приятная новость: у русскоговорящих энтузиастов ядра Linux теперь есть своя mail-рассылка. Запущенна рассылка в рамках проекта kernelnewbies.org, инициатором и координатором русской части которого я являюсь.

Я думаю, что поддерживать контакт таким образом на много удобнее. Отслеживать последние сообщения на форуме никто не хочет, а с настройкой RSS возникли некоторые проблемы.

Надеюсь, что мы сможем весело провести время, обсуждая ядро. Так же надеюсь, что она поможет многим из нас лучше разобраться в принципах работы ядра, и подталкнет к написанию хоть и самых простых, но все же собственных модулей 🙂

Подписаться на нее можно на этой странице. Там же есть ссылка и на архив сообщений.

Russian Linux kernel community

Posted in Linux Kernel by anaumov on 23.08.2010

Думаю, что всем русскоязычным linux kernel энтузиастам будет интересно узнать, что на портале kernelnewbies.org теперь запущен и RU-сегмент.

Зачем еще один портал о ядре? Дело в том, что основатель проекта linuxkernel.ru – Тарасенко Николай – к сожаленью забросил его развитие и поддержку. Я не раз пытался с ним связатья, но ответа не получил. Кроме этого портала, есть соответствующие разделы на UFO и LF, но это только форумы.

Поэтому я начал диалог с основателем kernelnewbies.org. Rik van Riel – кернел-хакер из RedHat, с которым мы сразу же нашли общий язык. Он сразу поддержал мою инициативу и создал площадку для русского сообщества. Я вожусь с ней несколько дней, и похоже, что она уже готова.

Конфигурирование, настройка, компиляция и установка ядра, а так же разработка модулей, изучение принципов работы подстистем ядра – все это является главной темой портала, центральным элементом которой является конечно же форум и ML. Кодировка UTF-8. На потрале есть возможность вести свой блог, а так же собирать RSS с других блогов (kernel planet). Остальные функции работают пока не так хорошо, но я работаю над этим сейчас.

В общем, еще раз welcome and don’t forget to have a lot of fun 😉

Welcome to the kernel development!

Posted in Linux Kernel by anaumov on 29.05.2010

Вы не должны иметь густую бороду и носить очки, чтобы заниматься хакингом ядра Linux. Вам так же не надо иметь степень бакалавра в IT, чтобы понимать структуру ядра или писать модули. Любить пиво так же не обязательно, хотя эта привычка приветствуется 🙂 Все что нужно для хакинга это желание, сам Linux с исходниками ядра, доступ в глобальныю сеть, ну и конечно немного свободного времени.

Итак, напишем модуль ядра, который просто выведет на экран что-то типа “Welcome to the kernel development!”. Есть много разных способов сделать это. Я покажу 3 из них: с помощью функции printk(), файловой системы /proc и просто с помощью чтения содержимого файла из /dev (да, будет созданно новое “устройство”). Ну первый способ разобран и описан по шагам на каждом углу, поэтому не так интересен. Я включил его в эту статейку просто чтобы освежить в памяти читателя основы, и чтобы ему было проще понять остальные два способа… хотя и в них ничего сложного нет 😉
Читать полностью…