1. 程式人生 > >64位Linux系統呼叫的新增以及系統呼叫的原理

64位Linux系統呼叫的新增以及系統呼叫的原理

使用者地址空間和核心地址空間

每個程序都會有一個固定大小的虛擬地址空間,大小較固定,視作業系統位數而定(位數同時也決定實體地址的大小)。例如32位作業系統,其實體地址也就是32位,表示的空間也就是2的32次方,即4GB。
大家都知道系統核心事關作業系統的穩定與否,我們普通程式不應該直接訪問或操作的。但每個程式又會因系統呼叫或中斷而陷入核心執行核心的操作。為了安全,我們就把虛擬地址空間劃分出一塊獨立的部分,稱為核心態虛擬地址空間。這段核心空間大小固定,32位的為1GB,一般在虛擬地址空間的高位。另外它對應的實體地址空間範圍也是固定的。

64位Linux系統呼叫的新增

前言:系統呼叫屬於核心態的程式開發,因此要慎重。另外不像模組載入,系統呼叫的新增必須重新編譯核心,因此很耗時(30——60min不等)。另外系統呼叫一般真的沒必要再添加了,系統中有的系統呼叫就夠用了,我們自己加一般都是冗餘的畫蛇添足的。

第一步:確定新的系統呼叫的名字例如sayDafanzi,並準備好一個linux核心原始碼,自行下載並解壓到相應目錄即可
我確定的系統呼叫名字叫sayDafanzi.然後我下的linux-2.6.32.27的核心原始碼,並解壓在/usr/src/kernels/linux-2.6.32.27
資料夾中。下面步驟中,預設的根目錄就以這個目錄為值。
第二步:新增系統呼叫號,並將系統呼叫號和核心函式對上。
64位不同於32位。64位在核心原始碼中的arch/x86/include/asm/unisted_64.h這個標頭檔案中新增適當處新增如下程式碼:

#define __NR_sayDafanzi                         299  //299是相對於之前的最後一個值加了1
__SYSCALL(__NR_sayDafanzi,sys_sayDafanzi)

第二步:實現系統呼叫

我把系統呼叫使用的核心函式放在kernel/sys.c下,這個核心還可以放在其他位置。程式碼如下:

SYSCALL_DEFINE0(sayDafanzi)  /*這是後序版本新增的一個巨集,可替換為諸如asmlinkage int      sys_sayDafanzi(void){}的形式*/
{
     printk("dafanzi23333333333333");
     return 0;
}

第四步:重新編譯核心
回到第一步所假設的根目錄make mrproper,make olfconfig(一直回車),make,make modules,make modules_install,make install
此步驟很耗費時間

第五步:測試測試

#include <stdio.h>
int main()
{
        syscall(299);  /*在2.6.19之前使用的注入__syscallx7個巨集,不過在此之後,這幾個巨集被廢除了,因為傳遞引數有些麻煩*/
        return 0;
}