Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 May 2007 11:27:40 +0300
From:      Diomidis Spinellis <dds@aueb.gr>
To:        Sonja Milicic <tanarri@geri.cc.fer.hr>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: Writing to a file
Message-ID:  <457ABFA4-D793-4FD6-85E4-5CE380FE2CB9@aueb.gr>
In-Reply-To: <DBC9ED92-5A36-4D42-9572-3F5AC09BF538@aueb.gr>
References:  <463CCE1E.1080906@geri.cc.fer.hr> <DBC9ED92-5A36-4D42-9572-3F5AC09BF538@aueb.gr>

next in thread | previous in thread | raw e-mail | index | archive | help
On May 5, 2007, at 10:29 PM, Diomidis Spinellis wrote:
> On May 5, 2007, at 9:34 PM, Sonja Milicic wrote:
>> I'm working on an IO logging utility for FreeBSD as my GSoC  
>> project, and
>> I have some questions about writing a kernel functions that would  
>> open
>> an existing or create a new file (with the file name as a parameter,
>> returns a vnode * for the file) and write data to that file (with
>> pointer to data as parameter). I've found some functions in existing
>> code that do similar things and might help me understand how to  
>> solve my
>> problem, but as there isn't much documentation out there I still  
>> don't
>> understand a lot of things. So, could anyone please give me a  
>> detailed
>> explanation of how to open a file in kernel and write to it - best  
>> data
>> types to use, functions, what to look out for, maybe a link to  
>> tutorial
>> or manual that deals with this (if such a thing exists), etc.?
>
> A good strategy for dealing with such questions is to look for code  
> that does a task similar to the one you want to implement.  Two  
> kernel subsystems that come to my mind is the kernel logging  
> facility, which writes data to a user space process via a socket,  
> and the process accounting facility, which writes data to an  
> already opened file.  There are reasons (performance, flexibility)  
> why these two facilities have been designed in this way, and it  
> would be a good idea to see whether some of their design decisions  
> are also applicable to your problem.

Some clarifications on the above.  You can find the kernel-side of  
the accounting code at
/usr/src/sys/kern/kern_acct.c

acct opens an existing file for appending; acct_process (look for  
vn_rdwr) will write to that file.

Similarly, you can find the kernel-side of the system log code at / 
usr/src/sys/kern/subr_prf.c.  The userland client, which actually  
writes the message buffers to files, is at /usr/src/usr.sbin/syslogd.

In general, coding in the kernel environment is tricky.  You have to  
be careful with locking, many standard C facilities are missing, and  
bugs can bring down the entire system.  Therefore, it is often better  
to split complex tasks into two: a simple part in the kernel will  
communicate with a userland process, where you can put all the  
complexity.  Another example of this pattern is the routing code.

Diomidis Spinellis - http://www.spinellis.gr



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?457ABFA4-D793-4FD6-85E4-5CE380FE2CB9>