LINUX.ORG.RU

extern в ядро, как ?


0

0

Есть модуль, в нём есть фнкции, которые надо вызывать из аппликухи, для управления этим модулем. Я так понял (ну и конечно проверил) что просто написать:

extern some_fuck_func(some_fuck_arg)

не прокатит, линковщик материться, как и должен, на андефайн.

Вот собсно потому и вопрос, что делать, может как то надо мэйк файл подправить или ещё что?!

Пы.Сы. прошу не предлагать делать девайс для модуля ;)

Зваранее спасибо!!!

★★★★★

никак.

надо создать устройство и через него общаться.

anonymous
()

>Пы.Сы. прошу не предлагать делать девайс для модуля ;)

а может просто файл в проц??? так многие делают

а может unix-socket???

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

возможно через файлы /proc/sys/net/ipv4/*

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

> возможно через файлы /proc/sys/net/ipv4/*

неа, походу это ядерные фичи, но не от иптаблеса.

> а может просто файл в проц??? так многие делают

а это как, можно поподробнее

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

>> а может просто файл в проц??? так многие делают

>а это как, можно поподробнее

модуль при старте создаёт файл /proc/cyclon_module/module.ctrl

далее если юзерспейс приложение хотит узнать статус модуля она читает етот файл через read(). если хотит изменить состояние модуля пишет в файл через write(). на вскидку так делает alsa && afs.

а вообще для чего существет strace???? ;-))

запусти iptables через strace и посмотри что происходит.

а нет так ждём idle || murr

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

# strace iptables -L
execve("/usr/sbin/iptables", ["iptables", "-L"], [/* 80 vars */]) = 0
uname({sys="Linux", node="dell", ...})  = 0
brk(0)                                  = 0x8053000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=128959, ...}) = 0
old_mmap(NULL, 128959, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
close(3)                                = 0
open("/lib/libdl.so.2", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0\f\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=10480, ...}) = 0
old_mmap(NULL, 12392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x40038000
madvise(0x40038000, 12392, MADV_SEQUENTIAL|0x1) = 0
old_mmap(0x4003a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x4003a000
close(3)                                = 0
open("/lib/libnsl.so.1", O_RDONLY)      = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 5\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=75048, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4003c000
old_mmap(NULL, 83968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4003d000
madvise(0x4003d000, 83968, MADV_SEQUENTIAL|0x1) = 0
old_mmap(0x4004e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x4004e000
old_mmap(0x40050000, 6144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40050000
close(3)                                = 0
open("/lib/tls/libc.so.6", O_RDONLY)    = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0pO\1\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1201648, ...}) = 0
old_mmap(NULL, 1150108, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x40052000
madvise(0x40052000, 1150108, MADV_SEQUENTIAL|0x1) = 0
old_mmap(0x40165000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x113000) = 0x40165000
old_mmap(0x40169000, 7324, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40169000
close(3)                                = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4016b000
mprotect(0x40165000, 4096, PROT_READ)   = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0x4016b6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0x40018000, 128959)              = 0
socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 3
getsockopt(3, SOL_IP, 0x40 /* IP_??? */, 0xbfffeeb0, 0xbfffeeac) = -1 ENOPROTOOPT (Protocol not available)
close(3)                                = 0
open("/proc/sys/kernel/modprobe", O_RDONLY) = 3
brk(0)                                  = 0x8053000
brk(0x8074000)                          = 0x8074000
read(3, "/sbin/modprobe\n", 1024)       = 15
close(3)                                = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x4016b708) = 24759
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24759
--- SIGCHLD (Child exited) @ 0 (0) ---
socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 3
getsockopt(3, SOL_IP, 0x40 /* IP_??? */, "filter\0\10\0100\5\10\0\210\26@\364o\26@\0\210\26@\010"..., [84]) = 0
getsockopt(3, SOL_IP, 0x41 /* IP_??? */, "filter\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., [656]) = 0
fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000
write(1, "Chain INPUT (policy ACCEPT)\n", 28Chain INPUT (policy ACCEPT)
) = 28
write(1, "target     prot opt source      "..., 62target     prot opt source               destination
) = 62
write(1, "\n", 1
)                       = 1
write(1, "Chain FORWARD (policy ACCEPT)\n", 30Chain FORWARD (policy ACCEPT)
) = 30
write(1, "target     prot opt source      "..., 62target     prot opt source               destination
) = 62
write(1, "\n", 1
)                       = 1
write(1, "Chain OUTPUT (policy ACCEPT)\n", 29Chain OUTPUT (policy ACCEPT)
) = 29
write(1, "target     prot opt source      "..., 62target     prot opt source               destination
) = 62
close(3)                                = 0
munmap(0x40018000, 4096)                = 0
exit_group(0)                           = ?

Похоже используются сокеты? Поправь если не так. Хотя по мне проще реализовать prос.

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

я просто не понял что значит "проц" мне показалось это сокращение от "процессор" а не proc вот и стормозил потому :)

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

>Похоже используются сокеты? Поправь если не так. Хотя по мне проще реализовать prос.

навряд.

надо отследить чем занимается ребёнок.

обрати внимание на clone() && waitpid()

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

Ни clone() ни waitpid() в исходниках иптаблеса не нашёл (я имею ввиду фронтэнд а не модуль :) ). Только wait(&status), да и тот находится в фунции для загрузки модуля.

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

>Только wait(&status), да и тот находится в фунции для загрузки модуля.

clone() находится рядом.

я здесь не большой спец. посмотри ещё на mmap(MAP_FIXED) - возможно они лезут в память ядра а так ждём idle && murr

cvv ★★★★★
()

в принципе, вам уже все сказали.

заводите устройство, или создавайте файл в /proc,/sysfs,
или socket.

конткретно netfilter работает (на 100% не уверен, а смотреть
внимательно лень) через setsockopt(SOL_IP)

net/ipv4/ip_sockglue.c:ip_setsockopt()
...
        default:
#ifdef CONFIG_NETFILTER
                err = nf_setsockopt(...)

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

Если не сложно то можно дать ссылочку на предмет создания файлов в proc, ну или какой ман почитать, ну или примерчик. И сюда же, а через файлы прок можно передавать и читать любые типы данных или только что то простое, по типу интеджеров? Просто надо передавать и считывать сложные структуры.

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

> передавать и читать любые типы данных или только что то
> простое, по типу интеджеров?

если вы можете передать int, вы можете передать
указатель. если вы можете передать указатель, вы
можете передать что угодно.

ссылок я не знаю, но создать файл в /proc легко:
fs/proc/generic.c:create_proc_entry().

эта функция вернет вам struct proc_dir_entry, а
в ней есть struct file_operations * proc_fops.
переопределяйте методы и делайте что вам нужно.
проще всего через ->ioctl().

NOTE: если вы просто хотите поэксперементировать
или поиграться, вы можете вставить hook в какой-
нибудь вызов, напр. в sys_prctl, я так часто делаю.

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

Ну я уже отметил что нашёл доку :) вообщем тут походу действительно проше юзать девайс и ioctl, так что я остановлюсь на этом, ну может потом попробую что то новое.

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

Да, иптаблес насколько я помню используют сокеты, setsockopt.. Если я ничего не путаю.. Но, блин сам подумай.. если в ядерном модуле будет что-то определенное как extern то оно будет extern только для ядра.. при чем туту юзерспейс? или я чего-то недогоняю?

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

Пардон, а не подскажите, какие хидеры нужны для того что бы заюзать ioctl и всё связанное. Просто там же надо заполнять структуру struct file_operations, а мало того что в разных примерах оно по разному, так ещё и все под 2.4.

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

ТО OxiD:

нее, обьявлять экстерн и описание функции вроде надо в проге, а ядро по идее должно выполнять роль либы.

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

Всё разобрался. Вот только получится юзать read и write, а вот получить указатель на структуру или ещё что не получится, поскольку, по скольку по моему скромному мнению, это повалит либо прогу либо модуль, т.к. апликуха попытается обратиться к памяти ядра, что не допустимо.

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

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

copy_to_user(), copy_from_user()

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

>по скольку по моему скромному мнению, это повалит либо прогу либо модуль, т.к. апликуха попытается обратиться к памяти ядра

во первых это допустимо

во вторых вполне допустимо из ядра обратится к памяти аппликухи

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

Ну то что можно обратиться к памяти проги в этом не сомневался, а вот с обратным, как то я сомневался.

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

если точнее то по словам idle при помощи mmap(MAP_FIXED) а также mmap(/dev/kmem) естественно от рута

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