1. 程式人生 > >作業系統實驗之系統呼叫

作業系統實驗之系統呼叫

1。今天整理了一下實驗報告

 在unistd.h中可以看到現在Linux 0.11 支援3個引數的傳遞。新增引數的方法大概有3條
           1.可以採用ESI,EDI,EBP,ESP這幾個暫存器傳遞引數。
           2.可以採用《Linux 0.11註釋》中提到的系統呼叫門的辦法。
           3.可以開闢一塊使用者態的空間,允許核心態訪問,傳遞引數時,只需傳遞此空間的首地址指標即可。

2。具體實現思路如下:

1)在include/unistd.h中新增系統呼叫的功能號
這裡寫圖片描述
2)並且相應的在include/linux/sys.h中宣告新的系統呼叫處理函式以及新增系統呼叫處理程式指標陣列表中該項的索引值
這裡寫圖片描述


3)修改system_call.s中系統呼叫總數。
這裡寫圖片描述
4)在核心中編寫系統呼叫處理函式,放在kernel下面(who.c)。

#define  __LIBRARY__
#include <unistd.h>
#include <errno.h>
#include <asm/segment.h>

//實現將使用者空間的字串拷貝到核心空間中
//建立變數儲存
char tmp[64]={0}  
int sys_iam(const char * name)
{
   int i = 0;
   //字串長度不能超過32,放回拷貝的字串的個數,
//如果超過32,返回-1,同時將errno置為EINVAL while(get_fs_byte(name+i) != '\0') { i++; } if(i > 23) { return -EINVAL; } i = 0; //包括字串結束符 while((tmp[i] = get_fs_byte(name+i))!= '\0') { i++; } return i; //返回實際拷貝的字串個數 } //獲取sys_iam在核心中儲存的字串 //長度不能超過32 int
sys_whoami(char * name,unsigned int size) { int i =0; while(tmp[i++] != '\0'); if(size < i) { //name的空間小於字串的長度,返回-1 return -1; } i = 0; //拷貝到使用者空間 while(tmp[i] != '\0') { put_fs_byte(temp[i],(name + i)); i++; } return i; }

4)在make file中新增新系統呼叫所在檔案的編譯、連結規則(依賴關係)。
這裡寫圖片描述
這裡寫圖片描述
5)在應用程式中提供介面,呼叫系統呼叫。
① ami:

#define __LIBRARY__
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
_syscall1(int,iam,const char*,name)

int main(int argc,char* argv[])
{

    if(argc>1){
    if(iam(argv[1])<0){
        printf("SystemCall Exception!\n");
        return -1;
    }
    }
    else{
    printf("Input Exception!\n");
    return -1;
    }       
    return 0;
}

② whoami:

#define __LIBRARY__  //一定要加,不然的話_syscall2不能識別
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
//系統呼叫
_syscall2(int,whoami,char*,name,unsigned int,size)

int main()
{
    int counter;
    char buff[128]={0};

    counter=whoami(buff,128);
    if(counter < 0)
    {
       printf("SystemCall Exception!");
       return -1;
        }
    else{
        printf("%s\n",buff);
        }
    return 0;
}

2。實現結果
這裡寫圖片描述

3。實驗過程中出現的問題總結:

1)關於linux0.11和ubuntu之間檔案共享的問題
按照實驗手冊上面所示,不能顯示,我的解決:
先掛載,加需要新增的檔案或者新建檔案到 /hdc/usr/root/目錄下面就行了,修改完成之後,解除安裝,執行linux0.11,在linux0.11中/home/root/目錄下面ls就能顯示出來
2)提示_NR_ami 沒有找到問題
我們在前面所示,我們需要虛擬機器中的unistd.h才行,具體的路徑是:
/hdc/usr/include/unistd.h 就可以了