LINUX.ORG.RU

Получить список всех функций ядра

 ,


0

1

Нужно получить список всех функций ядра. Сделал так:

$ egrep -oh '^extern .* [a-z0-9_]* \(' /usr/include/x86_64-linux-gnu/sys/*.h | awk '{print $(NF-1)}' | wc -l
201
Что-то маловато. Так и должно быть?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

А в содержимое смотрел-то хоть? Там в половине файлов тупо ещё один #include.

Как насчёт такого варианта?

$ grep ' T ' /boot/System.map-$(uname -r) | awk '{print $3}' | wc -l
15704

ilammy ★★★
()
Ответ на: комментарий от CYB3R

ну, во-первых, _ потерян, но все-равно получится только ~197

дык, а что нужно? функции ядра нужно искать в исходниках ядра, а тут ищутся только системные (доступные из юзер-спейса)

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 1)
Ответ на: комментарий от metawishmaster

Добавил _. Ну, мне нужен список всех функций, которые можно дёрнуть. Но не просто список, а с параметрами.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Э-э-э... My best shot.

$ ls -1 /usr/include/x86_64-linux-gnu/sys/*.h   \
| awk '{print "#include <" $1 ">"}'             \
| gcc -E -o- -xc -                              \
| grep '^extern '                               \
| sed -e 's/^extern //'                         \
      -e ':loop'                                \
        -e 's/^unsigned //'                     \
        -e 's/^signed //'                       \
        -e 's/^long //'                         \
        -e 's/^struct //'                       \
        -e 's/^union //'                        \
      -e 't loop'                               \
| awk '{print $2}'                              \
| grep -v ';$'                                  \
| wc -l
444

ilammy ★★★
()
Ответ на: комментарий от ilammy

gcc

А, хитро.
Он ещё и ненужные хедеры отбрасывает:

/usr/include/x86_64-linux-gnu/sys/elf.h:22:3: error: #error This header is unsupported on x86-64.
 # error This header is unsupported on x86-64.
   ^
In file included from <stdin>:81:0:
/usr/include/x86_64-linux-gnu/sys/vm86.h:24:3: error: #error This header is unsupported on x86-64.
 # error This header is unsupported on x86-64.
   ^

CYB3R ★★★★★
() автор топика
Ответ на: а у меня только так... от metawishmaster

awk 'FS=":" {print $2}'

Почему-то у меня это некоторые строки корёжит. Хотя двоеточие в каждой строке только одно.
Но есть же ключ -h у grep.

$ grep -h "^extern [a-z_0-9]*" /usr/include/x86_64-linux-gnu/sys/*.h | wc -l
225
А сначала было всего 201...

CYB3R ★★★★★
() автор топика
Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от ilammy
$ ls -1 /usr/include/x86_64-linux-gnu/sys/*.h   \
| awk '{print "#include <" $1 ">"}'             \
| gcc -E -o- -xc -                              \
| grep -oP '^extern .*? [a-zA-Z0-9_*]+ \('      \
| awk '{print $(NF-1)}'                         \
| sed 's/^*//'                                  \
| wc -l
442

А ещё имена функций могут как бы начинаться со звёздочки для тех, кто возвращает указатели.

ilammy ★★★
()
Ответ на: комментарий от metawishmaster

И скобка там обязательна в регэкспе, а то попадают extern struct, которых там быть не должно.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от metawishmaster

тут ищутся только системные (доступные из юзер-спейса)

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

naszar
()
Ответ на: комментарий от naszar

Возможно, я использую неправильную терминологию. Меня интересуют функции типа mount, kill, mknod и всё линукс-специфичное.

CYB3R ★★★★★
() автор топика

При компиляции генерируется System.map, там есть все экспортируемые символы, еще можно сделать readelf на само ядро. Если грипать именно по исходникам, то можно вспомнить про макрос:

EXPORT_SYMBOL(alloc_anon_inode);
, так символ экспортируется, чтобы стать глобальным в контексте ядра. А если тебе нужен именно API системных вызовов, то тут проще - где-то в arch/<твоя_архитектура> есть хеадер ставящий в соответствие _sys_<...> функции номер системного вызова.

Можно сформировать список имен функций, а потом уже грипать в поисках именно прототипов, а не вызовов. Кстати очень быстро в это умеет git grep

А что ты конкретно хочешь, в чем задача?

Что-то маловато. Так и должно быть?

cat /boot/System.map|wc -l
70795

А столько хватит?

naszar
()
Ответ на: комментарий от CYB3R

А зачем? Просто, не проще посмотреть реализацию того-же mount в glibc и посмотреть какие она использует системные вызовы. Говорят напрямую вызывать ядро из своей программы - моветон.

naszar
()
Ответ на: комментарий от naszar

напрямую вызывать ядро из своей программы - моветон

Ладно, попробую найти обходной путь.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

libc и есть обходной путь, зачем его искать?

kvap
()
Ответ на: комментарий от CYB3R

Вообще непонятно, что именно тебе нужно, и ты не можешь это сформулировать. А вообще, посмотри, что можно вытянуть из LXR.

Krieger_Od ★★
()
Ответ на: комментарий от naszar

научи меня sys_exit() вызвать на x86, из юзерспэйса?


блин :)
тебе функции отдаются без sys_, так что пиши просто exit(). Не стоит благодарности.

зы: напрямую тоже можно, точки входа указаны в System.map, но это ай-ай-ай как плохо и, к тому же, в другом ядре может быть другой адрес у этого sys_exit()

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 1)
Ответ на: комментарий от naszar

как glibc вызывает, так и без неё в любой программе можно

есть ещё man syscall для того, что не имеет обёрток в glibc

anonymous
()
Ответ на: комментарий от metawishmaster

точки входа указаны в System.map

А когда это юзерспейсный процесс научился в пространство ядра?

так что пиши просто exit()

И glibc само вызовет исключение с номером соответствущего системного вызова НЕ ИМЕНЕМ.

naszar
()
Ответ на: комментарий от anonymous

Тут вопрос как с ядром слинковать пользовательский бинарник и вызывать функции по имени. Я думал что никак. А товарищ вот...

naszar
()
Ответ на: комментарий от metawishmaster

ты сам-то откуда это взял

Я написал:

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

Ты ответил:

здрасьте! я о этих (в дереве ядра) include/linux/syscalls.h функциях

Т.е. если тебе понадобилось ответить, то ты хотел сказать что я в чем-то неправ? В чем?

naszar
()
Последнее исправление: naszar (всего исправлений: 1)
Ответ на: комментарий от metawishmaster

Ну да, и я это и подразумевал под другим механизмом. Просто ты говоришь:

напрямую тоже можно, точки входа указаны в System.map, но это ай-ай-ай как плохо и, к тому же, в другом ядре может быть другой адрес у этого sys_exit()

я и подумал что ты имеешь в виду линковку.. а что ты этим хотел сказать?

naszar
()
Ответ на: комментарий от metawishmaster

с помощью прерывания 0x80

Афаик, там по возможности используется спец-инструкция sysenter, а прерывания оставлены в качестве фоллбека.

ilammy ★★★
()
Ответ на: комментарий от naszar

да эт уже _меня_ проглючило... :-\
последие две неделии вся голова в мыслях о ядре, причем не о нашем уютном, а о вражеском оффтопиковском ;(

// причем заказ на девайс, в конечном итоге, для горкорпорации, но они Linux еще не осилили, не смотря на все крики о «Российской ОС»/МСВС/AstraLinux. А NASA-блок МКС уже год как на Дебиане. Ну эт ладно... наболело просто %)

metawishmaster ★★★★★
()
Ответ на: комментарий от ilammy

спец-инструкция sysenter

В пользовательской программе не обязательно использовать sysenter и обвязку для нее. Готовый код отображается в пространство каждого процесса. Это вроде называется vsdo.

tlx ★★★★★
()
Ответ на: комментарий от naszar

да, забыл как это называлось и где читал, а когда не вспомнил, пошел на попятную :-\

но помню, что было сделано для увеличения производительности, и у оффтопика такого не было, и по-моему до сих пор нет
там еще много терок было на тему того, что System.map - гигантская дырка в безопасности, но это уже как-то обошли...

metawishmaster ★★★★★
()
Ответ на: комментарий от metawishmaster

p.s. кстати, от сюда же вытекает то, что при размере оперативки в 4Гига пользовательскому приложению будет доступно только 3Гб - 1 Гб мапится на ядро. Ну и, разумеется, это можно регулировать в ядре. В смысле, можно делать 3:1, 2:2, даже 1:3 %)

metawishmaster ★★★★★
()
Ответ на: комментарий от metawishmaster

при размере оперативки в 4Гига пользовательскому приложению будет доступно только 3Гб

Linux в отличие от форточек поддерживал PAE достаточно давно.

tlx ★★★★★
()
Ответ на: комментарий от metawishmaster

и у оффтопика такого не было, и по-моему до сих пор нет

Главное повторять эту мантру почаще, верить в исключительность линукса и есть мозоли на завтрак обед и ужин.

kike
()
Ответ на: комментарий от kike

малыш-кайк, на твою фигню отвечать - это до твоего уровня спускаться... если есть что сказать, так не говори голословно. пруф нужен.
я нашел пруф, вот тебе цитата: «So if application code running in user-mode (at privilege level 3) cannot call code running in kernel-mode (at privilege level 0) how do system calls in Windows NT work?». дальше рассказывают про Interrupt-gate. Андерстенд?

а следовательно, mein trottelig kind, мое «и у оффтопика такого не было, и по-моему до сих пор нет» можно/нужно заменить на «и у оффтопика такого не было, и до сих пор нет».

metawishmaster ★★★★★
()
Ответ на: комментарий от metawishmaster

Ути какие мы гордые. Не хотим до малышей опускаться. Хотим постить unrelated «пруфы».

vdso был введён для ускорения некоторых системных вызовов путём делания видимыми некоторых ядерных переменных в userspace, чтобы было возможно их прочитать не ныряя в ядро.

Аналогичный приём используется в Windows®™ начиная эдак с Windows®™ 95®™. Всего-то 20 лет.

kike
()
Ответ на: комментарий от kike

но почему-то никакого механизма кроме «System calls in Windows NT are initiated by executing an „int 2e“ instruction.» там не указано

metawishmaster ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.