Dentry linux что это
Как уже рассказывалось, подсистема VFS представляет каталоги так же, как и файлы. В имени пути /bin/vi, и элемент bin, и элемент vi — это файлы, только bin — это специальный файл, который является каталогом, a vi — это обычный файл. Объекты файловых индексов служат для представления обоих этих компонентов. Несмотря на такую полезную унификацию, подсистеме VFS также необходимо выполнять операции, специфичные для каталогов, такие как поиск компонента пути по его имени, проверка того, что указанный элемент пути существует, и переход на следующий компонент пути.
Для решения этой задачи в подсистеме VFS реализована концепция элемента каталога (directory entry или dentry). Объект dentry — это определенный компонент пути. В предыдущем примере компоненты /, bin и vi — это объекты элементов каталога. Первые два — это каталоги, а последний — обычный файл. Важным моментом является то, что все объекты dentry — это компоненты пути, включая и обычные файлы.
Элементы пути также могут включать в себя точки монтирования. В имени пути /mnt/cdrom/foo, компоненты /, mnt, cdrom и foo — это все объекты типа dentry. Подсистема VFS при выполнении операций с каталогами по необходимости конструирует объекты элементов каталога на лету.
Объекты типа dentry представлены с помощью структуры struct dentry и определены в файле <linux/dcache.h>. Эта структура с комментариями, которые определяют назначение каждого поля, имеет следующий вид.
atomic_t d_count; /* счетчик использования */
unsigned long d_vfs_flags; /* флаги кэша объектов dentry */
spinlock_t d_lock; /* блокировка данного объекта dentry */
struct inode *d_inode; /* соответствующий файловый индекс */
struct list_head d_lru; /* список неиспользованных объектов */
struct list_head d_child; /* список объектов у родительского
struct list_head d_subdirs; /* подкаталоги */
struct list_head d_alias; /* список альтернативных (alias)
unsigned long d_time; /* время проверки правильности */
struct dentry_operations *d_op; /* таблица операций с элементом
struct super_block *d_sb; /* связанный суперблок */
unsigned int d_flags; /* флаги элемента каталога */
int d_mounted; /* является ли объект точкой
void *d_fsdata; /* специфические данные
struct rcu_head d_rcu; /* блокировки RCU (read-copy update) */
struct dcookie_struct *d_cookie; /* cookie-идентификатор */
struct dentry *d_parent; /* объект dentry
struct qstr d_name; /* имя dentry */
struct hlist_node d_hash; /* список хеширования */
struct hlist_head *d_bucket; /* сегмент хеш-таблицы */
unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* короткое имя файла */
В отличие от предыдущих двух объектов, объект dentry не соответствует какой бы то ни было структуре данных на жестком диске. Подсистема VSF создает эти объекты на лету на основании строкового представления имени пути. Поскольку объекты элементов каталога не хранятся физически на дисках, то в структуре struct dentry нет никаких флагов, которые указывают на то, изменен ли объект (т.е. должен ли он быть записан назад на диск).
Кэш объектов dentry
Кэш объектов dentry После того как подсистема VFS преодолела все трудности, связанные с переводом всех элементов пути в объекты элементов каталогов, и был достигнут конец пути, то было бы достаточно расточительным выбрасывать на ветер всю проделанную работу. Ядро кэширует
Объект Folder
Объект Folder Объект Folder обеспечивает доступ к свойствам каталога. Создать этот объект можно с помощью свойства RootFolder объекта Drive или методов GetFolder, GetParentFolder и GetSpecialFolder объекта FileSystemObject следующим образом:var FSO, Folder;FSO = WScript.CreateObject("Scripting.FileSystemObject");Folder = FSO.GetFolder("С:Мои
Объект File
Объект File Объект File обеспечивает доступ ко всем свойствам файла. Создать этот объект можно с помощью метода GetFile объекта FileSystemObject следующим образом:var FSO, F;//Создаем объект FileSystemObjectFSO=WScript.CreateObject("Scripting.FileSystemObject");//Создаем объект FileF=FSO.GetFile("С:Мои документахletter.txt");Также
Объект TextStream
Объект TextStream Объект TextStream обеспечивает последовательный (строка за строкой) доступ к текстовому файлу. Методы этого объекта позволяют читать информацию из файла и записывать ее в него.Создать объект TextStream можно с помощью следующих методов:? CreateTextFile объектов FileSystemObject и
Объект Array
Объект Array Новый объект встроенного класса Array можно создать с помощью оператора new следующими способами:? new Array() — создание массива нулевой длины;? new Array(N) — создание массива длины N;? new Array(а0, a1, . aN) — создание массива длины N+1 c элементами а0, a1, . aN.Например:var A1, А2, A3;A1 = new
Объект Date
Объект Date Для создания нового объекта встроенного класса Date используется один из трех конструкторов.Конструктор первого вида позволяет создать объект, в котором хранится информация о текущих дате и времени:var d;d = new Date();Здесь время задается по Гринвичу, т.е. с
Объект Enumerator
Объект Enumerator С помощью объекта Enumerator можно получить доступ к любому элементу коллекции (в VBScript для этого служит цикл For…Each). Коллекцией в языке JScript называется множество элементов, которое отличается от массива тем, что к элементам коллекции нельзя получить прямой доступ
Объект Math
Объект Math Встроенный класс Math применяется для математических вычислений и содержит основные математические константы и функции. Замечание Объект Math создается сервером сценариев автоматически и не может быть создан при помощи оператора new, как другие встроенные
Объект String
Объект String Встроенный объект String предназначен для выполнения различных операций над текстовыми строками. Обычно объекты класса String создаются просто с помощью записи в переменную текстового литерала:var s1, s2;s1 = "Это строка";s2 = "Это тоже строка";Также можно создавать такие
Объект CompositeElementLite
Объект CompositeElementLite Вернемся в начало этой главы и вспомним, как мы получали доступ к нужному нам элементу Web-страницы.Мы можем получить доступ к одному элементу Web-страницы:var elCMain = Ext.get("cmain");Или сразу к нескольким:var clContainers = Ext.select("DIV");Мы помним, что метод select объекта Ext
Объект document
Объект document Прежде всего надо отметить, что объект document существует в единственном экземпляре для всего HTML-документа. Он присутствует всегда, если существует HTML-документ, поэтому специально создавать его не требуется.activeElementИспользуется в сценарии для получения ссылки
Объект location
Объект location Объект location содержит информацию о местонахождении текущего документа, т.е. его интернет-адрес. Его также можно использовать для перехода на другой документ и перезагрузки текущего документа.Свойства объекта locationМетоды объекта locationПользуясь объектом location,
Объект style
Объект style Как и все остальные объекты, style поддерживает ряд свойств и методов. Их можно разделить на две группы:иСвойства первой группы в целом аналогичны соответствующим атрибутам стиля и имеют почти такие же имена за тем исключением, что символы "-" убираются, т.к. не
Объект window
Объект
Объект Все, что находится в трехмерном виртуальном пространстве сцены — это объекты. Термин "объект" обозначает нечто, находящееся в трехмерном мире. Что бы мы ни создали в виртуальном пространстве, это будет объект.Существует множество видов объектов. Принадлежность
Термин файловая система имеет разные значения в разных контекстах:
- Относится к определенному формату файла. Например, файловая система Linux Ext2 , Файловая система MSDOS FAT16 , И файловая система Windows NT NTFS или FAT32
- Относится к носителю, который был «отформатирован» в определенном формате.
- Операционная система значений используется для управления файловой системой и работы с файловым механизмом и его реализацией.
По сути, помимо собственного Ext2 Кроме того, поддерживаются и другие файловые системы. Linux абстрагирует свою собственную файловую систему до интерфейса файловой системы, который позволяет пользователям работать с разными файловыми системами (набор системных вызовов). С точки зрения пользователя, это виртуальная, идентичная и абстрактная файловая система, и пользователь не обращает внимания на фактические детали файловой системы (тип файловой системы, способы выполнения связанных операций). Это называется Виртуальная файловая система VFS . Этот абстрактный интерфейс предоставляет пользователям набор стандартных и абстрактных файловых операций, которые существуют в пользовательской программе в виде системных вызовов, таких как read() 、 write() 、 lseek() и многое другое. Например, в операционной системе Linux вы можете установить в систему диск или раздел в формате DOS (то есть файловую систему), а затем пользовательские программы могут обращаться к этим файлам таким же образом, как если бы они Ext2 Формат файла такой же.
Интерфейс между ядром и различными файловыми системами осуществляется через file_operation Эта структура данных реализована.
Вы можете видеть, что почти вся структура - это указатели на функции. Каждая файловая система отвечает за реализацию своей собственной file_operations Структура данных, например здесь read Он указывает на функцию входа файловой системы, используемую для чтения файлов.
Открыть файл open() Чтобы установить соединение с конкретным файлом или установить контекст чтения и записи. Фактическим носителем этой связи является file структура данных.
От имени процесса task_struct В структуре данных есть два указателя:
fs_struct Представляет информацию о файловой системе, files_struct Информация, представляющая открытый файл
Первые три указателя указывают на dentry Структура, dentry Записывайте записи каталога, чтобы pwd Представляет текущий каталог процесса, root Представляет корневой каталог процесса, который является каталогом, когда пользователь входит в систему, altroot Это замещающий корневой каталог, установленный для пользователя. Эти три каталога не обязательно находятся в одной файловой системе во время реальной работы, например root Обычно устанавливается на / На узле Ext2 Файловая система, и текущий рабочий каталог может быть установлен в /dosc В файловой системе DOS. Последние три указателя указывают на эти установки. vfsmount структура данных.
Информация о файлах, которые открыл процесс, хранится в file Структура и files_struct Основное содержание структуры file Структура массива.
в file В составе:
f_op Указатель указывает на файловую систему, к которой принадлежит файл file_operation Структура, так что по file Может знать, как работать с файлом; f_dentry Укажите на файл dentry Записывается структура данных, то есть информация о каталоге файла, почему бы не здесь dentry Как file Члены файла используют указатель, чтобы указать на dentry Какой? Поскольку в одном файле есть только один dentry Структура, и файл может быть открыт несколькими процессами. Каждый раз, когда файл открывается процессом, он будет task_struct Создать в file Экземпляр структуры.
Короче говоря, Linux предоставляет набор согласованных структур данных через виртуальную файловую систему, включая dentry 、 inode 、 dentry_operations 、 inode_operations Подождите. Содержимое этих структур данных устанавливает соединение с определенным файлом в процессе. open После инициализации результат инициализации связан с типом файловой системы носителя, на котором находится файл. Хотя детали реализации разных файловых систем различаются, например, разные файловые системы могут использовать разные механизмы индексации, но все они имеют определенные структуры данных, которые реализуют аналогичные функции. Следовательно, только для разных файловых систем Linux использует массив указателей функций, чтобы найти функции в соответствующем драйвере устройства файловой системы для выполнения аналогичных задач.
Основная структура данных в виртуальной файловой системе
The Superblock Object
Объект суперблока в ядре состоит из функций alloc_super() Ответственный за создание. Когда файловая система смонтирована, alloc_super() Функция прочитает файловую систему с диска через драйвер устройства. superblock , Использование файловой системы superblock Чтобы инициализировать ядро superblock Объект.
Superblock Operations
superblock Самый важный член объекта s_op , Это указатель superblock operation table Указатель, superblock operation struct Указатель функции в указывает операции, которые могут выполняться в файловой системе.
Когда файловой системе необходимо выполнить операции со своим суперблоком, она запустится со своего super_block struct Указатель найден в super_operations Structure, а затем перейдите к соответствующему обработчику в соответствии с указателем функции. И соответствующие процедуры обработки разные on-disk filesystem Принимать решение.
The Inode Object
inode object Он представляет всю информацию, необходимую ядру для управления файлом или каталогом. Для файловой системы в стиле Unix эту информацию можно получить непосредственно из on-disk inode Читать, если файловая система не содержит inode Затем ему необходимо найти информационное наполнение схожими функциями по дизайну собственной файловой системы. kernel inode 。
все inode Оба представляют файл в файловой системе, но inode bject Он будет создан в памяти только при доступе к файлу. Сюда входят специальные файлы, такие как файлы устройств или файлы каналов. следовательно, struct inode Некоторые поля будут связаны с этими конкретными файлами. Такие как, i_pipe Домен указывает на структуру данных именованного канала, i_bdev Укажите на структуру данных блочного устройства.
Inode Operations
Как в superblock operation Такой же, inode_opeartion Члены очень важны.
It describes the filesystem’s implemented functions that the VFS can invoke on an inode.
Например:
Здесь i - указатель на конкретный inode, для этого inode мы выполнили truncate() Операция и конкретная функция выполнения этой операции обеспечивается файловой системой, в которой расположен индексный дескриптор.
- inode_create : VFS пройден create() с open() Системный вызов для вызова этой функции, согласно specified initial access mode Чтобы создать конкретный dentry object Связанные новые inode Экземпляр объекта
The Dentry Object
в on-disk В файловой системе каталоги обычно понимаются как файлы, и файлы каталогов также имеют соответствующие inode , Но в блоке данных файла каталога имя хранится в inode Отношение отображения. Однако в Linux VFS все файлы и каталоги абстрагируются в каталоги. inode Абстракция выше dentry , Пара файловой системы inode Операция сначала должна найти inode Соответствует в файловой системе dentry . Эти отношения впереди Схема структуры файловой системы Linux Это очень ясно. Причина в том, чтобы ускорить доступ к каталогу.
, например путь /bin/vi , bin На диске находится файл каталога, vi Это обычный файл. У обоих файлов есть свои inode . Несмотря на эту полезную унификацию, VFS часто требуется выполнить некоторые directory-specific operation , Например, поиск пути. Поиск имени пути должен переводить каждую часть пути, гарантировать, что каждый шаг является допустимым, а затем искать от одной части к другой. Чтобы ускорить этот процесс, VFS представила directory entry Концепция чего-либо.A dentry is a specific component in a path. В предыдущем примере /,bin,vi Все dentry object 。Dentry objects are all components in a path, including files. Это позволяет легко разрешить путь.
dentry Это также может указывать на точку монтирования. Например в пути /mnt/cdrom/foo в, /,mnt,cdrom,foo Все dentry object . VFS выполняет directory operations Создавайте в реальном времени dentry object 。 dentry Не соответствует ни одному on-disk data structure 。
Обратите внимание, что dentry В
Эти две переменные можно рассматривать просто как указатели на родительский каталог и все его подкаталоги. Подкаталог - это d_subdirs Организован в виде очереди. Следовательно, можно подумать, что dentry Просто в vfs Внутренне используется для моделирования on-disk files and directires Организационная структура данных. по dentry Операционная система может быстро узнать логическую структуру файлов и каталогов на диске без прямого доступа к диску. Конечно да dentry Создание основано на структуре организации данных на диске, поэтому по крайней мере один доступ к данным на диске должен быть в памяти. Кеш Логическая структура данных на диске.
подводить итоги dentry Основные функции:
- Используется в разрешении пути, VFS используется напрямую dentry Вы можете получить информацию о пути к файлу на диске. Нет необходимости каждый раз читать файл каталога с диска для анализа пути;
- Кэшировать результаты каждого разрешения пути dentry cache 。
Dentry State
Допустимый объект dentry может иметь три состояния: used, unused, negative
- A used dentry corresponds to a valid inode (d_inode points to an associated inode) and indicates that there are one or more users of the object (d_count is positive).A used
dentry is in use by the VFS and points to valid data and, thus, cannot be discarded. - Неиспользуемый dentry соответствует действительному inode (d_inode указывает на inode), но VFS в настоящее время не использует объект dentry (d_count равно нулю). dentry Соответствует inode , Но не используется ни одним процессом. Обычно это dentry Кешируйте его, чтобы path name lookups Станьте быстрее.
- A negative dentry is not associated with a valid inode (d_inode is NULL) because either the inode was deleted or the path name was never correct to begin with. negative dentry Основная функция - кэширование неудачного пути доступа.
The Dentry Cache
dentry cache Он состоит из трех частей:
- Из-за того же inode Будет иначе dentry ,следовательно inode средний i_dentry Очередь сохраняет все точки в inode Запись в справочнике.
- Двусторонняя ссылка lru В очереди хранятся неиспользуемые и отрицательные объекты dentry.
- Хеш-таблица и хеш-функция используются для быстрого поиска соответствующей записи каталога на основе имени пути.
Хеш-таблица хранится в dentry_hashtable Массив. Каждый элемент является указателем на группу с одинаковым значением хеш-функции. dentries (Организован в связанный список) через d_lookup() Функция может запрашивать хеш-таблицу.
Например: в настоящее время редактируется исходный файл, расположенный в домашней папке /home/dracula/src/the_sun_sucks.c , Всякий раз, когда к этому файлу обращаются, чтобы разрешить все пути: /,home,dracula,src,the_sun_sucks.c , VFS должен follow each directory entry . Чтобы избежать этой трудоемкой операции, VFS может сначала попробовать dentry cache Найдите имя пути в. Если запрос выполнен успешно, вы можете напрямую получить то, что вам нужно dentry object В случае сбоя VFS необходимо выполнить поиск файла каталога в файловой системе. После завершения ядро добавляет эти новые записи в каталог dchche Чтобы ускорить будущие запросы.
Dentry Operations
d_hash() Функция должна генерировать хеш-значение в соответствии с указанным dentry, и эта функция вызывается всякий раз, когда VFS добавляет dentry в хеш-таблицу.
The File Objects
Файловый объект используется для представления файла, открытого процессом.Когда мы рассматриваем VFS с точки зрения пользовательского пространства, первое, что мы встречаем, - это файловый объект. Процесс обрабатывает файлы напрямую, а не суперблоки, inodes или dentries.
Файловый объект является представлением открытого файла в памяти. Объект создается в ответ на системный вызов open () и уничтожается в ответ на системный вызов close (). Все Операции, связанные с файлами, определены в file operation table в. Поскольку возможно, что несколько процессов откроют один и тот же файл и будут управлять им, может быть несколько процессов, соответствующих одному и тому же файлу. file objects . Объект файла указывает на dentry, которая фактически представляет открытый файл. Объекты inode и dentry, конечно же, уникальны (dentry и inode находятся во взаимосвязи «многие к одному», потому что у файла могут быть разные пути).
File Operations
- loff_t llseek(struct file *file, loof_t offset, int origin) Используется для перемещения указателя файла на заданное расстояние. llseek() Системный вызов в конечном итоге вызовет эту функцию.
Data Structures Associated with Filesystems
Поскольку Linux поддерживает множество различных файловых систем, ядро должно иметь особую структуру данных для описания возможностей различных файловых систем. file_system_type Вот что он делает:
get_sb() Функция считывает данные из суперблока диска, а затем сохраняет информацию при загрузке файловой системы. file_system_type в. Остальные функции описывают характеристики файловой системы.
Каждая файловая система имеет только одну file_system_type , Независимо от того, сколько экземпляров файловой системы смонтировано в системе или смонтирована ли файловая система.
Когда файловая система смонтирована, система создаст vfsmount структура данных. Эта структура данных представляет собой конкретный экземпляр файловой системы, другими словами, точку монтирования.
Data Structure Associated with a Process
Каждый процесс в системе имеет свою собственную таблицу открытых файлов, корневую файловую систему, текущий рабочий каталог, точку монтирования и т. Д.
files_struct Определено в <linux/fdtable.h> В дескрипторе процесса files Домен - это указатель files_struct Указатель. Вся информация о процессе открытия файла, а также дескриптор файла находятся в files_struct среди них.
fd_array Элементы в массиве struct file* указатель. Как упоминалось ранее, file Структура соответствует одному dentry Объект, open() Системный вызов создает dentry Или в dchche Найдите один в dentry И создайте указатель на dentry из file Структура, поставь это file Адрес структуры добавлен в struct file *fd_array[] В, а затем обратно в fd_array Индекс в виде open() Возвращаемое значение функции.
Вторая структура данных, связанная с процессом: fs_struct , Содержит информацию о файловой системе процесса и дескрипторе процесса. fs Домен указывает на эту структуру данных.
В этой структуре сохраняются текущий рабочий каталог (pwd) и корневой каталог текущего процесса.
Третья важная структура данных - это namespace Структура, определенная в <linux/mnt_namespace.h> В дескрипторе процесса mnt_namespace Домен указывает на эту структуру данных. Начиная с ядра Linux 2.4, каждый процесс имеет свой собственный namespace , Это позволяет каждому процессу иметь собственное уникальное представление о файловой системе, смонтированной в системе, - это уже не просто корневой каталог, а полностью уникальная иерархия файловой системы.
list Члены указывают на двусвязный список смонтированной файловой системы, и этот двусвязный список формирует namespace . Для большинства процессов их дескриптор процесса будет указывать на их собственный уникальный files_struct так же как fs_struct . За переход с флагом клона CLONE_FLAGS или CLONE_FS Для созданного процесса они поделятся filse_strucr、fs_struct . Это приводит к тому, что разные дескрипторы процесса указывают на один и тот же
filse_strucr、fs_struct 。 count Роль участников - записывать количество совместно используемых файловых процессов.
namespace Механизм решает проблему в обратном направлении. По умолчанию все процессы имеют одинаковые namespace . (Тем не менее, все они видят одну и ту же иерархию файловой системы из одной и той же таблицы монтирования). Только при использовании clone() Установить во время CLONE_NEWNS После флага у каждого процесса будет копия namespace Копия структуры. В противном случае большинство процессов просто наследуют пространство имен от своих родителей.
«Анализ процесса загрузки Linux», корневая файловая система монтирования ядра
Примечание. Эта статья основана на анализе ядра Linux2.6.29, другие версии ядра приведены только для справки.
В ходе анализа сценариев исходного кода я увидел шину, устройство, драйвер и механизм его обнаружения.Создание узла устройства udev в ядре Linux2.6 связано с этим, что касается файловой системы, это всегда было устрашающе, но при изучении ядра эту часть невозможно обойти. В настоящее время нет никаких исследований по хеш-таблице, используемой в VFS, она играет ключевую роль в поиске узлов в dentry и vfsmount, анализ выполняется позже. Ниже приведен простой анализ процесса монтирования корневой файловой системы:
1. Рождение rootfs
В Linux все является файлом: в Linux обычные файлы, каталоги, символьные устройства, блочные устройства, сокеты и т. Д. Обрабатываются как файлы, их конкретные типы и операции отличаются, но они должны обеспечивать унифицированный рабочий интерфейс для верхнего уровня. ,
Виртуальная файловая система VFS - это программный уровень в ядре Linux, который обеспечивает интерфейсы работы файловой системы для программ пользовательского пространства вверх, а вниз позволяет сосуществовать различным файловым системам. Следовательно, все существующие файловые системы должны реализовывать инкапсуляцию структуры VFS.
Монтирование любой файловой системы в системе Linux должно соответствовать двум условиям: точка монтирования и файловая система.
Для прямого монтирования файловой системы nfs или flash необходимо решить две проблемы:
1. Кто предоставит точку монтирования? Мы можем представить себе создание суперблока (содержащего записи каталога и i-узлы). Разве в это время нет точки монтирования? К сожалению, Linux представила VFS (все является файлом, все типы файловых систем должны обеспечивать программный уровень VFS). , Чтобы обеспечить единый интерфейс для верхнего уровня) Эта проблема не может быть решена таким образом, потому что точка монтирования должна быть связана с файловой системой, то есть точка монтирования должна принадлежать файловой системе.
2. Как получить доступ к файловой системе на NFS или Flash? Можно сказать, что прямой доступ к драйверу устройства читает файловую систему над ним (файловая система на устройстве смонтирована в его собственном корневом каталоге), это нормально? Не забывайте, что это Linux VFS, и доступ к устройству не является исключением. Поскольку устройству доступа по-прежнему требуется доступ к точке монтирования через файловую систему, к нему нельзя получить прямой доступ (для удовлетворения архитектуры VFS в Linux все является файлом).
Следовательно, одним словом: rootfs существует, потому что он должен предоставить системе самую примитивную точку монтирования в рамках механизма VFS.
Такие противоречия требуют от нас введения специальной файловой системы:
1. Это первая файловая система, созданная и загруженная самой системой, точка монтирования файловой системы - это собственная запись корневого каталога.
2. Файловая система не может существовать в nfs или flash, потому что она попадет в предыдущее противоречие.
Вышеуказанные проблемы требуют от нас создания специальной файловой системы со следующими тремя характеристиками:
1. Это первая файловая система, созданная и загруженная самой системой;
2. Точка монтирования файловой системы - это собственный объект записи корневого каталога;
3. Файловая система существует только в памяти.
Из приведенного выше анализа видно, что rootfs является краеугольным камнем VFS в Linux (все является файлом, все типы файловых систем должны обеспечивать программный уровень VFS для обеспечения унифицированного интерфейса с верхним уровнем); эти два тесно связаны. Если нет механизма VFS, нет необходимости в rootfs.Так же, если нет rootfs, механизм VFS не может быть реализован.
Это настоящие отношения между ними. Я видел все высказывания в Интернете раньше: некоторые говорили только, что отношения близкие, и не указывали конкретные отношения, некоторые просто неправильно понимали детей, говоря, что VFS является rootfs.
Фактически, VFS - это механизм, и каждая файловая система в Linux (включая только что упомянутые rootfs, а также общие ext3, yaffs и т. Д.) Должна быть реализована в соответствии с этим механизмом, rootfs - только в соответствии с VFS. Файловая система, которая стандартизирована и имеет три вышеуказанные характеристики.
VFS - это механизм, которому должна следовать реализация файловой системы Linux. Rootfs - это особая файловая система. Все реализации файловой системы в Linux должны соответствовать механизму VFS (в соответствии с интерфейсом VFS), это истинная связь между ними. ,
Следующий анализ основан на ядре эмулятора Android Linux 2.6.6.29:
Во-вторых, соответствующая структура данных
Текущий указатель как глобальная переменная в ядре Linux очень широко используется, например: получение идентификатора текущего процесса в контексте процесса, планирование задач и поиск пути в вызовах файловой системы, таких как open; сначала представьте текущую структуру:
Реализация current может быть разной в каждой платформе и в каждой версии ядра, но принцип тот же. Указатель обычно определяется в заголовочном файле current.h конкретной платформы, и типом является struct task_struct:
2. Монтирование файловой системы vfsmount (struct vfsmount):
По сути, процесс операции монтирования заключается в создании новой структуры vfsmount, а затем в привязке этой структуры к точке монтирования (объект элемента каталога). После сопоставления каталог можно искать в точке монтирования vfsmount на один уровень после поиска в каталоге.
Для каждой смонтированной файловой системы она представлена экземпляром vfsmount.
3. Суперблок (структура super_bloc):
4. Узел индекса каталога (struct inode):
5. Объект записи каталога (структура dentry):
3. Зарегистрируйте / создайте, установите / смонтируйте rootfs и вызовите set_fs_root, чтобы установить корневую файловую систему текущей системы в rootfs.
Первый шаг: установить файловую систему rootfs;
Второй шаг: вызовите его функцию get_sb (get_sb_nodev для rootfs такой памяти / псевдо файловой системы, get_sb_bdev для реальной файловой системы, такой как ext2), установите суперблок (включая элементы каталога и i-узлы)
Шаг 3: Смонтируйте файловую систему (точка монтирования файловой системы указывает на запись корневого каталога суперблока файловой системы);
Шаг 4: Установите корневую файловую систему и текущий текущий каталог системы на rootfs и его корневой каталог.
Есть два шага ниже:
1. Зарегистрируйте виртуальную файловую систему rootfs init_rootfs в ядре.
2. Установите корневой каталог rootfs и смонтируйте rootfs в собственный корневой каталог, установите текущий корневой каталог системы и корневую файловую систему.
Далее основное внимание уделяется анализу функции do_kern_mount, которая реализует монтирование rootfs в своем собственном корневом каталоге:
На этом этапе файловая система rootfs устанавливается и монтируется в соответствующем элементе каталога своего собственного суперблока (включая элементы каталога dentry и inod i-узла), устанавливая текущий корневой каталог системы и корневую файловую систему, каталог pwd и файловую систему.
Передайте Initramfs в rootfs: если в Initramfs есть init, эта ситуация особенная, rootfs - это корневая файловая система, используемая последней системой.
И в данный момент нет необходимости отдельно записывать img корневой файловой системы, в это время корневая файловая система является частью ядра uImage. Конечно, дефект заключается в том, что носитель, на котором работает файловая система, является виртуальным диском, то есть диском памяти, который больше не соответствует диску, поэтому файлы в корневом каталоге не будут сохранены в это время. Элемент конфигурации его ядра: CONFIG_INITRAMFS_SOURCE. Это часто встречается в реальных проектах.
make menuconfig->General setup->Initial RAM filesystem and RAM disk(initramfs/initrd) support
В исходных файлах Initramfs укажите путь к корневой файловой системе, например:… / out / target / product / tclm6 / root; если не заполнено, это приведет к файловой системе initrd или на диске. (Поскольку вы увидите ниже, ядро не найдет "/ init").
Соответствующий исходный код ядра:
Посмотрите на реализацию init_post:
4. Смонтируйте действительную файловую систему в rootfs и вызовите set_fs_root, чтобы установить корневую файловую систему текущей системы.
Ниже приведено краткое описание с точки зрения параметров загрузочного ядра uboot:
В следующих трех случаях файловая система монтируется в каталог / root в rootfs, а корневой каталог текущей системы переключается на / root, а корневая файловая система текущей системы переключается на файловую систему диска.
Ниже объясняются вызовы mount_root () и sys_chroot (".") В два этапа:
1. Смонтируйте файловую систему nfs или disk в каталог / root rootfs (например, диск)
2. Установите текущий каталог / root в качестве текущего корневого каталога системы и файловую систему диска в качестве текущей корневой файловой системы системы.
Анализ sys_chroot ("."): См. Функцию предварительной обработки языка C и макрос программирования ядра Linux
Обратите внимание на следующее: специальная файловая система rootfs не была размонтирована, она просто скрыта под корневой файловой системой на диске.
initrd как корневая файловая система
setenv bootargs root=/dev/ram0 initrd=0x2800000,24M rootfstype=ext2 mem=64M console=ttyAMA0
root: используется для указания местоположения rootfs.
rootfstype: используется для указания типа файловой системы.
NFS в качестве корневой файловой системы
setenv bootargs root=/dev/nfs nfsroot=192.168.1.7:/opt/yz/nfs,rw ip=192.168.1.160 mem=64M console=ttyAMA0
nfsroot: в каком каталоге какого хоста находится файловая система.
ip: укажите ip-адрес сетевой карты после запуска системы.
прошить как корневую файловую систему
mtdparts: расположение корневой файловой системы во флэш-памяти.
Резюме: rootfs никогда не будет удален, он просто скрыт. В пользовательском пространстве чаще всего виден только один лист корневых файлов большого дерева, а файловая система все еще установлена.
V. Другие инструкции
Что касается результатов, установленных под mirco2440:
Опыт этого процесса из журнала:
Результат монтирования под Ubuntu:
В-шестых, контрольный пример показывает структуру файловой системы текущей системы, независимо от того, в каком каталоге она не изменится:
make генерирует hello.ko
Сначала посмотрите на структуру файловой системы:
1. Вставьте / data / и запустите insmod hello.ko rmmod hello.ko
2. Вставьте / sdcard / tank / и запустите insmod hello.ko rmmod hello.ko
Это доказывает, что current-> fs-> root является корневой файловой системой, распознаваемой системой.
Интеллектуальная рекомендация
Краткое описание общих функций MPI
содержание 1, основная функция MPI 2, точка-точка функция связи 3, коллективная функция связи 1, основная функция MPI MPI_Init(&argc, &argv) Информировать системы MPI для выполнения всех необх.
Примечание 9: EL выражение
JVM память
концепция Виртуальная машина JVM управляет собственной памятью, которая разделяет память во многие блоки, наиболее распространенной для памяти стека и памяти кучи. 1 структура виртуальной машины JVM H.
Проблема сетевого запроса на Android 9.0
вЗапустите Android 9 (API Уровень 28) или вышеНа устройстве операционной системы Android, чтобы обеспечить безопасность пользовательских данных и устройств, использование по умолчанию для зашифрованно.
Учебная запись по Webpack (3) В статье рассказывается о создании webpack4.0.
предисловие Для изучения веб-пакета автор также предпринял много обходных путей. Есть много вещей, которые я хочу знать, но я не могу их найти. Автор поможет вам быстро начать работу. Цель этой статьи.
Как уже рассказывалось, подсистема VFS представляет каталоги так же, как и файлы. В имени пути /bin/vi, и элемент bin, и элемент vi — это файлы, только bin — это специальный файл, который является каталогом, a vi — это обычный файл. Объекты файловых индексов служат для представления обоих этих компонентов. Несмотря на такую полезную унификацию, подсистеме VFS также необходимо выполнять операции, специфичные для каталогов, такие как поиск компонента пути по его имени, проверка того, что указанный элемент пути существует, и переход на следующий компонент пути.
Для решения этой задачи в подсистеме VFS реализована концепция элемента каталога (directory entry или dentry). Объект dentry — это определенный компонент пути. В предыдущем примере компоненты /, bin и vi — это объекты элементов каталога. Первые два — это каталоги, а последний — обычный файл. Важным моментом является то, что все объекты dentry — это компоненты пути, включая и обычные файлы.
Элементы пути также могут включать в себя точки монтирования. В имени пути /mnt/cdrom/foo, компоненты /, mnt, cdrom и foo — это все объекты типа dentry. Подсистема VFS при выполнении операций с каталогами по необходимости конструирует объекты элементов каталога на лету.
Объекты типа dentry представлены с помощью структуры struct dentry и определены в файле <linux/dcache.h>. Эта структура с комментариями, которые определяют назначение каждого поля, имеет следующий вид.
atomic_t d_count; /* счетчик использования */
unsigned long d_vfs_flags; /* флаги кэша объектов dentry */
spinlock_t d_lock; /* блокировка данного объекта dentry */
struct inode *d_inode; /* соответствующий файловый индекс */
struct list_head d_lru; /* список неиспользованных объектов */
struct list_head d_child; /* список объектов у родительского
struct list_head d_subdirs; /* подкаталоги */
struct list_head d_alias; /* список альтернативных (alias)
unsigned long d_time; /* время проверки правильности */
struct dentry_operations *d_op; /* таблица операций с элементом
struct super_block *d_sb; /* связанный суперблок */
unsigned int d_flags; /* флаги элемента каталога */
int d_mounted; /* является ли объект точкой
void *d_fsdata; /* специфические данные
struct rcu_head d_rcu; /* блокировки RCU (read-copy update) */
struct dcookie_struct *d_cookie; /* cookie-идентификатор */
struct dentry *d_parent; /* объект dentry
struct qstr d_name; /* имя dentry */
struct hlist_node d_hash; /* список хеширования */
struct hlist_head *d_bucket; /* сегмент хеш-таблицы */
unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* короткое имя файла */
В отличие от предыдущих двух объектов, объект dentry не соответствует какой бы то ни было структуре данных на жестком диске. Подсистема VSF создает эти объекты на лету на основании строкового представления имени пути. Поскольку объекты элементов каталога не хранятся физически на дисках, то в структуре struct dentry нет никаких флагов, которые указывают на то, изменен ли объект (т.е. должен ли он быть записан назад на диск).
Кэш объектов dentry
Кэш объектов dentry После того как подсистема VFS преодолела все трудности, связанные с переводом всех элементов пути в объекты элементов каталогов, и был достигнут конец пути, то было бы достаточно расточительным выбрасывать на ветер всю проделанную работу. Ядро кэширует
Объект Folder
Объект Folder Объект Folder обеспечивает доступ к свойствам каталога. Создать этот объект можно с помощью свойства RootFolder объекта Drive или методов GetFolder, GetParentFolder и GetSpecialFolder объекта FileSystemObject следующим образом:var FSO, Folder;FSO = WScript.CreateObject("Scripting.FileSystemObject");Folder = FSO.GetFolder("С:Мои
Объект File
Объект File Объект File обеспечивает доступ ко всем свойствам файла. Создать этот объект можно с помощью метода GetFile объекта FileSystemObject следующим образом:var FSO, F;//Создаем объект FileSystemObjectFSO=WScript.CreateObject("Scripting.FileSystemObject");//Создаем объект FileF=FSO.GetFile("С:Мои документахletter.txt");Также
Объект TextStream
Объект TextStream Объект TextStream обеспечивает последовательный (строка за строкой) доступ к текстовому файлу. Методы этого объекта позволяют читать информацию из файла и записывать ее в него.Создать объект TextStream можно с помощью следующих методов:? CreateTextFile объектов FileSystemObject и
Объект Array
Объект Array Новый объект встроенного класса Array можно создать с помощью оператора new следующими способами:? new Array() — создание массива нулевой длины;? new Array(N) — создание массива длины N;? new Array(а0, a1, . aN) — создание массива длины N+1 c элементами а0, a1, . aN.Например:var A1, А2, A3;A1 = new
Объект Date
Объект Date Для создания нового объекта встроенного класса Date используется один из трех конструкторов.Конструктор первого вида позволяет создать объект, в котором хранится информация о текущих дате и времени:var d;d = new Date();Здесь время задается по Гринвичу, т.е. с
Объект Enumerator
Объект Enumerator С помощью объекта Enumerator можно получить доступ к любому элементу коллекции (в VBScript для этого служит цикл For…Each). Коллекцией в языке JScript называется множество элементов, которое отличается от массива тем, что к элементам коллекции нельзя получить прямой доступ
Объект Math
Объект Math Встроенный класс Math применяется для математических вычислений и содержит основные математические константы и функции. Замечание Объект Math создается сервером сценариев автоматически и не может быть создан при помощи оператора new, как другие встроенные
Объект String
Объект String Встроенный объект String предназначен для выполнения различных операций над текстовыми строками. Обычно объекты класса String создаются просто с помощью записи в переменную текстового литерала:var s1, s2;s1 = "Это строка";s2 = "Это тоже строка";Также можно создавать такие
Объект CompositeElementLite
Объект CompositeElementLite Вернемся в начало этой главы и вспомним, как мы получали доступ к нужному нам элементу Web-страницы.Мы можем получить доступ к одному элементу Web-страницы:var elCMain = Ext.get("cmain");Или сразу к нескольким:var clContainers = Ext.select("DIV");Мы помним, что метод select объекта Ext
Объект document
Объект document Прежде всего надо отметить, что объект document существует в единственном экземпляре для всего HTML-документа. Он присутствует всегда, если существует HTML-документ, поэтому специально создавать его не требуется.activeElementИспользуется в сценарии для получения ссылки
Объект location
Объект location Объект location содержит информацию о местонахождении текущего документа, т.е. его интернет-адрес. Его также можно использовать для перехода на другой документ и перезагрузки текущего документа.Свойства объекта locationМетоды объекта locationПользуясь объектом location,
Объект style
Объект style Как и все остальные объекты, style поддерживает ряд свойств и методов. Их можно разделить на две группы:иСвойства первой группы в целом аналогичны соответствующим атрибутам стиля и имеют почти такие же имена за тем исключением, что символы "-" убираются, т.к. не
Объект window
Объект
Объект Все, что находится в трехмерном виртуальном пространстве сцены — это объекты. Термин "объект" обозначает нечто, находящееся в трехмерном мире. Что бы мы ни создали в виртуальном пространстве, это будет объект.Существует множество видов объектов. Принадлежность
Читайте также: