Unix-dev-sys. системное программирование в среде unix (linux/freebsd)

Примеры использования

Работа с CD/DVD-дисками и образами

Создать образ CD/DVD, используя большой размер блока. Игнорировать ошибки:

    dd if=/dev/cdrom of=backup.iso bs=65536 conv=noerror

Записать ISO-образ «image.iso» на устройство sdb вместе с его загрузочным сектором и форматированием раздела в файловую систему образа (как правило, ISO 9660 или UDF):

    dd if=image.iso of=/dev/sdb

Работа с файлами

Скопировать файл foo в файл bar:

    dd if=foo of=bar

Скопировать файл foo в файл bar, пропустив первые 10 КБ из файла foo:

    dd if=foo of=bar bs=1k skip=10

Порезать 10-мегабайтный файл foo на 2 по 5 МБ:

    dd if=foo of=bar.0 bs=1M count=5
    dd if=foo of=bar.1 bs=1M skip=5

Склеить четыре 100-мегабайтных файла в один:

    dd if=SMILE.001 of=SMILE  bs=1M seek=
    dd if=SMILE.002 of=SMILE  bs=1M seek=100
    dd if=SMILE.003 of=SMILE  bs=1M seek=200
    dd if=SMILE.004 of=SMILE  bs=1M seek=300

а можно и так:

    dd if=SMILE.001 > SMILE
    dd if=SMILE.002 >> SMILE
    dd if=SMILE.003 >> SMILE
    dd if=SMILE.004 >> SMILE

или же (для сбора файла из большого количества кусков):

    for i in {1..4}; do 
        dd if=SMILE.00$i >> SMILE
    done

Примеры выше показывают возможности dd; на практике, обычно, используется cat:

    cat SMILE.00{1,2,3,4} >> SMILE

Вывести на экран (в /dev/stdout) первые 256 байт файла foo:

    dd if=foo of=/dev/stdout bs=128 count=2

или:

    dd if=foo bs=128 count=2

Предыдущая команда годится только для просмотра текстового файла. Содержимое бинарного файла рекомендуется смотреть так:

    dd if=foo bs=1 count=10 2>/dev/null | hexdump

Резервное копирование и удаление данных

В большинстве случаев следует быть внимательным, чтобы файл назначения не оказался на том же самом диске, с которого снимается образ.

Скопировать один раздел жёсткого диска на другой жёсткий диск, игнорируя ошибки ввода-вывода:

    dd if=/dev/sda1 of=/dev/sdb2 bs=4096 conv=noerror,sync

Сделать копию главной загрузочной записи (MBR) первого жёсткого диска:

    dd if=/dev/hda of=bootloader.mbr bs=512 count=1

Заполнить всё свободное место в текущем разделе нулями:

    dd if=/dev/zero of=zerofill

Создать сжатый образ первого жёсткого диска со всеми разделами (рекомендуется сначала заполнить свободное место нулями для лучшего сжатия):

    dd if=/dev/sda | xz -9 > MyFuBu.ISO.XZ

Cоздать разбитый на отрезки по 2Gb образ первого жёсткого диска со всеми разделами (со сжатием и без):

    dd if=/dev/sda | xz -9 | split -b 2G --additional-suffix=.xz - MyFuBu.iso.

    dd if=/dev/sda | split -b 2G --additional-suffix=.iso - MyFuBu.

Просмотреть содержимое главной загрузочной записи (MBR) первого жёсткого диска:

    dd if=/dev/sda bs=512 count=1 | hexdump -C

Копировать всё, кроме метки, с диска на магнитную ленту:

    (dd bs=4k skip=1 count= && dd bs=512k) <$disk >$tape

Копировать всё, не перезаписывая метку, с магнитной ленты на диск:

    (dd bs=4k seek=1 count= && dd bs=512k) <$tape >$disk

Уничтожить содержимое устройства /dev/sdg, заполнив его «нулями» из /dev/zero:

    dd if=/dev/zero of=/dev/sdg bs=65536

Узнать статус выполнения операции:

    killall -USR1 dd

В некоторых случаях статус выполнения просматривается командой:

    pkill -USR1 -x dd

В последних версиях статус выполнения можно выводить в консоль, задав команду dd с параметром status=progress

    dd if=image.iso of=/dev/sdb status=progress

Вступительное тестирование

Тест № ФКТ-421 Архитектура UNIX

  • Пользовательская учетная запись (УЗ). Атрибуты пользовательской УЗ UNIX. Команды изменения
    атрибутов УЗ.
  • Первичная и дополнительные группы пользователей.
  • Дерево каталогов UNIX. Файловые системы и их монтирование в дерево каталогов. Команды управления деревом каталогов UNIX.
  • Типы файлов. Структура дерева каталогов UNIX. Команды управления файлами.
  • Владельцы файлов. Права доступа к файлу. Дополнительные атрибуты файла. Команды изменения атрибутов файлов.
  • Процессы. Типы процессов. Атрибуты процесса.
  • Жизненный путь процесса. Сигналы. Команды управления процессами.
  • Подсистема управления заданиями. Команды управления заданиями.
  • Парадигма ввода-вывода UNIX. Команды управления вводом и выводом данных.
  • Пользовательское окружение. Командный интерпретатор.
  • Пользовательский профиль. Настройка окружения командного интерпретатора. Переменные окружения.
  • Локализация и интернационализация окружения.
  • Основные утилиты UNIX.
  • Графический интерфейс UNIX. Настройка окружения графической подсистемы UNIX.

Тест № ВПТ-217 Навыки программирования на языке С и навыки использования основных API ОС UNIX.

Навыки программирования на языке С:
Знание синтаксиса языка С.
Умение компилировать программы, написанные на языке С.
Знания и умения реализовать алгоритмы обработки следующих структур данных:

  • массивы и ассоциативные массивы (хэши);
  • очереди и стеки;
  • односвязные и двусвязные линейные списки;
  • структуры и массивы структур;

Навыки использования основных API ОС UNIX:Основные инструменты разработки;
Интерфейс файловой системы;
Интерфейс сигналов;

Тематический план

Модуль 1. Операционная система UNIX: Основные стандарты.

  • ANSI C
  • POSIX.1 (IEEE 1003.1-1988, IEEE 1003.1-1990), POSIX.1b (IEEE 1003.4-1993), POSIX.1c (1003.5-1995)
  • X/Open (XPG3, XPG4)

Модуль 2. Среда программирования

  • Программы и процессы UNIX
  • Библиотечные и системные вызовы UNIX и их заглушки.
  • Основные библиотеки UNIX и их заголовочные файлы
  • Процесс создания исполняемого файла. Динамическая и статическая компоновка
  • Формат ELF. Структура объектного и исполняемого файла
  • Позиционно-независимый код. Структура разделяемой библиотеки.

Модуль 3. Инструменты разработчика.

  • Компилятор языка C (cc).
  • Препроцессор языка C (cpp).
  • Компоновщик объектных модулей (ld). Просмотрщик зависимостей динамической компоновки (ldd).
  • Архиватор библиотек (ar)
  • Система управления сборкой (make). Синтаксис makefile.
  • Просмотровщики содержимого объектных и исполняемых файлов (objdump, nm, readelf).
  • Утилита очистки объектных и исполняемых файлов (strip).
  • Символьный отладчик (gdb).

Модуль 4. Средства автоматизации процесса разработки и сопровождения программы

  • Утилита automake
  • Утилита autoconf
  • Система контроля версий CVS
  • Среда разработки KDevelop

Модуль 5.Стандартная библиотека ANSI C

  • Стандартная библиотека ввода-вывода
  • Функции манипулирования строковыми данными.
  • Функции манипулирования областями памяти.
  • Функции управления динамически выделяемой памятью.

Модуль 6. Интерфейс файловой системы

  • Открытие и закрытие файлов.
  • Чтение и запись в файл.
  • Совместное использование и блокировка файлов.
  • Создание, удаление и установка атрибутов файлов и каталогов.
  • Создание жёстких и символических ссылок.

Модуль 7.Сигналы

  • Концепция и виды сигналов
  • Обработчики сигналов
  • Надёжные и ненадёжные сигналы и их семантика.
  • Функции управления сигналами.

Модуль 8. Среда окружения и управление процессами

  • Порождение и завершение процессов.
  • Аргументы командной строки. Функция getopt.
  • Переменные окружения. Функции getenv и setenv
  • Управление процессами. Семейство функций fork и exec
  • Управление дочерними процессами. Семейство функций wait.

Модуль 9. Средства межпроцессного взаимодействия

  • Неименованные каналы
  • Очереди
  • Разделяемая память и семафоры

Модуль 10. Создание пользовательских интерфейсов

  • Конфигурирование терминального ввода-вывода
  • Интерфейс командной строки. Библиотека readline.
  • Псевдографический интерфейс. Библиотека libncurses.

Модуль 11. Стандартные решения для типовых задач. Библиотека glib

  • Типы данных, используемые в glib.
  • Функции и утилиты, предоставляемые glib.

Решение проблем

Добавление модулей в черный список

Иногда udev может ошибочно загружать неправильные модули ядра. Чтобы избежать этого, добавьте такие модули в . Если модуль находится в чёрном списке, udev будет игнорировать его как при загрузке, так и при более позднем «горячем» подключении внешнего устройства (например, USB-носителя).

Отладочная печать

Если задать параметр ядра , то аппаратное обеспечение будет выдавать отладочную информацию. Другой способ — задать параметр

/etc/udev/udev.conf
udev_log="debug"

Чтобы добавить эту опцию в initramfs, укажите файл настроек udev в строке

/etc/mkinitcpio.conf
FILES="... /etc/udev/udev.conf"

после чего новый загрузочный образ.

udevd вылетает при загрузке

После миграции на LDAP или обновления системы, использующей LDAP, udevd может начать аварийно завершаться в момент загрузки системы с сообщением «Starting UDev Daemon». Обычно это происходит потому, что udevd пытается определить имя через LDAP, но не может, так как в этот момент еще не установлено подключение к сети.

Необходимо, чтобы все используемые в LDAP группы были продублированы локально. Получить имена групп, используемых в правилах udev, и имена групп, присутствующих в системе, можно командами:

# grep -Fr GROUP /etc/udev/rules.d/ /usr/lib/udev/rules.d/ | sed 's:.*GROUP="\(\{1,\}\)".*:\1:' | sort -u >udev_groups
# cut -d: -f1 /etc/gshadow /etc/group | sort -u >present_groups

Вывод будет записан в файлы и . Чтобы увидеть различия, выполните построчное сравнение командой diff:

# diff -y present_groups udev_groups
...
network							      <
nobody							      <
ntp							      <
optical								optical
power							      |	pcscd
rfkill							      <
root								root
scanner								scanner
smmsp							      <
storage								storage
...

В данном примере группа по какой-то причине отсутствует в системе. Все такие группы необходимо . Также убедитесь, что имена всех локальных ресурсов разрешены, прежде чем возвращаться к LDAP. Файл должен содержать следующую строку:

group: files ldap

Устройство является съемным, однако не признается таковым

Создайте правило udev для конкретного устройства. Чтобы получить подробную информацию об устройстве вы можете либо использовать , либо (не забудьте поменять если нужно):

$ udevadm info /dev/sdb | grep ID_SERIAL

Теперь создайте файл правила в и установите переменные либо для udisks, либо для udisks2.

Для udisks установите , которая пометит все устройства как съёмные, и, таким образом, подходящие для автоматического монтирования. Подробнее см. .

/etc/udev/rules.d/50-external-myhomedisk.rules
ENV{ID_SERIAL_SHORT}=="серийный_номер", ENV{UDISKS_SYSTEM_INTERNAL}="0"

Для udisks2 установите , чтобы пометить устройство для автоматического монтирования и , чтобы пометить устройство как съёмное. Подробнее см.

/etc/udev/rules.d/99-removable.rules
ENV{ID_SERIAL_SHORT}=="серийный_номер", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"

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

Проблемы с автоматической загрузкой модулей аудиоустройств

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

Примечание: Начиная с версии udev 171, модули эмуляции OSS (, и ) больше не загружаются автоматически.

Поддержка дисководов IDE

Начиная с версии 170, udev не поддерживает устройства CD-ROM/DVD-ROM, загружаемые как обычные IDE дисководы модулем и отображаемые в системе как . Дисковод доступен только программам, которые обращаются к устройству напрямую, таким как cdparanoia, но невидим для более высокоуровневых программ, таких как KDE.

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

Оптические дисководы имеют неверный group ID

Если значение group ID вашего дисковода установлено как , но вы хотите, чтобы оно было , вам следует создать такое правило:

/etc/udev/rules.d
# permissions for IDE CD devices
SUBSYSTEMS=="ide", KERNEL=="hd", ATTR{removable}=="1", ATTRS{media}=="cdrom*", GROUP="optical"

# permissions for SCSI CD devices
SUBSYSTEMS=="scsi", KERNEL=="s*", ATTRS{type}=="5", GROUP="optical"

Tools

Bootloaders

  • Bootloader theory
  • GRUB
  • LILO
  • XOSL
  • System Commander
  • Boot Magic
  • Rolling Your Own Bootloader

Compilers

  • GCC
    • Cygwin
    • MinGW
    • Dev-C++
    • DJGPP
    • Building a GCC Cross-Compiler
    • Cross-Compiler Successful Builds
    • Porting GCC to your OS
  • Calling Conventions

    System V ABI

  • Watcom C/C++
  • Visual Studio

    Visual C++ Runtime

  • TCC
  • Smaller C
  • Other Compilers

Assemblers

  • GAS (GNU as, part of binutils)
  • FASM
  • NASM
  • YASM
  • On the difference between AT&T and Intel Opcode syntax

Linkers

  • LD (GNU ld, part of binutils)
  • Link Archiver (GNU ar, part of binutils)

Emulators

  • Bochs
  • QEMU
  • Virtual PC
  • VMware
  • VirtualBox
  • SimICS

Working with Disk Images

  • Disk Images in general, and …
    • Loopback Device for Linux, *BSD et al.
    • hdiutil for MacOS X
    • Windows Tools

Что находится в структуре struct dirent?

Стандарт POSIX 1003.1 определяет только один необходимый элемент структуры – массив элементов типа с именем . Это имя элемента каталога в виде стандартной NUL-завершенной строки. Все остальное в этой структуре зависит от конкретной UNIX-системы.

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

Например, многие UNIX-системы содержат поле и несколько дополнительных констант, которые позволяют узнать тип элемента каталога без вызова функции . Кроме избавления от необходимости лишний раз вызывать функцию это непереносимое расширение позволяет избежать занимающего много ресурсов запроса к файловой системе за подробными метаданными. Функция на большинстве UNIX-систем работает медленно.

Аннотация

Одна из самых высокопереносимых и масштабируемых систем – операционная
система UNIX, применяется на сегодняшний момент практически во всех сферах
информационных приложений: от настольных приложений до крупнейших вычислительных
центров. На базе этой операционной системы были созданы известнейшие интерфейсы
прикладного программирования для переносимой вычислительной среды POSIX, которые
по праву могут считаться стандартами де-факто для создания современного
переносимого программного обеспечения.

В рамках данного курса даются базовые знания по известнейшим стандартам
POSIX, cтандартам языка C, а также интерфейсам прикладного программирования
(API) UNIX-подобных систем

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

Знания и умения, полученные в результате обучения

После окончания данного курса слушатели будут обладать знаниями по следующим
направлениям:

  • Основные стандарты языка С, операционной системы UNIX и интерфейса
    переносимой операционной системы POSIX;
  • Стандартные библиотеки языка С;
  • Интерфейсы прикладного программного обеспечения (API) POSIX и UNIX.
  • Методы создания системного программного обеспечения UNIX.
  • Методы создания распределенного программного обеспечения.

К числу полученных практических навыков, полученных после окончания данного
курса следует отнести:

Умение грамотно создавать и поддерживать программные проекты в среде
разработки UNIX систем.

Introduction

Basic Information

  • Introduction
  • Required Knowledge
  • Beginner Mistakes
  • Getting Started
  • How To Ask Questions
  • GCC Cross-Compiler
  • What order should I make things in?
  • Licensing
  • Tutorials
  • Frequently Asked Questions

Environment

  • How kernel, compiler, and C library work together
  • Interrupt Service Routines
  • Using other Languages than C
  • UEFI and legacy BIOS (PC)
  • Inline Assembly (including examples)
  • Object Files and relocation

Bare Bones / Baby Steps

  • Bare Bones (C and C++)
  • Ada Bare bones
  • D Bare Bones
  • Pascal Bare Bones
  • FreeBasic Bare Bones
  • The BabyStep Tutorial

Example OS Organization

Meaty Skeleton

Booting and Setup

  • Boot Sequence
  • Diskless Booting
  • The Global Descriptor Table and a GDT Tutorial
  • Interrupts
  • Getting Keyboard Input

Testing and Debugging

  • Troubleshooting
  • Testing
  • Unit Testing
  • How Do I Use A Debugger With My OS
  • Kernel Debugging

Development

  • Going Further on x86
  • Creating an Operating System
  • Code Management

Compiler Development

Design Considerations

Kernel Models

  • Monolithic Kernel
  • Microkernel
  • Exokernel and related models
  • Modular Kernel

Task Models

  • Monotasking Systems
  • Multitasking Systems
  • Real-Time Systems

Memory and Resource Management

  • Memory management — Overview and Introduction
  • Segmentation
  • Paging
  • Memory Allocation
  • Page Frame Allocation
  • Memory Management Unit, or in-depth description of recursive mappings
  • File Management
  • File Systems

System Calls

ARM System Calls

Scheduling

  • Processes and Threads
  • Context Switching
  • Scheduling Algorithms
  • Multiprocessor Scheduling
  • Blocking Process — processes sleeping and waiting

Process Sychronization

  • Synchronization Primitives — Semaphores, mutexes, spinlocks et al.
  • Signals

Inter-Process Communication

  • Message Passing
  • Shared Memory
  • RPC — Remote procedure calls
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector