| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | <?xml version="1.0" encoding="UTF-8"?> | 
 | 2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" | 
 | 3 | 	"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> | 
 | 4 |  | 
 | 5 | <book id="LinuxKernelAPI"> | 
 | 6 |  <bookinfo> | 
 | 7 |   <title>The Linux Kernel API</title> | 
 | 8 |    | 
 | 9 |   <legalnotice> | 
 | 10 |    <para> | 
 | 11 |      This documentation is free software; you can redistribute | 
 | 12 |      it and/or modify it under the terms of the GNU General Public | 
 | 13 |      License as published by the Free Software Foundation; either | 
 | 14 |      version 2 of the License, or (at your option) any later | 
 | 15 |      version. | 
 | 16 |    </para> | 
 | 17 |        | 
 | 18 |    <para> | 
 | 19 |      This program is distributed in the hope that it will be | 
 | 20 |      useful, but WITHOUT ANY WARRANTY; without even the implied | 
 | 21 |      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
 | 22 |      See the GNU General Public License for more details. | 
 | 23 |    </para> | 
 | 24 |        | 
 | 25 |    <para> | 
 | 26 |      You should have received a copy of the GNU General Public | 
 | 27 |      License along with this program; if not, write to the Free | 
 | 28 |      Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
 | 29 |      MA 02111-1307 USA | 
 | 30 |    </para> | 
 | 31 |        | 
 | 32 |    <para> | 
 | 33 |      For more details see the file COPYING in the source | 
 | 34 |      distribution of Linux. | 
 | 35 |    </para> | 
 | 36 |   </legalnotice> | 
 | 37 |  </bookinfo> | 
 | 38 |  | 
 | 39 | <toc></toc> | 
 | 40 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 |   <chapter id="adt"> | 
 | 42 |      <title>Data Types</title> | 
 | 43 |      <sect1><title>Doubly Linked Lists</title> | 
 | 44 | !Iinclude/linux/list.h | 
 | 45 |      </sect1> | 
 | 46 |   </chapter> | 
 | 47 |  | 
 | 48 |   <chapter id="libc"> | 
 | 49 |      <title>Basic C Library Functions</title> | 
 | 50 |  | 
 | 51 |      <para> | 
 | 52 |        When writing drivers, you cannot in general use routines which are | 
 | 53 |        from the C Library.  Some of the functions have been found generally | 
 | 54 |        useful and they are listed below.  The behaviour of these functions | 
 | 55 |        may vary slightly from those defined by ANSI, and these deviations | 
 | 56 |        are noted in the text. | 
 | 57 |      </para> | 
 | 58 |  | 
 | 59 |      <sect1><title>String Conversions</title> | 
 | 60 | !Ilib/vsprintf.c | 
 | 61 | !Elib/vsprintf.c | 
 | 62 |      </sect1> | 
 | 63 |      <sect1><title>String Manipulation</title> | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 64 | <!-- All functions are exported at now | 
 | 65 | X!Ilib/string.c | 
 | 66 |  --> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 | !Elib/string.c | 
 | 68 |      </sect1> | 
 | 69 |      <sect1><title>Bit Operations</title> | 
| Randy Dunlap | a1a739c | 2008-10-25 17:24:36 -0700 | [diff] [blame] | 70 | !Iarch/x86/include/asm/bitops.h | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 71 |      </sect1> | 
| Randy Dunlap | 28e83ba | 2006-06-25 05:48:58 -0700 | [diff] [blame] | 72 |   </chapter> | 
 | 73 |  | 
 | 74 |   <chapter id="kernel-lib"> | 
 | 75 |      <title>Basic Kernel Library Functions</title> | 
 | 76 |  | 
 | 77 |      <para> | 
 | 78 |        The Linux kernel provides more basic utility functions. | 
 | 79 |      </para> | 
 | 80 |  | 
| Randy Dunlap | 6e1907ff | 2006-06-25 05:48:57 -0700 | [diff] [blame] | 81 |      <sect1><title>Bitmap Operations</title> | 
 | 82 | !Elib/bitmap.c | 
 | 83 | !Ilib/bitmap.c | 
 | 84 |      </sect1> | 
| Randy Dunlap | 28e83ba | 2006-06-25 05:48:58 -0700 | [diff] [blame] | 85 |  | 
 | 86 |      <sect1><title>Command-line Parsing</title> | 
 | 87 | !Elib/cmdline.c | 
 | 88 |      </sect1> | 
| Randy Dunlap | 2f72100 | 2006-06-25 05:48:59 -0700 | [diff] [blame] | 89 |  | 
| Jan Nikitenko | ad24152 | 2007-07-17 04:04:03 -0700 | [diff] [blame] | 90 |      <sect1 id="crc"><title>CRC Functions</title> | 
 | 91 | !Elib/crc7.c | 
| Randy Dunlap | 2f72100 | 2006-06-25 05:48:59 -0700 | [diff] [blame] | 92 | !Elib/crc16.c | 
| Jan Nikitenko | ad24152 | 2007-07-17 04:04:03 -0700 | [diff] [blame] | 93 | !Elib/crc-itu-t.c | 
| Randy Dunlap | 2f72100 | 2006-06-25 05:48:59 -0700 | [diff] [blame] | 94 | !Elib/crc32.c | 
 | 95 | !Elib/crc-ccitt.c | 
 | 96 |      </sect1> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 97 |   </chapter> | 
 | 98 |  | 
 | 99 |   <chapter id="mm"> | 
 | 100 |      <title>Memory Management in Linux</title> | 
 | 101 |      <sect1><title>The Slab Cache</title> | 
| Paul Drynoff | 800590f | 2006-06-23 02:03:48 -0700 | [diff] [blame] | 102 | !Iinclude/linux/slab.h | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 103 | !Emm/slab.c | 
 | 104 |      </sect1> | 
 | 105 |      <sect1><title>User Space Memory Access</title> | 
| Randy Dunlap | a1a739c | 2008-10-25 17:24:36 -0700 | [diff] [blame] | 106 | !Iarch/x86/include/asm/uaccess_32.h | 
| Randy Dunlap | f3cf31a | 2007-10-12 21:17:23 -0700 | [diff] [blame] | 107 | !Earch/x86/lib/usercopy_32.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 108 |      </sect1> | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 109 |      <sect1><title>More Memory Management Functions</title> | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 110 | !Emm/readahead.c | 
 | 111 | !Emm/filemap.c | 
 | 112 | !Emm/memory.c | 
 | 113 | !Emm/vmalloc.c | 
| Randy Dunlap | 88ca3b9 | 2006-10-04 02:15:25 -0700 | [diff] [blame] | 114 | !Imm/page_alloc.c | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 115 | !Emm/mempool.c | 
| Randy Dunlap | a80a438 | 2008-02-06 16:29:55 -0800 | [diff] [blame] | 116 | !Emm/dmapool.c | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 117 | !Emm/page-writeback.c | 
 | 118 | !Emm/truncate.c | 
 | 119 |      </sect1> | 
 | 120 |   </chapter> | 
 | 121 |  | 
 | 122 |  | 
 | 123 |   <chapter id="ipc"> | 
 | 124 |      <title>Kernel IPC facilities</title> | 
 | 125 |  | 
 | 126 |      <sect1><title>IPC utilities</title> | 
 | 127 | !Iipc/util.c | 
 | 128 |      </sect1> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 129 |   </chapter> | 
 | 130 |  | 
 | 131 |   <chapter id="kfifo"> | 
 | 132 |      <title>FIFO Buffer</title> | 
 | 133 |      <sect1><title>kfifo interface</title> | 
 | 134 | !Iinclude/linux/kfifo.h | 
 | 135 | !Ekernel/kfifo.c | 
 | 136 |      </sect1> | 
 | 137 |   </chapter> | 
 | 138 |  | 
| Randy Dunlap | 5b217fa | 2006-09-29 01:59:10 -0700 | [diff] [blame] | 139 |   <chapter id="relayfs"> | 
 | 140 |      <title>relay interface support</title> | 
 | 141 |  | 
 | 142 |      <para> | 
 | 143 | 	Relay interface support | 
 | 144 | 	is designed to provide an efficient mechanism for tools and | 
 | 145 | 	facilities to relay large amounts of data from kernel space to | 
 | 146 | 	user space. | 
 | 147 |      </para> | 
 | 148 |  | 
 | 149 |      <sect1><title>relay interface</title> | 
 | 150 | !Ekernel/relay.c | 
 | 151 | !Ikernel/relay.c | 
 | 152 |      </sect1> | 
 | 153 |   </chapter> | 
 | 154 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 155 |   <chapter id="modload"> | 
 | 156 |      <title>Module Support</title> | 
 | 157 |      <sect1><title>Module Loading</title> | 
 | 158 | !Ekernel/kmod.c | 
 | 159 |      </sect1> | 
 | 160 |      <sect1><title>Inter Module support</title> | 
 | 161 |         <para> | 
 | 162 |            Refer to the file kernel/module.c for more information. | 
 | 163 |         </para> | 
 | 164 | <!-- FIXME: Removed for now since no structured comments in source | 
 | 165 | X!Ekernel/module.c | 
 | 166 | --> | 
 | 167 |      </sect1> | 
 | 168 |   </chapter> | 
 | 169 |  | 
 | 170 |   <chapter id="hardware"> | 
 | 171 |      <title>Hardware Interfaces</title> | 
 | 172 |      <sect1><title>Interrupt Handling</title> | 
| Randy Dunlap | 8f2709b | 2005-11-07 01:01:05 -0800 | [diff] [blame] | 173 | !Ekernel/irq/manage.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 174 |      </sect1> | 
 | 175 |  | 
| Randy Dunlap | eed34d0 | 2006-10-03 01:13:50 -0700 | [diff] [blame] | 176 |      <sect1><title>DMA Channels</title> | 
 | 177 | !Ekernel/dma.c | 
 | 178 |      </sect1> | 
 | 179 |  | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 180 |      <sect1><title>Resources Management</title> | 
| Randy Dunlap | 2b54960 | 2006-07-30 03:03:40 -0700 | [diff] [blame] | 181 | !Ikernel/resource.c | 
| Randy Dunlap | e1ca66d | 2006-10-03 01:13:51 -0700 | [diff] [blame] | 182 | !Ekernel/resource.c | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 183 |      </sect1> | 
 | 184 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 185 |      <sect1><title>MTRR Handling</title> | 
| Randy Dunlap | f3cf31a | 2007-10-12 21:17:23 -0700 | [diff] [blame] | 186 | !Earch/x86/kernel/cpu/mtrr/main.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 187 |      </sect1> | 
| Randy Dunlap | b0ef371 | 2006-06-25 05:49:18 -0700 | [diff] [blame] | 188 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 189 |      <sect1><title>PCI Support Library</title> | 
 | 190 | !Edrivers/pci/pci.c | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 191 | !Edrivers/pci/pci-driver.c | 
 | 192 | !Edrivers/pci/remove.c | 
| Randy Dunlap | d75763d | 2006-07-30 03:03:41 -0700 | [diff] [blame] | 193 | !Edrivers/pci/search.c | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 194 | !Edrivers/pci/msi.c | 
 | 195 | !Edrivers/pci/bus.c | 
| Randy Dunlap | cffb2fa | 2009-04-10 15:17:50 -0700 | [diff] [blame] | 196 | !Edrivers/pci/access.c | 
 | 197 | !Edrivers/pci/irq.c | 
 | 198 | !Edrivers/pci/htirq.c | 
| Randy Dunlap | f05aab8 | 2005-10-23 11:58:19 -0700 | [diff] [blame] | 199 | <!-- FIXME: Removed for now since no structured comments in source | 
 | 200 | X!Edrivers/pci/hotplug.c | 
 | 201 | --> | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 202 | !Edrivers/pci/probe.c | 
| Randy Dunlap | cffb2fa | 2009-04-10 15:17:50 -0700 | [diff] [blame] | 203 | !Edrivers/pci/slot.c | 
| Pavel Pisa | 4dc3b16 | 2005-05-01 08:59:25 -0700 | [diff] [blame] | 204 | !Edrivers/pci/rom.c | 
| Yu Zhao | 15b49be | 2009-03-20 11:25:18 +0800 | [diff] [blame] | 205 | !Edrivers/pci/iov.c | 
| Randy Dunlap | cffb2fa | 2009-04-10 15:17:50 -0700 | [diff] [blame] | 206 | !Idrivers/pci/pci-sysfs.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 207 |      </sect1> | 
 | 208 |      <sect1><title>PCI Hotplug Support Library</title> | 
 | 209 | !Edrivers/pci/hotplug/pci_hotplug_core.c | 
 | 210 |      </sect1> | 
 | 211 |      <sect1><title>MCA Architecture</title> | 
 | 212 | 	<sect2><title>MCA Device Functions</title> | 
 | 213 |            <para> | 
| Randy Dunlap | f3cf31a | 2007-10-12 21:17:23 -0700 | [diff] [blame] | 214 |               Refer to the file arch/x86/kernel/mca_32.c for more information. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 215 |            </para> | 
 | 216 | <!-- FIXME: Removed for now since no structured comments in source | 
| Randy Dunlap | f3cf31a | 2007-10-12 21:17:23 -0700 | [diff] [blame] | 217 | X!Earch/x86/kernel/mca_32.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 218 | --> | 
 | 219 | 	</sect2> | 
 | 220 | 	<sect2><title>MCA Bus DMA</title> | 
| Randy Dunlap | a1a739c | 2008-10-25 17:24:36 -0700 | [diff] [blame] | 221 | !Iarch/x86/include/asm/mca_dma.h | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 222 | 	</sect2> | 
 | 223 |      </sect1> | 
 | 224 |   </chapter> | 
 | 225 |  | 
| Randy Dunlap | b0ef371 | 2006-06-25 05:49:18 -0700 | [diff] [blame] | 226 |   <chapter id="firmware"> | 
 | 227 |      <title>Firmware Interfaces</title> | 
 | 228 |      <sect1><title>DMI Interfaces</title> | 
 | 229 | !Edrivers/firmware/dmi_scan.c | 
 | 230 |      </sect1> | 
| Randy Dunlap | 6e8c818 | 2007-02-10 01:46:03 -0800 | [diff] [blame] | 231 |      <sect1><title>EDD Interfaces</title> | 
 | 232 | !Idrivers/firmware/edd.c | 
 | 233 |      </sect1> | 
| Randy Dunlap | b0ef371 | 2006-06-25 05:49:18 -0700 | [diff] [blame] | 234 |   </chapter> | 
 | 235 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 236 |   <chapter id="security"> | 
 | 237 |      <title>Security Framework</title> | 
| James Morris | 20510f2 | 2007-10-16 23:31:32 -0700 | [diff] [blame] | 238 | !Isecurity/security.c | 
| Randy Dunlap | 3f23d81 | 2008-08-17 21:44:22 -0700 | [diff] [blame] | 239 | !Esecurity/inode.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 240 |   </chapter> | 
 | 241 |  | 
| Randy Dunlap | 862f5f0 | 2006-06-23 02:05:52 -0700 | [diff] [blame] | 242 |   <chapter id="audit"> | 
 | 243 |      <title>Audit Interfaces</title> | 
 | 244 | !Ekernel/audit.c | 
 | 245 | !Ikernel/auditsc.c | 
 | 246 | !Ikernel/auditfilter.c | 
 | 247 |   </chapter> | 
 | 248 |  | 
 | 249 |   <chapter id="accounting"> | 
 | 250 |      <title>Accounting Framework</title> | 
 | 251 | !Ikernel/acct.c | 
 | 252 |   </chapter> | 
 | 253 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 254 |   <chapter id="blkdev"> | 
 | 255 |      <title>Block Devices</title> | 
| Randy Dunlap | caf03fe | 2008-01-30 11:51:00 -0800 | [diff] [blame] | 256 | !Eblock/blk-core.c | 
| Randy Dunlap | 5d87a05 | 2008-02-20 09:01:22 +0100 | [diff] [blame] | 257 | !Iblock/blk-core.c | 
| Randy Dunlap | caf03fe | 2008-01-30 11:51:00 -0800 | [diff] [blame] | 258 | !Eblock/blk-map.c | 
 | 259 | !Iblock/blk-sysfs.c | 
 | 260 | !Eblock/blk-settings.c | 
 | 261 | !Eblock/blk-exec.c | 
 | 262 | !Eblock/blk-barrier.c | 
 | 263 | !Eblock/blk-tag.c | 
| Randy Dunlap | 5d87a05 | 2008-02-20 09:01:22 +0100 | [diff] [blame] | 264 | !Iblock/blk-tag.c | 
| Randy Dunlap | 710027a | 2008-08-19 20:13:11 +0200 | [diff] [blame] | 265 | !Eblock/blk-integrity.c | 
| Randy Dunlap | 88cacbb | 2009-04-05 15:45:34 -0700 | [diff] [blame] | 266 | !Ikernel/trace/blktrace.c | 
| Randy Dunlap | 710027a | 2008-08-19 20:13:11 +0200 | [diff] [blame] | 267 | !Iblock/genhd.c | 
 | 268 | !Eblock/genhd.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 269 |   </chapter> | 
 | 270 |  | 
| Jonathan Corbet | cf3e43d | 2006-09-29 02:00:44 -0700 | [diff] [blame] | 271 |   <chapter id="chrdev"> | 
 | 272 | 	<title>Char devices</title> | 
 | 273 | !Efs/char_dev.c | 
 | 274 |   </chapter> | 
 | 275 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 276 |   <chapter id="miscdev"> | 
 | 277 |      <title>Miscellaneous Devices</title> | 
 | 278 | !Edrivers/char/misc.c | 
 | 279 |   </chapter> | 
 | 280 |  | 
| David Brownell | e275ac4 | 2008-04-28 02:11:56 -0700 | [diff] [blame] | 281 |   <chapter id="clk"> | 
 | 282 |      <title>Clock Framework</title> | 
 | 283 |  | 
 | 284 |      <para> | 
 | 285 | 	The clock framework defines programming interfaces to support | 
 | 286 | 	software management of the system clock tree. | 
 | 287 | 	This framework is widely used with System-On-Chip (SOC) platforms | 
 | 288 | 	to support power management and various devices which may need | 
 | 289 | 	custom clock rates. | 
 | 290 | 	Note that these "clocks" don't relate to timekeeping or real | 
 | 291 | 	time clocks (RTCs), each of which have separate frameworks. | 
 | 292 | 	These <structname>struct clk</structname> instances may be used | 
 | 293 | 	to manage for example a 96 MHz signal that is used to shift bits | 
 | 294 | 	into and out of peripherals or busses, or otherwise trigger | 
 | 295 | 	synchronous state machine transitions in system hardware. | 
 | 296 |      </para> | 
 | 297 |  | 
 | 298 |      <para> | 
 | 299 | 	Power management is supported by explicit software clock gating: | 
 | 300 | 	unused clocks are disabled, so the system doesn't waste power | 
 | 301 | 	changing the state of transistors that aren't in active use. | 
 | 302 | 	On some systems this may be backed by hardware clock gating, | 
 | 303 | 	where clocks are gated without being disabled in software. | 
 | 304 | 	Sections of chips that are powered but not clocked may be able | 
 | 305 | 	to retain their last state. | 
 | 306 | 	This low power state is often called a <emphasis>retention | 
 | 307 | 	mode</emphasis>. | 
 | 308 | 	This mode still incurs leakage currents, especially with finer | 
 | 309 | 	circuit geometries, but for CMOS circuits power is mostly used | 
 | 310 | 	by clocked state changes. | 
 | 311 |      </para> | 
 | 312 |  | 
 | 313 |      <para> | 
 | 314 | 	Power-aware drivers only enable their clocks when the device | 
 | 315 | 	they manage is in active use.  Also, system sleep states often | 
 | 316 | 	differ according to which clock domains are active:  while a | 
 | 317 | 	"standby" state may allow wakeup from several active domains, a | 
 | 318 | 	"mem" (suspend-to-RAM) state may require a more wholesale shutdown | 
 | 319 | 	of clocks derived from higher speed PLLs and oscillators, limiting | 
 | 320 | 	the number of possible wakeup event sources.  A driver's suspend | 
 | 321 | 	method may need to be aware of system-specific clock constraints | 
 | 322 | 	on the target sleep state. | 
 | 323 |      </para> | 
 | 324 |  | 
 | 325 |      <para> | 
 | 326 |         Some platforms support programmable clock generators.  These | 
 | 327 | 	can be used by external chips of various kinds, such as other | 
 | 328 | 	CPUs, multimedia codecs, and devices with strict requirements | 
 | 329 | 	for interface clocking. | 
 | 330 |      </para> | 
 | 331 |  | 
 | 332 | !Iinclude/linux/clk.h | 
 | 333 |   </chapter> | 
 | 334 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 335 | </book> |