]> Devoid-pointer.net GitWeb - KLGD.git/commitdiff
Add documentation files.
authorMichal Malý <madcatxster@devoid-pointer.net>
Mon, 27 Jul 2015 20:50:25 +0000 (22:50 +0200)
committerMichal Malý <madcatxster@devoid-pointer.net>
Mon, 27 Jul 2015 20:50:25 +0000 (22:50 +0200)
README.md [new file with mode: 0644]
docs/Linux-FF-KLGD-scheme.svg [new file with mode: 0644]
docs/Linux-FF-scheme.svg [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..a2d692f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+KLGD
+===
+
+Introduction
+---
+
+This software of the interim name KLGD (Kernel Library for Gaming Devices) was written to deal with a problem that arises when a real-time output has to be delivered to devices with high output latency. Applications that need to send data to various gaming devices to drive Force Feedback effects effects etc. can generate events for those devices at a very high rate. When that happens, the device might start to lag behind the application that controls it or drop some events altogether. This is obviously undesirable and leads to a very degraded user experience. The problem is demonstrated on the current Linux implementation of Force Feedback, but it is not specific to it.
+
+Layout of the Force Feedback infrastructure in the Linux kernel is shown on the following scheme:
+![Linux FF scheme](docs/Linux-FF-scheme.svg)
+
+Whenever a userspace makes a call either by ioctl or by writing to the device through a file descriptor, the call falls through this entire chain and ends up with the hardware driver writing to the device. The actual delivery of the payload to the device is handled by the kernel internals and it depends on the communication protocol the device uses. It is evident that when the target device cannot cope with incoming data fast enough the problem described above occurs.
+
+Solution
+---
+KLDG decouples the process of handling userspace requests from the process of uploading these requests to devices. When a userspace request arrives, its result is stored within a plugin responsible for handling that request. The plugin then tells KLGD when(and if) it needs to deliver new data to the device. A simple design with a workqueue and two spinlocks makes sure that everything is kept in a consistent state. Spinlocking also ensures that no data will be sent to the device until the previous payload has been fully processed. KLGD however relies on the underlying hardware driver to not buffer or queue the outgoing payload anywhere.
+Layout of the infrastructure involving KLGD looks like this: ![Linux FF scheme with KLGD](docs/Linux-FF-KLGD-scheme.svg)
+
+Operation
+---
+Basic operation of KLGD and the interaction with its plugins can be described as a following series of steps:
+
+1. A plugin receives an event from userspace and tells KLGD to schedule an update at appropriate time.
+2. When the timer fires, KLGD goes over all its plugins and asks them for data they need to send to the device.
+3. The obtained command stream is then passed to the hardware driver and delivered to the device.
+4. KLGD queries all plugins again to check if there is any more data to be sent to the device at some point in the future.
+
+### Important remarks
+
+* Keep in mind that KLGD itself never interfaces directly with userspace. All userspace interactions are supposed to be handled by the plugins.
+* The command stream generated by KLGD is not supposed to require any additional post-processing by the hardware driver. Ideally it should be a raw sequence of bytes that can be sent to the device right away.
+* With the above in mind it should be evident that the plugins need to generate commands specific for the given hardware.
diff --git a/docs/Linux-FF-KLGD-scheme.svg b/docs/Linux-FF-KLGD-scheme.svg
new file mode 100644 (file)
index 0000000..59ee30a
--- /dev/null
@@ -0,0 +1,491 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   id="svg10842"
+   viewBox="0 0 779.07203 267.13385"
+   height="267.13385"
+   width="779.07202">
+  <defs
+     id="defs10844">
+    <marker
+       style="overflow:visible"
+       id="marker17537"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path17539" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker17305"
+       style="overflow:visible">
+      <path
+         id="path17307"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker16583"
+       style="overflow:visible">
+      <path
+         id="path16585"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(0.3,0,0,0.3,-0.69,0)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker16471"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path16473" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker16099"
+       style="overflow:visible">
+      <path
+         id="path16101"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker15593"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path15595" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker15499"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.3,0,0,0.3,-0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path15501" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker14791"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path14793" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker14709"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.3,0,0,0.3,-0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path14711" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker13263"
+       style="overflow:visible">
+      <path
+         id="path13265"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker13193"
+       style="overflow:visible">
+      <path
+         id="path13195"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(0.3,0,0,0.3,-0.69,0)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker12365"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.3,0,0,0.3,-0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path12367" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker12193"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path12195" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker11788"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.3,0,0,0.3,-0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path11790" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8890"
+       style="overflow:visible">
+      <path
+         id="path8892"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(0.3,0,0,0.3,-0.69,0)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker8978"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path8980" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Send"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path4205" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8275-6"
+       style="overflow:visible">
+      <path
+         id="path8277-4"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+    </marker>
+  </defs>
+  <metadata
+     id="metadata10847">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(6.6527165,-185.7422)"
+     id="layer1">
+    <rect
+       ry="6.0704842"
+       y="253.05574"
+       x="20.634903"
+       height="105.18321"
+       width="91.154922"
+       id="rect4136-8"
+       style="fill:#78ff8e;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text4138-4"
+       y="309.60471"
+       x="26.47863"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="309.60471"
+         x="26.47863"
+         id="tspan4140-9">Application</tspan></text>
+    <path
+       id="path4150"
+       d="m 146.32801,205.7422 0,198.21424"
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:4px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="12.243362"
+       y="228.748"
+       id="text4152-0"><tspan
+         id="tspan4154-2"
+         x="12.243362"
+         y="228.748"
+         style="letter-spacing:4px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Userspace</tspan></text>
+    <rect
+       style="fill:#f1ff78;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect4158"
+       width="91.154922"
+       height="105.18321"
+       x="340.63489"
+       y="253.05574"
+       ry="6.0704842" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="363.31839"
+       y="311.03952"
+       id="text4160"><tspan
+         id="tspan4162"
+         x="363.31839"
+         y="311.03952"
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">ff-core</tspan></text>
+    <path
+       id="path4166-5"
+       d="m 113.90948,305.64741 64.63524,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker8890);marker-end:url(#marker8275-6)" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.48874569px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.19731037;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="144.41269"
+       y="288.54184"
+       id="text4544-4"><tspan
+         id="tspan4548-2"
+         x="144.41269"
+         y="288.54184"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Linux</tspan><tspan
+         id="tspan4552-0"
+         x="144.41269"
+         y="300.40277"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">input API</tspan></text>
+    <text
+       id="text5891"
+       y="228.748"
+       x="378.99341"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:4px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:4px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="228.748"
+         x="378.99341"
+         id="tspan5893">Kernel space</tspan></text>
+    <text
+       id="text5897"
+       y="288.34076"
+       x="306.80484"
+       style="font-style:normal;font-weight:normal;font-size:9.48874569px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.19731037;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="288.34076"
+         x="306.80484"
+         id="tspan5901">Kernel</tspan><tspan
+         id="tspan11873"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="300.20169"
+         x="306.80484">ff-core API</tspan></text>
+    <rect
+       ry="6.0704842"
+       y="253.05574"
+       x="180.63492"
+       height="105.18321"
+       width="91.154922"
+       id="rect8868"
+       style="fill:#b4ff78;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text8870"
+       y="300.46811"
+       x="226.6181"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="300.46811"
+         x="226.6181"
+         id="tspan8872">input</tspan><tspan
+         id="tspan8874"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="318.50204"
+         x="226.6181">system</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker11788);marker-end:url(#marker8978)"
+       d="m 275.02265,305.64741 62.20137,0"
+       id="path8888" />
+    <rect
+       ry="6.0704842"
+       y="253.05574"
+       x="500.63489"
+       height="105.18321"
+       width="91.154922"
+       id="rect11750"
+       style="fill:#ffc178;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text11875"
+       y="310.81628"
+       x="526.08643"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="310.81628"
+         x="526.08643"
+         id="tspan11877">KLGD</tspan></text>
+    <rect
+       style="fill:#78c3ff;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect12149"
+       width="29.734678"
+       height="34.310696"
+       x="531.2522"
+       y="379.75211"
+       ry="1.980188" />
+    <rect
+       ry="1.980188"
+       y="379.75211"
+       x="485.2522"
+       height="34.310696"
+       width="29.734678"
+       id="rect12153"
+       style="fill:#ffc178;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <rect
+       ry="1.980188"
+       y="379.75211"
+       x="577.2522"
+       height="34.310696"
+       width="29.734678"
+       id="rect12155"
+       style="fill:#78c4ff;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.12424469px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.18973088;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="620.63538"
+       y="-69.994308"
+       id="text12157"><tspan
+         id="tspan12159"
+         x="620.63538"
+         y="-69.994308"
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.18973088;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Plugin</tspan></text>
+    <text
+       id="text12165"
+       y="-102.52122"
+       x="653.16223"
+       style="font-style:normal;font-weight:normal;font-size:9.12424469px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.18973088;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"
+       transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.18973088;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="-102.52122"
+         x="653.16223"
+         id="tspan12167">Plugin</tspan></text>
+    <text
+       transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.12424469px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.18973088;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="685.68909"
+       y="-135.04814"
+       id="text12169"><tspan
+         id="tspan12171"
+         x="685.68909"
+         y="-135.04814"
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.18973088;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Plugin</tspan></text>
+    <path
+       id="path12173"
+       d="m 546.25001,361.63139 0,14.70754"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.93674505;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker12365);marker-end:url(#marker12193)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker13193);marker-end:url(#marker13263)"
+       d="m 511.54749,361.29905 -9.70718,15.27209"
+       id="path13191" />
+    <path
+       id="path14707"
+       d="m 580.7985,361.29905 9.70718,15.27209"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker14709);marker-end:url(#marker14791)" />
+    <rect
+       style="fill:#ff8b78;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect15483"
+       width="91.154922"
+       height="105.18321"
+       x="660.63489"
+       y="253.05574"
+       ry="6.0704842" />
+    <text
+       id="text7453"
+       y="310.94476"
+       x="669.43323"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="310.94476"
+         x="669.43323"
+         id="tspan7455">HW driver</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker15593)"
+       d="m 592.11846,305.64741 64.97654,0"
+       id="path15497" />
+    <path
+       id="path16089"
+       d="m 431.64449,305.53919 c 23.85737,0 23.7319,91.39654 50.0586,91.39654"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.97153854;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker16099)" />
+    <path
+       id="path16459"
+       d="m 500.11161,417.5631 0,8.66071 c 0,5.6522 0,5.6522 5.3125,5.6522 l 195.11668,0 c 5.70921,0 5.70921,0 5.70921,-5.71368 l 0,-64.46354"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker16583);marker-end:url(#marker16471)" />
+    <path
+       id="path17295"
+       d="m 546.25001,431.87601 0,-14.37988"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17537)" />
+    <path
+       id="path17297"
+       d="m 592.14286,431.87601 0,-14.31292"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker17305)" />
+  </g>
+</svg>
diff --git a/docs/Linux-FF-scheme.svg b/docs/Linux-FF-scheme.svg
new file mode 100644 (file)
index 0000000..18b3f4f
--- /dev/null
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   id="svg2"
+   viewBox="0 0 779.07209 238.21423"
+   height="238.21423"
+   width="779.07208">
+  <defs
+     id="defs4">
+    <marker
+       style="overflow:visible"
+       id="marker8978"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path8980" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8890"
+       style="overflow:visible">
+      <path
+         id="path8892"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(0.3,0,0,0.3,-0.69,0)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Sstart"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.3,0,0,0.3,-0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path4202" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker8567"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.2,0,0,0.2,1.2,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+         id="path8569" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker8485"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.2,0,0,0.2,1.2,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+         id="path8487" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Sstart"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.2,0,0,0.2,1.2,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+         id="path4184" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8275"
+       style="overflow:visible">
+      <path
+         id="path8277"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Send"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+         id="path4187" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="marker8065"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path8067" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow2Send"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path4205" />
+    </marker>
+    <linearGradient
+       id="linearGradient7445">
+      <stop
+         id="stop7449"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0.36464089" />
+      <stop
+         id="stop7447"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:1;" />
+    </linearGradient>
+    <marker
+       style="overflow:visible"
+       id="marker7079"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="scale(-0.6,-0.6)"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         id="path7081" />
+    </marker>
+    <linearGradient
+       id="linearGradient6295">
+      <stop
+         id="stop6297"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop6299"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0.36464089" />
+    </linearGradient>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4963"
+       style="overflow:visible">
+      <path
+         id="path4965"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)" />
+    </marker>
+    <marker
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4929"
+       style="overflow:visible">
+      <path
+         id="path4931"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(0.6,0.6)" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="Arrow1Mstart"
+       refX="0"
+       refY="0"
+       orient="auto">
+      <path
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+         id="path4178" />
+    </marker>
+    <linearGradient
+       gradientTransform="matrix(0.98294906,0,0,1.0008141,152.9219,839.90246)"
+       gradientUnits="userSpaceOnUse"
+       y2="138.43364"
+       x2="340.60168"
+       y1="96.597527"
+       x1="287.71048"
+       id="linearGradient6301"
+       xlink:href="#linearGradient6295" />
+    <linearGradient
+       gradientTransform="matrix(1,0,0,-1,292.54572,1075.4605)"
+       y2="138.43364"
+       x2="340.60168"
+       y1="96.597527"
+       x1="287.71048"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7137"
+       xlink:href="#linearGradient7445" />
+  </defs>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(18.195014,-832.00506)"
+     id="layer1">
+    <rect
+       ry="6.0704842"
+       y="899.3186"
+       x="9.0926065"
+       height="105.18321"
+       width="91.154922"
+       id="rect4136"
+       style="fill:#78ff8e;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text4138"
+       y="955.86755"
+       x="14.936335"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="955.86755"
+         x="14.936335"
+         id="tspan4140">Application</tspan></text>
+    <path
+       id="path4150"
+       d="m 134.78572,852.00506 0,198.21424"
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:4px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="0.70106506"
+       y="875.01086"
+       id="text4152"><tspan
+         id="tspan4154"
+         x="0.70106506"
+         y="875.01086"
+         style="letter-spacing:4px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Userspace</tspan></text>
+    <rect
+       style="fill:#f1ff78;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect4158"
+       width="91.154922"
+       height="105.18321"
+       x="329.09262"
+       y="899.3186"
+       ry="6.0704842" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="351.77609"
+       y="957.30237"
+       id="text4160"><tspan
+         id="tspan4162"
+         x="351.77609"
+         y="957.30237"
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">ff-core</tspan></text>
+    <path
+       id="path4166"
+       d="m 102.36719,951.91027 64.63524,0"
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Sstart);marker-end:url(#marker8275)" />
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:9.48874569px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.19731037;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       x="132.87041"
+       y="934.80469"
+       id="text4544"><tspan
+         id="tspan4548"
+         x="132.87041"
+         y="934.80469"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Linux</tspan><tspan
+         id="tspan4552"
+         x="132.87041"
+         y="946.66565"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">input API</tspan></text>
+    <rect
+       ry="3.0206075"
+       y="952.34833"
+       x="488.90808"
+       height="52.338032"
+       width="91.524025"
+       id="rect4903"
+       style="fill:#ffc178;fill-opacity:1;stroke:#000000;stroke-width:0.88989484;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text4905"
+       y="983.89258"
+       x="494.7514"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="983.89258"
+         x="494.7514"
+         id="tspan4907">ff-memless</tspan></text>
+    <rect
+       ry="6.0704842"
+       y="899.3186"
+       x="649.09265"
+       height="105.18321"
+       width="91.154922"
+       id="rect4913"
+       style="fill:#ff8a78;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker8065)"
+       d="m 420.59941,937.01043 226.30255,0"
+       id="path4927" />
+    <text
+       id="text5891"
+       y="875.01086"
+       x="367.45111"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:4px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:4px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="875.01086"
+         x="367.45111"
+         id="tspan5893">Kernel space</tspan></text>
+    <text
+       id="text5897"
+       y="931.71539"
+       x="534.65613"
+       style="font-style:normal;font-weight:normal;font-size:9.48874569px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.19731037;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.19731037;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="931.71539"
+         x="534.65613"
+         id="tspan5901">Kernel ff-core API</tspan></text>
+    <path
+       id="path5905"
+       d="m 435.55131,936.97453 c 24.6361,-0.009 24.60784,41.48994 50.71431,41.48994"
+       style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient6301);stroke-width:1.98368275;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Send)" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:url(#linearGradient7137);stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 580.07782,978.46735 c 25.06346,0.009 25.03471,-41.45617 51.59404,-41.45617"
+       id="path7077" />
+    <text
+       id="text7453"
+       y="957.30237"
+       x="657.68677"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="letter-spacing:0px;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="957.30237"
+         x="657.68677"
+         id="tspan7455">HW driver</tspan></text>
+    <rect
+       ry="6.0704842"
+       y="899.3186"
+       x="169.09262"
+       height="105.18321"
+       width="91.154922"
+       id="rect8868"
+       style="fill:#b4ff78;fill-opacity:1;stroke:#000000;stroke-width:1.25899994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <text
+       id="text8870"
+       y="946.73096"
+       x="215.07582"
+       style="font-style:normal;font-weight:normal;font-size:14.42713737px;line-height:125%;font-family:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.30000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="946.73096"
+         x="215.07582"
+         id="tspan8872">input</tspan><tspan
+         id="tspan8874"
+         style="text-align:center;letter-spacing:0px;text-anchor:middle;stroke:#000000;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         y="964.76489"
+         x="215.07582">system</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker8890);marker-end:url(#marker8978)"
+       d="m 263.48036,951.91027 62.20137,0"
+       id="path8888" />
+  </g>
+</svg>