preferable way to control kernel module
Dirk GOUDERS
gouders at et.bocholt.fh-ge.de
Thu Aug 11 18:12:10 GMT 2005
> >>Shouldn't that be no problem if he sets the offset parameter to
> >>SYSCALL_MODULE to NO_SYSCALL (get the next free offset)?
> >
> >
> > But then you have to communicate the syscall number out to your userland
> > applications somehow, and the applications have to know how to invoke a
> > syscall by hand (perhaps they could use the syscall() function, but still)
> .
> >
> It is not a big problem. Look at the following piece of code:
>
>
> /* Kernel module portion of code. */
> static int my_syscall = NO_SYSCALL;
> static struct sysent my_sysent = {
> 2, /* sy_arg */
> (sy_call_t *)&my_func /* sy_call */
> };
> SYSCALL_MODULE(my_syscall_name, &my_syscall, &my_sysent,
> NULL, NULL);
>
>
> /* User-land portion of code. */
> int get_syscall(const char *syscall_name)
> {
> struct module_stat stat;
> int mod_id;
> int syscall_num;
>
> if ((mod_id = modfind(syscall_name)) < 0)
> return (-1);
>
> stat.version = sizeof(stat);
> if (modstat(mod_id, &stat) < 0)
> return (-1);
>
> return (stat.data.intval);
> }
>
> ...
>
> syscall_num = get_syscall("my_syscall_name");
>
> /* Issue a syscall with necessary parameters. */
> syscall(syscall_num, ...);
That is roughly what I accidently played with, today.
Don't know about the probability that there may be no free offset,
though.
Dirk
More information about the freebsd-hackers
mailing list