Перейти к содержанию

Проблема при написании драйвера: ошибка обращения по виртуальному адресу


Гость

Рекомендуемые сообщения

Я пишу, а точнее переношу драйвер под IDE-контроллер (ядро 2.4) с платформы х86 на спарковую машину. Драйвер под PCI-шину уже есть и нормально работает. Под 2.4 отдельного драйвера для моего контроллера (Promise 133tx2) нет. Он (драйвер) входит в общий драйвер для IDE-интерфейса (который поддерживает и поиск контроллера на PCI-шине) и вызывает, как свою чатсь, драйвер для контроллера.

Вопрос вот какой.

Вот печати инициализации драйвера (выводятся в консоли):

Uniform Multi-Platform E-IDE driver Revision: 6.31

ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx

PDC20269: IDE controller on PCI bus 00 dev 28

PDC20269: chipset revision 2

PDC20269: not 100% native mode: will probe irqs later

И это есть всё правильно и нормально. Контроллер найден и дальше IDE-драйвер пробует передать управление процедуре инициализации моего контроллера (его части: драйверу контроллера). И на этом самом месте процесс убивается ядром вот с такими матюгами:

Unable to handle kernel paging request at virtual address 02000000

tsk->{mm,active_mm}->context = 000002ca

tsk->{mm,active_mm}->pgd = fc079400

\|/ ____ \|/

"@'/ ,. \`@"

/_| \__/ |_\

\__U_/

insmod(732): Oops

PSR: 418000c1 PC: ff44dfc8 NPC: ff44dfcc Y: 00000000 Not tainted

g0: f22d5000 g1: 41800fe0 g2: 00000001 g3: 41400fe1 g4: f002d2b8 g5: 53545556 g6: f2220000 g7: 00000000

o0: ff451000 o1: 000015c1 o2: f020ac00 o3: 000015c2 o4: 00004000 o5: f020ac00 sp: f2221b40 o7: f002d1b8

l0: f01b8400 l1: f02068fe l2: 02000520 l3: f020ac00 l4: f01b86a4 l5: f01b83e0 l6: f2220000 l7: f37313e0

i0: f053a800 i1: ff44fd30 i2: ff44dfbc i3: f01b86ac i4: 00004000 i5: f020ac00 fp: f2221bb0 i7: ff44a650

Caller[ff44a650]

Caller[ff44b004]

Caller[ff44b044]

Caller[ff447d44]

Caller[ff447d58]

Caller[ff448358]

Caller[ff448428]

Caller[f002e308]

Caller[f00113b8]

Caller[000378b0]

Instruction DUMP: 9de3bf90 e40620d4 113fd144 <e80ca01f> 90122368 e60ca01a a2100014 e00ca01b 7c2f7c13

Что это такое? И как с этим можно справиться?

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Да нет, какой закрытый. Линух же всё-таки. К тому же этот кусочек - стандартный драйвер для 2.4

Вот он (выдаю только значащие строки):

Есть файл ide.c, он, собственно, всем заправляет. В том числе и файлом ide-pci.c, который ищет устройства на PCI-шине.

Но он в данном случае скорее всего верно работает. Тем не менее, вид всё это имеет такой:

В ide-pci.c опеределены такие штуки:

extern unsigned int pci_init_pdc202xx(struct pci_dev *, const char *); (це процедура инифиализации драйвера самого контроллера, именно на вызове её всё, как мне представляется, и сыпется)

extern unsigned int ata66_pdc202xx(ide_hwif_t *); (это прочие прибамбасы, связанные с заданием парметров DMA и самого жесткого диска - см. ниже строчкой)

extern void ide_init_pdc202xx(ide_hwif_t *);

#define PCI_PDC202XX &pci_init_pdc202xx (это макросы соответственно)

#define ATA66_PDC202XX &ata66_pdc202xx

#define INIT_PDC202XX &ide_init_pdc202xx

...

#define DEVID_PDC20269 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20269})

Далее, есть typedef^

typedef struct ide_pci_device_s {

ide_pci_devid_t devid;

char *name;

unsigned int (*init_chipset)(struct pci_dev *dev, const char *name);

unsigned int (*ata66_check)(ide_hwif_t *hwif);

void (*init_hwif)(ide_hwif_t *hwif);

void (*dma_init)(ide_hwif_t *hwif, unsigned long dmabase);

ide_pci_enablebit_t enablebits[2];

byte bootable;

unsigned int extra;

} ide_pci_device_t;

и структура, вот нужный из неё кусок:

static ide_pci_device_t ide_pci_chipsets[] __initdata = {

...

{DEVID_PDC20269,"PDC20269", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 16 },

...

}

Это, собственно, параметры инициализации контроллера в случае его нахождения на шине.

Далее, есть процедурка, которая делает следующее:

ide_pci_device_t *d

...

pciirq = (d->init_chipset) ? d->init_chipset(dev, d->name) : ide_special_settings(dev, d->name);

*d, естественно, указывает на наш кусок структуры, который выше описан. То есть, как видно, последняя строка кода вызвает процедуру pci_init_pdc202xx (она находится в файле pdc202xx.c) и на неё и засыпается. И эта процедура есть процедура инициализации дравера контроллера Promise Ultra133 tx2.

Вот такая примерно схема. Очень буду признателен любым идеям. Smile

Ссылка на комментарий
Поделиться на другие сайты

То есть, он выводит, что "not 100% native mode, will probe irqs later", а к установке портов уже не переходит? Да, хотел посоветовать проверить указатель на d, потом дошло, что раз он выводит d->name, то указатель нормальный. Бум думать... =)

Кстати, такой вопрос: а что такое tsk->{mm,active_mm} и tsk->{mm,active_mm}? Что-то линуховое, связанное с памятью, или конкретно в ide*.c?

З.Ы. Самому интересно теперь стало... =)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...