Разделите a/path/to/file

sudo chmod 755 <script>

В моем случае ошибка заключалась в отсутствии прав на выполнение файла. Сообщение об ошибке появилось только тогда, когда я разделил команды:

$ sudo sh
# ./install
1
05.07.2018, 21:45
3 ответа

Why can't it work with 4GB of memory and just map different stuff into the 1GB space available for the kernel as needed?

Может, это то, что делают опции конфигурации HIGHMEMдля памяти, которая не подходит для прямого отображения. Но когда вам нужно получить доступ к произвольному местоположению в памяти, это намного проще сделать, если вы можете указать на него напрямую, не настраивая отображение каждый раз. Для этого вам нужна область виртуальной памяти, которая всегда сопоставляется со всей физической памятью, а этого нельзя сделать, если виртуальное адресное пространство меньше физического.

Прямой доступ также быстрее,vm/highmem.txtв документации ядра говорится:

The cost of creating temporary mappings can be quite high. The arch has to manipulate the kernel's page tables, the data TLB and/or the MMU's registers.

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

Все это представляет собой своего рода переключение банков , которое использовалось в 16 -битных машинах,и в системах 386/486 в эпоху DOS -(HIMEM.SYS). Я не думаю, что кому-то особенно нравился такой доступ к памяти даже тогда, поскольку это довольно усложняет задачу, если вам нужно иметь несколько областей физической памяти «открытыми» одновременно. Эволюция до 32 -, а затем до 64 -битных систем решила эту проблему.

2
27.01.2020, 23:18

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

вам нужно продолжить чтение, посмотрите внимательно.

The limitation on how much memory can be directly mapped with logical addresses remains, however. Only the lowest portion of memory (up to 1 or 2 GB, depending on the hardware and the kernel configuration) has logical addresses;[2] the rest (high memory) does not. Before accessing a specific high-memory page, the kernel must set up an explicit virtual mapping to make that page available in the kernel's address space. Thus, many kernel data structures must be placed in low memory; high memory tends to be reserved for user-space process pages.


If the kernel is running in the context of a process (handling a syscall), the process' page tables will still be loaded, so why can't the kernel read usermode process memory directly?

да

https://www.quora.com/Linux-Kernel-How-does-copy_to_user-work


Также может быть полезно понять, что обычное использование kmalloc()для выделения структур в ядре возвращает память, которая находится в пределах прямого отображения ~1 ГБ. Так что это прекрасно и легко получить доступ.

(Компромисс заключается в том, что он вводит сложность в виде этих различных типов распределений.

Если вы хотите, чтобы стандартные kmalloc()выделения могли использовать более 25% ОЗУ, вы делаете что-то довольно требовательное... В более специализированных случаях вы можете установить флаг GFP _HIGHMEM и карту & отключите память по мере необходимости. Но официальный ответ заключается в том, что вы просто не должны пытаться запускать такую ​​ресурсоемкую рабочую нагрузку на устаревших 32-битных -битных системах, заполненных более чем 30-битной физической оперативной памятью ).

Если вас действительно интересует эта конкретная деталь, я заметил еще две вещи.

1. Ограничение в 1 ГБ действительно накладывает ограничение на ОЗУ, но оно немного выше.

https://www.redhat.com/archives/rhl-devel-list/2005-January/msg00092.html

A bit of googling indicates that the 4G:4G patch is needed for systems with a lot of RAM (eg. 32 GB or more) because the kernel memory tables scale with the size of physical memory and a 32 GB system uses 0.5 GB for the table, half the kernel space available to a 3G:1G system. A 64 GB system won't boot because all of kernel memory is needed for the table.

Патч 4G :4G — это другое дело, но вы, вероятно, можете его игнорировать, его нет в основной версии Linux.

Похоже, это ограничение также было преодолено, так как теперь можно включить CONFIG _HIGHMEM64G (на i386, т. е. 32 -бит ). Наверное, лучше не полагаться на это. Или слишком много думать о том, что он должен делать.

2. Прямое отображение не обязательно для таблиц страниц.

Во многих популярных учебниках и пошаговых руководствах по написанию ОС используется умопомрачительный -прием под названием «рекурсивные таблицы страниц».

https://www.google.co.uk/search?q=recursive+page+tables

В Linux такой подход не использовался, поэтому традиционный Linux проще для понимания.Прямое сопоставление ~1 ГБ «малой памяти» устанавливается в начальной таблице страниц и никогда не изменяется. А таблицы страниц выделяются изнутри "мало памяти".

(Думаете ли вы о том, что сейчас делает CONFIG _HIGHMEM64G? Прекрати, это вредно для тебя.)

Я полагаю, Линус просто не додумался до рекурсивного трюка. IIRC есть и другие недостатки, связанные с отсутствием прямого отображения хорошего размера, но я не уверен в конкретных примерах.

Я говорю "традиционный Linux". Я еще не слышал, действительно ли KPTI был объединен для 32 -бит... но в любом случае KPTI не должен менять общую идею. Как только вы переключитесь с пользователя на таблицы страниц ядра, ядро ​​сможет получить доступ к прямому отображению. Процесс переключения представляет собой удивительную черную магию, но он просто выполняется при каждом переключении контекста. Таблицы страниц пользовательского пространства не включают прямое сопоставление, но пользовательское пространство не имеет и не должно обращаться к таблицам страниц и т. Д., Так что все в порядке.

1
27.01.2020, 23:18

If the kernel is running in the context of a process (handling a syscall), the process' page tables will still be loaded, so why can't the kernel read usermode process memory directly?

Формулировка «адресное пространство ядра» в этом контексте не должна интерпретироваться как противоположная адресному пространству пользователя. Вместо этого имеется в виду, что память, к которой ядро ​​должно получить доступ, должна быть отображена на некоторые виртуальные адреса. Именно на это и пытается обратить внимание автор книги. Таким образом, «адресное пространство ядра» — это все отображение.

1
27.01.2020, 23:18

Теги

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