preferable way to control kernel module
Sergey Uvarov
uvarovsl at mail.pnpi.spb.ru
Thu Aug 11 17:50:06 GMT 2005
John Baldwin wrote:
> On Thursday 11 August 2005 12:16 pm, Dirk GOUDERS wrote:
>
>> > > Thank you for advise. But I wonder: what is wrong with syscall
>> > > approach (via SYSCALL_MODULE macro)?
>> >
>> > I just haven't done one personally. I think there's also a lot more
>> > potenti al
>> > for collisions when trying to pick a syscall number versus picking a
>> > string name for a sysctl or /dev entry.
>>
>>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, ...);
More information about the freebsd-hackers
mailing list