<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 系統調用 * **內核提供的接口稱為`系統調用(指運行在用戶空間的程序訪問操作系統內核所提供服務的接口(內核服務意味著更高的權限)`,是代碼方式,即表示用戶(非編程人員)不能直接與內核進行交互。** * **系統調用是基于CPU指令集的,進行`封裝、擴展(比如擴展中斷向量,實現一系列的系統調用)`。類似于語言庫中的API對系統調用的封裝。** * 調用系統調用的兩種方式:以Linux為例(其他系統也是類似),在 Linux 平臺下有兩種方式來使用系統調用: * `利用封裝后的 C 庫(libc)`。Linux、Windows、iOS等許多系統內核大部分都是C語言編寫的,其中也有少部分的C++、C#等語言,所以大部分的系統調用通常是C、C++語言格式的 * `通過匯編直接調用`。通過匯編語言來直接調用系統調用,是最高效地使用 Linux 內核服務的方法,因為最終生成的程序不需要與任何庫進行鏈接,而是直接和內核通信。 * 第一種方式是對第二種方式的封裝。如DOS、Linux 的系統調用都是通過中斷匯編指令(int 0x80)來實現的。(見下面—系統調用的實現) ## 系統調用的實現 系統調用接口在實現中往往以`軟件中斷(Software interrupt),簡稱INT(軟中斷)`的方式提供,比如 Linux 使用 `INT 0x80`(INT是匯編指令,0x80為參數,表示80號中斷)作為系統調用接口,Windows使用 0x2E 號中斷作為系統調用接口(從Windows XP Sp2開始,Windows開始采用一種新的系統調用方式) 以Linux為例,在進行系統調用的時候: * 發起int 0x80中斷,并傳入`系統調用號` * 系統調用號:有一個`sys_call_table`是一個全局函數數組,存儲所有系統調用的地址(可以查看`include/linux/sys.h`文件),系統調用號是系統調用在該數組中的下標。 * 調用`set_system_gate`函數處理中斷,首先從當前的用戶態切換到內核態,然后找到中斷向量表,根據中斷編號(0x80),找到對應的中斷處理程序 * 找到中斷處理程序`system_call`(在`linux/kernel/system_call.s`中,是匯編程序),根據系統調用號在`sys_call_table`表中找到相應系統調用對應的函數入口。 * 調用`call匯編指令`,輸入函數地址 ## 關于中斷向量的一些補充 計算機啟動時,引導扇區、系統內核會陸續的將一些中斷填入中斷向量表,并將中斷向量指向自己編寫的中斷服務程序。 如操作系統啟動過程的最后,由`head.s`進入`main.c`中,會進行一系列的初始化:內存、設備、時鐘、中斷等。其中: * `trap_init()`函數,會初始化一些中斷向量 * `sched_init()`函數中會調用`set_system_gate(0x80,&system_call)`,設置中斷向量號0x80的中斷描述符 系統也會為用戶保留一些中斷向量,用戶可以將自己的中斷服務程序寫入這些中斷向量中。不僅如此,用戶還可以自己更改和完善系統已有的中斷向量。`相當于給INT指令增加參數(中斷向量號)選項,且指定對應的調用程序` **引導扇區(實模式) → bootloader(實模式 → 保護模式,R0) → 操作系統(保護模式,R0) → 操作系統先加載的是內核,內核處于R0,shell已經是在用戶態了** ## linux的系統調用的步驟 在匯編程序中使用Linux系統調用。 需要采取以下步驟在程序中使用Linux系統調用 * 將系統調用號放在EAX寄存器中。 * 將參數存儲在寄存器EBX,ECX等中的系統調用中。 * 調用相關的中斷(80h)。 * 結果通常在EAX寄存器中返回。 有六個寄存器存儲所使用的系統調用的參數。 這些是EBX,ECX,EDX,ESI,EDI和EBP。 這些寄存器采用連續參數,從EBX寄存器開始。 如果有超過六個參數,則第一個參數的存儲單元存儲在EBX寄存器中。 以下代碼片段顯示了系統調用sys_exit的用法 ``` mov eax,1 ; system call number (sys_exit) int 0x80 ; call kernel ``` 以下代碼片段顯示了使用系統調用sys_write ``` mov edx,4 ; message length mov ecx,msg ; message to write mov ebx,1 ; file descriptor (stdout) mov eax,4 ; system call number (sys_write) int 0x80 ; call kernel ``` 所有系統調用都列在`/usr/include/asm/unistd.h` ,以及它們的編號(在調用int 80h之前放入EAX的值)。 下表顯示了本教程中使用的一些系統調用 | EAX% | 名稱 | EBX% | %ECX | %EDX | ESX% | EDI% | | --- | --- | --- | --- | --- | --- | --- | | 1 | sys\_exit | int | \- | \- | \- | \- | | 2 | sys\_fork | struct pt\_regs | \- | \- | \- | \- | | 3 | sys\_read | unsigned int | char \* | size\_t | \- | \- | | 4 | sys\_write | unsigned int | const char \* | size\_t | \- | \- | | 5 | sys\_open | const char \* | int | int | \- | \- | | 6 | sys\_close | unsigned int | \- | \- | \- | | 以上是Intel規范的匯編代碼 ps:https://www.jianshu.com/p/2b21cffda10d
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看