Строки 480-482
Как описано в гл. 2, CONFIG_* #def ine связан с переменной времени компиляции. Если во время компиляции выбрана файловая система ргос, то следующим шагом инициализации будет вызов proc_root_init ():
fs/proc/root.c
40 void init proc_root_init(void)
41 {
42 int err = proc_init_inodecache() ;
43 if (err)
44 return;
45 err = register_filesystem(&proc_fs_type);
46 if (err)
47 return;
48 proc_mnt = kern_mount(&proc_fs_type);
49 err = PTR_ERR(proc_mnt);
50 if (IS_ERR(proc_mnt)) {
51 unregister_filesystem(&proc_fs_type);
52 return;
53 }
54 proc_misc_init();
55 proc_net = proc_mkdir("net", 0);
56 #ifdef CONFIG_SYSVIPC
57 proc_mkdir("sysvipc", 0);
58 #endif
59 #ifdef CONFIG_SYSCTL
60 proc_sys_root = proc_rakdir("sys", 0);
61 #endif
62 #if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
63 proc_mkdir("sys/fs", 0) ;
64 proc_mkdir("sys/fs/binfmt_misc", 0);
65 #endif
66 proc_root_fs = proc_mkdir{"fs", 0);
67 proc_root_driver = proc_mkdir("driver", 0);
68 proc_mkdir("fs/nfsd", 0); /* somewhere for the nfsd filesystem
to be mounted */
69 #if defined(CONFIG_SUN_OPENPROMFS) j|
defined(CONFIG_SUN_OPENPROMFS_MODULE)
70 /* просто получаем точку монтирования */
71 proc_mkdir("openprom", 0);
72 iendif
73 proc_tty_init() ;
74 #ifdef CONFIG_PROC_DEVICETREE
75 proc_device_tree_init();
76 #endif
77 proc_bus = proc_mkdir("bus", 0);
78 }
Строка 42
Эта строка инициализирует inodeKema, хранящий inode для данной файловой системы.
Строка 45
Структура f ile_system_type proc_f s_type регистрируется в ядре. Давайте подробнее рассмотрим эту структуру.
fs/proc/root.с
33 static struct file_system_type proc_fs_type = {
34 .name = "proc",
35 .get_sb = proc_get_sb,
3 6 .kill_sb = kill_anon_super,
37 };
Структура f ile_system_type, определяющая имя файловой системы как proc, имеет функцию для получения и освобождения структуры суперблока.
Строка 48
Мы монтируем файловую систему proc. (См. подробности в сноске для kern_mount, чтобы понять, что там происходит.)
Строки 54-78
Далее вызов proc_misc_init () создает большинство элементов, которые можно увидеть в файловой системе /ргос. Она создает элементы с помощью вызова create_proc_read_entry(), create_proc_entry() и create_proc_ seq_entry (). Оставшийся код блока содержит вызовы к proc_mkdir для создания директорий в /ргос, вызов функции proc_tty_init () для создания дерева внутри /proc/tty, и если установлена переменная настройки CONFIG_ PROC_DEVICETREE, то вызывается функция proc_device_tree_init () для создания поддерева /proc/device-tree.