Я изучаю реализацию kfifo.c в ядре Linux версии 2.6. Я не совсем понимаю, как указатели входа и выхода очереди обрабатывают оставшуюся часть.
Например, kfifo.c использует l = fifo->in - fifo->out для расчета пространства, используемого в очереди. Предположим, in = 0, out = 1, fifo->size = 8. И in, и out представляют собой беззнаковые целые числа, оба 32-битные. Таким образом, l = fifo->in - fifo->out будет 32 бита, 1 представляет собой 4294967295. Но фактически используемое пространство в очереди равно l = (fifo->in - fifo->out) & (fifo-> size-1) = 7
Итак, моя проблема: почему l не делает И с fifo->size-1?
unsigned int __kfifo_out_peek(struct __kfifo *fifo,
void *buf, unsigned int len)
{
unsigned int l;
l = fifo->in - fifo->out;
if (len > l)
len = l;
kfifo_copy_out(fifo, buf, len, fifo->out);
return len;
}
static void kfifo_copy_out(struct __kfifo *fifo, void *dst,
unsigned int len, unsigned int off)
{
unsigned int size = fifo->mask + 1;
unsigned int esize = fifo->esize;
unsigned int l;
off &= fifo->mask;
if (esize != 1) {
off *= esize;
size *= esize;
len *= esize;
}
l = min(len, size - off);
memcpy(dst, fifo->data + off, l);
memcpy(dst + l, fifo->data, len - l);
/*
* make sure that the data is copied before
* incrementing the fifo->out index counter
*/
smp_wmb();
}
Кроме того, у меня есть еще один вопрос: реализация kfifo_unused в kfifo.c. fifo->mask+1 представляет fifo->размер. Также предполагается, что вход = 0, выход = 1, fifo->size = 8. Следующий код вернет 9, но на самом деле используемое пространство должно быть 1.
static inline unsigned int kfifo_unused(struct __kfifo *fifo)
{
return (fifo->mask + 1) - (fifo->in - fifo->out);
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... nux-kernel
Проблема переноса целых чисел в kfifo.c в ядре Linux ⇐ Linux
-
Anonymous
1733291061
Anonymous
Я изучаю реализацию kfifo.c в ядре Linux версии 2.6. Я не совсем понимаю, как указатели входа и выхода очереди обрабатывают оставшуюся часть.
Например, kfifo.c использует l = fifo->in - fifo->out для расчета пространства, используемого в очереди. Предположим, in = 0, out = 1, fifo->size = 8. И in, и out представляют собой беззнаковые целые числа, оба 32-битные. Таким образом, l = fifo->in - fifo->out будет 32 бита, 1 представляет собой 4294967295. Но фактически используемое пространство в очереди равно l = (fifo->in - fifo->out) & (fifo-> size-1) = 7
Итак, моя проблема: почему l не делает И с fifo->size-1?
unsigned int __kfifo_out_peek(struct __kfifo *fifo,
void *buf, unsigned int len)
{
unsigned int l;
l = fifo->in - fifo->out;
if (len > l)
len = l;
kfifo_copy_out(fifo, buf, len, fifo->out);
return len;
}
static void kfifo_copy_out(struct __kfifo *fifo, void *dst,
unsigned int len, unsigned int off)
{
unsigned int size = fifo->mask + 1;
unsigned int esize = fifo->esize;
unsigned int l;
off &= fifo->mask;
if (esize != 1) {
off *= esize;
size *= esize;
len *= esize;
}
l = min(len, size - off);
memcpy(dst, fifo->data + off, l);
memcpy(dst + l, fifo->data, len - l);
/*
* make sure that the data is copied before
* incrementing the fifo->out index counter
*/
smp_wmb();
}
Кроме того, у меня есть еще один вопрос: реализация kfifo_unused в kfifo.c. fifo->mask+1 представляет fifo->размер. Также предполагается, что вход = 0, выход = 1, fifo->size = 8. Следующий код вернет 9, но на самом деле используемое пространство должно быть 1.
static inline unsigned int kfifo_unused(struct __kfifo *fifo)
{
return (fifo->mask + 1) - (fifo->in - fifo->out);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79250000/integer-wrapping-problem-in-kfifo-c-in-linux-kernel[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия