Гость Опубликовано 15 ноября, 2004 Жалоба Опубликовано 15 ноября, 2004 Я пишу, а точнее переношу драйвер под 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 Что это такое? И как с этим можно справиться? Цитата
EL[michlen] Опубликовано 15 ноября, 2004 Жалоба Опубликовано 15 ноября, 2004 Сдается мне, что в процедуре инициализации драйвер лезет куда не надо в память, вот ядро и матерится. Впрочем, я не уверен. Может исходничек процедуры сюда, хотя бы частично? Или это закрытый проект? Цитата
Гость Опубликовано 16 ноября, 2004 Жалоба Опубликовано 16 ноября, 2004 Да нет, какой закрытый. Линух же всё-таки. К тому же этот кусочек - стандартный драйвер для 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. Вот такая примерно схема. Очень буду признателен любым идеям. Цитата
EL[michlen] Опубликовано 17 ноября, 2004 Жалоба Опубликовано 17 ноября, 2004 То есть, он выводит, что "not 100% native mode, will probe irqs later", а к установке портов уже не переходит? Да, хотел посоветовать проверить указатель на d, потом дошло, что раз он выводит d->name, то указатель нормальный. Бум думать... =) Кстати, такой вопрос: а что такое tsk->{mm,active_mm} и tsk->{mm,active_mm}? Что-то линуховое, связанное с памятью, или конкретно в ide*.c? З.Ы. Самому интересно теперь стало... =) Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.