Re: Calling driver functions from kernel space

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sorry, I forget to add EXPORT_SYMBOL:

EXPORT_SYMBOL(mytestPath);

2009/11/11 Zhu Yanhai <zhu.yanhai@xxxxxxxxx>:
> I see, the linker was trying to link your function (which is in a
> module and invisible to make)
> try function pointer:
>
> in fs/readdir.c
>
> define a global func pointer: void (*mytestPath)();
> Then
> struct module *find_module(const char *YourDriverModuleName)
> if(module != NULL && mytestPath != NULL)
> {
>     mytestPath();
> }
>
> And then in your module:
>
> extern void (*mytestPath)();
>
> module_init()
> {
>    mytestPath=testPath;
> }
>
>
>
>
>
> 2009/11/11 Sam Carter <sam.w.carter@xxxxxxxxx>:
>> Sorry to ask again folks, but this is proving to be a nightmare.
>>
>> I need to call a function in a module I've made. I need to do this from the
>> file readdir.c in the kernel. At the moment, the module is a single file
>> which I've used insmod and rmmod to test. In it is the implementation of my
>> function 'testPath'. I also have a header file which has an empty
>> declaration of my function. The header file I have put in the fs/ directory
>> so it is in the same folder as the readdir.c file.
>>
>> So I'm lead to understand, in readdir.c, in the kernel, before compiling the
>> kernel, I need to add -
>> within fs/readdir.c
>> # include<YourCharDriver.H>
>>
>> at the top, under the existing include statements. In the same file, within
>> the syscall I'm modifying, I need to put -
>> struct module *find_module(const char *YourDriverModuleName)
>> if(module != NULL)
>> {
>>      testPath();
>> }
>>
>> This should test if my module is currently loaded, and if it is it will call
>> my testPath() function.
>>
>> Obviously I've used file names which actually reflect what my files are
>> called. The error happens when I try to compile the kernel with my changes
>> with a simple 'make'. Is that header file in the right place, and if it is,
>> then what would be causing the 'undefined reference to testPath, why am I
>> getting this when it all makes sense?
>>
>> Additionally, I've tried declaring the function as extern under the includes
>> in readdir.c, however this yields the same error. Although it seemingly
>> happens a little sooner into the kernel compilation procedure.
>>
>> Thanks again guys, all this help is appreciated!
>>
>> 2009/11/10 Pulkit Goel <vipulkit.goel@xxxxxxxxx>
>>>
>>> Hi,
>>> Mention at the top but after header file in readdir.c:::
>>>
>>> ..Heder file <>
>>> extern returntype YourDriverFunctionName(arg list);
>>> all other code..
>>>
>>>
>>>
>>> Regards:
>>> Pulkit Goel
>>> mail:vipulkit.goel@xxxxxxxxx
>>>
>>>
>>>
>>> On Tue, Nov 10, 2009 at 4:41 PM, Sam Carter <sam.w.carter@xxxxxxxxx>
>>> wrote:
>>>>
>>>> Hi again Pulkit, may I ask you where exactly the kernel code section of
>>>> your reply belongs? I've put the extern part into readdir.c, but I still get
>>>> an error that it can't find the line inside the if statement you mentioned.
>>>> Help is appreciated, thanks :)
>>>>
>>>> 2009/11/9 Pulkit Goel <vipulkit.goel@xxxxxxxxx>
>>>>>
>>>>> Hi,
>>>>>
>>>>> Add In Kernel Code::
>>>>>
>>>>> # include<YourCharDriver.H>
>>>>> OR
>>>>> extern YourDriverFunctionName();
>>>>>
>>>>> :::::from this Driver Function declaration Comes in Kernel Code
>>>>>
>>>>>
>>>>> Add In Driver Code::
>>>>>
>>>>> EXPORT_SYMBOL_GPL(YourDriverFunctionName);
>>>>>
>>>>> Calling Method in ""fs/readdir.c"" ::
>>>>>
>>>>> struct module *find_module(const char *YourDriverModuleName)
>>>>> if(module != NULL)
>>>>> {
>>>>>      YourDriverFunctionName();
>>>>> }
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Regards:
>>>>> Pulkit Goel
>>>>> mail:vipulkit.goel@xxxxxxxxx
>>>>>
>>>>> On Mon, Nov 9, 2009 at 3:35 PM, Sam Carter <sam.w.carter@xxxxxxxxx>
>>>>> wrote:
>>>>>>
>>>>>> When I try to compile the kernel with my changes to readdir.c, my
>>>>>> function in the driver is undefined and it therefore won't compile. This
>>>>>> also happens after I've compiled my driver against the kernel tree with the
>>>>>> EXPORT_SYMBOL in place.
>>>>>>
>>>>>> Any more thoughts on this?
>>>>>>
>>>>>> 2009/11/9 Zhu Yanhai <zhu.yanhai@xxxxxxxxx>
>>>>>>>
>>>>>>> EXPORT_SYMBOL_GPL(your func);
>>>>>>> Then this function can be called outside.
>>>>>>>
>>>>>>> For the second question, does this one work?
>>>>>>>
>>>>>>> /* Search for module by name: must hold module_mutex. */
>>>>>>> struct module *find_module(const char *name)
>>>>>>>
>>>>>>> It's in kernel/module.c and has been exported.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Zhu Yanhai
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 2009/11/8 Sam Carter <sam.w.carter@xxxxxxxxx>:
>>>>>>> > Hi all,
>>>>>>> >
>>>>>>> > I have a char driver/module which compiles and loads into the linux
>>>>>>> > kernel
>>>>>>> > just fine. In this driver are some functions which I would like to
>>>>>>> > access
>>>>>>> > from the kernel file 'fs/readdir.c'. Additionally, how can I test if
>>>>>>> > a
>>>>>>> > driver is loaded?
>>>>>>> >
>>>>>>> > I need something like the following.
>>>>>>> >
>>>>>>> > if(myDriver is loaded){
>>>>>>> >
>>>>>>> >     myDriver.functionCall();
>>>>>>> > }
>>>>>>> >
>>>>>>> > All examples I've found on internet searches are doing it from
>>>>>>> > userspace
>>>>>>> > applications.
>>>>>>> >
>>>>>>> > Thanks for any help
>>>>>>> >
>>>>>>> >
>>>>>>
>>>>>
>>>>
>>>
>>
>>
>

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux