System Programming
IT Standards
Computer hardware
Old hardware
Periphery
Comments 5
+4
hc->frameList = VMAlloc(1024 * sizeof(u32) + 8292);
hc->frameList = ((int)hc->frameList / 4096) * 4096 + 4096;
hc->qhPool = (UhciQH *)VMAlloc(sizeof(UhciQH) * MAX_QH + 8292);
hc->qhPool = ((int)hc->qhPool / 4096) * 4096 + 4096;
hc->tdPool = (UhciTD *)VMAlloc(sizeof(UhciTD) * MAX_TD + 8292);
hc->tdPool = ((int)hc->tdPool / 4096) * 4096 + 4096;

memset(hc->qhPool, 0, sizeof(UhciQH) * MAX_QH);
memset(hc->tdPool, 0, sizeof(UhciTD) * MAX_TD);
memset(hc->frameList, 0, 4 * 1024);

Не делайте так никогда, пожалуйста.

Если вам нужно выделить памяти с определенным выравниванием, сделайте функцию для этого, какую-нибудь VMAllocAligned(), принимающую выравнивание в качестве параметра.
Сейчас у вас в коде куча магических констант (8292 выглядит как опечатка в 8192, например), памяти выделено больше чем нужно (и потому guard page при выходе за границы может не сработать), вызов VMFree на любой из выделенных подобным образом указателей освободит что-то непонятное в большинстве случаев, а memset зануляет не весь выделенный буфер.
+1
Соглашусь. Кроме того, код в статье, как бы это сказать, не вполне «оригинальный». Оригинал здесь: github.com/pdoane/osdev/blob/master/usb/uhci.c
Понятно, что «мы все учились понемногу...», но источники ведь тоже нужно не забывать указывать.
0
Эти драйвера мы писали с другом 6 лет назад, так что код вполне оригинальный.
+2
hc->qhPool = ((int)hc->qhPool / 4096) * 4096 + 4096;

Где-то заплакал один uintptr_t

Впрочем в оригинале никаких выравниваний нет, т.к. VMAlloc возвращает адрес уже выравненный на страницу.
Only those users with full accounts are able to leave comments. , please.