указатель большого размера в gcc - PullRequest
2 голосов
/ 13 февраля 2012

Я хочу определить указатель большого размера (64-битный или 128-битный) в gcc, который не зависит от платформы.Я думаю, что в MSDN есть что-то вроде __ptr128 или __ptr64.

sizeof(__ptr128) is 16 bytes.
sizeof(__ptr64 ) is 8  bytes.

возможно ли это?

это может быть полезно, когда вы используете функции ядра в 64-битной ОС, для которых требуется аргумент указателя 8 байти у вас есть 32-битное приложение, которое использует 32-битный адрес, и вы хотите использовать эту функцию ядра.

Ответы [ 4 ]

7 голосов
/ 13 февраля 2012

Ваш вопрос не имеет смысла.Указатели, по определению, являются адресом памяти для чего-либо - размер должен зависеть от платформы.Как бы вы разыменовали 128-битный указатель на аппаратной платформе, поддерживающей 64-битную адресацию?!

Вы можете создать 64 или 128-битные значения , но указатель напрямую связан сСхема адресации памяти базового оборудования.

РЕДАКТИРОВАТЬ

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

Хотя технически возможно смешивать 64-битные инструкции в 32-битном исполняемом файле, ни один компилятор не позволит вам сделать это.64-битный вызов API будет использовать 64-битный код, 64-битные регистры и 64-битный стек - компилятору и операционной системе будет крайне неудобно управлять произвольным переключением из 32-битной среды в 64-битнуюenvironment.

Вы должны найти эквивалентный API для 32-битной среды.Возможно, вы могли бы опубликовать прототип функции ядра (имя + параметры), который вы хотите использовать, и кто-то может помочь вам найти лучшее решение.

Просто, чтобы не было путаницы, __ptr64 в MSDN это не независимость от платформы:

В 32-разрядной системе указатель, объявленный с помощью __ptr64, усекается до 32-разрядного указателя.

0 голосов
/ 07 июня 2018

Нет, потому что gcc не был разработан для встроенных архитектур.Существуют архитектуры, в которых существуют указатели нескольких размеров, например m16c: ram имеет 16-битные адреса, а rom (flash) имеет 20-битные адреса в одном и том же адресном пространстве.Использование производительности и размера лучше для указателей меньшего размера.

0 голосов
/ 15 марта 2018

Я опаздываю на вечеринку, но этот вопрос имеет большой смысл во встроенных платформах.

Если вы объединяете ЦП с некоторыми дополнительными ускорителями в одном SOC, им не обязательно нужноиметь одинаковое адресное пространство или адресное пространство размер .

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

Например, при использовании 64-разрядного ЦП и 32-разрядного ускорителя указатель для встроенного программного обеспечения может охватывать 32-разрядное адресное пространство, а указатель для ЦП - 64-разрядное адресное пространство,В C нет двух или более типов void * в зависимости от адресного пространства, с которым вы хотите поговорить.

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

0 голосов
/ 10 июля 2015

Нельзя комментировать, но утверждение о том, что вы не можете использовать 64-битные инструкции в «32-битном исполняемом файле», вводит в заблуждение, поскольку определение «32-битного исполняемого файла» подлежит интерпретации. Если вы имеете в виду исполняемый файл, который использует 32-битные указатели, то нет ничего, что говорит о том, что вы не можете использовать инструкции, которые манипулируют 64-битными значениями при использовании 32-битных указателей. Процессор не знает разницы.

Linux даже поддерживает режим, в котором вы можете иметь 32-битное пространство пользователя и 64-битное пространство ядра. Таким образом, каждое приложение имеет доступ к 4 ГБ ОЗУ, но система может получить доступ к гораздо большему. Это уменьшает размер ваших указателей до 4 байтов, но не ограничивает использование 64-битных манипуляций с данными.

...