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)
Ответ на: комментарий от metawishmaster

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

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

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

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

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.