Войти

Показать полную графическую версию : Доступ к адресам в Linux


ruslandh
28-01-2002, 23:24
Os Linux

Есть устройство, которое кладет по прямому доступу в ОЗУ информацию.
Ему доступны только первые 16 MB памяти (работает с 24 разрядами)
Есть задача, которая загружается с диска (т.е. не имеет фиксированных адресов)
Как этой задаче получить информацию от устройства ?
1 Как выделить динамически память в первых 16 мб ОЗУ.
2 Как получить реальные адреса этой области для передачи устройству.

ivank
28-01-2002, 23:59
ruslandh
Я думаю, вы не очень то понимаете, как работает операционная система в защищённом режиме -- каждая задача имеет своё адресное пространство, т.е. то, что у одного процесса лежит по адресу 0x12345678, не совпадает с тем, что лежит в другом процессе по тому же адресу. Т.е. к физичесскому адресу обратиться из пользовательского(работающего в 3-ем кольце) процесса невозможно ни в одной современной ОСи.

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

Добавлено:

А вот и эта статья: http://www.programme.ru/index.phtml?arch/082001/082001_1.htm

ruslandh
29-01-2002, 00:57
Спасибо.
Про драйверы все понятно - но нужны конкретные запросы к ядру, в общем эта задача и есть драйвер - непонятно как раз, как привязаться к конкретным адресам.

(Отредактировал(а) ruslandh - 1:02 29-01-2002)

ivank
29-01-2002, 09:24
ruslandh
А поподробнее про само устройство можно узнать?

ruslandh
30-01-2002, 09:12
Устройство передачи данных - какая разница ?
Шина ISA.


(Отредактировал(а) ruslandh - 9:15 30-01-2002)

SK
03-02-2002, 17:59
Доброго времени суток! Уменя была похожая проблема С обменом по EPP протоколу. Если ты знаеш конкректные физические адреса регистров, попробуй следующие например ioperm(0x387,5,1)
эта команда даёт разрешение работать с конкретными адресами в
ВНИМАНИЕ !!! только UNIX, Linux
outb()- запись в регистры
inb()- считать из них

ruslandh
09-02-2002, 02:11
Здравствуйте !
По-моему Вы что-то путаете - это-же обращение к адресам портов, а не адресам ОЗУ ? Или это общий механизм ? Что очень странно.

<font size=dfontsize1 class=bgc1>Исправлено: ruslandh, 8:05 11-02-2002

ruslandh
25-02-2002, 06:48
Спасибо Всем, узнал:

char *buffer = kmalloc (size, GFP_KERNEL | GFP_DMA)
unsigned long buffer_phys = virt_to_bus (buffer);

Можно использовать только в ядре Linux




© OSzone.net 2001-2012