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