чтение kallsyms

Тема в разделе "WASM.UNIX", создана пользователем featurelles, 4 июн 2010.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Froth
    чему равна длинна буфера? int buf_len;
     
  2. Froth

    Froth New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2010
    Сообщения:
    5
    featurelles
    ой блин, забыл. Задай любое значение, какими кусками ты хочешь его получать. Лучше наверное размер одной страницы - 4096.
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Froth
    Спасибо, завтра код проверю)
     
  4. Froth

    Froth New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2010
    Сообщения:
    5
    featurelles
    Если в одно целое потом собрать хочешь, то объяви какой-нить char file, а потом в этом цикле плюсуй к нему строку buf через strncat. главное буфер не забывай очищать на каждом шаге.
    Тело тогда будет примерно такое
    {
    offset+=ret;
    strncat( file, buf, ret);
    memset( buf, 0, buf_len);
    }
     
  5. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Код (Text):
    1. typedef struct {
    2.     char * name;
    3.     void * address;
    4. } ksymstr_t;
    5.  
    6. static int sym_resolve(ksymstr_t * s)
    7. {
    8.     int result = 0;
    9.     char * line, * str;
    10.     struct file * file;
    11.     mm_segment_t oldfs;
    12.  
    13.     oldfs = get_fs();
    14.     set_fs(KERNEL_DS);
    15.  
    16.     line = kmalloc(PAGE_SIZE, GFP_KERNEL);
    17.     if (!line) {
    18.         result = -ENOMEM;
    19.         goto return_result;
    20.     }
    21.  
    22.     file = filp_open("/proc/kallsyms", O_RDONLY, 0);
    23.     if (IS_ERR_OR_NULL(file)) {
    24.         result = -EINVAL;
    25.         goto return_result_free;
    26.     }
    27.  
    28.     file->f_pos = 0;
    29.     for (str = line; vfs_read(file, str, 1, &file->f_pos) == 1; str++) {
    30.         if (*str == '\n') {
    31.             *str = 0;
    32.             if (sym_match_line(line, s->name)) {
    33.                 if (sscanf(line, "%lx", (ulong *)&s->address) != 1)
    34.                     result = -EINVAL;
    35.                 break;
    36.             }
    37.             str = line - 1; /* as there will be (str++) */
    38.         }
    39.         cond_resched();
    40.     }
    41.  
    42.     filp_close(file, 0);
    43.  
    44. return_result_free:
    45.     kfree(line);
    46.  
    47. return_result:
    48.     set_fs(oldfs);
    49.     return result;
    50. }