《Linux內核分析》 第四節 扒開系統調用的三層皮(上)

黃胤凱 ? 原創作品轉載請注明出處 ? 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

一、視頻學習

1.系統調用的三層皮:xyz ? ?system_call ? ?sys_xyz

對應的是API,中斷向量對應的中斷服務程序,系統調用服務程序。

?

API:應用編程接口 ? ? ? ? ? ?

它與系統調用的關系:API可能直接提供用戶態的服務,不是一個API都有與之相對應的系統調用。

?

2.中斷處理,用戶態及內核態

通過cs:eip的值判斷代碼段是在用戶態還是內核態

中斷處理是一種由用戶態進入內核態的方式(系統調用也可以理解為是一種中斷)

中斷發生后,首先要保存現場,將數值壓棧,保存到相應的寄存器中,然后響應中斷,將數值彈棧,恢復現場。

?

?

二、使用庫函數API和C代碼中嵌入匯編代碼兩種方式使用同一個系統調用

  • 實驗報告

  • 選擇一個系統調用(13號系統調用time除外),系統調用列表參見http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl 參考視頻中的方式使用庫函數API和C代碼中嵌入匯編代碼兩種方式使用同一個系統調用

  • 博客內容的具體要求如下:

    1. 題目自擬,內容圍繞系統調用的工作機制進行,博客中需要使用實驗截圖

    2. 博客內容中需要仔細分析匯編代碼調用系統調用的工作過程,特別是參數的傳遞的方式等。

    3. 總結部分需要闡明自己對“系統調用的工作機制”的理解。

?

  • 本次實驗選擇了2號調用fork調用來做實驗:fork函數執行完畢后,如果創建新進程成功,則出現兩個進程,一個是子進程,一個是父進程。在子進程中,fork函數返回0,在父進程中,fork返回新創建子進程的進程ID

用實驗樓的虛擬機打開shell

Cd Code
Vi forktest.c
Gcc forktest.c -o forktest.o -m32
./forktest.o

fork.c代碼如下

復制代碼
#include <unistd.h>
#include <stdio.h>
int main ()
{pid_t fpid;int count = 0;fpid = fork();if (fpid < 0)printf("error in fork!");else if (fpid == 0) {printf("i am the child process, my process id is %d\n",getpid());count++;}else {printf("i am the parent process, my process id is %d\n",getpid());count++;}printf("count: %d\n",count);return 0;
}
復制代碼

?

 運行結果見截圖 

  • 嵌入式匯編代碼的執行,fork-asm.c源代碼如下(參數的傳遞方式見注釋):

?

復制代碼
#include <unistd.h>
#include <stdio.h>
int main ()
{pid_t fpid;int count = 0;


asm volatile ("mov $0, %%ebx\n\t"       "mov $0x2, %%eax\n\t"    // 將fork的系統調用號0x2賦值給eax"int $0x80\n\t"          // 通過0x80中斷向量,執行系統調用"mov %%eax, %0\n\t"      // 系統返回的pid號默認儲存在eax中: "=m" (fpid)            // 輸出操作數0為內存中的fpid。);
if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d\n",getpid()); count++; } else { printf("i am the parent process, my process id is %d\n",getpid()); count++; } printf("count: %d\n",count); return 0; }
復制代碼

運行結果見截圖

?

轉載于:https://www.cnblogs.com/20132109HKK/p/5295680.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374986.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374986.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374986.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Java中獲得類似于C的性能

總覽 Java有許多可能很慢的領域。 但是&#xff0c;對于每個問題都有解決方案。 許多解決方案/黑客都需要解決Java的保護問題&#xff0c;但是如果您需要低水平的性能&#xff0c;還是可以的。 Java使高級編程變得更簡單容易&#xff0c;但代價是使低級編程變得更加困難。 幸…

STARTUPINFO結構

1.結構原型 typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD w…

Spring聲明式事務示例

事務是具有ACID &#xff08;原子的&#xff0c;一致的&#xff0c;隔離的和持久的&#xff09;屬性的工作單元。 原子意味著所有更改都發生或什么都沒有發生。 如果從一個帳戶借錢并貸記到另一個帳戶&#xff0c;則交易將確保借記和貸項均已完成或均未完成。 一致表示更改使數…

路徑 (Path)–nodejs

本模塊包含一套用于處理和轉換文件路徑的工具集。幾乎所有的方法只做字符串變換&#xff0c; 不會調用文件系統檢查路徑是否有效。 通過 require(path) 來加載此模塊。以下是本模塊所提供的方法&#xff1a; path.normalize(p) 規范化字符串路徑&#xff0c;注意 .. 和 . 部分 …

OllyDBG反匯編快速找到程序入口一點分析

出處&#xff1a;http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先聲明下&#xff1a;這個和脫殼沒關系&#xff0c;不是找殼里面的程序入口哦&#xff0c;只是程序本身的入口&#xff0c;個別朋友不要誤會哈。其實這個應該是基礎&#xff0c;但我經常找…

簡單的Twitter:Heroku上的Play框架,AJAX,CRUD

因此&#xff0c;重大的公告發布了– Heroku開始為Play Framework應用程序提供本機支持&#xff01; 如果您還沒有聽說過&#xff0c;請在Heroku的博客上查看Jesper Joergensen的帖子 。 因此&#xff0c;對于演示&#xff0c;我將建立一個非常基本的Twitter副本&#xff1b; 它…

Cron表達式

CronTrigger CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日歷的概念&#xff0c;而非SimpleTrigger完全指定的時間間隔&#xff0c;復發的發射工作的時間表。CronTrigger&#xff0c;你可以指定觸發的時間表如“每星期五中午”&#xff0c;或“每個工作日…

深入理解JavaScript學習筆記(3)_全面解析Module模式

簡介 Module模式是JavaScript編程中一個非常通用的模式&#xff0c;一般情況下&#xff0c;大家都知道基本用法&#xff0c;本文嘗試著給大家更多該模式的高級使用方式。 首先我們來看看Module模式的基本特征&#xff1a; 模塊化&#xff0c;可重用封裝了變量和function&#x…

匯編----乘指令: MUL、IMUL

MUL: 無符號乘 ;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX IMUL: 有符號乘 ;影響 OF、CF 標志位;…

Google App Engine Java功能和命名空間API

功能API 使用Capabilities API&#xff0c;您的應用程序可以檢測特定API功能的停機和計劃停機時間。 您可以使用此API來檢測應用程序何時不可用&#xff0c;然后繞過它來減少應用程序的停機時間。 我們該如何處理&#xff0c;這是個折衷方案&#xff1f; 1.優雅&#xff1a;創…

破解key file時經常用到的幾個API函數及其用法

CreateFile函數 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP計劃任務之關閉瀏覽器后仍然繼續執行的函數

函數名稱&#xff1a;ignore_user_abort 本函數配置或取得使用端連接中斷后&#xff0c;PHP 程序是否仍繼續執行。默認值為中斷連接后就停止執行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 選項就是配置處。本功能在 PHP 3.0.7 版之后才開始提供。 官方說明…

node--更新數據庫問題

昨天測試blog的comment功能&#xff0c;在新增comment相關的代碼之后&#xff0c;重啟應用&#xff0c;出現Cannot call method forEach of undefined 。反復核對代碼&#xff0c;都沒發現異常&#xff0c;最后將數據庫文件刪除之后&#xff0c;再重啟數據庫&#xff0c;一切正…

U盤做完啟動盤,如何恢復原始容量

&#xff08;1&#xff09;右擊“我的電腦”&#xff0c;選擇“管理”選項&#xff0c;之后選擇“磁盤管理”&#xff0c;查看自己U盤的索引&#xff0c;如&#xff1a;Disk 1&#xff08;2&#xff09;在運行窗口&#xff0c;輸入cmd&#xff0c;回車&#xff0c;出現Dos運行環…

GWT Spring和Hibernate進入數據網格世界

利用Infinispan數據網格的功能最大化Hibernate性能。 一個GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我們將討論如何將Infinispan用作Hibernate二級緩存提供程序。 Infinispan是JBoss緩存的…

記對一個key file crackme的破解

crackme下載地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 遞歸 及 分組匯總 高級部分(多維數據集)

UNION 等集合操作符&#xff1a;UNION 等以第一個 SELECT 的 列明 作為 整個結果集的列明&#xff0c;整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY 這個意思是說 只有 ORDER BY 是對整個結果集作用的&#xff0c;其它都操作都作用在 UINON 兩側的 子集合中。EXCEPT 操…

Java Code Geeks Andygene Web原型

大家好&#xff0c; 我們很高興地宣布&#xff0c;一組Maven原型的第一個版本已經發布&#xff01;&#xff01;&#xff01; 該集合的目的是提供可以滿足各種開發需求的項目模板。 您可以在本文末尾找到JCG路線圖。 該第一個發行版旨在提供項目模板-Web應用程序的體系結構。 …

關于如何用od反匯編win32 控制臺程序

*********************************************************** 如何用od反匯編win32 控制臺程序(類似dos程序&#xff09;呢&#xff1f;*********************************************************** 注&#xff1a;od是用來調試win32程序的 1.反編譯win32 控制臺程序&…