diff --git a/.github/workflows/vtkm.yml b/.github/workflows/vtkm.yml new file mode 100644 index 0000000..5c0452e --- /dev/null +++ b/.github/workflows/vtkm.yml @@ -0,0 +1,25 @@ +name: Test VT Kernel Module + +on: + push: + branches: + - main + pull_request: + paths: + - 'lab/vtkm/**' + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./lab/vtkm + steps: + - uses: actions/checkout@v4 + - name: Clang Format + run: | + find . -path ./build -prune -o \ + \( -iname '*.c' -o -iname '*.h' -o -iname '*.cpp' -o -iname '*.hpp' \) \ + -exec clang-format --style=file --dry-run --verbose {} \; + - name: Build + run: make diff --git a/lab/vtkm/.clang-format b/lab/vtkm/.clang-format new file mode 100644 index 0000000..dd99110 --- /dev/null +++ b/lab/vtkm/.clang-format @@ -0,0 +1,16 @@ +BasedOnStyle: Google + +AccessModifierOffset: -2 + +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false + +DerivePointerAlignment: false +BreakConstructorInitializers: BeforeComma +AlignAfterOpenBracket: BlockIndent + +BinPackArguments: false +BinPackParameters: false + +AlignArrayOfStructures: Right diff --git a/lab/vtkm/.clang-tidy b/lab/vtkm/.clang-tidy new file mode 100644 index 0000000..cb95dc5 --- /dev/null +++ b/lab/vtkm/.clang-tidy @@ -0,0 +1,53 @@ +--- +Checks: '-*, + readability-*' +HeaderFileExtensions: + - h +ImplementationFileExtensions: + - c +HeaderFilterRegex: '' +FormatStyle: '.clang-format' +SystemHeaders: false +CheckOptions: + - key: readability-identifier-naming.ClassCase + value: lower_case + - key: readability-identifier-naming.ClassMemberCase + value: lower_case + - key: readability-identifier-naming.ConstexprVariableCase + value: lower_case + - key: readability-identifier-naming.EnumCase + value: lower_case + - key: readability-identifier-naming.EnumConstantCase + value: lower_case + - key: readability-identifier-naming.FunctionCase + value: lower_case + - key: readability-identifier-naming.GlobalConstantCase + value: lower_case + - key: readability-identifier-naming.StaticConstantCase + value: lower_case + - key: readability-identifier-naming.StaticVariableCase + value: lower_case + - key: readability-identifier-naming.MacroDefinitionCase + value: UPPER_CASE + - key: readability-identifier-naming.MacroDefinitionIgnoredRegexp + value: '^[A-Z]+(_[A-Z]+)*_$' + - key: readability-identifier-naming.MemberCase + value: lower_case + - key: readability-identifier-naming.PrivateMemberSuffix + value: '_' + - key: readability-identifier-naming.PublicMemberSuffix + value: '' + - key: readability-identifier-naming.NamespaceCase + value: lower_case + - key: readability-identifier-naming.ParameterCase + value: lower_case + - key: readability-identifier-naming.TypeAliasCase + value: lower_case + - key: readability-identifier-naming.TypedefCase + value: lower_case + - key: readability-identifier-naming.TypedefCaseSuffix + value: '_t' + - key: readability-identifier-naming.VariableCase + value: lower_case + - key: readability-identifier-naming.IgnoreMainLikeFunctions + value: 1 diff --git a/lab/vtkm/.gitignore b/lab/vtkm/.gitignore new file mode 100644 index 0000000..9ff45b6 --- /dev/null +++ b/lab/vtkm/.gitignore @@ -0,0 +1,18 @@ +# Linux kernel module +*.mod.cmd +*.mod.o.cmd +*.ko.cmd +*.o.cmd +*.ko +*.mod +*.mod.c +*.mod.o +*.o +.Module.symvers.cmd +.modules.order.cmd +Module.symvers +modules.order + +# Clangd +compile_commands.json +.cache/ diff --git a/lab/vtkm/Makefile b/lab/vtkm/Makefile new file mode 100644 index 0000000..355c262 --- /dev/null +++ b/lab/vtkm/Makefile @@ -0,0 +1,12 @@ +obj-m += src/vtkm.o + +PWD := $(CURDIR) +KDIR = /lib/modules/`uname -r`/build +EXTRA_CFLAGS = -Wall -g + +all: + make -C $(KDIR) M=$(PWD) modules + +clean: + make -C $(KDIR) M=$(PWD) clean + rm -rf .cache diff --git a/lab/vtkm/README.md b/lab/vtkm/README.md new file mode 100644 index 0000000..14089d2 --- /dev/null +++ b/lab/vtkm/README.md @@ -0,0 +1,26 @@ +# Базовый трек. Лабораторная работа 3 + +## Задание + +Разработать комплекс программ на пользовательском уровне и уровне ярда, который собирает +информацию на стороне ядра и передает информацию на уровень пользователя, и выводит ее в +удобном для чтения человеком виде. Программа на уровне пользователя получает на вход +аргумент(ы) командной строки (не адрес!), позволяющие идентифицировать из системных таблиц +необходимый путь до целевой структуры, осуществляет передачу на уровень ядра, получает +информацию из данной структуры и распечатывает структуру в стандартный вывод. Загружаемый +модуль ядра принимает запрос через указанный в задании интерфейс, определяет путь до целевой +структуры по переданному запросу и возвращает результат на уровень пользователя. + +Интерфейс передачи между программой пользователя и ядром и целевая структура задается +преподавателем. Интерфейс передачи может быть один из следующих: +- `syscall` - интерфейс системных вызовов. +- `ioctl` - передача параметров через управляющий вызов к файлу/устройству. +- `procfs` - файловая система `/proc`, передача параметров через запись в файл. +- `debugfs` - отладочная файловая система `/sys/kernel/debug`, передача параметров через + запись в файл. + +Целевая структура может быть задана двумя способами: + +- Именем структуры в заголовочных файлах Linux +- Файлом в каталоге `/proc`. В этом случае необходимо определить целевую структуру по пути + файла в `/proc` и выводимым данным. diff --git a/lab/vtkm/src/vtkm.c b/lab/vtkm/src/vtkm.c new file mode 100644 index 0000000..b0667cd --- /dev/null +++ b/lab/vtkm/src/vtkm.c @@ -0,0 +1,23 @@ +#include +#include +#include + +#define MODULE_NAME "vtkm" + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("secs-dev"); +MODULE_DESCRIPTION("A simple kernel module"); + +#define LOG(fmt, ...) pr_info("[" MODULE_NAME "]: " fmt, ##__VA_ARGS__) + +static int __init vtkm_init(void) { + LOG("VTKM joined the kernel\n"); + return 0; +} + +static void __exit vtkm_exit(void) { + LOG("VTKM left the kernel\n"); +} + +module_init(vtkm_init); +module_exit(vtkm_exit);