User Tools

Site Tools


modifying_the_linux_kernel

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
modifying_the_linux_kernel [2020/09/07 15:39]
misterjei [Adding a System Call]
modifying_the_linux_kernel [2021/09/17 11:36] (current)
misterjei [Adding a System Call]
Line 11: Line 11:
 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**__''.
Line 27: Line 27:
  
 === 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>
Line 34: Line 34:
 Finally, we need to add the system call definition. Thise will need to be compiled into the kernel as well. The kernel has lots of examples along these lines, which is for a system call with one parameter (''int sample_param''): Finally, we need to add the system call definition. Thise will need to be compiled into the kernel as well. The kernel has lots of examples along these lines, which is for a system call with one parameter (''int sample_param''):
  
-<code>SYSCALL_DEFINE1(sys_sample_syscall, int, sample_param)+<code>SYSCALL_DEFINE1(sample_syscall, int, sample_param)
 { {
     return sample_param + 1; // Adds 1 to the parameter and returns it     return sample_param + 1; // Adds 1 to the parameter and returns it
modifying_the_linux_kernel.1599507571.txt.gz ยท Last modified: 2020/09/07 15:39 by misterjei