Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

ЯЗЫК АССЕМБЛЕРА

Читайте также:
  1. Директивы ассемблера
  2. Зачем нужен язык ассемблера?
  3. Команды ассемблера. назначение и примеры команды передачи данных, арифметических, логических команд и сдвигов. Команды передачи управления.
  4. Команды ассемблера. Цепочные команды и префиксы, команды ввода вывода команды управления МП.
  5. Приложение 1. Система команд ассемблера HCS08
  6. Простые типы данных ассемблера
  7. Синтаксис команд Ассемблера.
  8. Что такое язык ассемблера?
  9. Что такое язык ассемблера?
  10. Язык ассемблера

В качестве примера linux kernel API приведем исходный текст самого простого модуля ядра, какой только возможен.

Пример hello.c:

#include <linux/module.h> // Необходим для любого модуля ядра
#include <linux/kernel.h> // Здесь находится определение KERN_ALERT

int init_module(void)
{
printk("<1>Hello world 1.\n");

/* Если вернуть ненулевое значение, то это будет воспринято как признак ошибки, возникшей в процессе работы init_module; в результате модуль не будет загружен. */
return 0;}

void cleanup_module(void)
{
printk(KERN_ALERT "Goodbye world 1.\n");}

Любой модуль ядра должен иметь по меньшей мере хотя бы две функции: функцию инициализации модуля -- init_module(), которая вызывается во время загрузки модуля, и функцию завершения работы модуля -- cleanup_module(). Начиная с ядра, версии 2.3.13, требования к именованию начальной и конечной функций были сняты. Теперь вы можете давать им свои имена. Новый метод именования является более предпочтительным, однако многие по-прежнему продолжают использовать имена init_module() и cleanup_module().

Обычно функция init_module() выполняет регистрацию обработчика какого-либо события или замещает какую-либо функцию в ядре своим кодом (который, как правило, выполнив некие специфические действия, вызывает оригинальную версию функции в ядре). Функция cleanup_module() является полной противоположностью, она производит "откат" изменений, сделаных функцией init_module(), что делает выгрузку модуля безопасной.

И наконец, любой модуль ядра должен подключать заголовочный файл linux/module.h. В нашем примере мы подключали еще один файл -- linux/kernel.h, но лишь для того, чтобы получить доступ к определению KERN_ALERT

Несмотря на столь красноречивое название, функция printk() вовсе не предназначена для вывода информации на экран, даже не смотря на то, что мы использовали ее в своем примере именно для этой цели! Основное назначение этой функции -- дать ядру механизм регистрации событий и предупреждений. Поэтому, каждый вызов printk() сопровождается указанием приоритета, в нашем примере это <1> и KERN_ALERT. Всего в ядре определено 8 различных уровней приоритета для функции printk() и каждый из них имеет свое макроопределение, таким образом нет необходимости писать числа, лишенные смысла (имена уровней приоритета и их числовые значения вы найдете в файле linux/kernel.h). Если уровень приоритета не указывается, то по-умолчанию он принимается равным DEFAULT_MESSAGE_LOGLEVEL.

Если задан уровень ниже, чем int console_loglevel, то сообщение выводится на экран. Если запущены и syslog, и klogd, то сообщение попадет также и в системный журнал /var/log/messages, при этом оно может быть выведено на экран, а может и не выводиться. Мы использовали достаточно высокий уровень приоритета KERN_ALERT для того, чтобы гарантировать вывод сообщения на экран функцией printk().
Список литературы

1. Ядро Linux http://ru.wikipedia.org/wiki/Linux_(ядро)

2. Ядро http://ru.wikipedia.org/wiki/Ядро_(операционной_системы)

3. Монолитное ядро http://ru.wikipedia.org/wiki/Монолитное_ядро

4. API http://ru.wikipedia.org/wiki/API

5. Linux kernel http://en.wikipedia.org/wiki/Linux_(kernel)

6. Системное програмное обеспечение А. В.Гордеев А.Ю. Молчанов – Спб.: Питер, 2002

7. IPC http://en.wikipedia.org/wiki/Inter-process_communication

8. The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz http://linux4u.jinr.ru/docs/add04/lkmpg.html

8. Программирование для Linux. Профессиональный подход. М.: Издательский дом "Вильямс", 2002

ЯЗЫК АССЕМБЛЕРА

Мы обсуждали три уровня, которые имеются в большинстве современных компьютеров. В этой главе речь пойдет о еще одном уровне, который также присутствует практически во всех современных машинах. Это уровень языка ассемблера. Уровень языка ассемблера существенно отличается от трех предыдущих, поскольку он реализуется с помощью трансляции, а не с помощью интерпретации.

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

Язык, на котором изначально написана программа, называется входным языком, а язык, на который транслируется эта программа, называется выходным языком.

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

Трансляция используется в том случае, если есть аппаратный или программный процессор для выходного языка и нет процессора для входного языка. Если трансляция выполнена правильно, то оттранслированная программа будет давать точно такие же результаты, что и исходная программа (если бы существовал подходящий для нее процессор). Следовательно, можно организовать новый уровень, который сначала будет транслировать программы на выходной уровень, а затем выполнять полученные программы.

Важно понимать разницу между трансляцией и интерпретацией

. При трансляции исходная программа на входном языке не выполняется сразу. Сначала она преобразуется в эквивалентную программу, так называемую объектную программу, или исполняемую двоичную программу, которая выполняется только после завершения трансляции. При трансляции нужно пройти следующие два шага:

1. Создание эквивалентной программы на выходном языке.

2. Выполнение полученной программы.

Эти два шага выполняются не одновременно. Второй шаг начинается только после завершения первого. В интерпретации есть только один шаг: выполнение исходной программы. Никакой эквивалентной программы порождать не нужно, хотя иногда исходная программа преобразуется в промежуточную форму (например, в код Java) для упрощения интерпретации.

Во время выполнения объектной программы задействовано только три уровня: микроархитектурный уровень, уровень команд и уровень операционной системы.

Следовательно, во время работы программы в памяти компьютера можно найти три программы: пользовательскую объектную программу, операционную систему и микропрограмму (если она есть). Никаких следов исходной программы не остается. Таким образом, число уровней, присутствующих при выполнении программы, может отличаться от числа уровней, присутствующих до трансляции. Следует отметить, что хотя мы определяем уровень по командам и языковым конструкциям, доступным программистам этого уровня (а не по технологии реализации), некоторые авторы иногда проводят различие между уровнями, реализованными интерпретаторами, и уровнями, реализованными при трансляции.




Дата добавления: 2014-12-19; просмотров: 40 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав