LINUX.ORG.RU

pointer-or-integer

 


0

1

Какой грязный трюк посоветует многоуважаемый $all, если нужно передать параметр, который может означать либо целочисленный интервал (допустим <= 10000000), либо указатель. Переносимость не требуется. Linux x86/x86_64, userspace.

Навскидку хочется сравнивать переданный параметр с какой-то константой. Для 32 бит вроде как можно передавать константу как x < 1G, т. к. нижняя часть адресного пространства отдана ядру. Валидна ли подобная магия для 64 бит?

Почему не передать просто структуру, в которой union и флажок, говорящий о типе? Или тебя оверхед волнует?

devsdc ★★
()
Ответ на: комментарий от devsdc

Слишком просто и очевидно. С таким подходом быдлокода не напишешь.

Stahl ★★☆
()

если нужно передать параметр, который может означать либо целочисленный интервал (допустим <= 10000000), либо указатель

Не нужно. Переставай быдлокодить и иди в дворники.

Pavval ★★★★★
()

На x86_64 есть понятие Canonical Address. Суть в том, что на самом деле адреса 48-битные, а 64-битные только регистры. Как получается 64-битный адрес? Берётся 48-битный адрес и расширяется до 64-бит с дополнение знака. То есть 0x7FFFFFFFFFFF превращается в 0x00007FFFFFFFFFFF, а 0x800000000000 в 0xFFFF800000000000. И так далее. Это значит, что диапазон адресов с 0x0000800000000000 по 0xFFFF7FFFFFFFFFFF невалиден аппаратно. То есть не может принадлежать ни приложению, ни ядру. При попытке обращения по такому адресу происходит исключение.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

диапазон адресов с 0x0000800000000000 по 0xFFFF7FFFFFFFFFFF невалиден аппаратно

Спасибо, то что нужно!

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от tailgunner

Используй младший бит в роли тега.

Плюсадин.

Но, как обычно, раз ТС об этом спрашивает, значит, ему ещё нельзя подобное делать.

const86 ★★★★★
()

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

anonymous
()
Ответ на: комментарий от kawaii_neko

обойтись без макросов для передачи чисел как в 32 битах

Что это значит и откуда вдруг возникли макросы? Кстати, не отходя от кассы, 32-битный процесс на 64-битном ядре легко может занять практически всё своё 32-битное адресное пространство (на линуксе только две страницы недосягаемы в штатных условиях). Древние легенды о гигабайтах, зарезервированных для ядра, рушатся о суровую реальность.

const86 ★★★★★
()
Ответ на: комментарий от anonymous

это хак и не переносимый код

Не переносимый куда? Меня интересует Linux 2.6.32+, x86_64 и в качестве бонуса неплохо запускаться и на 32 битах. И на этих архитектурах как раз таки можно практически без потерь забивать на выравнивание, в отличие от всяких армов, где шаг влево, шаг вправо и привет, SIGBUS!

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от const86

Кстати, не отходя от кассы, 32-битный процесс на 64-битном ядре легко может занять практически всё своё 32-битное адресное пространство

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

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от Pavval

Нужно. Так делают, например, движки js. На линуксе, например, старшие 13 (не уверен) бит адреса не используются, на солярке используются, но там в другом месте дыра. Младшие 3 бита на амд64 не используются и тп.

anonymous
()
Ответ на: комментарий от anonymous

Нужно.

4.2

Так делают, например, движки js.

Ну мы за них офигеть рады.

Pavval ★★★★★
()
Ответ на: комментарий от gavlig

А можешь рассказать, что заставляет так поступать?

Не могу найти свободный бит в структуре, а целых 4(8) байт под флажок выделять жалко.

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от gavlig

Структур много. 3 (7) * много = много, а память и без того есть чем занять.

kawaii_neko ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.