『壹』 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/