линейный адрес
объявляю структуру:
typedef struct {
int a;
int b;
} S1_t;
объявляю указатель на нее
S1_t *s1;
выделяю память
s1 = maaloc(sizeof(S1_t));
s1 это я так понял относительный адрес, а
как получить ЛИНЕЙНЫЙ адрес этой структуры ?
как получить ЛИНЕЙНЫЙ адрес этой структуры ?
Ну если ты толком не понимаешь, относительный адрес тебе дали или линейный, скажи - зачем тебе это надо??? Не парь себе мозгу :)
И еще это зависит от OC на которой программа компилиться будет, в виндах без разницы, все абсолютные, там только физический другой, причем в некоторый момент его может вообще не быть
данные лежат
- ОС linux
- с указателями дружу на уровне ПРИВЕТ МИР
так что строго не судите.
Разберитесь для начала с методами адресации - например - что в вашем понимании относительный адрес - относительный чего? предположения высказывать не буду.
"железяка просит линейный адрес по которому
данные лежат" - если вы не в состоянии понять что вам нужно сделать попробуйте или привести ошибку которую вы получаете, или хотябы название "железяки". Надо быть полным идиотом, что бы надеяться на то - что на форуме все телепаты и сразу догадаються в чем ваша проблема - и самое главное - что вы понимаете под термином "линейный адрес" - и откуда вы собственно вы термин взяли (смотри выше о "относительном адресе").
данные лежат
- ОС linux
- с указателями дружу на уровне ПРИВЕТ МИР
так что строго не судите.
Железо обычно просит физический адрес, и то если речь идёт о прямом обращении к памяти DMA, а линадрес может просить разве что драйвер.
Не знаю насчет линух, в винде любой адрес, которым оперирует приложение, и есть линейный адрес (т. е. базовый адрес всех сегментов = 0). В линухе не знаю, даже если там не так, указатель наверняка подразумевает под собой понятие как смещения, так и селектора сегмента (формат: 16 бит-селектор, 32 бит-смещение). Смещение - это и есть, наверное, то, что вы подразумеваете под "относительным адресом". У приложения нет "простого" способа узнать линейный адрес исходя из селектора и смещения, тут наверняка должны быть функции в API, которые выдают линейный адрес.
Но я на 95% уверен, что в линухе линейный адрес, как и в винде, совпадает со смещением, т. е. базовые адреса всех сегментов = 0. Так что париться не надо.
http://www.codenet.ru/cat/Other/low-level/
Вам будет полезно почитать, кстати, kot_'у тоже
хм. не все йогурты одинаково полезны :) и как статья связана с обсуждаемой темой?
в вашем случае надо писать "не всеМ йогурты одинаково полезны" )
Речь всё ещё идёт о линейных/относительных и т. д. адресах? Тогда связь со статьёй прямая, особенно со второй частью http://www.codenet.ru/progr/os/RAM/RAM-2.php
лучше молчать чем флудить
to cheburator
спасибо за статьи, почитал
и вот что подумал:
всетаки действительно физический адрес узнать нужно,
а линейным он назвался потому что нужно при
линейном режиме адресации физичиские
и линейные адреса совпадают,отсюда следует
что нужно или перейти в линейный режим адресации
( читал что под ДОС для этого нужно замутить с дополнительными
сегментными регистрами FS или GS), будит ли это
работать под линуксом не знаю
или c DMA разбираться
Насколько я помню - нужно перейти в "нереальный" (unreal) режим. Это не баг, это фича :)
Так все-таки, какая ОС требуется? В современных ОС защищенного режима это, скорее всего, получится лишь из драйвера..
Так все-таки, какая ОС требуется? В современных ОС защищенного режима это, скорее всего, получится лишь из драйвера..
ОС Линукс
Если это получится, что произойдет с дугими процессами
в системе?
Ну если граммотно драйвер напишешь то ничего особенного. Так железяка-то через DMA работает, выходит. Значит память надо выделить в режиме ядра (в драйвере)