Введение

Часть I. Код ядра Linux
arch/i386/kernel/entry.S
arch/i386/kernel/inrt_task.c
arch/i386/kernel/irq.c
arch/j386/kernel/irq.h
arch/i386/kernel/process.c
arch/i386/kernel/signal.c
arch/i386/kernel/smp.c
arch/i386/kernel/time.c
arch/i386/kernel/traps.c
arch/i386/lib/delay.c
arch/i386/mm/fault.c
arch/i386/mm/init.c
fs/binfmt_elf.c
fs/binfmt_java.c
fs/exec.c
include/asm-generic/smplock.h
include/asm-i386/atomic.h
inctude/asm-i386/current.h
include/asm-i386/dma.h
include/asm-i386/elf.h
include/asm-i386/hardirq.h
include/asm-i386/page.h
include/asm-i386/pgtable.h
include/asm-i386/ptrace.h
include/asm-i386/semaphore.h
include/asm-i386/shmparam.h
include/asm-i386/sigcontext.h
include/asm-i386/siginfo.h
include/asm-i386/signal.h
include/asm-i386/smp.h
include/asm-i386/softirq.h
include/asm-i386/spinlock.h
include/asm-i386/systenn.h
include/asm-i386/uaccess.h
include/linux/binfmts.h
include/linux/capabiiity.h
include/linux/elf.h
include/linux/effcore.h
include/linux/interrupt.h
include/linux/kernel.h
include/Iinux/kernel_stat.h
include/linux/limits.ti
include/linux/mm.h
include/linux/module.h
include/linux/msg.h
include/linux/personality.h
include/lirwx/reboot.h
include/linux/sched.h
include/linux/sem.h
include/linux/shm.h
include/linux/signal.h
include/linux/slab.h
include/linux/smp.h
include/linux/smpJock.h
include/linux/swap.h
include/linux/swapctl.h
include/linux/sysctl.h
include/linux/tasks.h
include/linux/time.h
include/linux/timer.h
include/linux/times.h
include/linux/tqueue.h
include/linux/wait.h
init/main.c
init/version.c
ipc/msg.c
ipc/sem.c
ipc/shm.c
ipc/util.c
kernel/capability.c
kernel/dma.c
kernel/exec_domain.c
kernel/exit.c
kernel/fork.c
kernel/info.c
kernel/itimer.c
kernel/kmod.c
kernel/module.c
kernel/panic.c
kernel/printk.c
kernel/sched.c
kernel/signal, с
kernel/softirq.c
kernel/sys.c
kernel/sysctl.с
kernel/time.c
mm/memory.c
mm/mlock.c
mm/mmap.c
mm/mprotect.c
mm/mremap.c
mm/page.alloc.c
mm/page_io.c
mm/stab.c
mm/swap.c
mm/swap_state.c
mm/swapfile.c
mm/vmalloc.c
mm/vmscan.c


Часть II. Комментарии кода ядра Linux

Глава 1. Введение в Linux
Краткая история создания Linux и Unix
Соглашение GNU General Public License
Процесс разработки Unux

Глава 2. Первое знакомство с кодом
Характерные особенности исходного кода ядра Unux
Использование свойств, специфических для дсс
Идиомы кода ядра
Сокращенное применение #if и #ifdef
Пример кода
printk
printk
Очереди ожидания
struct wait queue
wait_event
_ _wait_event
_ _wake_up
Модули ядра
request_module
Конфигурирование и компиляция ядра
Конфигурирование ядра
Сборка ядра

Глава 3. Обзор архитектуры ядра
Цели проектирования
Ясность
Совместимость
Переносимость
Живучесть и безопасность
Быстродействие
Первый взгляд на архитектуру ядра
Более пристальный взгляд на архитектуру ядра
Так что же, ядро многослойное, модульное, или какое?
Ядро Unux - в основном монолитное
Отношения между проектированием и реализацией
Структура каталогов исходного кода ядра
Documentation
arch
drivers
fs
include
init
ipc
kernel
lib
mm
net
scripts
Зависящий и независящий от архитектуры код

Глава 4. Инициализация системы
Загрузка ПК
Инициализация ядра Linux
start_kernel
BogoMIPS
calibrate_delay
Разбор параметров, передаваемых ядру
parse_options
checksetup
profile_setup
init
init

Глава 5. Системные вызовы
Что такое системный вызов?
Прерывания, пространство пользователя и пространство ядра
Способы реализации системных вызовов
system_call
system_call
lcall7
lcall7
Примеры системных вызовов
sys_ni syscall
sys_time
sys_reboot
sys_sysinfo

Глава 6. Сигналы, прерывания и время
Краткое замечание о блокировках
Сигналы
Структуры данных
sigset_t
struct sigaction
siginfo_t
struct signal_queue
Сервисные функции
sigaddset
sigdelset
sigismember
sigfindinword
sigmask
sigaddset
sigdelset
sigismember
sigmask
sigfindinword
_SIG_SET_BINOP
_SIG_SET_OP
sigemptyset
sigaddsetmasfc
siginitset
Отправка сигналов
sys_kill
kill_something info
kill_pg_info
kill_proc_info
send_sig_info
force_sig_info
recalc_sigpending
ignored_signal
do_signal
dequeue_signal
notify parent
handle_signal
Другие функции, связанные с обработкой сигналов
sys_sigpending
do_sigation
sys_rt_sigtimedwait
Различия кода для сигналов реального и не реального времени
sys_sigprocmask
sys_rt_sigprocmask
Прерывания
IRQ
Нижние половины
Структуры данных
Действия и IRQ
init_IRQ
init_ISA_irqs
set_intr_gate
setup_x86_irq
request_irq
free_irq
probe_irq_on
probe_irq_off
Обработчики и нижние половины аппаратных прерываний
do_IRQ
handle_IRQ_event
do_bottom_half
run_bottom halves
Время и таймер
do_timer
timer_bh
update_times
update_wall_time
calc_load
run_old_timers
Очереди таймера

Глава 7. Процессы и потоки
Планирование и временные кванты
Процессы реального времени
Приоритеты
Идентификаторы процессов (PID)
Подсчет ссылок
Возможности
Представление процессов в ядре
Состояния процессов
Происхождение процессов: fork и _ _сlопе
do_fork
Выделение PID
get_pid
Запуск новой программы
do_execve
prepare_binprm
search_binary_handler
Форматы исполняемых файлов
Пример: обработчик двоичных файлов Java
do_load_java
load_java
java_format
init_java_binfmt
Планирование: посмотрите, как они выполняются!
Функции и политики планирования
schedule
switch_to
Вычисление значения goodness
goodness
Приоритеты не реального времени
sys_setpriority
update_process_times
Приоритеты реального времени
setscheduler
Учет ограничении
Возможности
sys_capget
sys_capset
Идентификаторы пользователей и групп
Ограничения ресурсов
Все хорошее когда-то кончается - а теперь, как это делается
exit
_ _exit_files
wait
sys_wait4
release

Глава 8. Память
Виртуальная память
Свопинг и страничный обмен
Адресное пространство
Модуль управления памятью
Каталоги страниц и таблицы страниц
Буфера хранения результатов преобразования
_flush_tlb
Сегменты
Компоновка процессов памяти
struct vm_area_struct
struct vm_operations_struct
struct mm_struct
Операции со структурами VMA
find_vma
find_vma_prev
Страничный обмен
Подробный обзор средств защиты страниц
Копирование при записи
Ситуация отсутствия страницы
do_page_fault
handle_mm_fault
pgd_offset
pte_alloc
handle_pte_fault
do_wp_page
Вывод страниц на диск
try_to_swap_out
Устройства свопинга
get_swap_page
swap_free
sys_swapoff
sys_swapon
Отображение памяти с помощью mmap
do_mmap
do_munmap
Динамическая память пространства пользователя и пространства ядра
brk
sys_brk
vmalloc и vfree
vmalloc
get_vm_area
vfree
Дамп памяти
elf_core_dump

Глава 9. Межпроцессное взаимодействие по принципу System V
Очереди сообщений
Краткий обзор очереди сообщений
struct msg
struct msqid_ds
msgque
msg_init
real_msgsnd
real_msgrcv
sys_msgget
sys_msgctl
findkey
newque
freeque
Семафоры
struct sem
struct semid_ds
struct sem _queue
struct sembuf
struct sem_undo
sys_seтoр
sys_semctl
sem_exit
append _to_queue
prepend_to_queue
remove_from_queue
try_atomic_semop
update_queue
count_semncnt
count_semzcnt
Разделяемая память
struct shmid_ds
struct shmid_kernel
newseg
sys_shmget
killseg
sys_shmctl
insert_attach
remove_attach
sys_shmat
shm_ореn
shm_close
sys_shmdt

Глава 10. Симметричная мультипроцессорная обработка
Понятия и примитивы параллельного программирования
Атомарные операции
Проверка и установка
Семафоры
down
down_interruptible
down_trylock
DOWN_VAR
DOWN_HEAD
DOWN_TAIL
_down
_down_interruptible
_down_trylock
up
_up
_wake_up
Блокировка в цикле
spin_lock_string
spin_unlock_string
read_lock
read_unlock
write_lock
write_unlock
Усовершенствованные программируемые контроллеры прерываний
и связь между процессорами
smp_send_reschedule
send_IPI_singIe
Как поддержка симметричной мультипроцессорной обработки влияет
на архитектуру ядра
Влияние SMP на планирование
schedule
_schedule_tail
reschedule_idle
reschedule_idle_slow
release
smp_local_timer_interrupt
smp_local_timer_interrupt
lock_kernel и unlock_kernel
lock_kernel
unlock_kernel
softirq_trylock
softirq_trylock
cli и sti
_global_cli
_globai_sti
irq_enter и irq_exit
trq_enter
irq_exit

Глава 11. Настраиваемые параметры ядра
struct ctl_table
Поддержка /рrос/sys
register_proc_table
unregister_proc_table
do_rw_proc
proc_dostring
proc_doutsstring
do_proc_dointvec
proc_dointvec_minmax
Системный вызов sysctl
do_sysctl
parse_table
do_sysctl_strategy
register_sysctl_table
unregister_sysctl_table
sysctl_string
sysctl_intvec

Приложение A. Linux 2.4

Приложение В. Общая лицензия GNU

Сопровождающий CD-ROM

На сопровождающем книгу CD-ROM находится программное обеспечение,
которое окажет существенную помощь во время изучения книги:

liпих-0.01. Оригинальный дистрибутив ядра Linux, датируемый 1991 г.
Представляет интерес с исторической точки зрения.

linux-2.2.5. Полный дистрибутив ядра Linux, код которого
рассматривается в книге.

linux-2.2.10. Наиболее свежая версия устойчивого ядра по состоянию
на осень 1999 г.

linux-2.3.12. Наиболее свежая версия ядра, находящегося в стадии
разработки, по состоянию на осень 1999 г.

Теговые файлы для версий ядра 2.х, которые во многих редакторах
упрощают поиск информации в коде.

lckc_code. Большой файл, включающий код, приведенный в первой части
книги. Номера строк сохранены.

lckc-find-line.el. Короткий файл с кодом Emacs Lisp, который
обеспечивает эффективную навигацию по файлу lckc_code.

Все перечисленное выше программное обеспечение подчиняется
лицензии GNU General Public License, которая разрешает вам
бесплатно использовать, копировать и модифицировать содержимое
любых файлов.