庫函數與系統調用,庫函數系統調用

來源:互聯網
上載者:User

庫函數與系統調用,庫函數系統調用

     系統調用可以解釋為作業系統為使用者提供的一些介面,這些介面提供了對系統硬體功能的操作。這樣說大家可能還有點抽象,我再舉一個更具體的例子:比如我要寫一個程式,這個程式的功能就是在螢幕上顯示一個字串“hello,world!”。那麼實現這麼一個在螢幕上顯示一個字串的操作就是系統調用write()的功能。

     那麼系統調用的意義在哪裡呢?     你想想看,你寫一個程式還需要自己去實現在螢幕上列印字串的代碼,這也太累人了吧,,因此系統調用把我們從底層的硬體編程中解放了出來。再者,系統調用是核心代碼,核心代碼能訪問系統上的所有地址空間,而我們執行的代碼是使用者空間的代碼,使用者空間的代碼在對系統進行操作時是有限制的,(作為一個菜鳥程式員,系統如果不對你寫的代碼進行限制,,萬一把系統搞蹦了呢。。)。因此系統調用的另一個功能就是維護了系統的安全性,,你要用就直接調用我這個介面就行了,,不用你自己寫。系統調用還有一個功能就是為了方便程式的移植性。。      總之,你就把系統調用當做一個介面,什麼時候你需要使用它了,調用一下它就行了,既方便又安全。。      你可能會有疑問,我們平時在寫C語言時列印一個字串不是用printf()函數嗎?這個printf()跟前面提到的那個系統調用write()有什麼區別呢?問對了。     其實你可以把庫函數當做是對系統調用的又一次封裝。。什麼意思呢?系統調用作為核心提供給我們的介面,它的執行效率是比較高效精簡的。但是有時候我們需要對擷取的資訊進行更複雜的處理,這個時候如果我們把這些處理過程封裝成一個函數再提供給程式員,不是更方便編程了嗎?因此一個庫函數有可能含有一個系統調用,有可能有好幾個系統調用,當然也有可能沒有系統調用,比如有些操作就不需要涉及核心的功能。      總之,庫函數是面向程式員的應用編程介面。看一下下面這張圖也許更明白了它們之間的關係:      說完了庫函數和系統調用之間的關係,下面我們來看看系統調用到底是怎麼啟動並執行。     當一個進程正在運行時,遇到讀寫檔案什麼的,此時會發生一個中斷,中斷髮生後,系統會把目前使用者進程的一些寄存器資訊儲存在核心堆棧中(以備將來恢複),接著去執行中斷服務程式,我們這裡是去執行系統調用,Linux中通過執行int $0x80來執行系統調用的中斷,但是核心實現了很多系統調用,所以進程必須指明需要哪個系統調用,這時候就需要傳遞一個系統調用號。這個系統調用號就存放在%eax寄存器中。     下面我們通過一個例子來說明:我們這裡這個程式用來顯示當前的時間。     首先我們通過庫函數來實現:     結果如下:成功獲得目前時間。     接下來我們通過嵌入組合語言來實現系統調用:     發現沒?首先通過mov $0xd %%eax來將系統調用號放入%eax寄存器中,通過查閱,發現time()的系統調用號是13。這個時候通過執行int $0x80,系統就會去執行time()這個系統調用了。     查看結果:     看,依然能夠獲得系統的時間!     這裡涉及的很多知識可能大家都不太看得懂,沒關係,我們後面會詳細介紹!這篇部落格的目的是讓大家理解庫函數和系統調用的區別,以及系統調用的大致執行方式。   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.