Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 kernel sockets   Eugeni Dodonov   09 Jun 2001 03:05:33 
 Re: kernel sockets   Dmitry Fedorov   09 Jun 2001 09:09:14 
 Re: kernel sockets   Eugeni Dodonov   09 Jun 2001 22:06:20 
 Re: kernel sockets   Dmitry Fedorov   10 Jun 2001 10:37:37 
 Re: kernel sockets   Eugeni Dodonov   10 Jun 2001 21:35:59 
 Re: kernel sockets   Dmitry Fedorov   11 Jun 2001 07:38:28 
 Re: kernel sockets   Eugeni Dodonov   11 Jun 2001 15:03:01 
 Re: kernel sockets   Dmitry Fedorov   11 Jun 2001 17:08:26 
Архивное /ru.linux/88438fe53cbf.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional