Subversion Repositories HelenOS-doc

Rev

Rev 154 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. \chapter{Running HelenOS}
  2.  
  3. \section{Kernel Start}
  4. When the HelenOS kernel starts up, it configures its output device
  5. and starts booting. During the boot process it writes out some some
  6. lines regarding memory size and available CPUs. The userspace
  7. drivers and tasks take over the console as soon as the start-up activities are finished.
  8. When kernel tests are compiled in, the userspace layer is not started.
  9.  
  10. The console driver provides 12 virtual consoles, 11 are used
  11. for applications, console 12 is reserved for kernel console. Pressing
  12. function keys F1-F12 switches between the consoles.
  13.  
  14. If the architecture supports framebuffer device with
  15. at least 800x600 resolution, a nice graphical console is shown. At the top
  16. of the screen, a row of buttons for the virtual console is drawn. If
  17. the button contains console number, an application is connected to it.
  18. The red button means that there was an activity on the terminal
  19. since it was last shown to the user.
  20.  
  21. \section{Kernel Console}
  22. {\em kconsole} is a kernel thread operating completely in priviledged mode.
  23. It allows the user to interact directly with the kernel and even start directly
  24. functions inside the kernel.
  25.  
  26. The kernel console is shown by switching to console number 12. On some platforms
  27. the kconsole screen is not restored to its previous contents. Press
  28. enter to see {\em kconsole}'s prompt. The function keys for switching terminals
  29. do not work in the console. In order to switch back to other consoles, use
  30. the {\em continue} command. After executing the command, press a function key
  31. to switch to the console of your choice.
  32.  
  33. The basic editing facilities are very similar to {\em readline} conventions.
  34. The left and right arrows, backspace and delete keys allow convenient
  35. editing of text. The history of last ten commands can be retrieved
  36. using up and down arrows. The kernel console supports tab completion, double tab
  37. shows a list of available commands.
  38.  
  39. The first class of commands prints useful statistics from the running
  40. operating systems. The commands are:
  41. \begin{description}
  42. \item[zones] --- Prints a list of memory zones.
  43. \item[zone $<$zone number$>$] --- Prints a detailed statistics about the frame allocator.
  44. \item[slabs] --- Prints detailed statistics about the slab allocator.
  45. \item[scheduler] --- Prints out the contents of scheduler run queues for all cpus.
  46. \item[threads] --- Prints list of existing threads, including information about
  47. their state.
  48. \item[tasks] --- Prints list of tasks along with some basic IPC information.
  49. \item[ipc\_task $<$taskid$>$] --- Prints detailed information about IPC queues of a particular task.
  50. \item[tlb] --- Prints contents of the Translation Lookaside Buffer on a processor (supported only on some platforms).
  51. \item[exc] --- Prints table of registered exception handlers.
  52. \end{description}
  53.  
  54. The kernel contains a searchable version of its symbol table. This is used
  55. in error processing as well as for extending functionality of the kernel console.
  56. The following commands are supported:
  57. \begin{description}
  58. \item[symaddr $<$address$>$] --- Finds an address in symbol table and prints the appropriate
  59. symbol name.
  60. \item[call0, call1... $<$function$>$ $<$args...$>$] --- Calls a C function {\em function(args...)}.
  61. Note that the tab-completion also works for function names. Because
  62. of architecture calling convention, this command does not work correctly
  63. on the ia64 platform. The arguments can be specified
  64. \begin{itemize}
  65.   \item as a number or hexadecimal number: call1 task\_kill 8
  66.   \item as a string: call1 printf "Hello world"
  67.   \item as a hexadecimal number preceeded by '*'. The argument is then read from
  68. the given address: call2 printf "%X" *0x8000000
  69.   \item as a symbol name. In such case, the value located in the memory
  70.     location corresponding to the symbol name is used: call2 printf "%d" task_counter
  71.   \item as a symbol name preceeded by '\&'. The address is used.
  72.   \item as a symbol name preceeded by '*'. In such case, the symbol is dereferenced.
  73.  \end{itemize}
  74. \item[set4 <address|symbol name>] --- Stores a 4-byte value into a given address.
  75. \end{description}
  76.  
  77. The mips32, ia32 and amd64 platforms provide additional commands regarding
  78. debugging facility - set and clear hardware breakpoints and watchpoints.
  79.  
  80. \section{Kernel Console Task Control}
  81. The kconsole {\em call} commands can be used to start and kill tasks.
  82. To repeatably start a task, the following procedure should be used:
  83. \begin{verbatim}
  84. .... kernel boot data ....
  85. init[8].addr=0x8027b000, init[8].size=86016
  86. .... rest of boot data ...
  87. kconsole> call2 task_run_program 0x8027b000 0
  88. Calling f(0x8027b000,0): 0x80119283: generic/src/proc/task.o:task_run_program
  89. Result: 0x80086500
  90. \end{verbatim}
  91.  
  92. To kill a task, use of the function {\em task\_kill} is appropriate. The {\em taskid}
  93. parameter is a 64-bit number on all platforms, thus on the 32-bit platforms
  94. call2 should be used with 2 32-bit parameters instead.
  95. \begin{verbatim}
  96. kconsole> call2 task_kill 8 0
  97. Calling f(0x8,0x0): 0x801197e8: generic/src/proc/task.o:task_kill
  98. Result: 0x0
  99. \end{verbatim}
  100.  
  101. \section{Emergency Functions}
  102. It may happen that the IPC communication dies or that some
  103. problems arise in the communication chain
  104. {\em keboard driver} - {\em console} - {\em output driver}.
  105. As long as at least the keyboard driver works, pressing Escape key three
  106. times transfers control to the kernel console immediately. Because the screen is not
  107. updated, the user should press Enter to see the kconsole prompt.
  108.  
  109. If a kernel panic occurs, the error handling automatially switches control
  110. to the KConsole and allows users to inspect the failed kernel online.
  111. On the SMP system the other processors are halted immediately. The kernel
  112. contains its symbol table, so you can probably read some useful information
  113. about the exact place where the panic occured.
  114.  
  115. \section{How to Do a Kernel Panic}
  116. Kernel panic is extremely rare in HelenOS. However, if the user wishes to
  117. simulate it, the kernel console contains proper commands. For example, the following
  118. command simulates a write to the unmapped address 0x4:
  119. \begin{verbatim}
  120. kconsole> set4 4 0
  121. \end{verbatim}
  122.  
  123. To test the autodebugging possibilities of the ia32 platform, the following
  124. sequence can be executed:
  125. \begin{verbatim}
  126. kconsole> bkpts
  127. 0. 0x80032010 in (NULL)
  128.    Count(0)
  129. kconsole> set4 0x80032010 0
  130. **** Found ZERO on address 0x0 ****
  131. Reached breakpoint 0:0x8011552a(generic/src/console/cmd.o:cmd_set4)
  132. ***Type 'exit' to exit kconsole.
  133. debug>
  134. \end{verbatim}
  135.  
  136.  
  137. \section{KLog}
  138. In order to avoid disturbing the framebuffer driver with kernel messages, a circular
  139. buffer communication between the kernel and the userspace area is established.
  140. Non-critical messages are sent to the KLog application. The user can see messages about
  141. task faults and task cleanup completion.
  142.  
  143. \section{IPCC - testing application}
  144. For the sake of thourough testing of some aspects of task activities, IPCC application
  145. allows the user to generate faulting behaviour such as page faults and unaligned references\footnote{Some architectures
  146. do not fault on an unaligned memory reference.}.
  147.  
  148.