ОС XINU - Понимание функции roundmb - PullRequest
0 голосов
/ 19 октября 2018

Я изучаю ОС XINU и наткнулся на эту простую однострочную функцию.Можно ли объяснить, как работает эта функция, и округлить x до ближайшего размера блока для выделения памяти?Пожалуйста, не возражайте, если запрос слишком прост.Я также запутался, почему изменит его на указатель на символ.

/ * ----------------------------------------------------------------------

* roundmb, truncmb - округлить или усечь адрес до размера блока памяти

* ---------------------------------------------------------------------- * /

#define roundmb(x) (char *)( (7 + (uint32)(x)) & (~7) )

Ссылкана полный код XINU: https://github.com/xinu-os/xinu/blob/master/include/memory.h

1 Ответ

0 голосов
/ 19 октября 2018

Таким образом, это округляется до следующего коэффициента 8.

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

Первый реальный шагx + 7. Это увеличивает значение, поэтому нам нужно только округлить.

0 -> 7
1 -> 8
2 -> 10
7 -> 14
8 -> 15
9 -> 16

~ 7 - битовая маска, 0xFFFFFFF8.Я бы упростил и использовал 0xF8 при работе с небольшими числами.

Затем добавленная стоимость комбинируется с битовой маской.По сути, мы отбрасываем последние три бита.

0 -> 7  -> 0
1 -> 8  -> 8
2 -> 10 -> 8
7 -> 14 -> 8
8 -> 15 -> 8
9 -> 16 -> 16

Это число затем приводится к адресу памяти, отменяя первоначальное приведение к типу uint.Поскольку вы имеете дело с блоками памяти и, по-видимому, получаете доступ к данным внутри них, имеет смысл иметь их в качестве указателя.

...