F6F

 

FreeBSD mount_nfs memo

之前記過 FreeBSD nfsd 的服務流程,這邊記得是 FreeBSD mount_nfs 的流程:

  • mount_nfs 自己會先以 RPC 的 NFS_NULL_PROC 探看 server 的 nfsd
  • mount_nfs 接著以 RPC 的 RPC_MOUNT 對 server 的 mountd 取得 exported root handle。
  • mount_nfs 將取得的資訊以 iovec 的結構存起來。
  • mount_nfs 最後將這個 iovec 的參數丟進 nmount() system call 進入 kernel mode。
  • nmount() 訂義在 /usr/src/sys/kern/vfs_mount.c
  • nmount() 透過 vfs_domount() 呼叫到真正的 VFS_MOUNT()
  • 這時候就會由訂義在 /usr/src/sys/fs/nfsclient/nfs_clvfsops.cnfs_mount() 做真正的後續。
  • 在 kernel 的 vnode operations 裡,每當 mount 動作執行後,就會跟著執行 statfs。
  • 在 nfs 下,nfs_mount() 做完,就會跟著 nfs_statfs()
  • nfs_statfs() 裡面,會依序呼叫 FSINFOFSSTAT 這兩個 RPC procedure。

所以,這就是為什麼每當 client 做了 mount_nfs 以後,server 那邊收到的記錄是:NULL、FSINFO、FSSTAT。

C memo

讀這篇,請先理解如何唸它

int a[5];

typedef int array[5]; // array: a "type" of array of int
array a;

是同樣效果。現在要宣告一個 function pointer array (void *func())的話:

 /* func_pointer_t: a "type" of pointer to function returning pointer to void. */
typedef void *(*func_pointer_t)();
func_pointer_t func_array[] = { (func_pointer_t) open, (func_pointer_t) close };  

再混淆一點,多宣告一個 func_array_t 型別

 /* func_pointer_t: a "type" of pointer to function returning pointer to void. */  
typedef void *(*func_pointer_t)();  
/* func_array_t: a "type" of array of pointer to function returning pointer to void */
typedef void *(*func_array_t[])();
func_array_t func_array = { (func_pointer_t) open, (func_pointer_t) close };

或是就很酷的寫

void *(*func_array[])() = { ( (void *(*)()) open, ((void *(*)()) close };

這時候 func_array 就是 an array of pointer to function return pointer to void.
每個元素都是 a pointer to function returning pointer to void.

以上都能達到同樣效果。

當其中加入了 struct 或是 multidimensional array 的時候,情況會更複雜,但是只要知道優先順序(兩種括號優先、再來是星星)、唸法,還是可以輕鬆吃下。

看起來平時用不到,不過透過強制轉型,可以實現型別多型,請參考 rpcgen 產生出的 server code。而這裡講的只是讓作法更簡潔,不用透過一堆的 if 判斷。下次再講。

Usually, a struct-declarator is just a declarator for a member of a structure or union. A structure member may also consist of a specified number of bits. Such a member is also called a bit-field; its length is set off from the declarator for the field name by a colon.

struct-declarator:
    declarator       declarator : constant-expression 


struct {
    int a : 1;
}

The C Programming Language