linux 内核 编程(ubuntu内核)
Linux内核编程的内容简介
《Linux内核编程》以Linux操作系统为基础,详细介绍了Linux内核子系统,并辅以大量内核源代码和示例程序进行演示,引领读者深入Linux内核。《Linux内核编程》的主要内容包括:Linux基础知识、内核探索工具集、进程的整个生命周期、内存区、页面、Slab分配器、用于输入/输出的各种设备、文件系统、抢占、自旋锁、信号量、内核引导、构建Linux内核,以及向内核添加代码等。同时还简单介绍了一些应用工具和实用程序,从而可以获取理解内核内幕所需的信息。每章末尾都给出一些练习,涉及内核运行的操作及工作原理。
《Linux内核编程》适合对Linux内核感兴趣的各层次读者,无论对Linux初学者还是Linux程序开发人员,本书都是一本很有价值的参考书。
什么是LINUX内核编程
真佩服楼上的2位对“内核编程”的理解力!
简单说,Linux内核编程就是开发Linux驱动程序,学会内核编程后,将会对操作系统的内部机制和工作原理有充分了解,可以从事硬件驱动开发、嵌入式系统开发等。内核编程的语言仍是传统的C语言,但其编写方法和调用接口与传统应用程序的差别较大,你必须了解如何处理中断、如何在内核态和用户态之间转换、PCI、DMA、内核地址映射、内核I/O等,这不是《UNIX高级编程》所涉及的内容,可以找一本专门讲Linux驱动编程的书看看,或在网上搜寻相关资料(关键词:Linux DDK)。不过先提醒一句,学习内核编程的难度很大,必须做好长期心理准备
Linux内核编程的目录
目录
第1章概述1
1.1UNIX的历史2
1.2标准和通用接口3
1.3自由软件和开放源码3
1.4Linux发布版概览3
1.41Debian4
1.42Red Hat/Fedora 4
1.43Mandriva4
1.44SUSE4
1.45Gentoo4
1.46Yellow Dog5
1.47其他发布版5
1.5内核版本信息5
1.6基于Power的Linux5
1.7什么是操作系统6
1.8内核组织7
1.9Linux内核概述7
1.9.1用户接口7
1.9.2用户标识符8
1.9.3文件和文件系统8
1.9.4进程12
1.9.5系统调用15
1.9.6Linux调度程序15
1.9.7Linux设备驱动程序15
1.10可移植性和体系结构的相关性16
1.11小结16
1.12习题16
第2章内核探索工具集18
2.1内核中常见的数据类型18
2.1.1链表18
2.1.2查找21
2.1.3树22
2.2汇编24
2.2.1PowerPC24
2.2.2x8627
2.3汇编语言示例29
2.3.1x86中的汇编示例30
2.3.2PowerPC中的汇编示例31
2.4内联汇编33
2.4.1输出操作数34
2.4.2输入操作数34
2.4.3已修改过的寄存器(已修改的元素列表) 34
2.4.4参数的编号方式34
2.4.5约束条件34
2.4.6asm35
2.4.7__volatile__35
2.5特殊的C语言用法38
2.5.1asmlinkage38
2.5.2UL39
2.5.3内联39
2.5.4const和volatile39
2.6内核探索工具一览40
2.6.1objdump/readelf40
2.6.2hexdump41
2.6.3nm41
2.6.4objcopy42
2.6.5ar42
2.7内核发言:倾听来自内核的消息42
2.7.1printk()42
2.7.2dmesg42
2.7.3/var/log/messages42
2.8其他奥秘43
2.8.1__init43
2.8.2likely()和unlikely()43
2.8.3IS_ERR和PTR_ERR44
2.8.4通告程序链44
2.9小结45
2.9.1项目:Hellomod45
2.9.2第一步:构造Linux模块的框架45
2.9.3第二步:编译模块46
2.9.4第三步:运行代码47
2.10习题48
第3章进程:程序执行的基本模型49
3.1程序51
3.2进程描述符52
3.2.1与进程属性相关的字段54
3.2.2与调度相关的字段55
3.2.3涉及进程间相互关系的字段58
3.2.4与进程信任状相关的字段59
3.2.5与进程权能相关的字段60
3.2.6与进程限制相关的字段61
3.2.7与文件系统及地址空间相关的字段63
3.3进程的创建:系统调用fork()、vfork和clone()64
3.3.1fork()函数65
3.3.2vfork()函数66
3.3.3clone()函数67
3.3.4do_fork()函数68
3.4进程的生命周期70
3.4.1进程的状态70
3.4.2进程状态的转换71
3.5进程的终止74
3.5.1sys_exit()函数75
3.5.2do_exit()函数75
3.5.3通知父进程和sys_wait4()77
3.6了解进程的动态:调度程序的基本构架80
3.6.1基本结构80
3.6.2从等待中醒来或者激活81
3.7等待队列86
3.7.1添加到等待队列88
3.7.2等待事件89
3.7.3唤醒进程91
3.8异步执行流程93
3.8.1异常93
3.8.2中断95
3.9小结114
3.9.1项目:系统变量current114
3.9.2项目源码115
3.9.3运行代码116
3.10习题116
第4章内存管理117
4.1页119
4.2内存管理区121
4.2.1内存管理区描述符122
4.2.2内存管理区操作辅助函数124
4.3页面124
4.3.1请求页面的函数124
4.3.2释放页面的函数126
4.3.3伙伴系统126
4.4Slab分配器130
4.4.1缓存描述符133
4.4.2通用缓存描述符135
4.4.3Slab描述符136
4.5Slab分配器的生命周期138
4.5.1与Slab分配器有关的全局变量138
4.5.2创建缓存139
4.5.3创建slab与cache_grow()144
4.5.4Slab的销毁:退还内存与kmem_cache_destroy()146
4.6内存请求路径147
4.6.1kmalloc()147
4.6.2kmem_cache_alloc()148
4.7Linux进程的内存结构149
4.7.1mm_struct150
4.7.2vm_area_struct152
4.8进程映像的分布及线性地址空间153
4.9页表155
4.10缺页156
4.10.1x86缺页异常156
4.10.2缺页处理程序157
4.10.3PowerPC缺页异常164
4.11小结164
4.12项目:进程内存映射165
4.13习题166
第5章输入/输出167
5.1总线、桥、端口和接口的硬件实现167
5.2设备171
5.2.1块设备概述172
5.2.2请求队列和I/O调度173
5.2.3示例:“通用”块设备驱动程序180
5.2.4设备操作182
5.2.5字符设备183
5.2.6网络设备184
5.2.7时钟设备184
5.2.8终端设备184
5.2.9直接存储器存取184
5.3小结185
5.4项目:创建并口驱动程序185
5.4.1并口的硬件185
5.4.2运行在并口上的软件187
5.5习题192
第6章文件系统194
6.1文件系统的基本概念194
6.1.1文件和文件名194
6.1.2文件类型195
6.1.3文件的附加属性195
6.1.4目录和路径名196
6.1.5文件操作197
6.1.6文件描述符197
6.1.7磁盘块、磁盘分区以及实现197
6.1.8性能198
6.2Linux虚拟文件系统198
6.2.1VFS的数据结构200
6.2.2全局链表和局部链表的引用211
6.3与VFS相关的结构212
6.3.1fs_struct结构212
6.3.2files_struct结构213
6.4页缓存216
6.4.1address_space结构217
6.4.2buffer_head结构219
6.5VFS的系统调用和文件系统层221
6.5.1open()221
6.5.2close()227
6.5.3read()229
6.5.4write()244
6.6小结246
6.7习题246
第7章进程调度和内核同步247
7.1Linux的调度程序248
7.1.1选择下一个进程248
7.1.2上下文切换253
7.1.3让出CPU261
7.2内核抢占269
7.2.1显式内核抢占269
7.2.2隐式用户抢占270
7.2.3隐式内核抢占270
7.3自旋锁和信号量272
7.4系统时钟:关于时间和定时器274
7.4.1实时时钟:现在几点了274
7.4.2读取PPC的实时时钟276
7.4.3读取x86的实时时钟278
7.5小结280
7.6习题280
第8章内核引导281
8.1BIOS和Open Firmware282
8.2引导加载程序282
8.2.1GRUB283
8.2.2LILO286
8.2.3PowerPC和Yaboot286
8.3与体系结构相关的内存初始化287
8.3.1PowerPC的硬件内存管理287
8.3.2基于Intel x86体系结构的硬件内存管理296
8.3.3PowerPC和x86的代码汇集305
8.4原始的RAM盘305
8.5开始:start_kernel()306
8.5.1调用lock_kernel()307
8.5.2调用page_address_init()309
8.5.3调用printk(linux_banner)311
8.5.4调用setup_arch311
8.5.5调用setup_per_cpu_areas()315
8.5.6调用smp_prepare_boot_cpu()316
8.5.7调用sched_init()317
8.5.8调用build_all_zonelists()319
8.5.9调用page_alloc_init319
8.5.10调用parse_args()320
8.5.11调用trap_init()322
8.5.12调用rcu_init()323
8.5.13调用init_IRQ()323
8.5.14调用softirq_init()324
8.5.15调用time_init()325
8.5.16调用console_init()326
8.5.17调用profile_init()326
8.5.18调用local_irq_enable()327
8.5.19配置initrd327
8.5.20调用mem_init()327
8.5.21调用late_time_init()333
8.5.22调用calibrate_delay()333
8.5.23调用pgtable_cache_init()334
8.5.24调用buffer_init()335
8.5.25调用security_scaffolding_startup()336
8.5.26调用vfs_caches_init()336
8.5.27调用radix_tree_init()343
8.5.28调用signal_init()344
8.5.29调用page_writeback_init()344
8.5.30调用proc_root_init()346
8.5.31调用init_idle()347
8.5.32调用rest_init()348
8.6init线程(或进程1)349
8.7小结353
8.8习题353
第9章构建Linux内核354
9.1工具链354
9.1.1编译程序355
9.1.2交叉编译355
9.1.3链接程序356
9.1.4ELF二进制目标文件356
9.2内核源代码的构建360
9.2.1解释源代码360
9.2.2构建内核映像364
9.3小结369
9.4习题369
第10章向内核添加代码371
10.1浏览源代码371
10.11熟悉文件系统371
10.12filp和fops372
10.13用户空间和内核空间374
10.14等待队列375
10.15工作队列及中断378
10.16系统调用380
10.17其他类型的驱动程序380
10.18设备模型和sysfs文件系统383
10.2编写代码386
10.2.1设备基础386
10.2.2符号输出388
10.2.3IOCTL388
10.2.4轮询与中断391
10.2.5工作队列和tasklet395
10.2.6增加系统调用的代码396
10.3构建和调试398
10.4小结399
10.5习题400