2014-04-21 16 views
5

tôi đang chơi một chút với xv6, một thực hiện hiện đại của Unix phiên bản 6.Tại sao iget() ẩn trong xv6

Đối với thuê đầu tiên của tôi, tôi muốn thực hiện getcwd syscall đơn giản, nhưng tôi một chút bị mất theo mức độ trừu tượng mà tôi nên sử dụng.

  • Tôi có nên sử dụng giao diện struct file không?
  • Hoặc có thể giao diện struct inode?
  • Đối với những gì quan trọng, có vẻ như nó thậm chí có thể được triển khai hoàn toàn trong vùng đất người dùng.

Tôi đã bắt đầu triển khai nó với các thao tác struct inode. Ý tưởng ngây thơ của tôi là lấy proc->cwd, sau đó readi() mục nhập thứ hai của nó (..), quét nó để truy xuất inum trước đó của tôi, và cứ thế cho đến khi tôi nhấn gốc.

Có vẻ như không thực sự lắm, nhưng điều đó sẽ phù hợp với lần hack đầu tiên.

Vấn đề của tôi là tôi cần fs.c:iget() để truy xuất số struct inode từ số inum tôi nhận được trong số dirent s. Tôi đã nhận thấy rằng iget() là tĩnh trong fs.c và không được khai báo trong defs.h làm tôi khó chịu một chút, nhưng tôi không thể tìm thấy lý do tại sao.

Vì vậy, đây là câu hỏi của tôi. Tại sao nó iget() được cố ý ẩn khỏi phần còn lại của hạt nhân?

+1

Tôi nghĩ bạn thực sự nên thử http://unix.stackexchange.com/ cho câu hỏi này. –

+0

Cảm ơn lời khuyên. Tôi vừa tạo một bài đăng ở đó, nhưng tôi đoán nó ít được truy cập nhiều hơn so với luồng stackover chính. – NewbiZ

+1

Đúng, nhưng tôi nghi ngờ hầu hết người dùng ở đây đang làm việc với Unix. Liên kết tới bài đăng khác của bạn: http://unix.stackexchange.com/questions/126261/why-is-iget-hidden-in-xv6 –

Trả lời

1

Dường như với tôi họ chỉ là thực dụng.

iget chỉ được sử dụng bởi các thói quen thao tác thư mục. Các thói quen thao tác thư mục nằm trong fs.c.

Đối với việc triển khai getcwd. Sẽ tốt hơn nếu bạn làm theo mã chdir syscall. Đường dẫn ở đó. Bạn chỉ cần lưu trữ nó, có thể trong một trường mới trong cấu trúc proc. Tất nhiên, nếu đường dẫn đã cho là tương đối, bạn nên nối nó vào đường dẫn được lưu trữ hiện tại.

+0

Được rồi, tôi sẽ lấy nó. Và cảm ơn cho các con trỏ đến 'getcwd' :) – NewbiZ

-1

trong câu trả lời quan điểm của tôi cho câu hỏi của bạn là:

  1. nó là không an toàn và không chung chung. (nếu bạn có thể truy cập trực tiếp tập tin thông qua inode, mà không đi qua dirent, làm thế nào bảo mật sẽ được mantained? Bạn cần sự cho phép cho một tập tin cũng như thực hiện cho thư mục mẹ)
  2. nó là không thuyết phục để truy cập tập tin bằng inode (tập tin với inode tương tự có thể nằm trong một số thư mục và số inode là duy nhất chỉ cho FS nhất định)

nhưng có lẽ tôi đã hiểu lầm Bạn? Về cách để có được cwd, tôi khá chắc chắn Bạn muốn con trỏ đến giải pháp vì vậy có thể điều này sẽ giúp:

  1. những gì đang được lưu giữ trong u.u_dent.u_name? (Xem xét kỹ hơn tại user.h)

Bạn có thể muốn có một cái nhìn tại các quá:

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

Why can't files be manipulated by inode?

how to get directory name by inode value in c?

Các vấn đề liên quan