Я работаю над драйвером ядра Linux, который делает часть физической памяти доступной для пространства пользователя. У меня есть рабочая версия драйвера, но в настоящее время она очень медленная. Итак, я сделал несколько шагов назад и попытался создать небольшой простой драйвер, чтобы воссоздать проблему.
Я резервирую память во время загрузки, используя параметр ядра memmap=2G$1G
. Затем, в функции __init
драйвера, я ioremap
часть этой памяти, и инициализировать ее для известного значения. Я также ввел некоторый код для измерения времени:
#define RESERVED_REGION_SIZE (1 * 1024 * 1024 * 1024) // 1GB
#define RESERVED_REGION_OFFSET (1 * 1024 * 1024 * 1024) // 1GB
static int __init memdrv_init(void)
{
struct timeval t1, t2;
printk(KERN_INFO "[memdriver] init\n");
// Remap reserved physical memory (that we grabbed at boot time)
do_gettimeofday( &t1 );
reservedBlock = ioremap( RESERVED_REGION_OFFSET, RESERVED_REGION_SIZE );
do_gettimeofday( &t2 );
printk( KERN_ERR "[memdriver] ioremap() took %d usec\n", usec_diff( &t2, &t1 ) );
// Set the memory to a known value
do_gettimeofday( &t1 );
memset( reservedBlock, 0xAB, RESERVED_REGION_SIZE );
do_gettimeofday( &t2 );
printk( KERN_ERR "[memdriver] memset() took %d usec\n", usec_diff( &t2, &t1 ) );
// Register the character device
...
return 0;
}
Я загружаю драйвер и проверяю dmesg. Сообщает:
[memdriver] init
[memdriver] ioremap() took 76268 usec
[memdriver] memset() took 12622779 usec
Это 12,6 секунды для memset. Это означает, что memset работает со скоростью 81 МБ / с . С какой стати это так медленно?
Это ядро 2.6.34 в Fedora 13 и система x86_64.
EDIT:
Цель этой схемы - взять часть физической памяти и сделать ее доступной как для устройства PCI (через шину / физический адрес памяти), так и для приложения в пространстве пользователя (через вызов mmap
, поддерживаемый водитель). Устройство PCI будет постоянно заполнять эту память данными, а приложение из пользовательского пространства будет их считывать. Если ioremap
- плохой способ сделать это (как предложил Бен ниже), я открыт для других предложений, которые позволят мне получить любой большой кусок памяти, к которому могут напрямую обращаться как аппаратные, так и программные средства. Я, вероятно, также могу обойтись меньшим буфером.
См. Мое возможное решение ниже.