https://item.m.jd.com/product/12047310.html
基于zui新的Linux内核源代码3.19.3版本,对常用的内核API作了系统归纳,并编写了典型验证程序,使理论分析与实际编程做到了统一。分析的内核API模块包括:模块机制内核API、进程管理内核API、进程调度内核API、中断与异常机制内核API、时间与定时机制内核API、内存管理内核API、内核同步机制API、文件系统内核API和设备驱动与设备管理模块内核API。
【目录】
前 言
第1章 Linux内核API分析必备知识 1
1.1 Linux内核编程注意事项 1
1.2 本书中模块编译Makefile模板 2
1.3 内核调试函数printk 3
1.4 内核编译与定制 5
1.4.1 获得Linux内核与补丁 5
1.4.2 准备编译需要的工具 5
1.4.3 解压内核 6
1.4.4 给内核打补丁 6
1.4.5 设定编译选项 7
1.4.6 编译与安装内核 9
1.4.7 创建initramfs 10
1.4.8 设置grub 11
1.4.9 启动选项 12
1.5 温馨提示 12
本章参考文献 13
第2章 内核模块机制API 14
2.1 函数:__module_address( ) 14
2.2 函数:__module_text_address( ) 16
2.3 函数:__print_symbol( ) 19
2.4 函数:__symbol_get( ) 22
2.5 函数:__symbol_put( ) 25
2.6 函数:find_module( ) 27
2.7 函数:find_symbol( ) 31
2.8 函数:module_is_live( ) 36
2.9 函数:module_put( ) 38
2.10 函数:module_refcount( ) 40
2.11 函数:sprint_symbol( ) 42
2.12 函数:symbol_put_addr( ) 45
2.13 函数:try_module_get( ) 48
本章参考文献 50
第3章 Linux进程管理内核API 51
3.1 函数:__task_pid_nr_ns( ) 51
3.2 函数:find_get_pid( ) 54
3.3 函数:find_pid_ns( ) 56
3.4 函数:find_vpid( ) 58
3.5 函数:get_pid( ) 60
3.6 函数:get_task_mm( ) 62
3.7 函数:mmput( ) 66
3.8 函数:ns_of_pid( ) 68
3.9 函数:pid_nr( ) 70
3.10 函数:pid_task( ) 72
3.11 函数:pid_vnr( ) 74
3.12 函数:put_pid( ) 76
3.13 函数:task_active_pid_ns( ) 78
3.14 函数:task_tgid_nr_ns( ) 80
本章参考文献 82
第4章 Linux 进程调度内核API 83
4.1 函数:__wake_up( ) 83
4.2 函数:__wake_up_sync( ) 88
4.3 函数:__wake_up_sync_key( ) 91
4.4 函数:abort_exclusive_wait( ) 94
4.5 函数:add_wait_queue( ) 99
4.6 函数:add_wait_queue_exclusive( ) 102
4.7 函数:autoremove_wake_function( ) 105
4.8 函数:complete( ) 109
4.9 函数:complete_all( ) 112
4.10 函数:completion_done( ) 115
4.11 函数:current_thread_info( ) 118
4.12 函数:default_wake_function( ) 121
4.13 函数:do_exit( ) 124
4.14 函数:finish_wait( ) 126
4.15 函数:init_waitqueue_entry( ) 130
4.16 函数:init_waitqueue_head( ) 132
4.17 函数:kthread_create_on_node( ) 134
4.18 函数:kthread_stop( ) 136
4.19 函数:prepare_to_wait( ) 138
4.20 函数:prepare_to_wait_exclusive( ) 142
4.21 函数:remove_wait_queue( ) 147
4.22 函数:sched_setscheduler( ) 150
4.23 函数:set_cpus_allowed_ptr( ) 154
4.24 函数:set_user_nice( ) 157
4.25 函数:task_nice( ) 160
4.26 函数:try_wait_for_completion( ) 162
4.27 函数:wait_for_completion( ) 166
4.28 函数:wait_for_completion_interruptible_timeout( ) 169
4.29 函数:wait_for_completion_killable( ) 173
4.30 函数:wait_for_completion_timeout( ) 177
4.31 函数:wake_up_process( ) 180
4.32 函数:yield( ) 183
本章参考文献 185
第5章 Linux中断机制内核API 187
5.1 函数:__tasklet_hi_schedule( ) 187
5.2 函数:__tasklet_schedule( ) 190
5.3 函数:disable_irq( ) 193
5.4 函数:disable_irq_nosync( ) 193
5.5 函数:disable_irq_wake( ) 196
5.6 函数:enable_irq( ) 199
5.7 函数:enable_irq_wake( ) 201
5.8 函数:free_irq( ) 204
5.9 函数:irq_set_chip( ) 205
5.10 函数:irq_set_chip_data( ) 209
5.11 函数:irq_set_irq_type( ) 212
5.12 函数:irq_set_irq_wake( ) 214
5.13 函数:remove_irq( ) 217
5.14 函数:request_irq( ) 221
5.15 函数:request_threaded_irq( ) 225
5.16 函数:setup_irq( ) 229
5.17 函数:tasklet_disable( ) 232
5.18 函数:tasklet_disable_nosync( ) 234
5.19 函数:tasklet_enable( ) 236
5.20 函数:tasklet_hi_schedule( ) 237
5.21 函数:tasklet_init( ) 241
5.22 函数:tasklet_kill( ) 243
5.23 函数:tasklet_schedule( ) 245
5.24 函数:tasklet_trylock( ) 247
5.25 函数:tasklet_unlock( ) 248
本章参考文献 251
第6章 Linux内存管理内核API 252
6.1 函数:__free_pages( ) 252
6.2 函数:__get_free_pages( ) 253
6.3 函数:__get_vm_area( ) 255
6.4 函数:__krealloc( ) 258
6.5 函数:alloc_pages( ) 261
6.6 函数:alloc_pages_exact( ) 264
6.7 函数:find_vma( ) 266
6.8 函数:find_vma_intersection( ) 270
6.9 函数:free_pages( ) 272
6.10 函数:free_pages_exact( ) 273
6.11 函数:get_unmapped_area( ) 274
6.12 函数:get_zeroed_page( ) 276
6.13 函数:kcalloc( ) 278
6.14 函数:kfree( ) 280
6.15 函数:kmalloc( ) 281
6.16 函数:kmem_cache_alloc( ) 283
6.17 函数:kmem_cache_create( ) 285
6.18 函数:kmem_cache_destroy( ) 288
6.19 函数:kmem_cache_free( ) 289
6.20 函数:kmem_cache_zalloc( ) 290
6.21 函数:kmemdup( ) 292
6.22 函数:ksize( ) 295
6.23 函数:kstrdup( ) 298
6.24 函数:kstrndup( ) 299
6.25 函数:kzalloc( ) 301
6.26 函数:memdup_user( ) 303
6.27 函数:mempool_alloc( ) 306
6.28 函数:mempool_alloc_pages( ) 308
6.29 函数:mempool_alloc_slab( ) 311
6.30 函数:mempool_create( ) 313
6.31 函数:mempool_destroy( ) 316
6.32 函数:mempool_free( ) 317
6.33 函数:mempool_free_pages( ) 318
6.34 函数:mempool_free_slab( ) 318
6.35 函数:mempool_kfree( ) 319
6.36 函数:mempool_kmalloc( ) 320
6.37 函数:mempool_resize( ) 322
6.38 函数:nr_free_buffer_pages( ) 325
6.39 宏:page_address( ) 326
6.40 宏:page_cache_get( ) 328
6.41 宏:page_cache_release( ) 330
6.42 函数:page_zone( ) 331
6.43 宏:probe_kernel_address( ) 334
6.44 函数:probe_kernel_read( ) 336
6.45 函数:vfree( ) 338
6.46 函数:vma_pages( ) 339
6.47 函数:vmalloc( ) 341
6.48 函数:vmalloc_to_page( ) 343
6.49 函数:vmalloc_to_pfn( ) 345
6.50 函数:vmalloc_user( ) 347
本章参考文献 349
第7章 Linux内核定时机制API 350
7.1 函数:__round_jiffies( ) 350
7.2 函数:__round_jiffies_relative( ) 352
7.3 函数:__round_jiffies_up( ) 354
7.4 函数:__round_jiffies_up_relative( ) 356
7.5 函数:add_timer( ) 358
7.6 函数:current_kernel_time( ) 359
7.7 函数:del_timer( ) 361
7.8 函数:del_timer_sync( ) 364
7.9 函数:do_gettimeofday( ) 367
7.10 函数:do_settimeofday( ) 369
7.11 函数:get_seconds( ) 372
7.12 函数:getnstimeofday( ) 374
7.13 函数:init_timer( ) 376
7.14 函数:init_timer_deferrable( ) 378
7.15 函数:init_timer_key( ) 380
7.16 函数:init_timer_on_stack( ) 382
7.17 函数:init_timer_on_stack_key( ) 385
7.18 函数:mktime( ) 387
7.19 函数:mod_timer( ) 389
7.20 函数:mod_timer_pending( ) 392
7.21 函数:ns_to_timespec( ) 394
7.22 函数:ns_to_timeval( ) 396
7.23 函数:round_jiffies( ) 398
7.24 函数:round_jiffies_relative( ) 401
7.25 函数:round_jiffies_up( ) 404
7.26 函数:round_jiffies_up_relative( ) 406
7.27 函数:set_normalized_timespec( ) 409
7.28 函数:setup_timer( ) 411
7.29 函数:setup_timer_on_stack( ) 413
7.30 函数:timer_pending( ) 415
7.31 函数:timespec_add_ns( ) 417
7.32 函数:timespec_compare( ) 420
7.33 函数:timespec_equal( ) 422
7.34 函数:timespec_sub( ) 424
7.35 函数:timespec_to_ns( ) 426
7.36 函数:timeval_compare( ) 428
7.37 函数:timeval_to_ns( ) 431
7.38 函数:try_to_del_timer_sync( ) 433
本章参考文献 435
第8章 Linux内核同步机制API 436
8.1 函数:atomic_add( ) 436
8.2 函数:atomic_add_negative( ) 438
8.3 函数:atomic_add_return( ) 440
8.4 函数:atomic_add_unless( ) 442
8.5 函数:atomic_cmpxchg( ) 444
8.6 函数:atomic_dec( ) 446
8.7 函数:atomic_dec_and_test( ) 448
8.8 函数:atomic_inc( ) 449
8.9 函数:atomic_inc_and_test( ) 451
8.10 函数:atomic_read( ) 453
8.11 函数:atomic_set( ) 453
8.12 函数:atomic_sub( ) 455
8.13 函数:atomic_sub_and_test( ) 457
8.14 函数:atomic_sub_return( ) 459
8.15 函数:down( ) 461
8.16 函数:down_interruptible( ) 463
8.17 函数:down_killable( ) 465
8.18 函数:down_read( ) 468
8.19 函数:down_read_trylock( ) 470
8.20 函数:down_timeout( ) 472
8.21 函数:down_trylock( ) 474
8.22 函数:down_write( ) 476
8.23 函数:down_write_trylock( ) 479
8.24 函数:downgrade_write( ) 481
8.25 宏:init_rwsem( ) 483
8.26 函数:read_seqbegin( ) 486
8.27 函数:read_seqretry( ) 488
8.28 函数:sema_init( ) 490
8.29 宏:seqlock_init( ) 492
8.30 函数:up( ) 494
8.31 函数:up_read( ) 496
8.32 函数:up_write( ) 497
8.33 函数:write_seqlock( ) 498
8.34 函数:write_sequnlock( ) 498
本章参考文献 499
第9章 Linux文件系统内核API 500
9.1 函数:__mnt_is_readonly( ) 500
9.2 函数:current_umask( ) 502
9.3 函数:d_alloc( ) 504
9.4 函数:d_find_alias( ) 507
9.5 函数:dput( ) 510
9.6 函数:fget( ) 512
9.7 函数:generic_fillattr( ) 515
9.8 函数:get_fs_type( ) 517
9.9 函数:get_max_files( ) 520
9.10 函数:get_super( ) 522
9.11 函数:have_submounts( ) 525
9.12 函数:I_BDEV( ) 527
9.13 函数:inode_add_bytes( ) 529
9.14 函数:inode_get_bytes( ) 531
9.15 函数:inode_set_bytes( ) 533
9.16 函数:inode_sub_bytes( ) 535
9.17 函数:is_bad_inode( ) 537
9.18 函数:make_bad_inode( ) 538
9.19 函数:may_umount( ) 540
9.20 函数:may_umount_tree( ) 542
9.21 函数:mnt_want_write( ) 544
9.22 函数:notify_change( ) 545
9.23 函数:put_unused_fd( ) 547
9.24 函数:unshare_fs_struct( ) 549
9.25 函数:vfs_fstat( ) 551
9.26 函数:vfs_getattr( ) 553
9.27 函数:vfs_statfs( ) 556
本章参考文献 559
第10章 Linux 设备驱动及设备管理API 560
10.1 函数:__class_create( ) 560
10.2 函数:__class_register( ) 562
10.3 函数:cdev_add( ) 563
10.4 函数:cdev_alloc( ) 564
10.5 函数:cdev_del( ) 566
10.6 函数:cdev_init( ) 572
10.7 宏:class_create( ) 577
10.8 函数:class_destroy( ) 578
10.9 宏:class_register( ) 581
10.10 函数:class_unregister( ) 582
10.11 函数:device_add( ) 589
10.12 函数:device_create( ) 589
10.13 函数:device_del( ) 592
10.14 函数:device_destroy( ) 592
10.15 函数:device_initialize( ) 599
10.16 函数:device_register( ) 606
10.17 函数:device_rename( ) 607
10.18 函数:device_unregister( ) 613
10.19 函数:get_device( ) 620
10.20 函数:put_device( ) 621
10.21 函数:register_chrdev( ) 625
10.22 函数:unregister_chrdev( ) 626
10.23 部分相关函数说明 634
本章参考文献 635
附录 Linux内核API快速检索表 636
【前言/序言】
Preface前 言
进入21世纪以来,IT技术以前所未有的速度向前发展。Linux作为源码开放的操作系统,在众多的爱好者和网络黑客的共同努力下,不断成长并趋于完善。由于GNU计划所开发的各种组件和系统发行版所必备的软件可以运行于Linux内核之上,整个内核符合GNU通用公共许可证(GNU General Public License),使得Linux在PC、服务器以及嵌入式系统开发等领域得到了广泛的应用。
作者在长期的Linux内核开发中发现,当前介绍内核API方面的书籍很少。目前市面的关于Linux内核编程开发方面的书可以分为三类:第一类,Linux内核分析,所分析的内核源代码版本一般相对较早,而对于最新版本的内核源代码很少提及;第二类,Linux编程类,主要是以用户层面上的编程为主,一般涉及用户API;第三类,嵌入式Linux开发,相对于特定的硬件平台,只对所用到的特定内核API进行简要说明。对于Linux内核编程开发,需要全面了解内核API,而目前市面上找不到一本能够全面介绍最新的Linux内核API的图书,这也正是本书写作的目的所在。
本书的编写工作从2015年6月开始,所有的内核API验证实例基于最新的Linux内核源代码3.19.3版本。经过近十一个月的源代码分析、编程实践与实例验证,对常用的内核API进行系统归纳,并编写了典型验证程序,使理论分析与实际编程实现统一。分析的内核API模块包括:内核模块机制API、进程管理内核API、进程调度内核API、中断机制内核API、时间与定时机制内核API、内存管理内核API、内核同步机制API、文件系统内核API和设备驱动及设备管理模块内核API。
在实例编写过程中,感谢邓莹莹参与了部分实例的验证,以及机械工业出版社华章公司编辑为本书的出版所做的工作。另外,笔者听取了同事、同行专家意见和建议,并参阅了大量中文、外文文献和网络论坛的精华资料,特别是活跃在开放源代码社区的Linux爱好者,在此向他们表示感谢。
由于Linux更新速度较快,再加上编者所具备知识的广度和深度所限,书中存在的错误与不当之处请各位同仁批评指正。对于书中的问题,读者可以发送到E-mail:[email protected],能够及时与笔者交流,以便再版时更正与完善。
编者2016年5月1日于大连