Когда встроенные команды, загруженные в память

Похоже, что Ваша файловая система смонтирована с noexec опция, которая запрещает выполняющие программы в той файловой системе путем действия, как будто все биты выполнения в полномочиях были сброшены. Если Вы используете user смонтируйте опцию (или если некоторый пользовательский интерфейс использует ее под капотом), noexec включен, если Вы явно не выключаете его с exec.

Большинство карт с интерфейсом USB использует ПОЛУЧЕННУЮ ИЗ MS-DOS файловую систему VFAT, которая не имеет никакого понятия полномочий. Можно только указать биты полномочий, когда Вы монтируете файловую систему, и эти полномочия относятся ко всем файлам в той файловой системе.

Если у Вас нет разрешения выполнить сценарий, назовите интерпретатор явно:

sh /media/stick/test.sh

Для динамично связанного двоичного файла вызовите динамического компоновщика.

/lib/ld-linux.so.2 /media/stick/myprog
11
14.09.2013, 20:18
4 ответа

Скажем, если я ввожу в CD в моей оболочке. CD загружается из памяти в тот момент? Моя интуиция - то, что эти встроенные команды предварительно загружены к системной памяти после того, как ядро было загружено, но кто-то настоял, что они загружаются только, когда я на самом деле вызываю команду...

В общих чертах другие ответы корректны - созданные-ins загружаются оболочкой, стенд-alones загружаются при вызове. Однако очень stickly ласка-y "кто-то" мог настоять, что это не настолько просто.

Это обсуждение несколько о том, как ОС работает, и работа другой ОС различные пути, но я думаю в целом, следующее, вероятно, верно для всего современника *, отклоняет.

Во-первых, "загруженный в память" неоднозначная фраза; действительно то, к чему мы обращаемся, отобразили его виртуальное адресное пространство в память. Это значительно, потому что "виртуальное адресное пространство" относится для наполнения, который, возможно, должен быть помещен в память, но на самом деле не является первоначально: главным образом то, что на самом деле загружается в память, является самой картой - и карта не является территорией. "Территория" была бы исполняемым файлом на диске (или в дисковом кэше) и, на самом деле, большая часть из этого, вероятно, не загружается в память при вызове исполняемого файла.

Кроме того, большая часть "территории" является ссылками на другие территории (совместно использованные библиотеки), и снова, просто потому что они были упомянуты, не означает, что они действительно загружаются также. Они не становятся загруженными, пока они на самом деле не используются, и затем только части их, которые на самом деле должны быть загружены для любой "использование", должны успешно выполниться.

Например, вот отрывок top вывод на Linux, относящемся к a bash экземпляр:

VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                  
113m 3672 1796 S  0.0  0.1   0:00.07 bash   

VIRT на 113 МБ является виртуальным адресным пространством, которое отображается в RAM. Но RES является фактической суммой RAM, использованной процессом - только 3,7 КБ. И этого, некоторые - часть общей упомянутой выше территории - SHR на 1,8 КБ. Но мой /bin/bash на диске 930 КБ, и основной libc, который он связывает с (общий lib) вдвое более большой снова.

Та оболочка ничего не делает прямо сейчас. Скажем, я вызываю встроенную команду, которая, как мы сказали ранее, была уже "загружена в память" наряду с остальной частью оболочки. Ядро выполняет любой код, включен, начав в точке в карте, и когда это достигает ссылки для кодирования, который не был действительно загружен, это загружает его - из исполняемого изображения на диске - даже при том, что в более случайном смысле, тот исполняемый файл (быть этим оболочка, автономный инструмент или общая библиотека) был уже "загружен в память".

Это называют подкачкой по обращению.

9
27.01.2020, 19:57

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

Встроенные команды как alias, cd, echo и т.д. часть Вашей оболочки (bash, zsh, ksh или безотносительно). Они загружаются одновременно, оболочка и является просто внутренними функциями той оболочки.

9
27.01.2020, 19:57

Я сделал следующий эксперимент, чтобы показать, что встроенные команды на самом деле загружаются как часть exectuable bash. Следовательно, почему их называют builtins, но демонстрация всегда является лучшим способом доказать что-то.

Пример

  1. Запустите новое bash оболочка и примечание ее идентификатор процесса (PID):

    $ bash
    $ echo $$
    6402
    
  2. Во втором терминале работает ps управляйте, таким образом, мы можем смотреть и видеть если bash начинает поднимать любую дополнительную память:

    $ watch "ps -Fp 6402"
    

    Вывод похож на это:

    Every 2.0s: ps -Fp 6402                        Sat Sep 14 14:40:49 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml      6402  6349  0 28747  6380   1 14:33 pts/38   00:00:00 bash
    

    Примечание: Использование памяти показывают со столбцами SZ & RSS здесь.

  3. Начните выполнять команды в оболочке (pid 6402):

    Как Вы cd вокруг Вы заметите, что память на самом деле повышается, но это не из-за исполняемого файла cd будучи загруженным в память, скорее это вызвано тем, что структура каталогов на диске становится загруженной в память. Если Вы сохраняете cd'луг в другие каталоги Вы будете видеть, что он инкрементно продолжает подниматься.

    Every 2.0s: ps -Fp 30208                        Sat Sep 14 15:11:22 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml     30208  6349  0 28780  6492   0 15:09 pts/38   00:00:00 bash
    

    Можно сделать более тщательно продуманные тесты как это:

    $ for i in `seq 1000`; do cd ..; cd 90609;done
    

    Эта команда будет CD уровень и затем обратно вниз во времена каталога 90609 1000. При выполнении этого, если Вы контролируете использование памяти в ps окно Вы заметите, что оно не изменяется. При выполнении чего-то вроде этого никакое дополнительное использование памяти не должно быть замечено.

  4. strace

    Вот, другой говорит, что мы имеем дело со встроенной функцией к bash вместо фактического исполняемого файла. Когда Вы пытаетесь работать strace cd .. Вы получите следующее сообщение:

    $ strace cd ..
    strace: cd: command not found
    
4
27.01.2020, 19:57

"встроенная команда" относится к командам, встроенным в оболочку, а не как отдельные программы. ls, например, на самом деле не встроенная команда, а отдельная программа. Это будет загружено в RAM, когда это будет вызвано, если это уже не находится в дисковом кэше.

Пример встроенной команды был бы printf или cd. Они - часть оболочки и загружаются наряду с остальной частью оболочки.

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

3
27.01.2020, 19:57

Теги

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