2014-10-29 2 views
1

Я использую sparse linux tool для очистки шума от кода. Предположим, я следующую структуру, определенную в файле abc.c, как:Разница между void __iomem * и void * __iomem?

static struct check1 { 
    void __iomem **base_regs; 
}; 

В этом же файле abc.c. Я следующую строку кода, а также (Пусть X натуральное число):

случай 1:

static struct check1 *check1_var; 
struct check2 { 
    void* __iomem base= check1_var -->base_regs[X]; 
} 

случай 2:

struct check2 { 
    void __iomem *base= check1_var-->base_regs[X]; 
} 

В случае 1, I я получаю следующее предупреждение

warning: incorrect type in initializer (different address spaces) 

Однако это предупреждение удаляется, когда я переключился на случай 2.

Мой вопрос: В чем разница между void __iomem * и void* __iomem. На мой взгляд, они должны быть одинаковыми? Пожалуйста, помогите мне здесь, я не понимаю, почему это предупреждение удаляется в случае 2.

+0

http://stackoverflow.com/questions/19100536/what-is-the-use-of-iomem-in-linux-while-writing-device-drivers –

+0

@ ANBU.SANKAR Спасибо, что поделились им здесь. Но я прошел через это, но не нашел ответа. Как вы можете видеть в 'struct check1'' base_regs' также помечен '__iomem', и в обоих случаях я назначаю указатель тега' __iomem', в чем разница. ? –

+2

@AmitSharma Читать это http://lwn.net/Articles/102232/. Это показывает аналогичное обсуждение https://lkml.org/lkml/2014/9/24/1187. – iqstatic

ответ

1

Как указано в упомянутой ссылке, ядро ​​2.6.9, а затем содержит ряд изменений, предназначенных для улучшения работы ядра с Память ввода-вывода. Первая из них - это новая аннотация для __iomem, используемая для обозначения указателей на память ввода/вывода. Эти аннотации работают так же, как маркеры __user, за исключением того, что они ссылаются на другое адресное пространство.

Это определение, как указано ниже:

# define __user   __attribute__((noderef, address_space(1))) 
# define __iomem  __attribute__((noderef, address_space(2))) 

Как __user, то __iomem маркер служит роль документации в коде ядра; он игнорируется компилятором. Однако при проверке кода с разреженным разработчики будут видеть совершенно новый набор предупреждений, вызванных кодом, который смешивает обычные указатели с указателями __iomem или отменяет ссылки на эти указатели.

void* __iomem и void __iomem * - это не то же самое. Последнее заключается в том, как это необходимо сделать, используя __iomem, который вы предоставляете атрибуту указателю base.

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