<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

透了解系統調用助你成為Linux下編程高手

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:胡薇 ? 2018-05-11 11:27 ? 次閱讀

什么是系統調用?

Linux內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在自己的應用程序中調用它們。從某種角度來看,系統調用和普通的函數調用非常相似。區別僅僅在于,系統調用由操作系統核心提供,運行于核心態;而普通的函數調用由函數庫或用戶自己提供,運行于用戶態。

隨Linux核心還提供了一些C語言函數庫,這些庫對系統調用進行了一些包裝和擴展,因為這些庫函數與系統調用的關系非常緊密,所以習慣上把這些函數也稱為系統調用。

為什么要用系統調用?

實際上,很多已經被我們習以為常的C語言標準函數,在Linux平臺上的實現都是靠系統調用完成的,所以如果想對系統底層的原理作深入的了解,掌握各種系統調用是初步的要求。進一步,若想成為一名Linux下編程高手,也就是我們常說的Hacker,其標志之一也是能對各種系統調用有透徹的了解。

即使除去上面的原因,在平常的編程中你也會發現,在很多情況下,系統調用是實現你的想法的簡潔有效的途徑,所以有可能的話應該盡量多掌握一些系統調用,這會對你的程序設計過程帶來意想不到的幫助。

系統調用是怎么工作的?

一般的,進程是不能訪問內核的。它不能訪問內核所占內存空間也不能調用內核函數。CPU硬件決定了這些(這就是為什么它被稱作"保護模式")。系統調用是這些規則的一個例外。其原理是進程先用適當的值填充寄存器,然后調用一個特殊的指令,這個指令會跳到一個事先定義的內核中的一個位置(當然,這個位置是用戶進程可讀但是不可寫的)。在Intel CPU中,這個由中斷0x80實現。硬件知道一旦你跳到這個位置,你就不是在限制模式下運行的用戶,而是作為操作系統的內核--所以你就可以為所欲為。

進程可以跳轉到的內核位置叫做sysem_call。這個過程檢查系統調用號,這個號碼告訴內核進程請求哪種服務。然后,它查看系統調用表(sys_call_table)找到所調用的內核函數入口地址。接著,就調用函數,等返回后,做一些系統檢查,最后返回到進程(或到其他進程,如果這個進程時間用盡)。

具體過程如下圖所示:

如何使用系統調用?

先來看一個例子:

這是因為在time.h中實際上已經用庫函數的形式實現了time這個系統調用,替我們省掉了調用_syscall1宏展開得到函數原型這一步。

大多數系統調用都在各種C語言函數庫中有所實現,所以在一般情況下,我們都可以像調用普通的庫函數那樣調用系統調用,只在極個別的情況下,我們才有機會用到_syscall*()這幾個宏。

調用性能問題

系統調用需要從用戶空間陷入內核空間,處理完后,又需要返回用戶空間。其中除了系統調用服務例程的實際耗時外,陷入/返回過程和系統調用處理程序(查系統調用表、存儲\恢復用戶現場)也需要花銷一些時間,這些時間加起來就是一個系統調用的響應速度。系統調用不比別的用戶程序,它對性能要求很苛刻,因為它需要陷入內核執行,所以和其他內核程序一樣要求代碼簡潔、執行迅速。幸好Linux具有令人難以置信的上下文切換速度,使得其進出內核都被優化得簡潔高效;同時所有Linux系統調用處理程序和每個系統調用本身也都非常簡潔。

絕大多數情況下,Linux系統調用性能是可以接受的,但是對于一些對性能要求非常高的應用來說,它們雖然希望利用系統調用的服務,但卻希望加快相應速度,避免陷入/返回和系統調用處理程序帶來的花銷,因此采用由內核直接調用系統調用服務例程,最好的例子就HTTPD——它為了避免上述開銷,從內核調用socket等系統調用服務例程。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11011

    瀏覽量

    206919
  • 系統調用
    +關注

    關注

    0

    文章

    27

    瀏覽量

    8296

原文標題:若想成為一名Linux下編程高手,必須能對各種系統調用有透徹的了解

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux+C語言】你真的了解system接口的調用嗎?

    Linux + C語言】話說,你真的了解system接口的調用嗎?
    的頭像 發表于 09-12 16:33 ?3588次閱讀
    【<b class='flag-5'>Linux</b>+C語言】你真的<b class='flag-5'>了解</b>system接口的<b class='flag-5'>調用</b>嗎?

    一文全面了解linux相關知識

    今天浩道跟大家分享linux實用場景相關的實例,助你全面了解linux相關知識。
    發表于 01-29 11:09 ?402次閱讀

    Linux內核中系統調用詳解

    Linux內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在
    發表于 08-23 10:37 ?639次閱讀
    <b class='flag-5'>Linux</b>內核中<b class='flag-5'>系統</b><b class='flag-5'>調用</b>詳解

    添加Linux系統調用與利用QEMU測試

    添加Linux系統調用與利用QEMU測試
    發表于 10-01 12:19 ?240次閱讀
    添加<b class='flag-5'>Linux</b><b class='flag-5'>系統</b><b class='flag-5'>調用</b>與利用QEMU測試

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統是當今科技領域的核心,而C語言則是嵌入式系統開發中最常用的編程語言之一。
    發表于 03-25 14:12

    如何成為一名嵌入式C語言高手?

    如何成為一名嵌入式C語言高手? 嵌入式系統是當今科技領域的核心,而C語言則是嵌入式系統開發中最常用的編程語言之一。
    發表于 04-07 16:03

    練成Linux系統高手教程

    練成Linux系統高手教程─────打開那神秘  看著別人操作那滿屏幕的洋文,不可思議,那肯定是一個Linux高手,其實你也能
    發表于 08-10 11:17

    請問如何成為嵌入式高手?

    成為嵌入式高手的技能清單和升級線路圖第一部分:Linux平臺搭建與環境熟悉了解linux系統;區
    發表于 08-30 11:28

    什么是Linux系統編程

    什么是Linux系統編程?Linux系統編程也叫Linux的高級
    發表于 12-23 07:30

    LinuxC語言編程入門教程

    編程風格等。u3000u3000Linux 作為一個優秀的操作系統,一項非常重要的功能就是支持系統調用尤其是支持C語言的
    發表于 09-22 06:56

    Linux系統調用及用戶編程接口API分析

    在搭建起嵌入式開發環境之后,從本章開始,讀者將真正開始學習嵌入式Linux的應用開發。由于嵌入式Linux是經Linux裁減而來的,它的系統調用
    發表于 10-18 17:14 ?1次下載

    了解各種系統調用助你成為一名Linux編程高手

    Linux內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在
    的頭像 發表于 05-14 11:10 ?3137次閱讀
    <b class='flag-5'>了解</b>各種<b class='flag-5'>系統</b><b class='flag-5'>調用</b><b class='flag-5'>助你</b><b class='flag-5'>成為</b>一名<b class='flag-5'>Linux</b>下<b class='flag-5'>編程</b><b class='flag-5'>高手</b>

    什么是系統調用?為什么要用系統調用?

    實際上,很多已經被我們習以為常的C語言標準函數,在Linux平臺上的實現都是靠系統調用完成的,所以如果想對系統底層的原理作深入的了解,掌握各
    的頭像 發表于 06-01 08:44 ?1.5w次閱讀
    什么是<b class='flag-5'>系統</b><b class='flag-5'>調用</b>?為什么要用<b class='flag-5'>系統</b><b class='flag-5'>調用</b>?

    如何區分xenomai、linux系統調用/服務

    對于同一個POSIX接口應用程序,可能既需要xenomai內核提供服務(xenomai 系統調用),又需要調用linux內核提供服務(linux
    的頭像 發表于 05-10 10:28 ?1731次閱讀

    Linux系統調用的具體實現原理

    文我將基于 ARM 體系結構角度,從 Linux 應用層例子到內核系統調用函數的整個過程來梳理一遍,講清楚linux系統
    的頭像 發表于 09-05 17:16 ?785次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統</b><b class='flag-5'>調用</b>的具體實現原理
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>