Linux использует обоих. Это использует сегментацию для отображения всего доступного адресного пространства при предоставлении различных прав доступа: в основном ядро и представление пространства пользователя. Вы можете grep исходный код Linux для KERNEL_DS (сегмент данных ядра) для некоторых примеров.
Подкачка страниц затем используется для реализации виртуальной памяти (Grep для "структуры gdt_page" в ядре для начальной точки)
Я не иду в листы это оставшееся без ответа, потому что существует несколько вещей серьезно неправильно с этим сценарием. Однако, потому что я не знаю то, что сценарий, как предполагается, делает, этот ответ не собирается решать Вашу проблему.
chdir($directory);
может перестать работать. Необходимо обработать ошибку.
chdir($directory) or die "chdir($directory): $!";
$files .= "'$filename' "
не надлежащее заключение в кавычки на имя файла: это перестанет работать, если имя файла будет содержать a '
. Вы могли подготовить имя файла с $filename =~ s/'/'\\''/
, но существует на самом деле лучший способ сделать это (см. следующий вопрос).
system
с отдельным аргументом вызывает оболочку. Но Вы не используете функции оболочки, так вместо этого необходимо использовать форму списка. И тот способ, которым Вы не должны создавать строку, которая собирает все имена файлов: просто используйте список, который Вы уже имеете.
my @cmd = qw(/usr/bin/tar cvfz);
system(@cmd, $dest_path, @ARGV);
Все еще необходимо обработать ошибки от system
.
system(@cmd, $dest_path, @ARGV) or die "Call to $cmd[0] failed with status $?";
Если это - последняя вещь, Ваш сценарий делает, звонит exec
вместо этого.
exec(@cmd, $dest_path, @ARGV) or die "exec $cmd[0] failed: $!";
До сих пор Вы могли сделать все это легко в оболочке.
#!/bin/sh
set -e
cmd='tar cvzf'
dest_path='Archive.tgz'
cd -- "$(dirname -- "$0")"
echo "$cmd $dest_path $*"
exec $cmd "$dest_path" "$@"