Linux内核API

Linux内核API与用户API是具有本质区别的,因为它们所运行的系统模式不同。进行Linux内核源代码分析与内核API验证,需要具备一定的基础知识,掌握了这些基础知识后,才能在Linux内核源代码分析与内核API验证实例的理解中做到游刃有余。

Linux内核API_第1张图片

Linux可以运行在两种模式下:用户模式(user mode)和内核模式(kernel mode)。当我们编写一个普通程序时,有时会包含stdlib.h文件,也就是说我们使用了C标准库,这是典型的用户模式编程,在这种情况下,用户模式的应用程序要链接标准C库。在内核模式下不存在libc库,即没有这些函数供我们调用。

此外,在内核模式下编程还存在一些限制:

  • 不能使用浮点运算。因为Linux内核在切换模式时不保存处理器的浮点状态。
  • 不要让内核程序进行长时间等待。Linux操作系统本身是抢占式的,但是在内核是非抢占式的,也就是说用户空间的程序可以抢占运行,但是内核空间程序不可以。
  • 尽可能保持代码的整洁性。内核调试不像调试应用程序那样方便,因此,在前期代码编写的过程中保持代码的整洁易懂,将大大方便后期的调试。
  • 在内核态下编程,系统内的所有资源都是在内核统一调配的,并且数量有限,因此在申请的资源用完后一定要进行释放,避免出现死锁情况。
  • Linux内核API有很多配对使用。例如,文件引用计数有加操作,也会有相应的减操作,如果在实验中进行了“引用计数”加操作,函数执行后未进行减操作还原,可能会出现系统崩溃。

本教程中的所有内核API验证实例都是在Linux内核态下进行编程与验证的。

相关知识

学习本教程,你可以了解的相关知识点如下:

  • C语言教程C语言是应用最为广泛的一种高级程序设计语言,它不仅是计算机专业学生的必修课,也是许多非计算机专业学生所青睐的技术学科。C语言功能丰富,表达能力强,使用灵活方便,程序效率高,是结构化程序设计语言。

  • Linux教程
    Linux(Linux is not Unix)是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。

Linux内核API

  • Linux内核模块机制API
  • Linux进程管理内核API
  • Linux进程调度内核API
  • Linux内核中断机制API
  • Linux内核内存管理API
  • Linux内核定时机制API
  • Linux内核同步机制API
  • Linux内核文件系统API
  • Linux设备驱动及设备管理API
__module_address() __module_text_address() __print_symbol() __symbol_get()
__symbol_put() find_module() find_symbol() module_is_live()
module_put() module_refcount() sprint_symbol() symbol_put_addr()
try_module_get()
__task_pid_nr_ns() find_get_pid() find_pid_ns() find_vpid()
get_pid() get_task_mm() mmput() ns_of_pid()
pid_nr() pid_task() pid_vnr() put_pid()
task_active_pid_ns() task_tgid_nr_ns()
__wake_up() __wake_up_sync() __wake_up_sync_key() abort_exclusive_wait()
add_wait_queue() add_wait_queue_exclusive() autoremove_wake_function() complete()
complete_all() completion_done() current_thread_info() default_wake_function()
do_exit() finish_wait() init_waitqueue_entry() init_waitqueue_head()
kthread_create_on_node() kthread_stop() prepare_to_wait() prepare_to_wait_exclusive()
remove_wait_queue() sched_setscheduler() set_cpus_allowed_ptr() set_user_nice()
task_nice() try_wait_for_completion() wait_for_completion() wait_for_completion_interruptible_timeout()
wait_for_completion_killable() wait_for_completion_timeout() wake_up_process() yield()
__tasklet_hi_schedule() __tasklet_schedule() disable_irq() disable_irq_nosync()
disable_irq_wake() enable_irq() enable_irq_wake() free_irq()
irq_set_chip() irq_set_chip_data() irq_set_irq_type() irq_set_irq_wake()
remove_irq() request_irq() request_threaded_irq() setup_irq()
tasklet_disable() tasklet_disable_nosync() tasklet_enable() tasklet_hi_schedule()
tasklet_init() tasklet_kill() tasklet_schedule() tasklet_trylock()
tasklet_unlock() __free_pages() __get_free_pages() __get_vm_area()
__krealloc() alloc_pages() alloc_pages_exact() find_vma()
find_vma_intersection() free_pages() free_pages_exact() get_unmapped_area()
get_zeroed_page() kcalloc() kfree() kmalloc()
kmem_cache_alloc() kmem_cache_create() kmem_cache_destroy() kmem_cache_free()
kmem_cache_zalloc() kmemdup() ksize() kstrdup()
kstrndup() kzalloc() memdup_user() mempool_alloc()
mempool_alloc_pages() mempool_alloc_slab() mempool_create() mempool_destroy()
mempool_free() mempool_free_pages() mempool_free_slab() mempool_kfree()
mempool_kmalloc() mempool_resize() nr_free_buffer_pages() page_address()
page_cache_get() page_cache_release() page_zone() probe_kernel_address()
probe_kernel_read() vfree() vma_pages() vmalloc()
vmalloc_to_page() vmalloc_to_pfn() vmalloc_user()
__round_jiffies() __round_jiffies_relative() __round_jiffies_up() __round_jiffies_up_relative()
add_timer() current_kernel_time() del_timer() del_timer_sync()
do_gettimeofday() do_settimeofday() get_seconds() getnstimeofday()
init_timer() init_timer_deferrable() init_timer_key() init_timer_on_stack()
init_timer_on_stack_key() mktime() mod_timer() mod_timer_pending()
ns_to_timespec() ns_to_timeval() round_jiffies() round_jiffies_relative()
round_jiffies_up() round_jiffies_up_relative() set_normalized_timespec() setup_timer()
setup_timer_on_stack() timer_pending() timespec_add_ns() timespec_compare()
timespec_equal() timespec_sub() timespec_to_ns() timeval_compare()
timeval_to_ns() try_to_del_timer_sync()
atomic_add() atomic_add_negative() atomic_add_return() atomic_add_unless()
atomic_cmpxchg() atomic_dec() atomic_dec_and_test() atomic_inc()
atomic_inc_and_test() atomic_read() atomic_set() atomic_sub()
atomic_sub_and_test() atomic_sub_return() down() down_interruptible()
down_killable() down_read() down_read_trylock() down_timeout()
down_trylock() down_write() down_write_trylock() downgrade_write()
init_rwsem() read_seqbegin() read_seqretry() sema_init()
seqlock_init() up() up_read() up_write()
write_seqlock() write_sequnlock()
__mnt_is_readonly() current_umask() d_alloc() d_find_alias()
dput() fget() generic_fillattr() get_fs_type()
get_max_files() get_super() have_submounts() I_BDEV()
inode_add_bytes() inode_get_bytes() inode_set_bytes() inode_sub_bytes()
is_bad_inode() make_bad_inode() may_umount() may_umount_tree()
mnt_want_write() notify_change() put_unused_fd() unshare_fs_struct()
vfs_fstat() vfs_getattr() vfs_statfs()
__class_create() __class_register() cdev_add() cdev_alloc()
cdev_del() cdev_init() class_create() class_destroy()
class_register() class_unregister() device_add() device_create()
device_del() device_destroy() device_initialize() device_register()
device_rename() device_unregister() get_device() put_device()
register_chrdev() unregister_chrdev()

你可能感兴趣的:(linux)