Как утилита 'fio' выполняет операции, подобные VFS, на необработанных неформатированных устройствах без файловой системы на них?

Предполагая, что вы используете оболочку bash:

$ source./file
$ echo "$VAR1"
ABCDEF
$ var=VAR1
$ echo "${!var}"
ABCDEF

Используя ${!var}, вы используете косвенную переменную в bash. Значение переменной varиспользуется для получения имени расширяемой переменной.


В bashвы также можете использовать переменную ссылки на имя:

$ source./file
$ echo "$VAR1"
ABCDEF
$ declare -n var="VAR1"
$ echo "$var"
ABCDEF

Здесь переменная varотносится к переменной VAR1, поэтому $varбудет расширяться до того, до чего расширяется $VAR1.

Ссылки на имена изначально являются функцией ksh, и в этой оболочке они объявляются с помощью typeset -n.

Ссылки на имена чрезвычайно полезны для передачи ссылок на массивы при вызовах функций оболочки.


В любой shоболочке:

$../file
$ echo "$VAR1"
ABCDEF
$ var=VAR1
$ eval "echo \"\$$var\""
ABCDEF

Утилита evalпринимает строку, которую она повторно -оценивает. Здесь мы даем ему строкуecho "$VAR1"(после расширения$var).

Проблема с evalзаключается в том, что с ним легко внести ошибки или уязвимости, небрежно создав строку аргумента.

0
13.07.2020, 00:20
1 ответ

I understand that one cannot do VFS operations on a medium with no filesystem.

Возникает вопрос: «О каких именно операциях идет речь?» которые вы поясняете ниже...

Given that, how does a utility like fio perform VFS-like read/write/seek operations on raw devices?

Несмотря на то, что чтение/запись/поиск могут выполняться для вещей, которые имеют VFS, они не являются эксклюзивными операциями VFS, -допустимо выдавать их устройствам, которые также понимают соответствующие системные вызовы.

Как заявил @andy -dalton Linux блочные устройства принимают системные вызовы, такие как read()/ write()и fio, просто выдают стандартные вызовы библиотеки чтения/записи (, которые в конечном итоге превращаются в системные вызовы )для них (, как если бы это был файл в файловой системе ), а ядро ​​позаботится об этой разнице. См.https://github.com/axboe/fio/blob/2dd96cc46fa83a73acc1c9238c3ac59203e10213/engines/sync.c#L226-L229в качестве примера. Это упрощение, но оно иллюстрирует общую концепцию.

1
18.03.2021, 23:20

Теги

Похожие вопросы