2014-11-21 40 views
5

XV6'da basit bir öncelik tabanlı zamanlayıcı oluşturmaya çalışıyorum. Bunu yapmak için, bir sürecin önceliğini belirlemesine izin verecek bir sistem çağrısı oluşturmak zorundayım. Burada ve başka yerlerde tartışıldığı gibi sistem çağrısını oluşturmak için gereken her şeyi yaptık:XV6'da bir sistem çağrısı işlevine nasıl değer aktarılır?

how do i add a system call/utility in xv6

Sorun işlevi çağırmak, daha doğrusu ne zaman herhangi bir değişken geçemez olduğunu, bu şey gibi çalışır yanlıştır ama Doğru değerler fonksiyonun içinde görünmez.

Harici beyan (syscall.c):

... 
extern int sys_setpty(void); 

static int (*syscalls[])(void) = { 
... 
[SYS_setpty] sys_setpty, 
}; 

Sys-call Vektör (syscall.h):

#define SYS_setpty 22 

Uygulama (sysproc.c):

void 
sys_setpty(int pid, int pty) 
{ 
    cprintf("function pid: %d \n", pid); 
    cprintf("function pty: %d \n", pty); 
} 

(def.h & user.h):

void setpty(int, int); 

Makro (usys.S):

SYSCALL(setpty) 

Fonksiyon çağrı:

setpty(3, 50); 

Çıktı: 16843009. Ben: değerleri her zaman aynı tam sayısı vardır

function pid: 16843009 
function pty: 16843009 

pprint ve pty değerlerini atayarak cprintf'in düzgün çalışıp çalışmadığını kontrol etti. Düşünebildiğim her şeyin olası kombinasyonunu denemek için yaklaşık 6 saatimi harcadım ve XV6'da sistem çağrısı yoluyla değerleri iletmek için yerleşik bir mekanizmanın olmadığını düşünmeye başladım. Bir şey mi eksik? Şimdiden teşekkür ederim. Kullanıcı düzeyinde işlevlerden çekirdek düzeyi işlevlerine geçiş argümanları XV6'da yapılamaz.

cevap

8
XV6, argümanları bir çekirdek işlevine geçirmek için kendi yerleşik işlevlerine sahiptir. Örneğin, bir tamsayıya geçmek için argint() işlevi çağrılır. ...

argint(0, &pid); 

İşlem Kimliği ilk argüman almak için, ve: Ben set öncelikli fonksiyonu için kullanılan uygulamada, böyle bir şey olmazdı

argint(1, &pty); 

. .. istenen öncelik olan ikinci argümanı almak. Kullanıcı işleminden gelen işlev çağrısı şu şekilde görünür:

setpty(getpid(), priority); 
+0

Aynı noktada sıkışıp kaldınız mı? – WannaBeCoder

+0

Bununla oynadığımdan birkaç ay geçti, deneyeceğim ama neye ihtiyacın olduğu konusunda emin değilim. – bertmoog

+0

Kendi cevabınız +1 sayesinde, kullanıcı uzayından çekirdek alanına parametrelerin nasıl aktarılacağını anladım. Ancak öncelik tabanlı zamanlama yapamadım. :( – WannaBeCoder