Rev 131 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 9 | bondari | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 120 | jermar | 2 | <chapter id="hardware"> |
| 3 | <?dbhtml filename="hardware.html"?> |
||
| 9 | bondari | 4 | |
| 131 | jermar | 5 | <title>Device Drivers</title> |
| 9 | bondari | 6 | |
| 120 | jermar | 7 | <para>Since HelenOS is a microkernel, a framework for supporting userspace |
| 8 | device drivers has been implemented. A typical userspace task acting as a |
||
| 131 | jermar | 9 | device driver might need to:</para> |
| 120 | jermar | 10 | |
| 11 | <itemizedlist> |
||
| 12 | <listitem> |
||
| 13 | <para>receive notifications about interrupts sent by its device,</para> |
||
| 14 | </listitem> |
||
| 15 | |||
| 16 | <listitem> |
||
| 17 | <para>access physical memory address space,</para> |
||
| 18 | </listitem> |
||
| 19 | |||
| 20 | <listitem> |
||
| 21 | <para>access I/O space and</para> |
||
| 22 | </listitem> |
||
| 23 | |||
| 24 | <listitem> |
||
| 25 | <para>control preemption.</para> |
||
| 26 | </listitem> |
||
| 27 | </itemizedlist> |
||
| 28 | |||
| 29 | <section> |
||
| 131 | jermar | 30 | <title>Interrupt Notifications</title> |
| 120 | jermar | 31 | |
| 32 | <para>Userspace tasks that are in hold of the |
||
| 33 | <constant>CAP_IRQ_REG</constant> capability can register themselves via |
||
| 34 | the <code>ipc_register_irq()</code> to be notified about occurrences of a |
||
| 35 | given interrupt. The registration call takes two arguments. The first |
||
| 36 | argument is the IRQ number and the second is the pointer to special |
||
| 37 | pseudocode that instructs the kernel interrupt handler how to process the |
||
| 38 | IRQ. Currently the pseudocode language supports reading and writing |
||
| 39 | physical memory, reading from and writing to I/O space and actions related |
||
| 40 | to running HelenOS in virtual environments.</para> |
||
| 41 | |||
| 42 | <para>When the interrupt comes after its handler has been registered by a |
||
| 43 | userspace task, the kernel interrupt handler interprets the pseudocode |
||
| 44 | program and sends an IPC notification to the respective task. The |
||
| 45 | userspace task can get certain information about the interrupt (e.g. what |
||
| 46 | key was pressed) by issuing memory or I/O space reads in the pseudocode |
||
| 47 | program. The read values are wrapped into the IPC notification sent to the |
||
| 48 | task. The write operations are also very essential because some interrupts |
||
| 49 | are level-sensitive and need to be processed in the kernel interrupt |
||
| 50 | routine. In many situations, the interrupt is considered serviced only |
||
| 51 | when the interrupt handler performs certain reads or writes of memory or |
||
| 52 | I/O space.</para> |
||
| 53 | </section> |
||
| 54 | |||
| 55 | <section> |
||
| 131 | jermar | 56 | <title>Accessing Memory and I/O Space</title> |
| 120 | jermar | 57 | |
| 58 | <para>When a task has the <constant>CAP_MEM_MANAGER</constant> capability, |
||
| 59 | it can use the <constant>SYS_MAP_PHYSMEM</constant> to map regions of |
||
| 60 | physical memory to its address space. When successful, the syscall creates |
||
| 61 | an address space area for the physical memory region. The address space |
||
| 62 | area can be further shared by other tasks. Similarily, when a task has the |
||
| 63 | <constant>CAP_IOSPACE_MANAGER</constant> capability, it is entitled to |
||
| 64 | request access to the I/O space by using the |
||
| 65 | <constant>SYS_IOSPACE_ENABLE</constant>. However, this syscall is relevant |
||
| 66 | only on architectures that have separate I/O space (e.g. amd64 and |
||
| 67 | ia32).</para> |
||
| 68 | </section> |
||
| 69 | |||
| 70 | <section> |
||
| 131 | jermar | 71 | <title>Disabling Preemption</title> |
| 120 | jermar | 72 | |
| 73 | <para>It might be desirable for a device driver to temporarily disable |
||
| 74 | preemption. Tasks that can do this are required to have the |
||
| 133 | jermar | 75 | <constant>CAP_PREEMPT_CONTROL</constant> capability. Preemption could be theoretically disabled |
| 120 | jermar | 76 | by disabling interrupts on the current processor, but disabling preemption |
| 77 | is more lightweight as interrupt processing remains enabled.</para> |
||
| 78 | </section> |
||
| 79 | </chapter> |