‘壹’ linux内核提供的能够访问用户指针的api有哪些,哪些是安全的,怎么检查安全性
4. linux 用户API (内核API,请参考Linux内核API完全手)
一、进程控制:
fork 创建一个新进程
clone 按指定条件创建子进程
execve 运行可执行文件
exit 中止进程
_exit 立即中止当前进程
getdtablesize 进程所能打开的最大文件数
getpgid 获取指定进程组标识号
setpgid 设置指定进程组标志号
getpgrp 获取当前进程组标识号
setpgrp 设置当前进程组标志号
getpid 获取进程标识号
getppid 获取父进程标识号
getpriority 获取调度优先级
setpriority 设置调度优先级
modify_ldt 读写进程的本地描述表
nanosleep 使进程睡眠指定的时间
nice 改变分时进程的优先级
pause 挂起进程,等待信号
personality 设置进程运行域
prctl 对进程进行特定操作
ptrace 进程跟踪
sched_get_priority_max 取得静态优先级的上限
sched_get_priority_min 取得静态优先级的下限
sched_getparam 取得进程的调度参数
sched_getscheler 取得指定进程的调度策略
sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度
sched_setparam 设置进程的调度参数
sched_setscheler 设置指定进程的调度策略和参数
sched_yield 进程主动让出处理器,并将自己等候调度队列队尾
vfork 创建一个子进程,以供执行新程序,常与execve等同时使用
wait 等待子进程终止
wait3 参见wait
waitpid 等待指定子进程终止
wait4 参见waitpid
capget 获取进程权限
capset 设置进程权限
getsid 获取会晤标识号
setsid 设置会晤标识号
‘贰’ linux内核api有必要学吗
很有必要,对技术提升很有帮助,linux研究的越多越好,对编程很有好处
‘叁’ Linux库函数,Linux 系统API 这两个概念有区别吗
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四:让api也可以有了级别和专门的工作面向。
1、系统调用
系统调用提供的函数如open, close, read, write, ioctl等,需包含头文件unistd.h.以write为例:其函数原型为 size_t write(int fd, const void *buf, size_t nbytes),其操作对象为文件描述符或文件句柄fd(file descriptor),要想写一个文件,必须先以可写权限用open系统调用打开一个文件,获得所打开文件的fd,例如 fd=open(\逗/dev/video\地, O_RDWR)。fd是一个整型值,每新打开一个文件,所获得的fd为当前最大fd加1.Linux系统默认分配了3个文件描述符值:0-standard input,1-standard output,2-standard error.
系统调用通常用于底层文件访问(low-level file access),例如在驱动程序中对设备文件的直接访问。
系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。
这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢看这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。
2、库函数调用
标准C库函数提供的文件操作函数如fopen, fread, fwrite, fclose, fflush, fseek等,需包含头文件stdio.h.以fwrite为例,其函数原型为size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作对象为文件指针FILE *pf,要想写一个文件,必须先以可写权限用fopen函数打开一个文件,获得所打开文件的FILE结构指针pf,例如pf=fopen(\逗~/proj/filename\地, \逗w\地)。实际上,由于库函数对文件的操作最终是通过系统调用实现的,因此,每打开一个文件所获得的FILE结构指针都有一个内核空间的文件描述符fd与之对应。同样有相应的预定义的FILE指针:stdin-standard input,stdout-standard output,stderr-standard error.
库函数调用通常用于应用程序中对一般文件的访问。
库函数调用是系统无关的,因此可移植性好。
由于库函数调用是基于C库的,因此也就不可能用于内核空间的驱动程序中对设备的操作。
‘肆’ linux内核提供的能够访问用户指针的api有哪些哪些是安全的怎样检查安全性
指向用户区指针的用户区指针:argv, linux把操作系统内存和用户区内存隔离开, 用户程序只能通过系统调用访问系统功能, 内核态可以访问用户内存,但是要做检查,因为用户区内存是不可靠的,甚至是危险的。 _user就表示这个意思。
‘伍’ linux内核编程是什么意思啊
含义和Windows的SDK编程差不多,就是直接调用其API编程,甚至直接重写内核的部分功能。
学好了这个可以从事比较高级和底层的开发。
‘陆’ linux内核api man手册怎么建立
1. man
man,即 manunal,是 UNIX 系统手册的电子版本。根据习惯,UNIX 系统手册通常分为不同的部分(或小节,即 section),每个小节阐述不同的系统内容。目前的小节划分如下:
命令:普通用户命令
系统调用:内核接口
函数库调用:普通函数库中的函数
特殊文件:/dev 目录中的特殊文件
文件格式和约定:/etc/passwd 等文件的格式
游戏。
杂项和约定:标准文件系统布局、手册页结构等杂项内容
系统管理命令。
内核例程:非标准的手册小节。便于 Linux 内核的开发而包含
其他手册小节:
‘柒’ 什么是LINUX内核编程
真佩服楼上的2位对“内核编程”的理解力!
简单说,Linux内核编程就是开发Linux驱动程序,学会内核编程后,将会对操作系统的内部机制和工作原理有充分了解,可以从事硬件驱动开发、嵌入式系统开发等。内核编程的语言仍是传统的C语言,但其编写方法和调用接口与传统应用程序的差别较大,你必须了解如何处理中断、如何在内核态和用户态之间转换、PCI、DMA、内核地址映射、内核I/O等,这不是《UNIX高级编程》所涉及的内容,可以找一本专门讲Linux驱动编程的书看看,或在网上搜寻相关资料(关键词:Linux DDK)。不过先提醒一句,学习内核编程的难度很大,必须做好长期心理准备
‘捌’ Linux内核API完全参考手册的内容简介
linux作为源码开放的操作系统已经广泛应用于计算机与嵌入式设备,因此学会linux内核开发与编程显得越来越重要。本书以最新的linux内核版本2.6.30为依据,对常用的内核api作了系统分析和归纳,设计了典型实例并对开发场景进行了详细讲解。本书中分析的内核api模块包括:内核模块机制api、进程管理内核api、进程调度内核api、中断机制内核api、内存管理内核api、内核定时机制api、内核同步机制api、文件系统内核api和设备驱动及设备管理api。
本书立足linux内核api分析,深入实践,内容翔实,读者可以从低起点进行高效的内核分析与编程实践。本书可作为高等院校计算机、电子、信息类大学生及研究生进行linux操作系统学习和编程的教材或参考书,也可作为linux开发人员和广大linux编程开发爱好者的参考用书。
‘玖’ Linux内核API完全参考手册的目录
前言 本书使用方法第1章 Linux内核API分析必备知识 1Linux内核编程注意事项 1本书中模块编译Makefile模板 1内核调试函数printk 2内核编译与定制 4温馨提示 10参考文献 11第2章 Linux内核模块机制API 12函数:__mole_address ( ) 12函数:__mole_ref_addr ( ) 14函数:__mole_text_address ( ) 16函数:__print_symbol ( ) 18函数:__symbol_get ( ) 20函数:__symbol_put ( ) 22函数:find_mole ( ) 24函数:find_symbol ( ) 27函数:mole_is_live ( ) 30函数:mole_put ( ) 32函数:mole_refcount ( ) 34函数:sprint_symbol ( ) 36函数:symbol_put_addr ( ) 38函数:try_mole_get ( ) 40函数:use_mole ( ) 42参考文献 44第3章 Linux进程管理内核API 45函数:__task_pid_nr_ns( ) 45函数:find_get_pid( ) 47函数:find_pid _ns( ) 49函数:find_task_by_pid_ns( ) 51函数:find_task_by_pid_type _ns( ) 53函数:find_task_by_vpid( ) 55函数:find_vpid( ) 57函数:get_pid( ) 59函数:get_task_mm( ) 60函数:is_container_init( ) 63函数:kernel_thread( ) 65函数:mmput( ) 67函数:ns_of_pid( ) 69函数:pid_nr( ) 71函数:pid_task( ) 73函数:pid_vnr( ) 75函数:put_pid( ) 77函数:task_active_pid_ns( ) 79函数:task_tgid_nr_ns( ) 81参考文献 83第4章 Linux进程调度内核API 84函数:__wake_up( ) 84函数:__wake_up_sync( ) 87函数:__wake_up_sync_key( ) 89函数:abort_exclusive_wait( ) 91函数:add_preempt_count( ) 95函数:add_wait_queue( ) 97函数:add_wait_queue_exclusive( ) 100函数:autoremove_wake_function( ) 102函数:complete( ) 106函数:complete_all( ) 108函数:complete_done( ) 111函数:current_thread_info( ) 113函数:default_wake_function( ) 115函数:do_exit( ) 118函数:finish_wait( ) 120函数:init_waitqueue_entry( ) 123函数:init_waitqueue_head( ) 125函数:interruptible_sleep_on( ) 127函数:interruptible_sleep_on_timeout( ) 130函数:preempt_notifier_register ( ) 133函数:preempt_notifier_unregister ( ) 136函数:prepare_to_wait( ) 139函数:prepare_to_wait_exclusive( ) 142函数:remove_wait_queue( ) 146函数:sched_setscheler( ) 149函数:set_cpus_allowed_ptr( ) 152函数:set_user_nice( ) 155函数:sleep_on( ) 158函数:sleep_on_timeout( ) 160函数:sub_preempt_count( ) 162函数:task_nice( ) 164函数:try_wait_for_completion( ) 166函数:wait_for_completion( ) 169函数:wait_for_completion_interruptible( ) 172函数:wait_for_completion_interruptible_ timeout( ) 175函数:wait_for_completion_killable( ) 179函数:wait_for_completion_timeout( ) 182函数:wake_up_process( ) 184函数:yield( ) 187参考文献 188第5章 Linux中断机制内核API 189函数:__set_irq_handler( ) 189函数:__tasklet_hi_schele( ) 191函数:__tasklet_schele( ) 194函数:disable_irq( ) 196函数:disable_irq_nosync( ) 196函数:disable_irq_wake( ) 198函数:enable_irq( ) 201函数:enable_irq_wake( ) 203函数:free_irq( ) 205函数:kstat_irqs_cpu( ) 207函数:remove_irq( ) 209函数:request_irq( ) 213函数:request_threaded_irq( ) 216函数:set_irq_chained_handler( ) 219函数:set_irq_chip( ) 221函数:set_irq_chip_data( ) 225函数:set_irq_data( ) 227函数:set_irq_handler( ) 229函数:set_irq_type( ) 232函数:set_irq_wake( ) 234函数:setup_irq( ) 237函数:tasklet_disable( ) 239函数:tasklet_disable_nosync( ) 241函数:tasklet_enable( ) 243函数:tasklet_hi_enable( ) 244函数:tasklet_hi_schele( ) 246函数:tasklet_init( ) 248函数:tasklet_kill( ) 250函数:tasklet_shele( ) 252函数:tasklet_trylock( ) 254函数:tasklet_unlock( ) 255参考文献 257第6章 Linux内存管理内核API 258函数:__free_pages( ) 258函数:__get_free_pages( ) 258函数:__get_vm_area( ) 260函数:__krealloc( ) 262函数:alloc_pages( ) 265函数:alloc_pages_exact( ) 268函数:alloc_vm_area( ) 270函数:do_brk( ) 272函数:do_mmap( ) 273函数:do_mmap_pgoff( ) 276函数:do_munmap( ) 279函数:find_vma( ) 281函数:find_vma_intersection( ) 284函数:free_pages( ) 286函数:free_pages_exact( ) 287函数:free_vm_area( ) 288函数:get_unmapped_area( ) 288函数:get_user_pages( ) 290函数:get_user_pages_fast( ) 292函数:get_vm_area_size( ) 294函数:get_zeroed_page( ) 295函数:kcalloc( ) 297函数:kfree( ) 299函数:kmalloc( ) 299函数:kmap_high( ) 301函数:kmem_cache_alloc( ) 303函数:kmem_cache_create( ) 305函数:kmem_cache_destroy( ) 308函数:kmem_cache_free( ) 308函数:kmem_cache_zalloc( ) 309函数:kmemp( ) 311函数:krealloc( ) 313函数:ksize( ) 315函数:kstrp( ) 318函数:kstrnp( ) 319函数:kunmap_high( ) 321函数:kzalloc( ) 321函数:memp_user( ) 323函数:mempool_alloc( ) 325函数:mempool_alloc_pages( ) 327函数:mempool_alloc_slab( ) 329函数:mempool_create( ) 331函数:mempool_create_kzalloc_pool ( ) 333函数:mempool_destroy( ) 334函数:mempool_free( ) 335函数:mempool_free_pages( ) 335函数:mempool_free_slab( ) 336函数:mempool_kfree( ) 336函数:mempool_kmalloc( ) 337函数:mempool_kzalloc( ) 339函数:mempool_resize( ) 341函数:nr_free_buffer_pages( ) 343宏:page_address( ) 345宏:page_cache_get( ) 346宏:page_cache_release( ) 348函数:page_zone( ) 349宏:probe_kernel_address( ) 352函数:probe_kernel_read( ) 354函数:probe_kernel_write( ) 355函数:vfree( ) 357函数:vma_pages( ) 358函数:vmalloc( ) 359函数:vmalloc_to_page( ) 361函数:vmalloc_to_pfn( ) 363函数:vmalloc_user( ) 365参考文献 366第7章 Linux内核定时机制API 368函数:__round_jiffies( ) 368函数:__round_jiffies_relative( ) 369函数:__round_jiffies_up( ) 371函数:__round_jiffies_up_relative( ) 373函数:__timecompare_update( ) 375函数:add_timer( ) 377函数:current_kernel_time( ) 378函数:del_timer( ) 380函数:del_timer_sync( ) 382函数:do_gettimeofday( ) 384函数:do_settimeofday( ) 386函数:get_seconds( ) 388函数:getnstimeofday( ) 390函数:init_timer( ) 391函数:init_timer_deferrable( ) 393函数:init_timer_deferrable_key( ) 395函数:init_timer_key( ) 398函数:init_timer_on_stack( ) 400函数:init_timer_on_stack_key( ) 402函数:mktime( ) 404函数:mod_timer( ) 406函数:mod_timer_pending( ) 408函数:ns_to_timespec( ) 410函数:ns_to_timeval( ) 412函数:round_jiffies( ) 414函数:round_jiffies_relative( ) 416函数:round_jiffies_up( ) 418函数:round_jiffies_up_relative( ) 420函数:set_normalized_timespec( ) 422函数:setup_timer( ) 424函数:setup_timer_key( ) 426函数:setup_timer_on_stack( ) 428函数:setup_timer_on_stack_key( ) 430函数:timecompare_offset( ) 432函数:timecompare_transform( ) 435函数:timecompare_update( ) 436函数:timer_pending( ) 439函数:timespec_add_ns( ) 441函数:timespec_compare( ) 442函数:timespec_equal( ) 444函数:timespec_sub( ) 446函数:timespec_to_ns( ) 448函数:timeval_compare( ) 450函数:timeval_to_ns( ) 452函数:try_to_del_timer_sync( ) 453参考文献 456第8章 Linux内核同步机制API 457函数:atomic_add( ) 457函数:atomic_add_negative( ) 458函数:atomic_add_return( ) 460函数:atomic_add_unless( ) 461宏:atomic_cmpxchg( ) 463函数:atomic_dec( ) 464函数:atomic_dec_and_test( ) 466函数:atomic_inc( ) 467函数:atomic_inc_and_test( ) 469宏:atomic_read( ) 470宏:atomic_set( ) 471函数:atomic_sub( ) 472函数:atomic_sub_and_test( ) 474函数:atomic_sub_return( ) 475函数:down( ) 477函数:down_interruptible( ) 479函数:down_killable( ) 481函数:down_read( ) 483函数:down_read_trylock( ) 485函数:down_timeout( ) 487函数:down_trylock( ) 489函数:down_write( ) 491函数:down_write_trylock( ) 492函数:downgrade_write( ) 494宏:init_rwsem( ) 496宏:read_lock( ) 498函数:read_seqbegin( ) 499函数:read_seqretry( ) 500宏:read_trylock( ) 503宏:read_unlock( ) 504宏:rwlock_init( ) 505函数:sema_init( ) 508宏:seqlock_init( ) 509宏:spin_can_lock( ) 511宏:spin_lock( ) 513宏:spin_lock_bh( ) 514宏:spin_lock_init ( ) 516宏:spin_lock_irq( ) 518宏:spin_lock_irqsave( ) 520宏:spin_trylock( ) 522宏:spin_unlock( ) 525宏:spin_unlock_bh( ) 526宏:spin_unlock_irq( ) 526宏:spin_unlock_irqrestore( ) 527宏:spin_unlock_wait( ) 527函数:up( ) 529函数:up_read( ) 531函数:up_write( ) 532宏:write_lock( ) 532函数:write_seqlock( ) 534函数:write_sequnlock( ) 534宏:write_trylock( ) 535宏:write_unlock( ) 537参考文献 537第9章 Linux文件系统内核API 539函数:__mnt_is_readonly( ) 539函数:current_umask( ) 541函数:d_alloc( ) 542函数:d_alloc_root( ) 544函数:d_delete( ) 547函数:d_find_alias( ) 547函数:d_invalidate( ) 549函数:d_move( ) 550函数:d_validate( ) 551函数:dput( ) 553函数:fget( ) 554函数:find_inode_number( ) 557函数:generic_fillattr( ) 559函数:get_empty_filp( ) 561函数:get_fs_type( ) 563函数:get_max_files( ) 565函数:get_super( ) 566函数:get_unused_fd( ) 569函数:have_submounts( ) 570函数:I_BDEV( ) 572函数:iget_locked( ) 573函数:inode_add_bytes( ) 575函数:inode_get_bytes( ) 576函数:inode_needs_sync( ) 578函数:inode_set_bytes( ) 580函数:inode_setattr( ) 581函数:inode_sub_bytes( ) 584函数:invalidate_inodes( ) 586函数:is_bad_inode( ) 587函数:make_bad_inode( ) 588函数:may_umount( ) 590函数:may_umount_tree( ) 591函数:mnt_pin( ) 593函数:mnt_unpin( ) 594函数:mnt_want_write( ) 596函数:new_inode( ) 596函数:notify_change( ) 598函数:put_unused_fd( ) 600函数:register_filesystem( ) 602函数:unregister_filesystem( ) 604函数:unshare_fs_struct( ) 604函数:vfs_fstat( ) 606函数:vfs_getattr( ) 608函数:vfs_statfs( ) 610参考文献 613第10章 Linux设备驱动及设备管理API 614函数:__class_create( ) 614函数:__class_register( ) 615函数:cdev_add( ) 616函数:cdev_alloc( ) 617函数:cdev_del( ) 619函数:cdev_init( ) 624宏:class_create( ) 628函数:class_destroy( ) 629宏:class_register( ) 631函数:class_unregister( ) 632函数:device_add( ) 637函数:device_create( ) 638函数: device_del( ) 640函数:device_destroy( ) 640函数:device_initialize( ) 646函数:device_register( ) 652函数:device_rename( ) 652函数:device_unregister( ) 657函数:get_device( ) 663函数:put_device( ) 663函数:register_chrdev( ) 667函数:register_keyboard_notifier( ) 668函数:unregister_chrdev( ) 669函数:unregister_keyboard_notifier( ) 675部分相关函数说明 679参考文献 679附录 Linux内核API快速检索表 680
‘拾’ linux 系统api 和kernel api 一样么
linux kernel只提供一种叫系统调用给应用程序,linux系统提供了glibc这样的函数库专门封装了内核提供的系统调用,所以应用程序的开发就直接调用glibc库提供的库函数就可以了。
注:1、linux系统包括linux kernel、glibc库等。
2、因为应用程序调用系统调用是通过汇编指令完成的,所以才有了glibc的封装,简化了应用开发的难度。
kernel中提供的系统调用处理函数
sys_socket、sys_open、sys_close、sys_read、sys_write等
glibc中对应的是
socket、open、close、read、write等
glibc中的socket函数就是调用了int $0x80这条汇编指令,从而使cpu切换到内核态,执行sys_socket这个函数的。
函数调用流程:
socket->int $0x80->sys_socket。
现在2.6版本的内核提供了300多个系统调用:
glibc的下载地址:
http://ftp.gnu.org/gnu/glibc/
linux kernel的下载地址:
http://www.kernel.org/pub/linux/kernel/