Where is the system call table in linux kernel v3.9?
Saket Sinha
saket.sinha89 at gmail.com
Fri Jul 19 03:23:14 EDT 2013
Dear Srinivas,
Thank you for the excellent explanation here. Now I need to
ask a question in this context since we are discussing system calls. We all
know that system-calls are for user-space.
I have a file-system driver where I have to use system calls in
kernel-space.
Normally, we DON'T do any high level IOs from Kernel space (file
creation/reading, and so on). But here in my driver I am stacking FS
drivers, I can't avoid this. This is partly because Linux kernel can't
handle FS stacking (this wouldn't be an issue for Windows, for instance,
which supports stacking),
The simple (and legal) way to create a dir/file whatever is to call system
calls, like, for instance sys_mkdir. The problem is that I am not in a
context where I can call these. Because they expect a call from user mode,
while I am in kernel mode. This is even why I implemented macros such as:
https://github.com/HeisSpiter/hepunion/blob/master/fs/hepunion/hepunion.h#L399.
This one disables all checks from user mode calls, since I am in kernel.
And this allows calling system calls.
This is not a good way so can you provide any alternative.
Regards,
Saket Sinha
On Fri, Jul 19, 2013 at 12:15 PM, Srinivas Ganji <
srinivasganji.kernel at gmail.com> wrote:
> Hi Iker Pedrosa,
>
> In old versions of Linux kernels like 2.6.xx, the approach was different
> from Linux version 3.3 on wards.
>
> There are two different approaches to implement own system call. Each
> approach involves several steps. The difference between two approaches is,
> in one approach, we implement our system call in already existing file of
> kernel sources. In another approach, we created our own directory in kernel
> source which contains our system call implementation files. Ans in this
> second approach, we need to modify the Kernel Makefiles and Configuration
> files to include our newly created directory and its contents. First let us
> implement using the first approach.
>
> The following approach was successfully tested in Linux kernel 3.5.7
> version sources for x86 32-bit architecture.
>
> Here are the steps to create our own system call in the existing kernel
> sources. The paths given below are relative paths from /usr/src/linux.
>
> 1. Generally, add the function (system call) definition in kernel/sys.c
> file.
>
> /* this is the implementation of our system call */
> asmlinkage long sys_helloworld(void) {
> printk(KERN_EMERG "Hello, world!\n");
> return 0;
> }
>
> 2. Add the function prototype in the header file include/linux/syscalls.h
>
> asmlinkage long sys_helloworld(void);
>
> 3. Create an entry in system call table in the
> file arch/x86/syscalls/syscall_32.tbl
>
> 350 i386 helloworld sys_helloworld
>
> Note: In my case already table had 349 offsets, so I added it as 350.
>
> 4. If we want to create our own kernel images, then change the
> EXTRAVERSION in the main Makefile available at /usr/src/linux
>
> EXTRAVERSION = .ownsyscall
>
> 5. Then, build the modules from the main directory with the following.
>
> make menuconfig --- Just save and exit.
> make modules
> make modules_install
> make install
>
> 6. Now, reboot with our own image.
>
> 7. Write a simple C application for calling the our own system call.
>
> #include <stdio.h>
>
> /* sys_helloworld 350 */
> int main ()
> {
> syscall(350); /* 350 is our system calls offset number */
> return 0;
> }
>
> I hope, you understand it clearly and it helps you. Based on this, you can
> practice the second approach. It needs of creating our own directory and
> files (C, Makefile, Kconfig) and modifications required in architecture
> specific Kconfig.
>
> Regards,
> Srinivas.
>
>
> On Thu, Jul 18, 2013 at 2:34 PM, Iker Pedrosa <ikerpedrosam at gmail.com>wrote:
>
>> Hi Guys,
>>
>> I am a newbie to linux kernel and I am trying to do some of the
>> exercises/examples of the Linux Kernel Development book by Robert Love. For
>> the moment I'm trying to create a system call (Chapter 5) but I am unable
>> to do the first step which states the following:
>> "Add an entry to the end of the system call table.This needs to be done
>> for each architecture that supports the system call (which, for most calls,
>> is all the architectures).The position of the syscall in the table,
>> starting at zero, is its system call number. For example, the tenth entry
>> in the list is assigned syscall number nine."
>>
>> My problem is that I am unable to find the file that holds the table. In
>> the book the file that needs to be changed is the entry.S but it no longers
>> exists in v3.9. In an example that I have found on the internet, which is
>> done using v3.0, the file to change is syscall_table_32.S. But I've got the
>> same problem, it doesn't exist. So anybody can help me to find the table? I
>> know that I should be using v2.6 of the kernel but I don't know if that
>> version will work with the distribution that I'm using.
>>
>> The question is also in stackoverflow so if someone wants to answer there
>> I won't have any problem. The link to the page is the following:
>> http://stackoverflow.com/questions/17652555/where-is-the-system-call-table-in-linux-kernel-v3-9
>>
>> --
>> Iker Pedrosa <ikerpedrosam at gmail.com>
>>
>> _______________________________________________
>> Kernelnewbies mailing list
>> Kernelnewbies at kernelnewbies.org
>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>>
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20130719/5df76a59/attachment-0001.html
More information about the Kernelnewbies
mailing list