## Linux Device Drivers, 2nd Edition ### Index [ Numbers ], [ A ], [ B ], [ C ], [ D ], [ E ], [ F ], [ G ], [ H ], [ I ], [ J ], [ K ], [ L ], [ M ], [ N ], [ O ], [ P ], [ Q ], [ R ], [ S ], [ T ], [ U ], [ V ], [ W ], [ X ], [ Z ] Numbers[ Top ] 16-bit hardware addresses (PCI), 471 16-bit PCI registers, 476 16-bit ports, 230 string functions for, 232 32-bit addresses PCI bus I/O and memory space, 473 32-bit PCI registers, 483, 485-488 32-bit ports, 230 string functions for, 232 64-bit addresses accessing PCI bus memory space, 473 64-bit programmable decoder, 485 64-bit regions and PCI registers, 483 8-bit ports, 230 reading/writing, 230 string functions for, 232 A[ Top ] access blocking open requests, 168 cloning devices on open, 169-171 concurrent (see race conditions) to device files, 164-171 to drivers, 59 to expansion board memory, 238-247 PCI configuration space, 480-483 restricting to simultaneous users, 167 via capabilities, 137 to user space in Linux 2.0, 173-175 access_ok(), 135 active queue heads, 342 add_timer(), 201-203, 207 __add_wait_queue(), 287, 292 add_wait_queue_exclusive(), 146, 179 add_wait_queue(), 179, 287, 292 Address Resolution Protocol (see ARP) address types, 371 addresses bus (see bus addresses) hardware (see hardware addresses) PCI, 471-474 for peripheral boards, 473 Plug and Play, 496 resolving, 455-458 Adelson-Velski-Landis (AVL) tree, 515 alias directive (modprobe), 308 aliases for device names, 69 alignment, data, 299 alloc_bootmem_low_pages(), 221, 225 alloc_bootmem_low(), 221, 225 alloc_bootmem_pages(), 221, 225 alloc_bootmem(), 221, 225 alloc_kiovec(), 396, 422 map_user_kiobuf and, 399 alloc_skb(), 454, 468 allocate_resource structure, 41 allocating DMA buffers, 402-404 major device numbers, 57-61 memory, 36, 73-75 at boot time, 221-223 determining how much, 211 kmalloc for, 208-211 by page, 214-217 vmalloc for, 217-220 ports, 36-41 resources in Linux 2.4, 40 socket buffers, 449, 454 allocator module, 223 Alpha architecture I/O memory management support, 411 porting and, 233 alpha_machine_vector structure, 494 analyzing crash dumps, 125 applications vs. kernel modules, 16-21 arch directory, 517 ARM architecture layout of boot code, 510 PCI DMA interface support, 411 porting and, 233 ARP (Address Resolution Protocol) Ethernet and, 455 IFF_NOARP flag and, 432, 438 overriding, 456 asm directory, 17 <asm/atomic.h> header file, 285, 291 <asm/bitops.h> header file, 284, 291 <asm/byteorder.h> header file, 298, 304 <asm/current.h> header file, 21 <asm/dma.h> header file, 414, 416, 423 <asm/io.h> header file, 249, 422 accessing I/O ports, 230 converting between bus/virtual addresses, 404 <asm/ioctl.h> header file, 130 <asm/irq.h> header file, 262, 267 <asm/msr.h> header file, 183, 205 <asm/page.h> header file, 297, 303, 372, 376 <asm/pcibios.h> header file, 502 <asm/pgtable.h> header file, 218, 377 <asm/processor.h> header file, 497 <asm/sbus.h> header file, 412 <asm/segment.h> header file, 95 <asm/semaphore.h> header file, 76, 95 <asm/system.h> header file, 228, 249 <asm/types.h> header file, 295 <asm/uaccess.h> header file, 78, 95, 135, 177 <asm/unaligned.h> header file, 299, 304 assembly language dump of code, 116 asynchronous DMA, 401 asynchronous notification, 159-162 backward compatibility issues, 173 drivers and, 161 asynchronous running of task queues, 191 atomic_add_and_test(), 286 atomic_add(), 286, 291 atomic bit operations, 284 backward compatibility issues, 289 atomic_dec_and_test(), 286, 291 atomic_dec(), 286, 291 atomic_inc_and_test(), 286 atomic_inc(), 286, 291 atomic integer operations, 285 atomic_read(), 286 atomic_set(), 286 atomic_sub_and_test(), 286 atomic_sub(), 286, 291 atomic_t data type, 285 atomic.h header file, 285, 291 autoconf.h header file, 316 autodetecting parameter values, 42 autoirq_report(), 260 autoirq_setup(), 260 automatic device parameters detection, 43 driver configuration, 43 IRQ number detection, 258-262 shared interrupts and, 276 module loading/unloading, 305-311 AVL (Adelson-Velski-Landis) tree, 515 B[ Top ] b_end_io(), 339, 368 clustered I/O, 341 "make request" function and, 346 backward compatibility access to user space, 173-175 asynchronous notification, 173 block drivers, 364-366 capabilities, 175 compiling for multiprocessor systems, 48 demand-loading capability, 318 DMA (direct memory access), 420 exporting symbols, 48-50 file_operations structure, 91-93 fsync method, 173 hardware management, 248 interrupt handling, 288 memory management, 418-420 programming interface, 223 module configuration parameters, 50 module usage count, 93 networking, 464-466 peripheral buses, 502 resource management, 47 seeking, 176 select method in Linux version 2.0, 175 semaphore support, 94 task queues/timing issues, 204 user space, access to, 94 wait queues, 172 barrier(), 228, 249 base address registers, 485-488 base module parameter, 237 base name, device, 356 bdops (see block_device_operations structure) bfd (binary format description) library and ksymoops, 116 BH (see bottom halves) bh->b_end_io(), 339, 368 clustered I/O, 341 "make request" function and, 346 bibliography, 527 __BIG_ENDIAN symbol, 298, 304 big-endian byte order, 298 bigphysarea patch, 222 binary format description (bfd) library and ksymoops, 116 binary formats, 513 binfmt_elf.c file, 513 bit operations, 284 backward compatibility issues, 289 bit specifications, 236 bit splitting and minor numbers, 69 bitfields, defining ioctl commands, 130, 177 bitops.h header file, 284, 291 bits, clearing, 264 blk_cleanup_queue(), 323, 366 BLK_DEFAULT_QUEUE macro, 324, 367 blk_dev global array, 324, 364, 367 blk_dev_struct structure, 324 blk_init_queue(), 323, 366 initializing device-specific queues, 343 blk_ioctl(), 351, 368, 518 backward compatibility issues, 365 blk_queue_headactive(), 342, 368 blk_queue_make_request(), 346, 368 blk_size global array, 324, 367 sizes array and, 357 blkdev_dequeue_request(), 338, 368 end_request() and, 340 blkdev_entry_next_request(), 337, 368 blkdev_next_request(), 337, 368 blkdev_prev_request(), 337, 368 blkdev_release_request(), 338, 368 blkdev.h header file, 323, 366 BLKELVGET command, 351 BLKELVSET command, 351 BLKFLSBUF command, 350 BLKFRAGET command, 350 BLKFRASET command, 350 BLKGETSIZE command, 349, 361 blk.h header file, 328-330, 367 clustered requests and, 340 declaring DEVICE_NR first, 361 how macros and functions work, 339 BLKPG command, 350 blkpg.c file, 518 blkpg.h header file, 351 BLKRAGET command, 350 BLKRASET command, 350 BLKROGET command, 350 BLKROSET command, 350 BLKRRPART command, 350, 361 BLKSECTGET command, 350 BLKSECTSET command, 350 blksize_size global array, 324, 367 BLKSSZGET command, 350 block_dev.c file, 513 block_device_operations structure, 322 backward compatibility issues, 364 I/O operations, 323 removable devices, 352 block drivers, 7 arrays for information about, 324 backward compatibility, 364-366 generic hard disk support, 356 handling requests, 330-348 interrupt-driven, 362-364 io_request_lock and, 338 ioctl method and, 349-352 <linux/blk.h> header file (see blk.h header file) loading/unloading, 321-354 mounting devices, 348 multiqueue, 342-345 partitionable devices and, 355-362 raw I/O capability, 397 registering/unregistering, 322-328 removable block devices, 352-354 vs. char drivers, 321 block_fsync method, 158, 328 blocking I/O operations, 141-153 blocking open requests, 168 testing, 153 BogoMips value, 188 books Linux kernel, 527 Unix design/internals, 528 booting acquiring a dedicated buffer at, 221 allocating memory while, 221-223 kernels, 507-509 (non)modularized drivers and, 434 PCI and, 474 what happens before, 509-511 bootmem.h header file, 221, 225 bottom halves BH mechanism, 271 of interrupt handlers, 269-274 marking, 272 task queues, 190, 197 tasklets and, 198-200, 270 writing, 273 bounce buffers, 406 architectures not supporting, 411 streaming DMA mappings and, 409 bridge subdirectory, 516 bridges for PCI systems, 471 ignored by pcidata module, 482 BSS segments, 379 buffer cache and request structure, 335 buffer_head structure, 332 fields for, 335 performing clustered I/O, 341 buffer.c file, 513 buffering and interrupt-driven I/O, 278 buffers buffer overruns, 112 DMA, 402-404 for printk(), 100 in request queues, 336 socket (see socket buffers) user-space and raw I/O, 397-400 bugs (see debugging; troubleshooting) bus addresses, 372 converting between virtual addresses and, 404 dma_addr_t type and, 406 DMA-based hardware and, 404 bus architecture, 470-505 backward compatibility issues, 502 device-specific directories, 523 ISA interface, 494-496 PC/104 and PC/104+, 496 PCI interface, 470-494 bus_to_virt(), 404, 422 busy loops, 186 busy waiting implementation, 186 byte order PCI registers and, 475, 480 portability and, 298 byteorder.h header file, 298, 304 bzImage file, 510 C[ Top ] caches, lookaside, 211-214 backward compatibility issues, 223 caching problems for devices, 228, 385 call_usermodehelper(), 311, 320 CAP_DAC_OVERRIDE capability, 137 single-user access to devices, 168 CAP_NET_ADMIN capability, 137 CAP_SYS_ADMIN capability, 137 CAP_SYS_MODULE capability, 137 CAP_SYS_RAWIO capability, 137 CAP_SYS_TTY_CONFIG capability, 137 capabilities restricted operations and, 137 testing for, using request_module, 306 capability.h header file, 137, 178 capable(), 137, 178 Card Select Number (CSN), 496 cardctl program, 3 carrier signals, 451 cdrom_device_info structure, 520 cdrom.c file, 520 CFLAGS variable (make), 23 change_bit(), 284, 291 change_mtu method, 441 improving performance using socket buffers, 449 channels, DMA, 413-415 char drivers, 6, 54-96 defining mechanism of, 54 version numbers, 55-62 vs. block drivers, 321 check_disk_change(), 354, 369 check_media_change method, 353 backward compatibility issues, 364 check_mem_region(), 53, 250 backward compatibility issues, 47 working with I/O memory, 40, 239 check_region(), 52, 250 backward compatibility issues, 47 working with I/O ports, 38, 229 CHECKSUM_ symbols, 449 checksums adding to symbol names, 314 building, 317 circular buffers, 279 implementing interrupt handlers, 264-266 for printk(), 100 claim_dma_lock(), 416, 424 class PCI register, 476 classes, module, 6-8 cleanup_module(), 16, 50 error handling and, 31 network drivers and, 434 releasing ports, 39 unregistering items, 34 using unique names instead of, 34 clear_bit(), 284, 291 clear_dma_ff(), 417, 424 CLEAR_INTR macro, 329 clearing bits on interface board, 264 cli(), 252 clock cycles, counting, 182 clock ticks (see jiffies value) cloning devices on open requests, 169-171 close method, 72 accessing data within partitions, 360 adding VMA operations, 386 after cloning devices on open, 171 for single-open devices, 165 vm_operations_struct structure, 381 (see also release method) closing network interface, 443-445 clustered requests, 340 code, delaying execution of, 186-189 coding style, 23 collisions, device, 36, 38 command numbers, ioctl, 130-133 command-line parsing, 507 command-oriented drivers, 140 compiler optimizations, 227 concurrency, 20, 278-288 controlling transmission, 446 multiqueue block drivers and, 345 concurrent access (see race conditions) conditional compilation, avoiding, 90 CONFIG_DEVFS_FS, 85 portability issues and, 90 CONFIG_MODVERSIONS(), 316, 320 CONFIG_PCI(), 477, 503 CONFIG_SMP configuration option, 48 config.h header file, 316, 320, 477, 503 configuration space, PCI, 473, 480-483 configuration transactions, PCI, 473 configuring DMA controller, 415-418 drivers, 42-44 network devices, 441 PCI registers, 475-479 consistent DMA mappings, 406 setting up, 407 console_loglevel variable, 98 debugging system hangs, 118 console.c file, 518, 522 consoles drivers/char directory and, 518 frame buffer consoles, 522 selecting for messages, 99 wrong font on, 140 constructor function (kmem_cache_create), 212 controlling access (see access) controlling-by-write, 140 converting virtual addresses, 404 __copy_from_user, 79, 96 copy_from_user(), 79 memcpy_tofs and, 94 vmalloc() and, 218 __copy_to_user, 79, 96 copy_to_user(), 79 memcpy_fromfs and, 94 using put_user() instead of, 136 copying, cross-space, 78 core files, 120 core-file (gdb command), 121 core/skbuff.c file, 516 counter registers, 182 CPU modalities (levels), 19 __cpu_to_le32 macro, 298, 304 crash dump analyzers, 125 CRC (cyclic redundancy check) algorithm and module version control, 314 create_bounce(), 348 create_module system call, 9 using vmalloc() and, 218 create_proc_read_entry(), 106 cross compilation and platform dependency, 27 cross-space copying, 78 CSN (Card Select Number), 496 CURRENT_DEV macro, 329, 332 current_nr_sectors field, 332 current process, 21, 52 current time, retrieving, 184 current.h header file, 21 currentime file (jit module), 185 CURRENT(), 330, 368 accessing fields in request structure, 332 custom data types, 296 ioctl methods for networking, 458 task queues, 198 cycles_t type, 183 D[ Top ] data explicitly sizing, 295 physical packet transport, 429, 445-450 protecting from race conditions, 279 transferring for block driver requests, 332-334 with DMA, 401-418 using ioctl method, 131 unaligned, portability and, 299 data structures, portability of, 299 data types for explicitly sizing data, 295 interface-specific, 296 loose typing for I/O functions, 297 mixing different, 294 portability and, 293-297 standard C types, 293 dataalign program, 300 datasize program, 293 dcache.c file, 513 dd utility and scull driver example, 73 deadlocks avoiding, 77 detecting with IKD, 124 deallocating (see allocating) debugging, 97-127 using a debugger, 120-127 using Dynamic Probes, 127 using gdb, 120-122 using IKD (integrated kernel debugger), 124 implementing debug levels, 102 interrupt handling, 267 with ioctl method, 108 using kdb kernel debugger, 122-124 using kgdb, 125 using Linux Trace Toolkit (LTT), 127 locked keyboard, 118 module loading, 24 modules, 113-118 by printing, 97-103 with /proc filesystem, 103-107 by querying, 103-108 race conditions, 278-288 system faults, 110-120 system hangs, 118 using User-Mode Linux, 126 by watching in user space, 108-110 (see also troubleshooting) DECLARE_TASK_QUEUE, 191, 198, 206 DECLARE_TASKLET, 199, 206, 270, 290 DECLARE_TASKLET_DISABLED, 199, 206 DECLARE_WAIT_QUEUE_HEAD, 141, 143 jiq module and , 193 decoders, programmable, 485 decoding oops messages, 113-118 DEFAULT_CONSOLE_LOGLEVEL, 98 DEFAULT_MESSAGE_LOGLEVEL, 98 del_timer_sync(), 202, 207 avoiding race conditions, 203 backward compatibility issues, 205 del_timer(), 202, 207 delay.h header file, 188, 206 delaying execution of code, 186-188 delete_module system call, 34 demand-loading modules, 305-311 slave/master modules example, 309 dentry field (file structure), 68 backward compatibility issues, 93 depmod program, 319 dereferencing invalid pointers, 111-118 I/O pointers, not recommended, 240 memory addresses, 294 physical addresses, 240 destructor function (kmem_cache_create), 212 dev_alloc_skb(), 449, 454, 468 dev_id pointer, 254, 267 installing shared handlers, 275 dev_kfree_skb(), 454, 468 dev_mc_list structure, 462 /dev nodes, 6 assigning, 57 char devices and, 55 /dev/random device, 255 /dev/urandom device, 255 dynamic major number allocation, 58 removing, 61 dev structure and device initialization, 432 dev_t type (Unix), 62 dev_table.c file, 521 dev_tint(), backward compatibility issues for, 465 development kernels, 11 devfs (device filesystem), 56, 85-91 advantages of, 85 dual-mode initialization, 88 flags, 87 portability issues and, 90 DEVFS_FL_AUTO_DEVNUM flag, 87 DEVFS_FL_AUTO_OWNER flag, 87 DEVFS_FL_DEFAULT flag, 87 DEVFS_FL_HIDE flag, 87 DEVFS_FL_NO_PERSISTENCE flag, 87 DEVFS_FL_NONE flag, 87 DEVFS_FL_SHOW_UNREG flag, 87 devfs_fs_kernel.h header file, 96 devfs_get_flags(), 87 devfs_mk_dir(), 86 devfs_register(), 86 devfs_set_flags(), 87 devfs_unregister(), 86 device control operations, 5 device entry points, filesystem for, 85-91 device files, 55 controlling access, 164-171 deleting, 61 device filesystem (see devfs) DEVICE_INTR symbol, 329, 367 device memory (see I/O memory) DEVICE_NAME symbol, 329, 367 DEVICE_NO_RANDOM symbol, 329 DEVICE_NR symbol, 329, 367 minor_shift value and, 356 DEVICE_OFF macro, 329 DEVICE_ON macro, 329 DEVICE_REQUEST symbol, 329 device-dependent symbols, 328-330 deviceID PCI register, 476 devices assigning virtual addresses to, 242 autodetecting parameters of, 43 base name of, 356 block (see block drivers) caching problems, 228, 385 character (see char drivers) classes of, 6-8 cloning on open requests, 169-171 collisions between, 36 creating using devfs, 86, 88 DMA and, 401-418 file operations on, 63-66 hardware management, 226-250 hot-pluggable, handling, 489-493 identifying type with ls command, 55 interrupts (see interrupt handlers) names of, 56 aliases for, 69 dynamic major number allocation, 58 removing, 61 network (see network drivers) partitionable, 355-362 accessing data within partitions, 360 PCI (see PCI) reading and writing, 78-84 reading data from, 157 removable, 352-354 removing using devfs, 86 seeking, 163 single-open, 165 single-user access to, 167 truncating on open, 71 version (see version numbering) writing control sequences to, 140 writing data to, 157 devices.c file, 513 digital I/O ports, 235-238 direct memory access (see DMA) directly mapped I/O memory, 240 directories of kernel headers, 17 directory entry (file structure), 68 backward compatibility issues, 93 disable_dma(), 417, 424 disable_irq_nosync(), 267, 290 backward compatibility issues, 289 disable_irq(), 267, 290 backward compatibility issues, 289 shared handlers and, 276 disabling interrupts, 267 using save_flags/restore_flags, 252 disassemble command (gdb), 121 disassembled code and ksymoops, 116 disk changes, 352-354 disk files vs. open files, 67 disk geometry, retrieving, 351 dma_addr_t type, 406 DMA (direct memory access), 401-418 allocating buffers for, 402-404 backward compatibility issues, 420 configuring controller, 415-418 dedicated buffers at boot time, 221 __get_dma_pages() and, 215, 223 __GFP_DMA flag and, 209 for ISA memory, 413-418 PCI devices and, 404-412 dealing with difficult hardware, 405 DMA mappings (see DMA mappings) hardware dependencies for, 411 simple example of, 411 registering usage, 414 ring buffers, 402 DMA mappings, 405-410 consistent, 406 setting up, 407 scatter-gather, 409 streaming, 406 setting up, 407-409 dma_spin_lock, 416 DMAC (DMA controller), 413 DMA-capable memory zone, 210 SLAB_CACHE_DMA flag and, 212 dma.h header file, 414, 416, 423 dmesg command, 115 do_basic_setup(), 508 do_gettimeofday(), 185, 206 do_initcalls(), 508 do_ioctl method, 441, 458 do_IRQ(), 263 do_map_pgoff(), 514 do_timer(), 193 BH mechanism and, 272 down_interruptible(), 77, 95 down(), 77 dquot.c file, 513 driver modules, 7 drivers adding new, 56-61 asynchronous notification and, 161 character (see char drivers) choosing ioctl numbers for, 130 command-oriented, 140 configuring, 42-44 device names (see devices, names of) file operations, 63-66 FireWire, 8 I2O, 8 input/output buffers and, 148 interrupt-driven, 362-364 mechanism of (see mechanism, driver) monitoring with preprocessor, 101-103 network drivers, 425-469 probing for IRQ numbers, 261 removing (see unloading modules) SCSI, 7 security issues, 9 USB (see USB drivers) user-space, 45 version (see version numbering) writing, using devfs, 85-91 drivers/block directory, 518 drivers/cdrom directory, 520 drivers/char directory, 518 drivers/i2c directory, 524 drivers/ide directory, 519 drivers/input directory, 523 drivers/md directory, 519 drivers/media directory, 523 drivers/mtd directory, 524 drivers/net directory, 521 driver-specific symbols, 328-330 drivers/scsi directory, 520 drivers/sound directory, 521 drivers/video directory, 522 dump analyzers, 125 Dynamic Probes debugging tool, 127 E[ Top ] EBUSY error, 168 edge-triggered vs. level-triggered interrupt lines, 274, 495 EISA (Extended ISA) buses, 497 elevator.o file, 519 ELF sections avoiding #ifdefs, 508 changes to kernel compilation, 509 embedded systems, different ld scripts needed for , 510 enable_dma(), 417, 424 enable_irq(), 267, 290 backward compatibility issues, 289 shared handlers and, 276 enabling interrupts, 267 using save_flags/restore_flags, 252 end_request(), 330, 368 DEVICE_NO_RANDOM symbol and, 329 interrupt-driven block drivers and, 362 splitting up multibuffer requests, 339 end_that_request_first(), 340, 368 end_that_request_last(), 340, 368 endless loops, preventing, 118 end-of-file poll method and, 156 seeking relative to, 163 enet_statistics structure, Linux 2.0, 465 entropy pool and SA_SAMPLE_RANDOM flag, 255 errno.h header file, 31 error codes, 31 errors handling in init_module(), 30-32 read/write, 80 strace command to debug, 110 /etc/hosts file, 428 /etc/modules.conf file, 307, 319 /etc/networks file, 428 /etc/syslog.conf file, 100 avoiding performance problems, 103 ETH_ALEN macro, 444, 468 eth_header method, 440 ETH_P_IP macro, 457, 468 eth_type_trans(), 469 overriding ARP, 456 ether_setup(), 432, 468 setting up interface information, 436-439 etherdevice.h header file, 468 Ethernet, 429 address resolution, 455-458 ARP and, 455 non-Ethernet headers, 457 ethernet subdirectory, 516 exclusive sleep, 146 exclusive waits, 146 exec.c file, 513 execution modes, 19 execve(), 511 __exit attribute, 35 exit system call, 512 expansion board memory, 238-247 experimental kernels, 11 expires field (timer_list structure), 201 EXPORT_NO_SYMBOLS macro, 29, 51 in Linux 2.0, 48 EXPORT_SYMBOL macro, 30, 50-51 EXPORT_SYMBOL_NOVERS macro, 29, 51 EXPORT_SYMTAB macro, 29, 51 exporting symbols, 29, 317 in Linux 2.0, 48-50 Extended ISA (EISA) buses, 497 external buses, 499-502 directories for, 524 F[ Top ] f_dentry pointer, 68 backward compatibility issues, 93 f_flags field (file structure), 67 O_NONBLOCK flag, 134, 148 f_mode field (file structure), 67 f_op pointer, 68 f_pos field (file structure), 67, 91 read_proc/get_info() and, 105 F_SETFL command, 134, 161 fcntl system call and, 159 F_SETOWN command, 161 fcntl system call and, 159 facilities, (un)registering in init_module(), 29-32 fast interrupt handlers, 262-264 backward compatibility issues, 288 fasync_helper(), 162, 179 fasync method, 65 asynchronous notification and, 161 backward compatibility issues, 173 fasync_struct structure, 161 faults (see system faults) faulty_write() klogd and, 113 ksymoops and, 115 fb_info structure, 522 fbmem.c file, 522 fc_setup(), 437 fcntl system call F_SETOWN/F_SETFL commands, 159 vs. ioctl method, 134 fcntl.h header file, 148 fdatasync system call, 158 FDDI networks, configuring interfaces, 437 fddi_setup(), 437 fdisk program, 355-362 fiber channel devices, initializing, 437 FIFO (first-in-first-out) devices, 55 poll method and, 156 fifo.c file, 513 file flags, 67 file handling and fs directory , 513 file modes, 67 file_operations structure, 57, 63-66, 68 backward compatibility issues, 91-93 declaring using tagged initialization, 66 mmap method and, 384 file structure, 63, 66 File System header (fs.h), 95 file.c file, 513 filemap.c file, 514 filesystem modules, 8 filesystem nodes, 4 block drivers accessed by, 7 names, device (see devices, names of) filp pointer, 67 in ioctl method, 129 mounting block drivers, 348 in read/write methods, 78 retrieving inode pointers from, 93 filp->f_op, 68 implementing multiple fops, 70 initializing, 89 filp->private_data initializing, 89 FIOASYNC command, 134 FIOCLEX command, 134 FIONBIO command, 134 FIONCLEX command, 134 FireWire drivers, 8 firmware, PCI-aware, 474 first-in-first-out (FIFO) devices, 55 poll method and, 156 flags devfs, 87 file, 67 flash memory, executing kernel from, 510 flush method, 65 backward compatibility issues, 93 close system call and, 73 flushing pending output, 158 font, incorrect on console, 140 fops pointers, 63 as argument to register_chrdev, 56 implementing multiple, 70 fops->open, 70 forcing module load, 24 fork system call, 512 fragmentation, 403 frame buffer video devices directory, 522 free command, 85 free_dma(), 414, 423 free_irq(), 253, 289 when to call, 255 free_kiovec(), 396, 422 free_pages(), 215, 225 free_page(), 215, 225 fs directory, 513 fs.h header file, 95, 177, 322, 366 asynchronous notification and, 161 block driver commands and, 349 blocking/nonblocking operations, 148 file structure and, 66 kdev_t type and, 62 register_chrdev(), 56 fsync_dev method, 328 flushing all partitions, 359 fsync method, 65, 158 backward compatibility issue, 173 functions accessing memory in Linux 2.0, 173-175 calling from modules/applications, 17 disassembling with gdb, 121 inserting schedule() calls in, 118 G[ Top ] gcc compiler -g option, 121 inline assembly code, 184 -O flag, 22 SPARC platforms and, 27 -Wall flag, 23 gdb debugger, 120-122 kgdb patch and, 125 gendisk_head, 358, 369 gendisk_struct structure, 356, 369 adding to global list, 358 removing from global list, 360 General Public License (GPL), 12 generic hard disk support, 356 genhd.c file, 518 genhd.h header file, 356, 369 __GENKSYMS__, 320 genksyms program, 317 geographical addressing, 473 lack of in ISA devices, 494 MCA buses and, 497 NuBus and, 499 Plug and Play, 496 SBus and, 498 geometry, disk, 351 get_cycles(), 183 __get_dma_pages(), 215, 225 get_dma_residue(), 417, 424 get_fast_time(), 185, 206 __get_free_page(), 215, 225 advantage of using, 217 __get_free_pages(), 215, 225 get_free_pages(), 208 allocating memory using, 298 limitations on memory allocation, 403 mmap method and, 392 returning virtual addresses, 217 get_info(), 104-107 get_kernel_syms system call, 24 get_page(), 387 backward compatibility issues, 419 get_stats method, 441, 459 get_unaligned(), 299, 304 __get_user(), 136, 178 get_user(), 136, 178 Linux 2.0 version, 174 get_zeroed_page(), 215, 225 getdents system call, 513 GFP_ATOMIC flag, 209, 224 page-oriented allocation functions, 215 preparing for allocation failure, 215 GFP_BUFFER flag, 209 __GFP_DMA flag, 209, 224 memory zones and, 210 page-oriented allocation functions, 215 __GFP_HIGHMEM flag, 210, 224 memory zones and, 210 page-oriented allocation functions, 215 GFP_HIGHUSER flag, 209 GFP_KERNEL flag, 36, 208, 224 page-oriented allocation functions, 215 GFP_USER flag, 36, 209 GKSMP symbol, 317 global memory areas, 55 message enabling/disabling, 101 goto statement, 30 GPL (General Public License), 12 gpm mouse server, 45, 119 group, device, 59 H[ Top ] handle_IRQ_event(), 263 handle_scancode(), 518 hard_header method, 440, 457 backward compatibility issues, 466 building packets with ARP query results, 455 hard_header_parse method, 442 hard_start_transmit method, 445 hard_start_xmit method, 440, 445 backward compatibility issues, 464 HARDRESET command, 132 hardsect_size global array, 324, 367 hardware (see devices) hardware abstractions (PCI), 493 hardware addresses, 437 assigning, 444 changing, using set_mac_address method, 441 multicasting and, 460-464 used with PCI peripherals, 471-474 hardware headers adding before transmitting packets, 454 backward compatibility issues, 466 building, 440 encapsulating information, 457 overriding ARP, 456 hardware memory barriers, 228, 249 backward compatibility issues, 248 HAVE_DEVLIST, backward compatibility issues for, 466 HDIO_GETGEO command, 351 hdreg.h header file, 351 head pointers and circular buffers, 280 header_cache method, 442 header_cache_update method, 442 header files, 17 include directory and, 517 managing symbol visibility, 29 removing conditional compilation, 90 headers, Ethernet (see Ethernet) headers, non-Ethernet, 457 helper programs, running, 311 hex values of oops messages, 114 hiding global symbols, 29 in Linux 2.0, 48 high memory, 372 request queues and, 348 high memory zone, 210 high RAM addresses, reserving, 223 highmem.c file, 515 highmem.h header file, 374 HIPPI drivers, preparing fields for, 437 hippi_setup(), 437 host adapters, plugging into core system, 520 host numbers, 428 hosts.c file, 520 hot-pluggable devices, handling, 489-493 hung system, 118 HZ (time frequency) symbol, 181, 297 I[ Top ] i_rdev field (inode structure), 61 I2O drivers, 8 IA-64 architecture PCI DMA interface support, 411 porting and, 233 /proc/interrupts file, snapshot of, 257 IDE device drivers, directory for, 519 if_ether.h header file, 468 ifconfig command net_device structure and, 435 opening/closing interfaces, 443 #ifdef constructs avoiding with devfs, 90 avoiding with init calls, 508 IFF_ symbols, 438, 462 IFF_NOARP flag, 432 if.h header file, 438, 458, 467 ifreq structure, 458 IKD (integrated kernel debugger) patch, 124 IMMEDIATE_BH bottom half, 272 writing a BH bottom half, 273 immediate queue, 193, 197, 206 BH mechanism and, 272 writing a BH bottom half, 273 in_interrupt(), 192, 206 vs. intr_count global variable, 205 inb_p(), 232, 249 inb(), 230, 249 include/asm directory (see entries under <asm/>) include directory, 517 infinite loops, preventing, 118 inflate.c file, 517 __init attribute, 35 init calls and #ifdef constructs, 508 INIT_LIST_HEAD macro, 301 init_module(), 16, 29-32, 50 error handling in, 30-32 EXPORT_NO_SYMBOLS macro and, 29 hiding global symbols, 48 unregistering facilities from, 30 using unique names instead of, 34 init process, 511 INIT_REQUEST(), 330, 368 splitting up multibuffer requests, 339 init scripts and loading/unloading modules, 60 init thread, 507 init_timer(), 201, 207 __initdata attribute, 35 init.h header file, 35, 50 initialization functions and boot-time memory allocation, 221 initializing kernel data structures, 507 modules, 29-32 explicitly naming functions for, 34 network devices, 432 semaphores, 76 initrd utility, 360 inline assembly code (example), 183 inline functions, 22 for accessing I/O ports, 230 inl(), 231, 249 inode pointer backward compatibility issues, 91 in ioctl method, 129 retrieving from filp pointer, 93 inode structure accessing device numbers, 61, 69, 95 mounting block drivers, 348 inode->i_rdev, 61, 69, 95 inode.c file, 513 input buffers, driver, 148 input files, enabling asynchronous notification from, 159 input management, directory for, 523 input module, 28 input pins, 226, 235 reading values from parallel port, 238 input_register_device(), 523 input_register_handler(), 523 input.c file, 523 input.h header file, 504 insb(), 232, 249 insl(), 232, 249 insmod program, 6, 24 assigning parameter values, 42 backward compatibility issues, 319 dynamically allocating major numbers, 60 -f switch, 24 modprobe program vs., 28 module loading and security, 309 testing modules using, 16 version control in modules, 314 vmalloc() and, 218 installing interrupt handlers, 253-264 insw(), 232, 249 int data type, 294 integrated kernel debugger (IKD) patch, 124 inter_module_get_request(), 313, 319 inter_module_get(), 312, 319 inter_module_put(), 313, 319 inter_module_register(), 312, 319 inter_module_unregister(), 312, 319 interactive kernel debugger (kdb), 122-124 interface buses, 496-502 interface flags for net_device structure, 438 interface-specific data types, 296 intermodule communication, 311-314 Internet sites about Linux kernels, xv interrupt handlers, 251-292 using arguments with, 267 autodetecting IRQ numbers, 258-262, 276 backward compatibility issues, 288 BH mechanism, 271 bottom halves of handlers, 269-274 enabling/disabling interrupts, 252, 267 fast vs.slow, 262-264 backward compatibility issues, 288 implementing, 264-268 installing, 253-264 at device open, 255 shared handlers, 275 for network drivers, 450 preparing parallel ports for, 253 /proc files for, 256 race conditions, 278-288 circular buffers for, 279 lock variables for, 284-286 spinlocks for, 281-283 running shared handlers, 276 sharing interrupts, 274-278 tasklets, 270 on x86 architecture, 263 interrupt mode and asynchronous execution, 191 interrupt numbers, 254 used as arguments, 267 probing using kernel facility, 259 interrupt request lines (see IRQs) Interrupt Service Routine (ISR), 181 interrupt-driven operation, 278 block drivers, 362-364 interrupt.h header file, 199, 206, 259, 272, 290 interruptible_sleep_on_timeout(), 142, 178 delaying code execution, 187 interruptible_sleep_on(), 142, 178 avoiding race conditions, 286 implementation of, 144 vs. wait_event macro, 145 interruptions, code, 77 interrupts PCI, 488 timer, 181 interrupts file, 256, 289 shared interrupts and, 277 intervals of time, 181-184, 297 intptr_t type (C99 standard), 294 intr_count global variable, 205 inw(), 230, 249 _IO() macro, 131, 177 I/O, 158 accessing, PCI and, 483-488 asynchronous notification, 159-162 blocking, 141-153 blocking/nonblocking, 148 buffers for, 148 flushing pending, 158 interrupt-driven, 278 ISA devices and, 494 pausing, 232 remapping specific regions of, 389 space for, in PCI buses, 473 string operations, 231 transferring data with DMA, 401-418 (see also reading; writing) I/O memory, 39-41, 226, 238-247 directly mapped, 240 page tables and, 239 software-mapped, 242 I/O ports, 36-41, 226, 229-234 allocating, 39 digital, 235-238 inline functions for accessing, 230 parallel (see parallel ports) I/O registers vs. RAM, 227-229 I/O registry, accessing, 38 io_request_lock, 338, 368 backward compatibility issues, 366 multiqueue block drivers and, 343 performing clustered I/O, 341 I/O request queues (see request queues) iobuf.h header file, 396, 422 _IOC() macro, 177 _IOC_TYPEBITS macro, 131, 177 _IOC_NR() macro, 131, 177 _IOC_READ macro, 131, 177 _IOC_NONE macro, 131, 177 _IOC_DIRBITS macro, 177 _IOC_TYPE() macro, 131, 177 _IOC_NRBITS macro, 131, 177 _IOC_SIZEBITS macro, 131, 177 _IOC_WRITE macro, 131, 177 _IOC_SIZE() macro, 131, 177 _IOC_DIR() macro, 131, 177 ioctl method, 64, 129-141 accessing specific information for partitions, 361 using bitfields to define commands, 130 block devices and, 349-352 changing read_ahead values, 326 command numbers, choosing, 130-133 controlling devices without, 140 controlling I/O channel, 128 customizing for networking, 458 debugging with, 108 extra argument of, 134-139 implementing ioctl commands, 138 network devices and, 441 predefined commands of, 133 using scalar values to define commands, 133 TIOCLINUX command, 99 type checking disabled, 129 ioctl.c file, 513 ioctl.h header file, 130, 177 setting up command numbers, 131 ioctl-number.txt file, 130 io.h header file (asm), 249, 422 accessing I/O ports, 230 converting between bus/virtual addresses, 404 io.h header file (linux), 250 iomem file, 39, 53 iomem_resource structure, 41 ioperm(), 231 iopl(), 231 ioport_resource structure, 41 ioport.h header file, 38, 52, 229, 250 resource ranges and, 40 ioports file, 37, 53 _IOR() macro, 131, 177 _IOW() macro, 131, 177 _IOWR() macro, 131, 177 ioremap_nocache(), 242, 250 ioremap(), 217-219, 225, 250 accessing I/O memory, 239 backward compatibility issues, 248 ISA memory range, 243 software-mapped I/O memory and, 242 IORESOURCE_IO flag, 484 IORESOURCE_MEM flag, 484 IORESOURCE_PREFETCH flag, 484 IORESOURCE_READONLY flag, 484 iounmap(), 217, 225, 250 backward compatibility issues, 248 software-mapped I/O memory and, 242 iovec structures, 84 IP numbers assigning, 427-429 resolving to physical addresses, 455-458 ip_summed field (sk_buff), 449, 453 ipc directory, 517 ipv4/ipv6 subdirectories, 516 irq argument (interrupt number), 254, 267 IRQ_WAITING status bit, setting, 264 irq.h header file, 262, 267 IRQs (interrupt request lines), 253 autodetecting (probing) numbers for, 258-262 shared interrupts and, 276 level-triggered vs. edge-triggered, 274, 495 PCI devices and, 488 statistics on, 257 ISA bus master DMA, 413 ISA devices, 494-496 DMA for, 413-418 EISA (Extended ISA) buses, 497 identifying I/O regions, 36 interrupt sharing and, 274, 495 pausing I/O, 232 Plug-and-Play specification, 496 probing, 38 programming techniques, 495 VLB (VESA Local Bus) devices, 498 ISA memory accessing, 244 below 1 MB, 243-245 DMA for, 413-418 nopage method and, 389 probing for, 245-247 isa_readb and related functions, 245 ISDN drivers and lookaside caches, 211-214 ISR (Interrupt Service Routine), 181 J[ Top ] jiffies value in busy waiting implementation, 186 kernel timers and, 201 no solution for short delays, 188 retrieving current time, 184 at timer interrupt, 182 trans_start field and, 442 variable syntax, 205 jiq (Just In Queue) module, 193 timer usage example, 202 jiq_print_tq(), 193 jit (Just In Time) module current time, retrieving, 185 delaying code execution, 186 jitbusy program, 186 Just In Queue (jiq) module, 193 timer usage example, 202 Just In Time (jit) module current time, retrieving, 185 delaying code execution, 186 K[ Top ] kbd_mode -a command, 119 kcore file, 120 kdataalign program, 300 kdatasize module, 294 kdb kernel debugger, 122-124 kdev_t_no_nr(), 62 kdev_t type, 62 extracting physical device number, 329 kdev_t.h header file, 62 keep directive (modprobe), 308 KERN_ALERT macro, 98 KERN_CRIT macro, 98 KERN_DEBUG macro, 98 KERN_EMERG macro, 98 KERN_ERR macro, 98 KERN_INFO macro, 98 KERN_NOTICE macro, 98 KERN_WARNING macro, 98 kernel directory, 512 kernel headers, 17 kernel I/O buffers, 396-400 kernel I/O vectors, 396 kernel lockups, detecting, 124 kernel logical addresses (see logical addresses) kernel sources, 527 kernel space, 19 transferring to/from user space, 78-84 kernel stack debugger (IKD feature), 124 __KERNEL__ symbol, 22, 50 explicitly sizing data, 295 kernel header files and, 17 __KERNEL_SYSCALLS__, 511 kernel timers, 200-203 KERNEL_VERSION macro, 25, 47 kernel_version variable, 52 kernel virtual addresses (see virtual addresses) kerneld program, backward compatibility issues for, 318 kerneld.h header file, backward compatibility issues for, 319 KERNELDIR variable and version dependency, 25 kernel.h header file, 98, 228, 249 kernels allocating memory at boot time, 221-223 books about Linux, 527 booting, 507-509 with initrd, 360 capabilities and restricted operations, 137 concurrency in, 20 connecting network drivers to, 430-434 current process and, 21 developmental (experimental), 11 filesystem modules, 8 flash memory, executing from, 510 handling system faults (see system faults) IKD (integrated kernel debugger) patch, 124 initial boot sequence, 507 introduction to, 1-14 kgdb patch and, 125 kiobufs, 396-400 kmod facility and, 305 linked lists, 300-302 loading modules into (see loading modules) messages (see messages) module version control, 314-318 multicasting support, 461 probing interrupt numbers with, 259 race conditions and, 76-78 request queues, finding, 343 running task queues, 191 security (see security) splitting role of, 4-6 symbol table, 27-29 klogd and, 114 system hangs, 118 time intervals in, 181-184 tracing programs, 108-110 using conventional data types, 295 version numbering, 10 web sites about, xv keventd process, 192, 195 backward compatibility issues, 204 call_usermodehelper and, 311 keyboard, debugging when locked, 118 keyboard.c file, 518 kfree_skb(), 454, 468 kfree(), 36, 52, 224 defined in slab.c file, 514 scull driver example and, 73 kgcc package, 22 kgdb patch, 125 khttpd subdirectory, 516 kill_fasync(), 162, 179 kiobuf_init(), 396, 422 kiobufs, 396-400 kiovecs, 396 klogd daemon -c flag, 98 debugging modules with, 113 decoding oops messages, 113 -f option, 101 logging messages, 100 obtaining clean oops messages, 115 -p option, 114 kmalloc.c file, 211, 514 kmalloc(), 36, 52, 208-211, 224 defined in slab.c file, 514 flags argument, 208-210 limitations on memory allocation, 403 performance degradation issues, 216 returning virtual addresses, 217-219 scull driver example and, 73 size argument, 211 vs. vmalloc(), 217-219 kmap(), 374, 421 backward compatibility issues, 420 kmem_cache_alloc, 213, 225 kmem_cache_create, 212, 224 kmem_cache_destroy, 213, 224 kmem_cache_free, 213, 225 kmem_cache_t, 212, 224 kmod facility, 305 loading modules, 310 user-mode helper programs and, 311 kmod.c file, 512 kmod.h header file, 306, 319 backward compatibility issues, 319 kmsg file, 100 kswapd thread, 515 ksymoops utility, 114-118 obtaining clean oops messages, 115 ksyms command, 27 ksyms file, 27, 30, 53 ksymoops and, 115 kunmap(), 374, 421 backward compatibility issues, 420 L[ Top ] layered modularization, 28 LCRASH utility, 126 ld scripts and boot code layout, 510 ld -r command, 23 __le32_to_cpu macro, 298, 304 least significant bit and partitionable devices, 355 LEDs, soldering to output pins, 237 levels debugging, 102 message priority (see loglevels) levels (modalities), CPU, 19 level-triggered vs. edge-triggered interrupt lines, 274, 495 lib directory, 517 libraries, 17 license, Linux, 12 line disciplines, implementing, 521 link state, changes in, 451 linked lists, 300-302 Linux license terms, 12 version numbering, 10 linux directory, 17 Linux Documentation Project web site, xv Linux Kernel Crash Dumps (LKCD), 126 Linux Trace Toolkit (LTT), 127 LINUX_VERSION_CODE macro, 25, 52 <linux/autoconf.h> header file, 316 <linux/blk.h> header file (see blk.h header file) <linux/blkdev.h> header file, 323, 366 <linux/blkpg.h> header file, 351 <linux/bootmem.h> header file, 221, 225 <linux/capability.h> header file, 137, 178 <linux/config.h> header file, 316, 320, 477, 503 <linux/delay.h> header file, 188, 206 <linux/devfs_fs_kernel.h> header file, 87, 96 <linux/errno.h> header file, 31 <linux/etherdevice.h> header file, 468 <linux/fcntl.h> header file, 148 <linux/fs.h> header file, 95, 177, 322, 366 asynchronous notification and, 161 block driver commands and, 349 blocking/nonblocking operations, 148 file structure and, 66 kdev_t type and, 62 register_chrdev(), 56 <linux/genhd.h> header file, 356, 369 <linux/hdreg.h> header file, 351 <linux/highmem.h> header file, 374 <linux/if_ether.h> header file, 468 <linux/if.h> header file, 438, 458, 467 <linux/init.h> header file, 35, 50 <linux/input.h> header file, 504 <linux/interrupt.h> header file, 199, 206, 259, 272, 290 <linux/io.h> header file, 250 <linux/iobuf.h.h> header file, 396, 422 <linux/ioctl.h> header file, 177 setting up command numbers, 131 <linux/ioport.h> header file, 38, 52, 229, 250 resource ranges and, 40 <linux/kdev_t.h> header file, 62 linux-kernel mailing list, 13 <linux/kernel.h> header file, 98, 228, 249 <linux/kerneld.h> header file backward compatibility issues, 319 <linux/kmod.h> header file, 306, 319 backward compatibility issues, 319 <linux/list.h> header file, 144, 300-302, 304 <linux/malloc.h> header file, 224 <linux/mm.h> header file, 209, 224, 380, 421 <linux/module.h> header file, 24, 51, 66 version.h header file and, 25 <linux/modversions.h> header, 315, 320 <linux/netdevice.h> header file, 431, 467 <linux/param.h> header file, 181, 205 <linux/pci.h> header file, 405, 422, 477, 503 accessing configuration space, 480 detecting size of PCI regions, 486 pci_ops structure and, 493 <linux/poll.h> header file, 154, 179 <linux/proc_fs.h> header file, 104 <linux/scatterlist.h> header file, 410 <linux/sched.h> header file, 52, 178, 205, 289, 291 interrupt request line functions, 253 jiffies value and, 182 kernel directory and, 512 wait queue code information, 147 <linux/skbuff.h> header file, 445, 452, 468 <linux/sockios.h> header file, 458, 469 <linux/spinlock.h> header file, 166, 180, 281, 290 <linux/symtab_begin.h> header file, 51 <linux/symtab_end.h> header file, 51 <linux/time.h> header file, 206 <linux/timer.h> header file, 201, 207 <linux/tqueue.h> header file, 190, 192, 206 <linux/types.h> header file, 295, 303 <linux/uio.h> header file, 84 <linux/usb.h> header file, 504 <linux/version.h> header file, 25, 52 <linux/vmalloc.h> header file, 217, 225 <linux/wait.h> header file, 144, 178 list_add(), 301, 304 list_add_tail(), 301, 304 list_del(), 301, 304 list_empty(), 301, 304 testing request queues with, 344 list_entry(), 301, 304 list_head data structure, 300-302 list_splice(), 301, 304 list.h header file, 144, 300-302, 304 lists, linked, 300-302 __LITTLE_ENDIAN symbol, 298, 304 little-endian byte order, 298, 475, 480 LKCD (Linux Kernel Crash Dumps), 126 ll_rw_blk.c file, 518 llseek method, 64, 92, 163 in Linux version 2.0, 176 loading block drivers, 321-354 loading modules, 24 on demand, 305-311 slave/master modules example, 309 dynamically assigned device numbers, 59 for network drivers, 430 version dependency and, 24 LocalTalk devices, setting up fields for, 437 lock_kiovec(), 396, 422 lock method, 65 lock variables, 284-286 locked keyboard, debugging, 118 lockup detector (IKD), 124 loff_t (long offset), 64, 67, 91 LOG_BUF_LEN circular buffer, 100 logging messages, 100 logical addresses, 372 loglevels (message priorities), 15, 97-99 long data type, 294 long delays, 186-188 lookaside caches, 211-214 backward compatibility issues, 223 loopback interface, 426 IFF_LOOPBACK flag, 438 loop.c file, 519 loops busy, 186 endless, 118 software, 188 loops_per_second value, 188 low memory, 372 lp.c file, 518 ls command, identifying device type, 55 lseek method, 64 in Linux version 2.0, 176 syntax in Linux 2.0, 92 ltalk_setup(), 437 LTT (Linux Trace Toolkit), 127 LVM (logical volume manager) drivers drivers/md directory, 519 "make request" function and, 346 M[ Top ] M68k architecture layout of boot code, 510 no support for PCI bus, 411 porting and, 233 MAC (Medium Access Control) addresses, 437 resolving, 455-458 set_mac_address method and, 441 machine-specific registers, 183 magic SysRq key, 119 mailing list, linux-kernel, 13 major device numbers, 56-61 dynamic allocation of, 57-61 MAJOR macro, 62, 95 major_name value (gendisk_struct), 356 MAJOR_NR symbol, 328, 367 "make request" function, 346-348 __make_request(), 346 make utility building a makefile, 23 KERNELDIR variable and, 25 makefiles, 22 adding version control with, 315 exporting versioned symbols, 317 install rules for, 26 SPARC architecture and, 27 malloc.h header file, 224 mangling symbol names, 314-317 map_user_kiobuf(), 399, 422 maplist array (kiobuf), 396, 400 mapper program, 391 mapping memory (see memory management) mapping registers, 405 architectures not supporting, 411 scatterlists and, 409 mark_bh(), 272, 290 marking bottom halves, 272 max_readahead global array, 325, 367 backward compatibility issues, 365 max_sectors global array, 326, 367 max_segments global array, 326 mb(), 228, 249 MCA (Micro Channel Architecture) buses, 497 mdelay(), 188, 206 mechanism, driver defining, 54 policy versus, 2 media, directory for, 523 Medium Access Control addresses (see MAC addresses) mem.c file, 518 memcpy_fromfs(), 94, 96 memcpy_fromio(), 241, 250 memcpy_tofs(), 94, 96 memcpy_toio(), 241, 250 memory accessing from expansion boards, 238-247 in Linux 2.0, 173-175 in PCI buses, 473, 483-488 allocating, 73-75 at boot time, 221-223 with kmalloc, 208-211 by page, 214-217 performance degradation issues, 216 with vmalloc, 217-220 circular buffers, 279 free, information on, 85 global areas, 55 high, 372 how much to allocate, 211 ISA memory range, 243-245 limitations on, 372 lookaside caches, 211-214 low, 372 managing allocation, 36 page size and portability, 297 persistence, 55 verifying user-space addresses, 135 vs. I/O registers, 227-229 memory barriers, 228 backward compatibility issues, 248 performance issues, 229 memory management, 4 accessing pages not in memory, 387-389 backward compatibility issues, 418-420 DMA (direct memory access), 401-418 fragmentation, 403 handling map region changes, 387-389 kernel source file directory, 514 memory mapping/remapping, 373-375 accessing pages not in memory, 387-389 handling region changes, 387-389 kiobufs, 396-400 mmap method, 382-395 PCI regions, 485 RAM, 390-394 specific I/O regions, 389 virtual addresses, 394 mmap method, 382-395 PCI and, 483-488 theory of, 370-382 VMAs (virtual memory areas), 378-382 memory map arrays, 374 memory maps, components of, 379 memory zones, 210 memory.c file, 515 memory-is-prefetchable bit, 483 memory-mapped registers (see I/O memory) memset_io(), 241, 250 messages globally enabling/disabling, 101 logging, 100 oops messages, 111-118 priorities (loglevels) of, 15, 97-99 mice, 119 asynchronous notification, 161 Micro Channel Architecture (MCA) buses, 497 minor device numbers, 56, 61, 69 MINOR macro, 62, 95 minor_shift value (gendisk_struct), 356 MIPS processor directly mapped memory, 240 inline assembly code and, 183 layout of boot code, 510 PCI DMA interface support, 411 porting and, 233 MIPS64 architecture, support for PCI DMA interface, 411 misc directory, 525 installing drivers in, 26 misc-modules/export.c file, 49 MKDEV macro, 62, 95 mknod command, 57 mlock system call, 46 mlock.c file, 514 mm directory, 514 mmap_avl.c file, 515 mmap method, 65, 382-395 using remap_page_range, 384-386 remapping virtual addresses with, 394 scullp driver and, 391-394 usage count and, 386 vm_area_struct structure and, 380 mmap.c file, 514 mm.h header file, 209, 224, 380, 421 mm/kmalloc.c file, 211, 514 mm/slab.c file, 211, 514 MOD_DEC_USE_COUNT macro, 33, 51 MOD_IN_USE macro, 33, 51 MOD_INC_USE_COUNT macro, 33, 51 mod_timer(), 202, 207 avoiding race conditions, 203 modalities (levels), CPU, 19 modes device modes, 59 file modes, 67 modprobe program, 319 assigning parameter values, 42 directives, 308 insmod program vs., 28 loading modules, 307 request_module() and, 306 security issues for module names, 309 version control in modules, 314 modularization kmod facility, 305 layered, 28 network drivers, 434 MODULE_AUTHOR macro, 44, 51 MODULE_DESCRIPTION macro, 44, 51 module_exit(), 35, 50 module_init(), 35, 50 __module_kernel_version symbol, 24 module parameters, 43 backward compatibility issues, 50 MODULE_PARM_DESC macro, 43, 51 MODULE_PARM macro, 42, 51 backward compatibility issues, 50 MODULE_SUPPORTED_DEVICE macro, 44, 51 MODULE symbol, 22 module.c file, 512 module.h header file, 24, 51, 66 version.h header file and, 25 modules, 6 applications vs., 16-21 classes of, 6-8 communicating between, 311-314 current process and, 21 debugging, 113-118 exporting symbols, 29, 317 in Linux 2.0, 48-50 filesystem, 8 header files of, 17 initializing, 29-32 explicitly naming functions for, 34 interrupts (see interrupt handlers) license terms, 12 loading/unloading, 16, 61, 305-311 with dynamically assigned device numbers, 59 insmod program and, 24 for network drivers, 430, 434 slave/master modules example, 309 usage count and, 33, 313 using init scripts, 60 version dependency and, 24 (see also cleanup_module()) partition detection in, 357-360 platform dependency, 27 probing for hardware (see probing) requesting the loading of, 306 security (see security) stacking, 28 usage count, 33, 313 backward compatibility issues, 93 version control, 314-318 version dependency, 24-26 modules file, 34, 51 ksymoops and, 114 modutils package exporting symbols, 29 misc directory and, 26 MODVERSIONS, 320 modversions.h header file, 315, 320 monitoring, preprocessor for, 101-103 most significant bit, 253 partitionable devices and, 355 mounting block drivers, 348 mremap system call, 387 remapping specific I/O regions, 390 msr.h header file, 183, 205 MTU, network devices and, 441 multicasting, 460-464 IFF_MULTICAST flag and, 439 multiprocessor systems backward compatibility issues, 48 multiqueue block drivers, 342-345 mutex semaphores, 76 mutual exclusion mode (semaphores), 76 N[ Top ] n_tty.c file, 518 namei.c file, 513 names, device (see devices, names of) namespace pollution, 18 native DMA, 413-418 natural alignment of data items, 300 nbd.c file, 519 nbtest program, 153 net_device_stats structure, 433 backward compatibility issues, 465 fields in, 459 net_device structure, 430, 435-443 device methods of, 440-442 ether_setup and, 432, 436-439 hidden fields, 436-443 interface flags for, 438 interface information, 436-439 unusual devices, assigning fields for, 437 utility fields for, 442 visible fields, 435 net directory, 516 net_init.c file, 436 netdevice.h header file, 431, 467 netif_carrier_off(), 451, 467 backward compatibility issues, 465 netif_carrier_ok(), 452, 467 netif_carrier_on(), 451, 467 backward compatibility issues, 465 netif_rx(), 467 packet reception and, 450 netif_start_queue(), 444, 467 backward compatibility issues, 464 netif_stop_queue(), 444, 467 backward compatibility issues, 464 controlling transmission concurrency, 446 netif_wake_queue(), 467 backward compatibility issues, 464 restarting packet transmission, 446 netsyms.c file, 516 network drivers, 7, 425-469 connecting to kernel, 430-434 initializing devices, 432, 521 interrupt handlers for, 450 link state, changes in, 451 loading/unloading modules for, 430, 434 methods of, 440-442 modularized vs. non-modularized, 434 opening/closing network interface, 443-445 socket buffers (see socket buffers) statistics on, 459 networking, 6 backward compatibility issues, 464-466 __NO_VERSION__ symbol, 26, 52 nonblocking operations, 148 poll method, 154-159 select method, 154-159 testing, 153 non-modularized network drivers, 434 nonpreemption and concurrency, 20 nopage method, 382 backward compatibility issues, 419 mapping memory with, 387-389 mapping RAM to user space, 391-394 mremap system call with, 387 preventing extension of mapping, 390 remapping virtual addresses with, 394 normal memory zone, 210 NR_IRQS symbol, 262 NuBus, 499 NULL pointers, invalid dereferencing, 111-113 NUM macro, splitting minor numbers, 69 numbering versions (see version numbering) O[ Top ] O_NDELAY flag (f_flags field), 148 O_NONBLOCK flag (f_flags field), 67, 134, 148 read/write methods and, 157 O_RDONLY flag (f_flags field), 67 O_SYNC flag (f_flags field), 67 objdump utility, 118 disassembling module functions, 122 octets vs. bytes, 426 oops messages, 61, 111-118 decoding, 113-118 resolving hex values of, 114 open method, 65, 68-72 accessing data within partitions, 360 adding VMA operations, 386 blocking, 168 checking for disk changes, 354 cloning devices in response to, 169-171 initializing file pointers, 89 mounting block drivers, 348 for network devices, 440, 443 private_data and, 68 requesting DMA channels, 414 restricting simultaneous users and, 167 for single-open devices, 165 vm_operations_struct structure, 381 open.c file, 513 opening network interface, 443-445 optimizations, compiler, 227 options directive (modprobe), 308 outb_p(), 232 outb(), 230, 249 outl(), 231, 249 output buffers, driver, 148 output pins, 226, 235 soldering LEDs to, 237 outsb(), 232, 249 outsl(), 232, 249 outsw(), 232, 249 outw(), 230, 249 overriding ARP, 456 P[ Top ] __pa(), 372, 421 backward compatibility issues, 420 packages, upgrading, 10 PACKET_BROADCAST flag, 453 PACKET_HOST flag, 453 PACKET_MULTICAST flag, 453 PACKET_OTHERHOST flag, 453 packets multicasting, 460-464 transmission/reception of, 429, 445-450 page_address(), 374, 421 page_alloc.c file, 514 Page Directory (PGD) page table, 375 page faults caused by invalid pointers, 111 Page Mid-level Directory (PMD) page table, 375 PAGE_SHIFT symbol, 297, 303 page size and portability, 297 PAGE_SIZE symbol, 297, 303 mmap method and, 383 page_table_lock, 378 backward compatibility issues, 419 remapping virtual addresses, 395 page tables, 375-378 building using nopage, 387-389 using remap_page_range, 384 I/O memory and, 239 remapping virtual addresses, 394 page.h header file, 297, 303, 372, 376 page-oriented allocation functions, 214-217 panic.c file, 512 Parallel Line Internet Protocol (PLIP) using Ethernet headers, 456 interrupt handling differences, 450 overriding ARP, 457 parallel port driver modules, stacking, 28 parallel ports, 235-238 disabling interrupts, 268 preparing for interrupt handling, 253 running shared interrupt handlers, 276 stacking driver modules, 28 parameters assigning values, 42 device, 43 module, 43 backward compatibility issues, 50 param.h header file, 181, 205 parport device driver, 518 parse_options(), 507 partial data transfers read method, 80 write method, 82 partitionable devices, 355-362 accessing data within partitions, 360 detecting partitions with initrd, 360 in modules, 357-360 generic hard disk support for, 356 path directive (modprobe), 308 pausing I/O, 232 PC parallel interface, 235-238 PC/104 and PC/104+ bus architectures, 496 pci_alloc_consistent(), 407, 422 PCI_BASE_ADDRESS_ symbols, 483-486 pci_bus structure, 494, 503 pci_dev_driver(), 491 pci_dev structure, 404, 477, 503 backward compatibility issues, 502 reading configuration variables, 481 pci_device_id structure, 491, 503 ID fields for, 492 PCI_DMA_BIDIRECTIONAL symbol, 408, 422 PCI_DMA_FROMDEVICE symbol, 407, 422 bounce buffers and, 409 PCI_DMA_NONE symbol, 408, 422 pci_dma_supported(), 405, 422 pci_dma_sync_sg(), 410, 423 PCI_DMA_TODEVICE symbol, 407, 422 bounce buffers and, 409 pci_driver structure, 491-493, 503 backward compatibility issues, 503 handling hot-pluggable devices, 490 pci_enable_device(), 478 pci_find_class(), 478, 504 pci_find_device(), 478, 504 pci_find_slot(), 478 pci_free_consistent(), 407, 422 pci_insert_device(), 491 PCI_INTERRUPT_ symbols, 488 pci_map_sg(), 410, 423 pci_map_single(), 408, 423 pci_module_init(), 490, 504 pci_ops structure, 493 PCI (Peripheral Component Interconnect) addressing, 471-474 base address registers, 485-488 configuration registers, 475-479 configuration space, 473, 480-483 device configuration snapshot, 481 DMA and, 404-412 dealing with difficult hardware, 405 DMA mappings (see DMA mappings) hardware dependencies for, 411 simple example of, 411 drivers, alternative to, 476 drivers/pci directory, 523 geographical addressing, 473 hardware abstractions, 493 hot-pluggable devices, 489-493 interface of, 470-494 interrupts, 488 I/O resources, 484 using ioremap(), 218 remap_page_range and, 389 pci_present(), 477, 503 pci_read_config_ functions, 480, 504 pci_register_driver(), 490, 504 pci_remove_device(), 491 pci_resource_end(), 484 pci_resource_flags(), 484 pci_resource_start(), 484 pci_set_dma_mask(), 405 pci_sync_single(), 409, 423 pci_unmap_sg(), 410, 423 pci_unmap_single(), 408, 423 pci_unregister_driver(), 491, 504 pci_write_config_ functions, 481, 504 pcibios.h header file, 502 pcidata module, 482 pcidump program, 482 pci.h header file, 405, 422, 477, 503 accessing configuration space, 480 detecting size of PCI regions, 486 pci_ops structure and, 493 pciregions module, 486 PDEBUG/PDEBUGG symbols, 102 pending output, flushing, 158 performance allocating socket buffers, 449 avoiding device collisions, 36 clustering requests and, 340 debugger use, 120 degrading by allocating too much memory, 216 managing system resources, 35-41 memory barriers and, 229 mmap method, 384 namespace pollution, 18 output buffers and, 148 PCI vs. ISA, 470 printk to debug, 103 raw I/O limitations to, 397 using request queues (see request queues) string operations and, 231 peripheral bus architecture (see bus architecture) Peripheral Component Interconnect (see PCI) peripheral memory, 238-247 perror() vs. strace command, 110 persistence of memory, 55 PG_locked flag, 374 PG_reserved flag, 374 pgd_offset(), 377 PGD (Page Directory) page table, 375 pgd_val(), 377 pgtable.h header file, 218, 377 physical addresses, 372 mapping virtual addresses to, 375 pins 9/10 of parallel connector, 253 generating interrupts, 265 platform dependency, 11 bit operations and, 284 kmalloc flags and, 209 for modules, 27 porting and, 232-234 /proc/stat file, 257 platform-specific directories, 524 PLIP (Parallel Line Internet Protocol) using Ethernet headers, 456 interrupt handling differences, 450 overriding ARP, 457 Plug-and-Play (PnP) specification, 496 pm.c file, 512 pmd_offset(), 377 PMD (Page Mid-level Directory) page table, 375 pmd_val(), 377 PnP (Plug-and-Play) specification, 496 pointers and invalid dereferencing, 111-118 Point-to-Point Protocol (PPP) and interrupt handling differences, 450 policy, driver, 2-4 controlling devices by printing and, 140 poll method, 64, 154-159 data structures of, 159 poll_table_entry structure, 158 poll_table structure, 154, 158 poll_wait(), 154, 179 POLLERR flag, 155 poll.h header file, 154, 179 POLLHUP flag, 155 POLLIN flag, 155 POLLOUT flag, 155 POLLPRI flag, 155 POLLRDBAND flag, 155 POLLRDNORM flag, 155 POLLWRBAND flag, 155 POLLWRNORM flag, 155 portability, 297-302 data types and, 293-297 devfs (device filesystem), 90 porting and, 232-234 ports, 36-41, 229-234 accessing different sizes, 230 allocating, 39 avoiding collisions, 37 parallel (see parallel ports) platform dependency and, 232-234 post-install directive (modprobe), 308 post-remove directive (modprobe), 308 PowerPC architecture page tables not used in, 377 PCI DMA interface support, 411 porting and, 233 PPP (Point-to-Point Protocol) and interrupt handling differences, 450 pread method, 79, 91 llseek method and, 164 precision, temporal, 185 predefined ioctl method commands, 133 task queues, 192-198 preemption and concurrency, 20 prefetchable bit, 483 prefixes, 18, 44 pre-install directive (modprobe), 308 preprocessor, using to monitor driver, 101-103 pre-remove directive (modprobe), 308 printing controlling devices by, 140 to debug code, 97-103 from gdb debugger, 121 interface-specific data, 296 partition information, 359 _t data items, 296 printk.c file, 512 printk(), 15, 52 circular buffers for, 100 current pointer and, 21 debugging with, 97-100, 103 logging messages from, 100 loglevel strings for, 98 turning debug messages on/off, 101 priority asynchronous notification and, 159-162 immediate queue, 193, 197 memory allocation, 36, 208 message (see loglevels) private_data field (file structure), 68, 147 privileged operations, 137 probe_irq_off(), 259, 289 probe_irq_on(), 259, 289 probe method, 491 Probes, Dynamic, 127 probing, 36-41 backward compatibility issues, 466 for IRQ numbers, 258-262 shared interrupts and, 276 for ISA memory, 245-247 for network devices, 432 proc_dir_entry create_proc_read_entry() and, 106 proc_register_dynamic() and, 107 /proc filesystem creating /proc entries, 106 read-only /proc files, 104 debugging with, 103-107 installing an interrupt handler, 256 removing /proc entries, 107 shared interrupts and, 277 vs. ioctl method, 108 /proc/bus/pci file backward compatibility issues, 503 browsing configuration space, 481 visibility of hardware addresses, 471 /proc/bus/pci/devices file, 474 /proc/devices file, 58 processes access to multiple, 167 avoiding race conditions with spinlocks, 166, 281-283 kernel timers for, 200-203 opening devices for each process, 165 requeuing, 192 sleeping, 141-148 race conditions and, 286-288 task queues for, 189-200 wait queues and, 141-147 waking up (see waking up processes) processor.h header file, 497 processor-specific registers, 182-184 proc_fs.h header file, 104 /proc/interrupts file, 256, 289 shared interrupts and, 277 /proc/iomem file, 39, 53 /proc/ioports file, 37, 53 /proc/kcore file, 120 /proc/kmsg file, 100 /proc/ksyms file, 27, 53 ksymoops and, 115 module version support and, 315 searching for registration functions, 30 /proc/modules file, 34, 51 ksymoops and, 114 /proc/pci file backward compatibility issues, 503 browsing configuration space, 482 visibility of hardware addresses, 471 /proc/pcidata file, 482 /proc/pciregions file browsing configuration space, 486 proc_register(), 107 proc_register_dynamic(), 107 /proc/slabinfo file, 213 /proc/stat file, 257, 289 /proc/sys/kernel/printk file, reading console loglevel with, 99 producer/consumer algorithm, 279 programmable decoders, 485 programming drivers (see writing, drivers) programs, obtaining, 12 protect method, 381 proto_ops structure, 516 pte_offset(), 377 pte_page(), 378 pte_present(), 378 pte_val(), 377 PTRS_PER_PGD macro, 377 PTRS_PER_PMD macro, 377 PTRS_PER_PTE macro, 377 put_unaligned(), 299, 304 __put_user(), 136, 178 put_user(), 136, 178 Linux 2.0 version, 174 pwrite method, 79, 91 llseek method and, 164 Q[ Top ] quantum (memory area), 73 race conditions and, 76 reading/writing one at a time, 85 querying to debug, 103-108 queue heads, active, 342 queue_task_irq_off(), 204 queue_task_irq(), 204 queue_task(), 191, 206 rescheduling tasks, 192 running custom task queues, 198 scheduler queue and, 195 timer queue and, 196 vs. queue_task_irq, 204 queues initializing/cleaning up, 323 request (see request queues) scheduler queue, 192, 194-196 task (see task queues) timer (see entries under tq_; timer queue) wait (see wait queues) R[ Top ] race conditions, 20 avoiding, with wait_event macros, 142, 179 interrupt handling and, 278-288 introduction to, 76-78 kernel timers and, 203 single-processor vs. SMP systems, 166 RAID drivers drivers/md directory, 519 "make request" function and, 346 RAM probing ISA memory for, 246 remapping, 390-394 reserving high RAM addresses, 223 vs. I/O registers, 227-229 random numbers, 255 ranges, resource, 40 raw I/O and user-space buffers, 397-400 rd.c file, 519 rdtsc/rdtscl functions, 183, 205 read_ahead global array, 325, 367 read_lock_bh(), 283, 291 read_lock_irqsave(), 283, 291 read_lock_irq(), 283, 291 read_lock(), 283, 291 read method, 64, 78-81 arguments to, 79 code for, 81 configuring DMA controller, 415 f_pos field (file structure) and, 67, 91 get_info() and, 104 llseek method and, 163 poll method and, 157 read_proc() and, 104 return values, rules for interpreting, 80 strace command and, 109 syntax in Linux 2.0, 92 read_proc(), 104-107 connecting to /proc hierarchy, 106 read_unlock_bh(), 283, 291 read_unlock_irqrestore(), 283, 291 read_unlock_irq(), 283, 291 read_unlock(), 283, 291 read_write.c file, 513 readb(), 240, 250 readdir method, 64 reader-writer spinlocks, 283 reading blocking I/O, 141-153 blocking/nonblocking operations, 148 poll method, 154-159 select method, 154-159 testing, 153 from a device, 78-81 readl(), 240, 250 readq(), 241 readv method, 66, 84 read/write instructions, reordering, 227 read/write position, changing, 64 readw(), 240, 250 rebuild_header method, 440 backward compatibility issues, 466 reception of packets, 429, 448-450 multicasting, 460-464 reentrancy, 20, 118, 147 register_blkdev(), 322, 366 register_cdrom(), 520 register_chrdev(), 56-58, 95 vs. register_blkdev(), 322 register_disk(), 369 accessing data within partitions, 360 backward compatibility issues, 366 printing partition information, 359 reading generic disk partition table, 358 registering devices, 327 register_framebuffer(), 522 register_netdev(), 467 REGISTER_SYMTAB macro, 49 register_symtab(), 48, 51 registering block drivers, 322-328 DMA usage, 414 facilities in init_module, 29-32 network drivers, 430 ports, 38 registers I/O, 227-229 mapping, 405 scatterlists and, 409 PCI configuration, 475-479 processor-specific, 182-184 release_dma_lock(), 416, 424 release_irq(), 276 release_mem_region(), 53, 250 backward compatibility issues, 47 working with I/O memory, 40, 239 release method, 65, 72 blocking open and, 169 syntax in Linux 2.0, 92 unmounting block devices, 349 (see also close method) release_region(), 52, 250 backward compatibility issues, 47 working with I/O ports, 38, 229 remap_page_range(), 384-386, 421 limitations in dealing with RAM, 390 mapping addresses returned by ioremap, 395 remapping I/O regions, 389 PCI regions, 485 RAM, 390-394 virtual addresses, 394 removable block devices, 352-354 remove method, 492 remove_proc_entry(), 107 __remove_wait_queue, 287, 292 remove_wait_queue(), 179, 287, 292 reordering read/write instructions, 227 repatch program, 527 request_dma(), 414, 423 request function backward compatibility issues, 364 basic design of, 330-334 buffer cache and, 336 interrupt-driven devices and, 362 io_request_lock and, 338 multiqueue block drivers and, 343 register_disk and, 359 registering block devices, 323 splitting up multibuffer requests, 339 transferring data, 332 request_irq(), 253, 289 installing shared handlers, 275 when to call, 255 request_mem_region(), 53, 250 backward compatibility issues, 47 working with I/O memory, 40, 239 request_module(), 306, 319 inter_module_get_request() and, 313 loading modules, 307 modprobe program and, 306 security issues for module names, 309 request queues, 324 active queue heads and, 342 blk.h header file and, 328-330 block drivers not using, 345-348 buffers in, 336 defining, 343 initializing device-specific, 343 introduction to, 330-331 I/O request locks (see io_request_lock) manipulating, 337 multiqueue block drivers and, 342-345 request_queue structure, 335 __request_region(), 41 request_region(), 52, 250 backward compatibility issues, 47 working with I/O ports, 38, 229 request structure, 332 buffer cache and, 335 releasing back to kernel, 338 requesting interrupts (see interrupt handlers) requests, block driver, 330-348 blocking, 168 clustered, 340 handling data transfer, 332-334 interrupt-driven devices and, 362 partitionable devices and, 361 requeuing/rescheduling tasks, 192 reserved pages, remapping, 390-394 reserving high RAM addresses, 223 resetup_one_dev(), 366 resolution, time, 185 resolving Ethernet addresses, 455-458 resource ranges, 40 resources allocating in Linux 2.4, 40 managing, 35-41 backward compatibility for, 47 PCI, 484 restore_flags(), 252 restricting access (see access) resume method, 492 revalidate method, 353 backward compatibility issues, 364 register_disk and, 359 ring buffers, DMA, 402 RISC processor and inline assembly code, 183 rmb(), 228, 249 rmmod program, 6, 34 dynamically allocating major numbers, 60 testing modules using, 16 ROM, probing ISA memory for, 246 route utility, 429 Rules.make file, 26 platform dependency and, 27 run_task_queue(), 191, 206 running custom task queues, 198 runtime errors, strace for, 110 RW_LOCK_UNLOCKED, 283 rwlock_t type, 283, 291 S[ Top ] S390 architecture no support for PCI bus, 411 porting and, 234 SA_INTERRUPT flag, 254, 289 fast vs. slow interrupt handling, 262 SA_SAMPLE_RANDOM flag, 255, 289 SA_SHIRQ flag, 255, 289 installing shared handlers, 275 SAK (Secure Attention Key) function, 119 save_flags(), 252 sbull driver (example), 321-369 adding raw I/O capability, 397-400 sbullr driver (example), 397-400 SBus (Sun-designed bus), 498 drivers/sbus directory, 524 performing DMA mappings on, 412 sbus.h header file, 412 scatter-gather DMA mappings, 409 scatterlist structure, 410, 423 scatterlist.h header file, 410 scatterlists, mapping, 409 sched.h header file, 52, 178, 205, 289, 291 capable() and, 137 interrupt request line functions, 253 jiffies value and, 182 kernel directory and, 512 wait queue code information, 147 schedule_task(), 192, 195, 206 backward compatibility issues, 204 schedule_timeout(), 188 scheduler queue (tq_scheduler), 192, 194-196 backward compatibility issues, 204 schedule(), 145, 179, 512 delaying execution of code, 187 exclusive waits and, 146 preventing endless loops with, 118 reentrant functions and, 147 screen layouts, kernel support for, 522 SCSI drivers, 7 drivers/scsi directory, 520 scsi_ioctl.c file, 520 scsi_module.c file, 520 scsi_register_module(), 520 scsi.c file, 520 scull driver (example), 54-94, 101, 131, 135-139 scullc driver (example), 213 scullp driver (example), 216 mapping RAM to user space, 391-394 scullpipe devices (examples), 150-153 scullv driver (example), 219-220, 394 Secure Attention Key (SAK) function, 119 security, 9 module loading and, 309 seeking a device, 163 in Linux version 2.0, 176 segment.h header file, 95 select method, 154-159 in Linux version 2.0, 175 poll method and, 64 selection.c file, 518 sema_init(), 76, 95 sysdep.h header file and, 94 semaphore.h header file, 76, 95 semaphores, 76-78 backward compatibility issues, 94 detecting deadlocks with IKD, 124 incrementing value of, 77 initializing, 76 not used in interrupt handlers, 279 protecting critical code regions, 151 vs. spinlocks, 166 set_bit(), 284, 291 set_config method, 441 set_current_state(), 287, 291 backward compatibility issues, 288 set_dma_addr(), 416, 424 set_dma_count(), 417, 424 set_dma_mode(), 416, 424 SET_FILE_OWNER macro, 93 SET_INTR macro, 329 set_mac_address method, 441 set_mb(), 229 SET_MODULE_OWNER macro, 66, 95, 467 backward compatibility issues, 465 net_device structure and, 433 set_multicast_list method, 441, 461-464 interface flags and, 439 set_rmb(), 229 set_wmb(), 229 setconsole program (example), 99 setterm program, 140 setup_arch(), 507 sg_dma_address(), 410, 423 sg_dma_len(), 410, 423 sharing interrupts, 274-278 short delays, 188-189 short driver (example), 237 accessing I/O memory, 241 BH implementation, 273 going to sleep and avoiding race conditions, 286 implementing interrupt handlers, 264-266 probing in the driver, 261 installing an interrupt handler, 255 shutting down modules (see unloading modules) SIGIO signal, 160 signal handling, 151 down_interruptible() and, 77 signal.c file, 512 single-open devices, 165 SIOCDEVPRIVATE commands, 458, 469 SIOCSIFADDR command, 458 SIOCSIFMAP command, 458 size of block devices, 324 sizing data explicitly, 295 sk_buff structure fields for, 452 receiving packets, 448 transmitting packets, 445 skb_headroom(), 455, 468 skb_pull(), 455, 468 __skb_push(), 454, 468 backward compatibility issues, 465 skb_push(), 454, 468 __skb_put(), 454, 468 skb_put(), 454, 468 skb_reserve(), 455, 468 skb_tailroom(), 454, 468 skbuff.h header file, 445, 452, 468 skull driver (example), 22-44 SLAB_CACHE_DMA flag, 212, 224 SLAB_CTOR_ATOMIC flag, 212, 224 SLAB_CTOR_CONSTRUCTOR flag, 213, 224 SLAB_HWCACHE_ALIGN flag, 212, 224 SLAB_NO_REAP flag, 212, 224 slab.c file, 211, 514 sleep_on_timeout(), 142, 178 delaying execution, 187 sleep_on(), 142, 178 avoiding race conditions, 286 sleeping processes, 141-148 avoiding race conditions, 286-288 SLOW_DOWN_IO statement, 249 slow interrupt handlers, 262-264 backward compatibility issues, 288 __SMP__ symbol, 22, 50 SMP systems backward compatibility issues, 48 concurrency in the kernel, 20 kernel headers and, 22 module version control and, 314 race conditions and, 76-78 running tasklets on, 198-200 spinlocks to avoid race conditions, 166 writing reentrant code, 147 snapshot of PCI configuration, 481 snull driver (example), 426-457 sock_ioctl(), 458 socket buffers, 445, 452-455 allocating, 449, 454 functions acting on, 454 socket.c file, 516 sockios.h header file, 458, 469 soft lockup detector (IKD), 124 softirq.c file, 512 softnet implementation and backward compatibility, 464 software loops, 188 software memory barriers, 228, 249 software versions (see version numbering) software-mapped I/O memory, 242 sound cards, drivers for, 521 sound_install_audiodrv(), 521 SPARC architecture defining disable_irq/enable_irq as pointers, 268 high memory, 210 I/O memory management support, 411 platform dependency and, 27 porting and, 234 SBus, 498 performing DMA mappings on, 412 SPARC64 platform data alignment, 300 directly mapped memory, 240 gdb debugger and, 121 objdump utility and, 118 oops messages and, 116 special files, 55 spin_is_locked(), 282, 290 spin_lock_bh(), 282, 290 spin_lock_init(), 166, 180, 281, 290 spin_lock_irqsave(), 281, 290 avoiding deadlocks with, 282 spin_lock_irq(), 281, 290 spin_lock(), 167, 180, 281, 290 spin_trylock(), 282, 290 spin_unlock_bh(), 282, 290 spin_unlock_irqrestore(), 282, 290 spin_unlock_irq(), 282, 290 spin_unlock_wait(), 282, 290 spin_unlock(), 167, 180, 282, 290 spinlock_t type, 166, 180, 281, 290, 367 spinlock.h header file, 166, 180, 281, 290 spinlocks, 281-283 dma_spin_lock, 416 io_request_lock, 338 page_table_lock, 378 reader-writer, 283 vs. semaphores, 166 xmit_lock, 443, 446 spull driver (example), 355-364 device methods for, 360 stack meter (IKD feature), 124 stacking modules, 28 standard C data types, 293 start_kernel(), 507-509 stat file, 257, 289 static symbols, 18 statistics on caches, 213 on interrupts, 257 on network interfaces, 433, 441, 459 sti(), 252 stop method, 440, 443 strace command, 108-110 streaming DMA mappings, 406 setting up, 407-409 string operations, 231 struct page pointer, 373-375 backward compatibility issues, 419 struct timeval pointer, 185, 205 subsystem deviceID PCI register, 476 subsystem vendorID PCI register, 476 sunrpc subdirectory, 516 Super-H architecture no support for PCI bus, 411 porting and, 234 supervisor mode, 19 suser(), 175 suspend method, 492 swap_state.c file, 515 swapfile.c file, 515 swapout method, 382 switch statement, with ioctl, 129, 133 symbols driver-specific, 328-330 exporting, 29, 317 in Linux 2.0, 48-50 hiding global, 29 mangling symbol names, 314-317 static, declaring as, 18 symbol table, 27-29 klogd and, 114 module version control and, 315 symtab_begin.h header file, 51 symtab_end.h header file, 51 sync method, 382 synchronization (see lock method; race conditions) sys_create_module(), 24 sys_delete_module system call, 33 sys_syslog(), 98 sysctl_net.c file, 516 sysdep.h header file, 26 backward compatibility issue, 47-50 sema_init() and, 94 SET_FILE_OWNER macro and, 93 wait queues in Linux 2.0/2.2, 172 syslogd daemon logging messages, 100 performance problems with, 103 sysrq.txt file, 119 <sys/sched.h> header file capable() and, 137 system calls, 24 invoked by init thread, 511 system faults changing message loglevels after, 99 debugging, 110-120 handling, kernels vs. applications, 19 system hangs, 118 precautions when reproducing, 120 system resources allocating in Linux 2.4, 40 managing, 35-41 backward compatibility for, 47 system.h header file, 228, 249 System.map file klogd and, 114 ksymoops and, 114 T[ Top ] _t data types, 296 tagged initialization format, 63 avoiding flush method, 93 declaring file_operations structure, 66 tail pointers and circular buffers, 280 take_over_console(), 522 TASK_EXCLUSIVE flag, 146 TASK_INTERRUPTIBLE flag, 145, 287, 291 task_queue, 191, 206 task queues, 189-200 backward compatibility issues, 204 data structures of, 190 declaring, 191 declaring custom, 198 driver timeline, 193 predefined, 192-198 requeuing/rescheduling tasks, 192 running, 191 TASK_RUNNING flag, 145, 287, 291 TASK_UNINTERRUPTIBLE flag, 291 tasklet_disable(), 200, 207 tasklet_enable(), 200, 207 tasklet_kill(), 200, 207 tasklet_schedule(), 199, 206, 270, 290 BH mechanism and, 272 tasklets, 198-200, 270 scheduling, 199 tcpdump program, 430 terminals, selecting for messages, 99 test_and_change_bit(), 285, 291 test_and_clear_bit(), 285, 291 test_and_set_bit(), 285, 291 test_bit(), 284, 291 testing (non)blocking operations, 153 "thundering herd" problem, 146 time, 181-207 delaying execution of code, 186-189 HZ (time frequency), 181, 297 kernel timers, 200-203 sleeping processes, 286-288 time intervals in the kernel, 181-184, 297 time.c/timer.c files, 512 time.h header file, 206 timeouts backward compatibility issues, 204 of kernel timers, 201 scheduling, 188 setting up short-term, 187 transmission (see transmission timeouts) TIMER_BH bottom half, 272 timer interrupts, 181 timer_list structure, 201 timer queue element structure, 190 timer queue (tq_timer), 193, 196, 206 BH mechanism and, 272 timer.h header file, 201, 207 timers, 200-203 timestamp counter (TSC), 183 TIOCLINUX command, 99 to_kdev_t(), 62 token ring networks, setting up interfaces for, 437 top-half vs. bottom-half handlers, 269 tq_immediate queue, 193, 197, 206 BH mechanism and, 272 writing a BH bottom half, 273 tq_scheduler queue, 192, 194-196 backward compatibility issues, 204 tq_struct structure, 190 tq_timer(), 193, 196, 206 BH mechanism and, 272 TQUEUE_BH bottom half, 272 tqueue.h header file, 190, 192, 206 tr_configure(), 437 tracing programs, 108-110 Linux Trace Toolkit (LTT), 127 transistor-transistor logic (TTL) levels, 235 transmission concurrency, controlling, 446 transmission of packets, 429, 445-448 multicasting, 460-464 transmission timeouts, 433, 447 tx_timeout method and, 440 watchdog_timeo field and, 442 traversal of linked lists, 302 troubleshooting, 97 porting problems, 232-234 race conditions, 278-288 system hangs, 118 wrong font on console, 140 (see also debugging) truncating devices on open, 71 TSC (timestamp counter), 183 TTL (transistor-transistor logic) levels, 235 tunelp program, 3 tx_timeout method, 440, 447 TYPE macro, splitting minor numbers, 69 types.h header file (asm), 295 types.h header file (linux), 295, 303 U[ Top ] u8, u16, u32, u64 data types, 295, 303 uaccess.h header file, 78, 95, 135, 177 uClinux port different ld scripts needed for, 510 mmnommu directory, 515 udelay(), 188, 206 uint8_t/uint32_t types, 295 uintptr_t type (C99 standard), 294 uio.h header file, 84 unaligned data, 299 unaligned.h header file, 299, 304 uniqueness of ioctl command numbers, 130 universal serial bus drivers (see USB drivers) Unix design books, 528 unix subdirectory, 516 unloading modules, 16, 34, 61 on demand, 305-311 for network drivers, 434 usage count and, 33, 313 (see also cleanup_module()) unlock_kiovec(), 396, 422 unmap_kiobuf(), 399, 422 unmap method, 381 unregister_blkdev(), 322, 366 unregister_cdrom(), 520 unregister_chrdev(), 61, 95 unregister_netdev(), 467 unregistering block drivers, 322-328 facilities, 30 unsigned type, 230 platform dependencies and, 232 up(), 77, 95 urandom device, 255 usage count, 386 accessing data within partitions, 360 decremented by release method, 72 incremented by open method, 68 maintained by block drivers, 323 maintaining via owner field, 71 modules, 33, 313 backward compatibility issues, 93 nopage method and, 392 usb_deregister(), 500, 505 usb_driver structure, 500, 505 usb_register(), 500, 505 USB (universal serial bus) drivers, 7, 500 call_usermodehelper and, 311 directory for, 524 lookaside caches, 211-214 stacking on usbcore/input modules, 28 writing, 500-502 usbcore module, 28 usb.h header file, 504 __USE_OLD_SELECT__ preprocessor symbol, 176 __USE_OLD_SYMTAB__, 49 user mode, 19 helper programs, running, 311 user space, 19 access to, in Linux 2.0, 173-175 accessing I/O ports from, 230 capabilities/restrictions in, 137 changes in access to, 94 entering via init process, 511 explicitly sizing data in, 295 mapping RAM to, 390-394 reentrant functions and, 147 retrieving datum from, 136 transferring to/from kernel space, 78-84 watching programs run in, 108-110 writing drivers in, 45 user virtual addresses, 371 User-Mode Linux, 126 users, restricting access to simultaneous, 167 UTS_RELEASE macro, 25 V[ Top ] __va(), 372, 421 backward compatibility issues, 420 validating block driver requests, 330 disk changes, 353 variables, declaring as volatile, 279 vector operations (readv/writev), 84 vendorID PCI register, 476 verify_area(), 173-175 VERIFY_ symbols, 135, 178 version dependency, 24-26 module version control, 314-318 version numbering, 10 char drivers, 55-62 major device numbers, 56-61 minor device numbers, 56, 61, 69 versioned symbols, 315 enabling module version control, 316 exporting, 317 version.h header file, 25, 52 VESA Local Bus (VLB) devices, 498 vfree(), 217, 225 backward compatibility issues, 248 video_device structure, 523 video devices, directory for, 522 video_register_device(), 523 video/videodev.c file, 523 virt_to_bus(), 404, 422 backward compatibility issues, 420 virt_to_page(), 374, 421 backward compatibility issues, 418 mapping memory with nopage, 389 virtual addresses, 372 assigning to devices, 242 mapping to physical addresses, 375 remapping, 394 Sbus peripherals and, 498 vmalloc and related functions, 217-220 virtual memory areas (VMAs), 378-382 main fields in vm_area_struct, 380 VLB (VESA Local Bus) devices, 498 vm_area_struct structure, 380 backward compatibility issues, 419 VM_IO flag, 381 vm_operations_struct structure, 381 vm_private_data field (vm_area_struct), 393 backward compatibility issues, 419 VM_RESERVED flag, 381 VMA_OFFSET macro, 387 VMALLOC_VMADDR(), 395 vmalloc.c file, 514 vmalloc.h header file, 217, 225 vmalloc(), 217-220, 225, 394 vs. kmalloc(), 217-219 VMAs (virtual memory areas), 378-382 main fields in vm_area_struct, 380 vmlinux kernel image, 510 vmscan.c file, 515 volatile, declaring variables as, 279 vremap() in Linux 2.x only, 223, 248 vsprintf.c file, 517 vt.c file, 518 W[ Top ] wait_event_interruptible(), 142, 179, 288, 292 wait_event(), 142, 179, 288, 292 vs. interruptible_sleep_on(), 145 wait_queue_head_t, 178 new in Linux version 2.3.1, 172 poll table entries and, 158 sleeping/waking up processes, 141-143 working with advanced applications, 144 wait_queue_t type, 144, 179 poll table entries and, 158 wait queues, 141-147 avoiding race conditions, 287 defined type for, 178 delaying code execution, 187 in Linux versions 2.0/2.2, 172 manipulating, 144 poll table entries and, 158 putting processes into, 179 wait.h header file, 144, 178 wake_up_interruptible_sync(), 143, 178 wake_up_interruptible(), 143, 178 wake_up_sync(), 143, 178 wake_up(), 143, 178 resuming execution of code, 188 waking up processes, 142 exclusive waits and, 146 functions used for, 178 release method and, 169 -Wall flag (gcc), 23, 296 watchdog_timeo field (net_device structure), 442, 447 watching programs in user space, 108-110 web sites related to Linux kernels, xv wmb(), 228, 249 wppage method, 382 backward compatibility issues, 419 wrapper functions, compiling under 2.0 headers, 92 write_lock_bh(), 283, 291 write_lock_irqsave(), 283, 291 write_lock_irq(), 283, 291 write_lock(), 283, 291 write method, 64, 78-80 code for, 83 configuring DMA controller, 415 f_pos field (file structure) and, 67, 91 input/output buffers and, 148 llseek method and, 163 poll method and, 157 return values, rules for interpreting, 82 select method and, 157 strace command and, 109 syntax in Linux 2.0, 92 write_unlock_bh(), 283, 291 write_unlock_irqrestore(), 283, 291 write_unlock_irq(), 283, 291 write_unlock(), 283, 291 writeb(), 240, 250 writel(), 240, 250 writeq(), 241 writev method, 66, 84 writew(), 240, 250 writing, 97 blocking I/O, 141-149 blocking/nonblocking operations, 148 control sequences to devices, 140 to a device, 78-80, 82-84 drivers using devfs, 85-91 reentrant code, 147 in user space, 45 version numbering, 10 watching user-space programs run, 108-110 writer's role in, 2-4 interrupt handler bottom halves, 273 interrupt handlers, 264-268 makefiles, 22 (see also debugging) X[ Top ] x86 architecture interrupt handling on, 263 limitations of platform, 510 PCI DMA interface support, 411 porting and, 233 x/i (examine instructions) command, 121 xtime variable, 185 Z[ Top ] zImage file, 510 Back to: Table of Contents Back to: Linux Device Drivers, 2nd Edition
oreilly.com Home | O'Reilly Bookstores| How to Order | O'Reilly Contacts International | About O'Reilly | Affiliated Companies | Privacy Policy © 2001, O'Reilly & Associates, Inc. webmaster@oreilly.com