modifying_the_linux_kernel
Differences
This shows you the differences between two versions of the page.
Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
modifying_the_linux_kernel [2020/09/07 15:43] misterjei [Adding a System Call] |
modifying_the_linux_kernel [2021/09/17 11:36] (current) misterjei [Adding a System Call] |
Every system call must have an associated system call number which corresponds to its position in the system call table. This table is transformed / imported into the source as part of the build process. The correct table varies by architecture, but is in the following format/location in the source tree: | Every system call must have an associated system call number which corresponds to its position in the system call table. This table is transformed / imported into the source as part of the build process. The correct table varies by architecture, but is in the following format/location in the source tree: |
| |
''/arch/**//<archname>//**/entry/syscalls/syscall_**//<variant>//**.tbl'' | ''**//<kernelsourcedir>//**/arch/**//<archname>//**/entry/syscalls/syscall_**//<variant>//**.tbl'' |
| |
For example, in the x64 version of Linux, **//<archname>//** is ''__**x86**__'' and **//<variant>//** is ''__**64**__''. | For example, in the x64 version of Linux, **//<archname>//** is ''__**x86**__'' and **//<variant>//** is ''__**64**__''. |
| |
=== 2. Prototype of the System Call === | === 2. Prototype of the System Call === |
The kernel has no "safety" checks like user-space programs; registers can easily (and often are) corrupted. Instead, we should tell the compiler to limit the function to the CPU stack only and avoid dependence on registers. This can do done using the asmlinkage flag in GCC (the compiler we use). This is done as part of the system call's prototype (which is used in C to declare a function which is defined elsewhere). The declaration must be in a place that makes it accessible to the definiton. If you explore the kernel, you'll find some examples like this: | The kernel has no "safety" checks like user-space programs; registers can easily (and often are) corrupted. Instead, we should tell the compiler to limit the function to the CPU stack only and avoid dependence on registers. This can be done using the asmlinkage flag in GCC (the compiler we use) as part of the system call's prototype (which is used in C to declare a function which is defined elsewhere). The declaration must be in a place that makes it accessible to the definition. If you explore the kernel, you'll find some examples like this: |
| |
<code>asmlinkage int sys_sample_syscall(int sample_param);</code> | <code>asmlinkage int sys_sample_syscall(int sample_param);</code> |
modifying_the_linux_kernel.1599507817.txt.gz ยท Last modified: 2020/09/07 15:43 by misterjei