Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ядро. Показать все сообщения
Показаны сообщения с ярлыком ядро. Показать все сообщения

воскресенье, 2 февраля 2020 г.

Разработка модуля ядра Linux на ассемблере

#linux #ассемблер #ядро


В Linux'е не шибко спец, однако есть такая задача: разработать модуль ядра...
Вот, к примеру, простой hello world (NASM), однако как его собрать и запустить? Именно
как модуль ядра!

BITS 32

GLOBAL      main
EXTERN      printk

SECTION     .data

Hello       db  'Hello world!',0

SECTION     .text

main:

        push    Hello
        call    printk
        add     esp,4

        ret


После компиляции nasm'ом gcc собирать его отказывается, говоря, что понятия не имеет
ни о каком printk.

Что нужно сделать, чтобы собрать и запустить этот код именно как модуль ядра?



upd 05.06.2017: Создал несколько файлов, однако это всё не работает. Где косяки и
как их поправить – не знаю... :((

Может, кто помочь с этим?

module.c

#include   // Необходим для любого модуля ядра

extern void MyProc(void);
int init_module(void)
{
  MyProc();
  return 0;
}

void cleanup_module(void)
{
}


main.asm

BITS 32

GLOBAL      MyProc
EXTERN      printk

SECTION     .data

Hello       db  'Hello word!',0

SECTION     .text

MyProc:

        push    Hello
        call    printk
        add esp,4

        ret


makefile

obj-m += test.o
test-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: main.asm
    nasm -f elf -o $@ $^


compile.sh

make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD modules


Что не так?



Хотя... вроде заработало...

Только теперь непонятно как это запустить...

Пишу sudo insmod test.ko – в ответ тишина. Где Hello world! ?
Файла /var/log/messages у меня нет вообще...
    


Ответы

Ответ 1



как его собрать и запустить? Именно как модуль ядра! Основное отличие сборки любого приложения для адресного пространства пользователя от сборки модуля для адресного пространства ядра, заключается в том, что приложение - самостоятельная сущность, а модуль - работает под управлением ядра. Из этого следует, что для компиляции модуля Вам нужно иметь исходные тексты (как минимум - заголовки) ядра, а для его компоновки (т.е. получения файла *.ko) необходимы объектные коды самого ядра. Существует определённая технология сборки самого ядра и его модулей. С ней вкратце можно ознакомиться вот здесь: Разработка модулей ядра Linux (Алексей Соловьев) Более профессионально всё изложено вот здесь: Разработка модулей ядра Linux (Олег Цилюрик) (цикл статей на IBM developerWorks) Но там 36 глав... Вам для разбега хватит и первой главы: Разработка модулей ядра Linux: Часть 1. Первые шаги И хотел бы заметить, что ядро почти на 100% написано на С. На ассемблере пишут только те части ядра, которые существенно зависят от архитектуры. Например - функции работы с регистрами устройств ввода/вывода в драйверах.

воскресенье, 29 декабря 2019 г.

Вызов модулей из ядра движка

#php #cms #роутер #ядро


Через запросы GET или POST из ядра движка идут запросы на те или иные модули, например,
модуль просмотра новости на сайте.

Если URL http://site.ru/?module=readnews&id=3, я делаю это так:

if ($module=="readnews") {
    $news = new ReadNews();
    $news->Display($id);
}


И т.д. через if-ы перебираю все модули. Или switch.

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

Как можно такое организовать.
    


Ответы

Ответ 1



Расскажу как сделал свою CMS, которая используется на многих моих сайтах. Запросы идут через роутер (не знаю, но может быть, это не правильное название данного метода). Сразу скажу что моя система не идеальна и не каждому она подойдет, но мои сайты на ней прекрасно работают. Структура движка: / - корень — classes - классы — — engine.php - основной класс — — route.php - роутер (обработчик запросов) — controllers - контроллеры Элемент списка — — controller_index.php - главный модуль, будет запущен при вот таком вызове - site.ru/ — — controller_messages.php - тестовый модуль — index.php - главный файл, он принимает все запросы — .htaccess - ну это понятно Начну по порядку пожалуй. htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ index.php?route=$1 [L,QSA] index.php /* разные настройки (вкл. ошибок и т.п.) */ function __autoload($class_name) { // авто подключение классов и модулей $file = $_SERVER['DOCUMENT_ROOT'] . '/' . (substr_count($filename, 'controller') ? 'controllers' : 'classes') . '/' . strtolower($class_name) . '.php'; if ( file_exists($file) ) include_once($file); } /* безопасное соединение с базой данных, файл лежит перед корнем сайта если вдруг упадет php, логин и пароль к базе данных никто не сможешь увидеть */ include_once('../db-site.php'); route::delegate(); // обрабатываем запросы, подключаем и запускаем необходимый модуль engine::run(); // стартуем движок engine.php - /classes/ class engine { /** * переменные движка * */ public static $alias, $content ; /** * Вывод 404 ошибки * */ public static function away() { header('HTTP/1.0 404 Not Found'); exit('404 Not Found'); } /** * Обработка запроса * * @param array $alias массив с параметрами */ public static function alias($alias) { foreach($alias as $k => $v) if ( !empty($v) ) $alias[$k] = $v; else unset($alias[$k]); self::$alias = $alias; } /** * Стартер движка * */ public static function run($alias) { echo self::$content; } } route.php - /classes/ class route { public static function delegate() { $route = empty($_GET['route']) ? '' : $_GET['route']; // проверка запроса if ( empty($route) ) $route = 'index'; // если запрос пуст, то есть - http://site.ru/ engine::alias(explode('/', $route)); // разбираем запрос на массив, site.ru/one/two -> array('one', 'two') $route = engine::$alias[0]; // достаем первый, он будет модулем - one $file = '/controllers/controller_' . $route . '.php'; if ( !is_file($file) ) engine::away(); // если модуль не найден - 404 Not Found $route = 'controller_' . $route; if ( !class_exists($route) ) engine::away(); // если модуль найден, а класс не найден - 404 Not Found $controller = new $route(); // создаем экземпляр класса $controller->delegate(engine::$alias); // запускаем модуль и передаем параметры запроса } } controller_messages.php - /controllers/ class controller_messages { function delegate($alias) { return self::$alias[0](); // [0] - это первый параметр. Например, site.ru/messages } function messages() { switch(engine::$alias[1]) { case 'add' : $ex = 'add message'; break; case 'edit' : $ex = 'edit message'; break; default : $ex = 'all messages'; break; } core::$content = $ex; } } controller_index.php - /controllers/ class controller_index { function delegate($alias) { core::$content = 'index page.. engine ok!'; } } Всё, система готова! Теперь при открытии главной страницы будет запускаться модуль controller_index.php и выводится текст index page.. engine ok!. На данной системе у меня стоит обработка AJAX и обычных POST запросов, мобильная версия, а также крутой парсер с условиями который упрощает работу в разы. Вопросы в комменты.

Ответ 2



Ну вы же можете сделать вот так. Пользователь вводит URL: http://site.ru/?module=readnews&id=3. Мы видим, что он хочет загрузить какой-то модуль (какой - мы не знаем). Значит, берем значение из переменной module и проверяем есть ли такой модуль на сайте. Если модуль найден, загружаем его. Код при этом будет выглядеть примерно следующим образом: $modules = array('readnews', 'readarticles', 'watchphotos','404module'); $module = $_GET['module']; if(in_array($module, $modules){ $Module = new $module($_GET); $Module->Display(); }else{ $module = '404module'; $Module = new $module($_GET); $Module->Display(); } Пусть сам модуль думает над параметрами, которые ему передали в $_GET и что ему надо отобразить исходя из этих параметров. Код очень грубый. Но оформить его в виде удобных классов - это уже согласитесь... дело техники... Рекомендую также к прочтению: Model-View-Controller. Там описывается очень удобная структурная модель любого программного обеспечения. В том числе и для сайтов написанных на PHP. Называется MVC. Вообем здесь только дело за вами. Как сделаете - так и будете развивать в дальнейшем то, что сделали раньше. Другое дело, чтобы потом самому приятно было кодить...

вторник, 9 октября 2018 г.

Linux с самых основ (компиляция, установка ядра и тд)

Всю жизнь пользовался Windows, и что-то внезапно захотелось немного познакомиться с Linux. Хочется разобраться со всем этим делом с самых-самых основ, но чувствую что не хватает некоторого понимания и теоретических познаний и представлений. Есть ряд вопросов, ответы на которые, как мне кажется, могут немного заполнить пробелы в моем понимании того, что такое Linux и с чем его едят. Итак:
Правильно ли я понимаю, что есть одно единственное и неповторимое ядро Linux, на базе которого разработаны все эти многочисленные дистрибутивы (Ubuntu, Debian, Mint и т.д), и при этом можно установить именно это самое чистое ядро, а не какой-то из дистрибутивов? Правильно ли я понимаю, что само по себе ядро это уже по сути ОС, только без графического интерфейса (что-то вроде DOS) а сам GUI-интерфейс можно уже установить отдельно? Слышал много раз о том, что ядро в начале обычно нужно скомпилировать, а затем установить. Есть ли возможность получить уже скомпилированное ядро, распространяется ли оно в таком виде? Хорошая ли идея - пытаться скомпилировать это самое ядро Linux на Windows, и насколько это вообще возможно? Слышал много раз о всяких менеджерах пакетов, при помощи которых осуществляется установка различного софта в системах на базе Linux, при этом у каждой такой ОС (Ubuntu, Debian, Mint и т.д) свои собственные менеджеры пакетов. А как быть с чистым ядром? Каким образом на него что-то ставится? Каким вообще образом распространяется софт для Linux? Только в open source, с последующей компиляцией? А такие штуки как установочные файлы, .exe-шники и прочее - обычно не используется? Если есть только один ПК без установленной ОС, как обычно на него устанавливается ядро Linux?
Пока-что на этом все. За ранее спасибо.


Ответ

Правильно ли я понимаю, что есть одно единственное и неповторимое ядро Linux, на базе которого разработаны все эти многочисленные дистрибутивы (Ubuntu, Debian, Mint и т. д).
Не совсем. Едина только база (изначальный исходный код). То есть разработчики дистрибутивов скачивают исходные коды нужной им версии Linux-а, вносят в них какие-то свои исправления (патчи), задают параметры сборки для включения нужных и исключения ненужных возможностей и компилируют ядро. Иными словами, дистрибутивы отличаются не только репозиториями и прикладными программами, но и вариациями ядра.
... и при этом можно установить именно это самое чистое ядро, а не какой-то из дистрибутивов?
Можно. Но так как ядро распространяется в исходных кодах, вам придётся скомпилировать из них свой вариант, заточенный конкретно под ваш компьютер и, возможно, потребности — штатный конфигуратор make menuconfig богат на опции:

Главное окно графического конфигуратора параметров сборки Linux. Источник: Википедия
Однако, получение даже минимальной рабочей системы — довольно длительный и многоэтапный процесс, требующий достаточных познаний в принципах работы Linux-а.
Правильно ли я понимаю, что само по себе ядро это уже по сути ОС, только без графического интерфейса (что-то вроде DOS) а сам GUI-интерфейс можно уже установить отдельно?
И снова не совсем. Ядро — это всего лишь прослойка между программами и железом. В случае Linux-а там в комплекте ещё идут драйвера.
Чтобы получить что-то, похожее на DOS, вам дополнительно потребуются как минимум GNU Coreutils — набор программ, определяющих пользовательское окружение (ls, cat, su и т. д.), и загрузчик (например, grub, lilo), который будет загружать ядро при включении компьютера.
Кстати, именно из-за симбиоза ядра Linux и пакета программ GNU Coreutils операционную систему и называют GNU/Linux.
Слышал много раз о том, что ядро в начале обычно нужно скомпилировать, а затем установить. Есть ли возможность получить уже скомпилированное ядро, распространяется ли оно в таком виде?
Распространение в исходных кодах — это своего рода политика разработчиков ядра, а потому скомпилированное ядро можно только выдрать из какого-то имеющегося дистрибутива.
Хорошая ли идея - пытаться скомпилировать это самое ядро Linux на Windows, и насколько это вообще возможно?
Для сборки Linux вам потребуются компилятор GCC и компоновщик LD. Теоретически, при сборке под Cygwin проблем быть не должно (если именно компилировать ядро), но есть информация о трудностях с регистрозависимыми имёнами файлов, которые Windows считает одинаковыми.
Слышал много раз о всяких менеджерах пакетов, при помощи которых осуществляется установка различного софта в системах на базе Linux, при этом у каждой такой ОС (Ubuntu, Debian, Mint и т.д) свои собственные менеджеры пакетов. А как быть с чистым ядром? Каким образом на него что-то ставится?
Компиляцией из исходников. То есть в случае чистого ядра у вас под рукой всегда должен быть компилятор.
Каким вообще образом распространяется софт для Linux? Только в open source, с последующей компиляцией? А такие штуки как установочные файлы, .exe-шники и прочее - обычно не используется?
Сборка из исходников является обязательной только для компонентов ядра, таких как драйвера. Прикладные же программы можно ставить и в виде двоичных файлов. Идёте на сайт разработчика, скачиваете какой-нибудь пакет. Затем, зная что любой пакет — это всего лишь архив одного из распространённых форматов, распаковываете его и раскидываете содержащиеся внутри файлы на подобающие им места в системе. И наконец удостоверяетесь, что у вас есть все библиотеки, нужные для запуска этой программы.
Если есть только один ПК без установленной ОС, как обычно на него устанавливается ядро Linux?
Для сборки Linux нужна другая копия Linux. Поэтому вам надо хотя бы раздобыть live cd какого-нибудь дистрибутива.