/dev/kmem

Тема в разделе "WASM.UNIX", создана пользователем _ir4_Y_, 7 авг 2008.

  1. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Доброго времени суток
    пытаюсь читать ин-ю из файла kmem
    Код (Text):
    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/stat.h>
    4. #include <fcntl.h>
    5.  
    6. struct {
    7.         unsigned short limit;
    8.         off_t base;
    9. } __attribute__ ((packed)) idtr;
    10.  
    11. main()
    12. {
    13. unsigned long addr=0x0;
    14. int f=open("/dev/kmem",O_RDONLY);
    15. if(f==-1) perror("Error fopen");
    16. asm ("sidt %0" : "=m" (idtr));
    17. printf("idt_offset:%x\n",idtr.base);
    18. if (pread(f,&addr,sizeof(unsigned long),idtr.base)==-1)
    19. perror("Error pread");
    20. else
    21. printf("%x\n",addr);
    22. }
    в результате получаю следующее:
    Код (Text):
    1. slackware root # ./test            
    2. idt_offset:80ca7000
    3. Error pread: Invalid argument
    4. slackware root #
    тестирую на bluewhite64
    ядро 2.6.25.4

    обьясните
    почему нету ff ff ff ff передадресом idt
    и почему pread не работает ?
     
  2. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    Где у тебя смещение?

    http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/mem.htm
     
  3. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    смещение idtr.base
    если делать через lseek и read таже самая ошибка
     
  4. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    проблему решил все нормально
    но по ходу определилась одна очень интересная деталь в 86-64 архитектуре в ядре две таблицы системных вызовов
    первая ia32_sys_call_table используется для 0х80 прерывания
    очевидно для совместимости с более ранними библиотеками/программами

    вторая sys_call_table
    используется в функцие system_call
    можете обьяснить кто ее вызывает и как происходит системный вызов в новой архитектуре
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    вызывается через инструкцию syscall
    код system_call тут
    http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/arch/x86/kernel/entry_64.S#L221
    пиши конкретно, что непонятно