2015-02-20 4 views
3

AM Я правильно заметил, что в случае любого распределения памяти, выполняемого в процедурах драйвера устройства, kzalloc предпочтительнее, чем kmalloc?Почему программирование драйвера предпочитает kzalloc over kmalloc

Я видел патчи ядра, заменяющие kmalloc + memset на kzalloc. Но я сомневаюсь, почему нужно вообще устанавливать содержимое памяти? Почему мы не можем просто использовать kmalloc, когда память, как ожидается, позже будет написана с соответствующим контентом?

+0

Что делать, если вы забыли написать память и прочитать ее. Или что, если вы читаете необнужденную память, прежде чем писать? –

ответ

2

Хорошо. Это не очень важно для ядра Linux и kmalloc/kzalloc как такового. Но его общая проблема в распределении и использовании памяти.

Эти ребята рассмотрели множество случаев того, что может произойти, если вы просто выполняете выделение и не обнуляете его. И это все еще пользовательский материал, представьте, что это происходит в ядре.

См: zeroing out memory

0

Это зависит от определения соответствующего содержания.

Если вы не заботитесь о содержимом памяти, вы можете просто использовать kmalloc; это случай распределения буфера, вы не заботитесь о первоначальном содержимом, потому что вы собираетесь написать свои данные. В этом случае вы сохраняете «стоимость» установки памяти на 0.

Но все по-другому, если вы собираетесь выделить память для структуры. Лично я предпочитаю kzalloc только тогда, когда хочу выделить структуры, где я собираюсь установить некоторое значение (отличное от 0), но в то же время я хочу установить все остальные поля структуры в известное и действительное состояние (нуль). Например:

struct test { 
    int counter; 
    void *buffer; 
    int n_data; 
}; 

В этом случае, если я буду использовать kzalloc спасу некоторые строки кода, потому что:

  • инициализировать счетчик 0 в начале, как правило, это хорошая вещь делать;
  • набор для NULL буфере это также хорошо, потому что я передать его позже, и установив его на NULL я могу просто написать следующее, потому что это известно состояние:

    if (!t->buffer) 
        t->buffer = kmalloc(10); 
    
  • установки количества данные n_data в ноль хороши, потому что буфер в начале пуст и не выделен.

Конечно, если в вашей структуре вы собираетесь установить вручную большинство полей со значением иной, чем ноль, то это сделать меньше смысла (по крайней мере для меня), чтобы инициализировать все к нулю с kzalloc

Смежные вопросы