Здравствуйте!
Пытаюсь заставить работать на новом ядре драйвер и тестовую программу к нему, которые были написаны лет пять назад для этого же железа, но для старого ядра. В те времена все работало отлично.
Компьютер одноплатный. Загрузочная карта памяти содержит linux с ядром 3.10.12 и файлом initrd.img, сделанным так, чтобы постоянная файловая система не монтировалась, а работа велась в initrd, который крутится в оперативной памяти. Ядро было довольно сильно урезано, для экономии памяти.
Драйвер создан для сигнального процессора, который связан с одноплатным компьютером через PCI шину (и компьютер и плата содержащая процессор вставляются в PCI слоты в одной стойке). Драйвер успешно распознает процессор и загружается в систему.
Этот драйвер позволяет загружать данные с хоста (одноплатного компьютера) прямо в память сигнального процессора. Тестовая программа собственно это и делает.
В коде драйвера, в структуре file_operations, определена функция .mmap, которая, насколько я понимаю, производит отображение памяти процессора в пространство ядра. Функция mmap заключается в вызове функции remap_pfn_range(). Именно на вызове этой функции вылетает следующая ошибка и вся система перестает работать (здесь linkdrv это драйвер, а BoardTest это тестовая программа):
--------[ cut here ]--------
kernel BUG at mm/memory.c :2377!
invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC
Modules linked in: linkdrv(0)
CPU: 1 PID: 851 Comm: BoardTest Tainted: G 0 3.10.12 #10
Hardware name: /F15, BIOS F15r1-Q.11 10/17/2006
task: f6581950 ti: f5c5c000 task.ti: f5c5c000
EIP: 0060:[<c10aeac4>] EFLAGS: 00010246 CPU: 1
EIP is at remap_pfn_range+0x75/0x191
ЕАХ: 00000000 EBX: b72f5000 ECX: b72f5000 EDX: 00000000
ESI: f6616c08 EDI: 00040000 EBP: f5c5ded8 ESP: f5c5de9c
DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
CR0: 80050033 CR2: b760а890 CR3: 35c2f000 CR4: 000007d0
DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
DR6: ffff0ff0 DR7: 00000400
Stack:
f5c5ded8 с10b2b9с f67d3540 00000200 f65175ac 00000003
00000000 b72f5000 00000000 f5c5ded0 f678ce00 f6616c08
f8028123 00000000 00000027 f6616c08 b74f5000 f5c5df24
Call Trace:
[<c10b2b9c>] ? vma_merge+0x148/0xlc5
[<f80281Z3>] Mmар+0х4а/0х51 [linkdrv]
[<c10b3fl6>] mmap_region+0x20d/0x3c8
[<c10b4330>] do_mmap_pgoff+0x25f/0x2d5
[<c10a9a3c>] vw_mmap_pgoff+0x54/0x7d
[<c10b2d96>] SyS_mmap_pgoff+0xllf/0x159
[<c14a2558>] syscall_call+0x7/0xb
Code: 04 75 ec 89 7e 4c ff 75 ec 89 f9 8d 55 0c 89 f0 53 e8 88 36
EIP: [<c10aeac4>] remap_pfn_range+0x75/0x191 SS:ESP 0068:f5c5de9c
---[ end trace b23282ceb98d656f ]---
Подскажите пожалуйста, в чем может быть причина этой ошибки и в чем она вообще заключается? Насколько я понимаю, проблема больше в ядре(ведь драйвер раньше работал). Возможно нужно что-то изменить в конфигах? Если так, то что именно?
Заранее спасибо за любую помощь!