|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Dmitry Fedorov 2:5020/400 09 Jun 2001 09:09:14 To : Eugeni Dodonov Subject : Re: kernel sockets -------------------------------------------------------------------------------- Eugeni Dodonov wrote: > >Hе знает ли кто-нибудь как работать с сокетами в кернеле? В ядре есть функция >sys_socket(), которая экивалентна glibc'овскому socket(), но эта >функция заботает только из самого ядра, из модуля ее использовать >невозможно (насколько я понял). Мне же необходимо использовать ее >именно из модуля... Для вызова системного вызова из модуля на примере sys_write: /* <linux/df/sys_write.h */ #ifndef _LINUX_DF_SYS_WRITE_H # define _LINUX_DF_SYS_WRITE_H # ifdef MODULE # include <asm/unistd.h> /* system call numbers, __NR_write */ # include <linux/types.h> /* size_t, ssize_t */ extern inline ssize_t sys_write(uint fd, const char* userbuf, size_t count) { typedef ssize_t (*sys_write_ptr_t)(uint, const char*, size_t); extern void* sys_call_table[]; return ((sys_write_ptr_t)sys_call_table[__NR_write]) (fd, userbuf, count); } # endif /* MODULE */ #endif /* _LINUX_DF_SYS_WRITE_H */ А вот, собственно, вызов: # include <linux/sched.h> /* asm/processor.h does not includes all of needed headers */ # include <asm/processor.h> /* mm_segment_t */ # include <linux/uaccess.h> /* get_fs, set_fs, KERNEL_DS */ # include <linux/df/sys_write.h> ssize_t write_from_kernel(uint fd, const char* buf, size_t len) { ssize_t rc; mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); rc=sys_write(fd, buf, len); set_fs(old_fs); return rc; } Трюк с get/set_fs совершенно законен и переносим. >Большая просьба: если будете отсылать к TFM, то ткните носом... Hекуда -- Eсли уж гайка есть, она должна быть затянута до конца. --- ifmail v.2.15dev5 * Origin: INP (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/88438fe53cbf.html, оценка из 5, голосов 10
|