<< Chapter < Page Chapter >> Page >

Saving state and invoking the kernel function

Below is a slightly simplified version of the Linux code that is called to handle a system call trap.

The first part of the code (starting at system_call) saves the registers of the user process and plays around with the memory management registers so that the kernel's internal data is accessible. It also finds the process table entry for this user process.

The trap instruction that caused the entry to the kernel has a parameter that specifies which system call is being invoked. The code starting at do_call checks to see if this number is in range, and then calls the function associated with this system call number. When this function returns, the return value (stored in the eax register) is saved in the place where all the other user registers are stored. As a result, when control is transferred from the kernel back to the user process, the return value will be in the right place.

After the system call is complete, it is time to return to the user process. There are two choices at this point: (1) either return directly the the user process that made the system call or (2) go through the dispatcher to select the next process to run. ret_from_sys_call

system_call: ##----Save orig_eax: system call number # used to distinguish process that entered# kernel via syscall from one that entered # via some other interrupt# pushl %eax# #----Save the user's registers# pushl %espushl %ds pushl %eaxpushl %ebp pushl %edipushl %esi pushl %edxpushl %ecx pushl %ebx# #----Set up the memory segment registers so that the kernel's# data segment can be accessed. #movl $(__KERNEL_DS),%edx movl %edx,%dsmovl %edx,%es ##----Load pointer to task structure in EBX. The task structure # resides below the 8KB per-process kernel stack.# movl $-8192, %ebxandl %esp, %ebx ##----Check to see if system call number is a valid one, then # look-up the address of the kernel function that handles this# system call. #do_call: cmpl $(NR_syscalls),%eaxjae badsys call *SYMBOL_NAME(sys_call_table)(,%eax,4)# Put return value in EAX of saved user context movl %eax,EAX(%esp)# #----If we can return directly to the user, then do so, else go to# the dispatcher to select another process to run. #ret_from_sys_call: cli # Block interrupts; iret effectively re-enables themcmpl $0,need_resched(%ebx) jne reschedule# restore user context (including data segments) popl %ebxpopl %ecx popl %edxpopl %esi popl %edipopl %ebp popl %eaxpopl %ds popl %esaddl $4,%esp # ignore orig_eax iretreschedule: call SYMBOL_NAME(schedule)jmp ret_from_sys_call

Independent and cooperating processes

Independent process

One that is independent of the rest of the universe.

  • Its state is not shared in any way by any other process.
  • Deterministic: input state alone determines results.
  • Reproducible.
  • Can stop and restart with no bad effects (only time varies). Example: program that sums the integers from 1 to i (input).

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Operating systems. OpenStax CNX. Aug 13, 2009 Download for free at http://cnx.org/content/col10785/1.2
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Operating systems' conversation and receive update notifications?

Ask