Доброго времени суток пытаюсь читать ин-ю из файла kmem Код (Text): #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> struct { unsigned short limit; off_t base; } __attribute__ ((packed)) idtr; main() { unsigned long addr=0x0; int f=open("/dev/kmem",O_RDONLY); if(f==-1) perror("Error fopen"); asm ("sidt %0" : "=m" (idtr)); printf("idt_offset:%x\n",idtr.base); if (pread(f,&addr,sizeof(unsigned long),idtr.base)==-1) perror("Error pread"); else printf("%x\n",addr); } в результате получаю следующее: Код (Text): slackware root # ./test idt_offset:80ca7000 Error pread: Invalid argument slackware root # тестирую на bluewhite64 ядро 2.6.25.4 обьясните почему нету ff ff ff ff передадресом idt и почему pread не работает ?
Где у тебя смещение? http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/mem.htm
проблему решил все нормально но по ходу определилась одна очень интересная деталь в 86-64 архитектуре в ядре две таблицы системных вызовов первая ia32_sys_call_table используется для 0х80 прерывания очевидно для совместимости с более ранними библиотеками/программами вторая sys_call_table используется в функцие system_call можете обьяснить кто ее вызывает и как происходит системный вызов в новой архитектуре
вызывается через инструкцию syscall код system_call тут http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/arch/x86/kernel/entry_64.S#L221 пиши конкретно, что непонятно