Общий вопрос застрял у меня в голове, поэтому я решил добавить ответ о том, как мне найти произвольный идентификатор в ядре Linux.
Загрузите версию исходного кода ядра (или установите пакет исходного кода ядра Linux -вашего дистрибутива )и распакуйте его:
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.39.tar.xz
tar xf linux-4.9.39.tar.xz
cd linux-4.9.39
Создайте минимальный.config, чтобы сделать ядро компилируемым:
make menuconfig # just exit and save
Ключевой шаг:компиляция ядра с флагом -save-temps
gcc, чтобы оно сохраняло промежуточные файлы до -процессора:
make KCFLAGS=-save-temps
В процессе компиляции будут удалены *.i
файлы в текущем каталоге. Найдите любой файл, в котором определен идентификатор; Я выбрал здесь тот же идентификатор для простоты сравнения, но этот процесс будет работать для любого другого идентификатора; Я выбрал zbud.i только потому, что мне понравилось имя файла:
grep PageWriteback *.i
...
zbud.i:static inline __attribute__((no_instrument_function)) __attribute__((always_inline)) int PageWriteback(struct page *page) { return (__builtin_constant_p((PG_writeback)) ? constant_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags)) : variable_test_bit((PG_writeback), (&({ ((void)(sizeof(( long)(0 && PageCompound(page))))); page;})->flags))); }
...
Откройте файл для просмотра, прокрутите до нужного идентификатора, затем найдите в файле вверх/назад строку, начинающуюся с #
, чтобы увидеть, откуда пришло определение:
# 255 "./include/linux/page-flags.h"
, который указывает нам на тот же исходный файл, который Ник нашел до .
В качестве альтернативы вы можете выполнить поиск включаемых строк и/или идентификатора, а затем удалить все завершающие строки; последней строкой вывода будет файл, в котором был определен идентификатор:
grep -E '^# |PageWriteback' zbud.i | sed '/PageWriteback/,$d' | tail -n 1
...
# 74 "./include/linux/page-flags.h"
# 108 "./include/linux/page-flags.h"
# 255 "./include/linux/page-flags.h"
Начальное количество жестких ссылок равно 1 для файла и 2 для каталога (первая ссылка — его имя в родительской папке, а вторая жесткая ссылка — .
). Счетчик ссылок для каталога увеличивается на единицу каждый раз, когда в нем создается подкаталог (из-за ..
в каждом подкаталоге ).
Этот счет можно легко просмотреть с помощью ls -l
. Это второе значение. Смотри:
~/x$ ls -la
total 16
drwxr-xr-x 2 tomasz tomasz 4096 Sep 24 00:08.
drwxr-xr-x 54 tomasz tomasz 4096 Sep 24 00:11..
-rw-r--r-- 1 tomasz tomasz 19 Sep 23 18:45 1
-rw-r--r-- 1 tomasz tomasz 19 Sep 23 18:45 2
~/x$ mkdir d
~/x$ ls -la
total 20
drwxr-xr-x 3 tomasz tomasz 4096 Sep 24 00:11.
drwxr-xr-x 54 tomasz tomasz 4096 Sep 24 00:11..
-rw-r--r-- 1 tomasz tomasz 19 Sep 23 18:45 1
-rw-r--r-- 1 tomasz tomasz 19 Sep 23 18:45 2
drwxr-xr-x 2 tomasz tomasz 4096 Sep 24 00:11 d
~/x$ mkdir d/dd
~/x$ ls -la
total 20
drwxr-xr-x 3 tomasz tomasz 4096 Sep 24 00:11.
drwxr-xr-x 54 tomasz tomasz 4096 Sep 24 00:11..
-rw-r--r-- 1 tomasz tomasz 19 Sep 23 18:45 1
-rw-r--r-- 1 tomasz tomasz 19 Sep 23 18:45 2
drwxr-xr-x 3 tomasz tomasz 4096 Sep 24 00:11 d
Второе значение для d
увеличилось с 2 до 3 после создания в нем d/dd
.
См. комментарии mosvy ниже для более широкого обзора.