哈工大OS實驗三 系統呼叫

2021-10-20 04:52:00 字數 2338 閱讀 1203

1)iam()

第乙個系統呼叫是 iam(),其原型為:

int iam(const char * name);

完成的功能是將字串引數 name 的內容拷貝到核心中儲存下來。要求 name 的長度不能超過 23 個字元。返回值是拷貝的字元數。如果 name 的字元個數超過了 23,則返回 「-1」,並置 errno 為 einval。

2)whoami()

第二個系統呼叫是 whoami(),其原型為:

int whoami(char* name, unsigned int size);

[copy]

它將核心中由 iam() 儲存的名字拷貝到 name 指向的使用者位址空間中,同時確保不會對 name 越界訪存(name 的大小由 size 說明)。返回值是拷貝的字元數。如果 size 小於需要的空間,則返回「-1」,並置 errno 為 einval。

也是在 kernal/who.c 中實現。

在 kernal/who.c 中實現此系統呼叫。

實現:

_syscall0

(int

,whoami)

//這樣乙個巨集定義展開就得到了

intwhoami

(void

)

在linux中編寫c檔案,其中的#define _library和#include在後面發現可以去掉乙個,具體可見/usr/include/unistd.**件。

成功執行。

3)測試程式

執行新增過新系統呼叫的 linux 0.11,在其環境下編寫兩個測試程式 iam.c 和 whoami.c。最終的執行結果是:

$ ./iam lizhijun

$ ./whoami

lizhijun

這裡主要是實現了使用者和核心的資料傳輸。

題目規定:

int

iam(

const

char

* name)

;int

whoami

(char

* name,

unsigned

int size)

;//這兩個函式的引數中都包括乙個指標,但是這個指標是以當前程式為基位址的,

//當我們加入核心中,這個位址得到的資料自然不一樣。

所以我們需要借用兩個函式:get_fs_byte和set_fs_byte

那麼fs暫存器是什麼呢?我們可以在system_call中看到。

重寫who.c的**

#define __library__

#include

#include

#include

char name[24]

;int

sys_iam

(const

char

* add)

//計算長度

if(len>23)

//判斷長度

int i=0;

while

(get_fs_byte

(add+i)

!='\0'

)//將使用者空間的資料存放到核心空間中

name[i]

='\0'

;//新增結束符

return i;

}int

sys_whoami

(char

*jieshufu ned int size)

if(i>size)

i=0;

while

(name[i]

!='\0'

)put_fs_byte

('\0'

,add+i)

;return i;

}

按照要求編寫**:

執行評分程式,程式的主要功能就是通過執行iam將資料儲存到核心資料區,再通過whoami來取出。

哈工大作業系統實驗4 程序同步

1 在ubuntu下,用系統提供的sem open sem close sem wait 和sem post 等訊號量相關的系統呼叫編寫pc.c程式。2 在ubuntu上編譯並執行pc.c,檢查執行結果。用printf 向終端輸出資訊是很自然的事情,但當多個程序同時輸出時,終端也成為了乙個臨界資源,...

哈工大作業系統實驗一 作業系統的引導

哈工大作業系統實驗手冊 實驗資源與參考 不配環境懶人福利 實驗樓 參考閱讀 linux核心完全注釋 趙炯,作業系統原理 實現與實踐 李治軍,劉巨集偉 bootsect.s能完成setup.s的載入,並跳轉到setup.s開始位址執行。而setup.s向螢幕輸出一行 now we are in set...

哈工大編譯原理實驗1 詞法分析

設計實現類高階語言的詞法分析器,基本功能如下 1 能識別以下幾類單詞 識別符號 由大小寫字母 數字以及下劃線組成,但必須以字母或者下劃線開頭 關鍵字 型別關鍵字 整型 浮點型 布林型 記錄型 分支結構中的if和else 迴圈結構中的do和while 過程宣告和呼叫中的關鍵字 運算子 算術運算子 關係...