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 過程宣告和呼叫中的關鍵字 運算子 算術運算子 關係...