2014-04-21 51 views
5

gram trochę z xv6, nowoczesna realizacja Unix wersji 6.Dlaczego IGET() ukryte w xv6

dla mojego pierwszego włamania, chciałem zaimplementować prosty getcwd syscall, ale jestem trochę zagubiony, jakiego poziomu abstrakcji powinienem użyć.

  • Czy powinienem używać interfejsu struct file?
  • A może interfejs struct inode?
  • Co ważne, wygląda na to, że można go wdrożyć wyłącznie w przestrzeni użytkownika.

Zacząłem wdrażać go z manipulacjami struct inode. Mój naiwny pomysł polegał na tym, aby pobrać jego drugi wpis (..), przeskanować go, aby odzyskać moją poprzednią , i tak dalej, dopóki nie trafię do katalogu głównego.

Nie wydaje się bardzo wydajna, ale będzie pasować do pierwszego hacka.

Mój problem polega jednak na tym, że potrzebuję fs.c:iget(), aby pobrać z inum s. Dostaję je w dirent s. Zauważyłem, że iget() jest statyczne w fs.c i nie jest zadeklarowane w defs.h co mnie denerwuje, ale nie mogę znaleźć przyczyny.

To jest moje pytanie. Dlaczego to iget() zostało celowo ukryte przed resztą jądra?

+1

Myślę, że powinieneś naprawdę spróbować http://unix.stackexchange.com/ na to pytanie. –

+0

Dzięki za cynk. Właśnie utworzyłem tam post, ale myślę, że jest znacznie mniej odwiedzany niż główny stackoverflow. – NewbiZ

+1

To prawda, ale wątpię, że większość użytkowników pracuje z Uniksem. Link do twojego drugiego postu: http://unix.stackexchange.com/questions/126261/why-is-iget-hidden-in-xv6 –

Odpowiedz

1

Wydaje mi się, że były po prostu pragmatyczne.

iget jest używany tylko przez procedury manipulacji katalogami. Procedury manipulacji katalogiem znajdują się w fs.c.

Co do implementacji getcwd. Byłoby znacznie lepiej, gdybyś podążał za kodem syscall. Ścieżka tam jest. Po prostu trzeba go zapisać, prawdopodobnie w nowym polu w strukturze proc. Oczywiście, jeśli podana ścieżka jest względna, należy dołączyć ją do bieżącej zapisanej ścieżki.

+0

Dobra, wezmę to. I dzięki za wskazówki do 'getcwd' :) – NewbiZ

-1

moim zdaniem odpowiedź na twoje pytanie brzmi:

  1. był niepewny i nie rodzajowy. (jeśli mógłbyś uzyskać dostęp bezpośrednio do pliku poprzez i-węzeł, bez przechodzenia przez dirent, w jaki sposób byłby zabezpieczony? Potrzebujesz pozwolenia na plik, jak również wykonać dla katalogu nadrzędnego)
  2. to było niejednoznaczne, aby uzyskać dostęp do pliku przez i-węzeł (plik z takim samym i-węzłem może być w kilku katalogach, a numer i-węzła jest unikalny tylko dla danego FS)

, ale być może źle cię zrozumiałem? Jeśli chodzi o uzyskanie cwd, jestem prawie pewien, że wolisz wskaźnik do rozwiązania, więc może to pomoże:

  1. co jest przechowywane w u.u_dent.u_name? (Bliżej przyjrzeć user.h)

Czasami warto spojrzeć na te też:

http://lwn.net/Articles/254486/

Why can't files be manipulated by inode?

how to get directory name by inode value in c?