Перенос кода пользовательского пространства в пространство ядра

у меня есть большая система, написанная в основном на C, которая до сих пор работала в пользовательском пространстве. Теперь мне нужно скомпилировать код как модуль ядра. Для этого, afaik, я должен хотя бы переписать код и заменить функции как malloc, calloc, free, printf С их эквивалентами ядра, потому что это исключительно функции пользовательского пространства. Проблема, однако, в том, что у меня нет исходного кода для некоторых пользовательских библиотек, используемых в системе, и эти библиотеки называют malloc etc. внутри свои функции. Так что, в принципе, мне, возможно, придется переделать всю библиотеку.

теперь вопрос: будет ли это действительно грязный хак, Если я напишу свою собственную реализацию malloc как обертка вокруг kmalloc, что-то вроде этого:

void *malloc(size_t size) {
    return kmalloc(size, GFP_USER);
}

затем свяжите эту реализацию с системным кодом, который устранит все неизвестный символ в модуле ошибки.

на самом деле я думал, что это будет общая проблема, и кто-то бы уже написал такую обертку kmalloc, но я гуглил уже пару дней и не нашел ничего полезного.

EDIT: причина этого заключается в том, что система, о которой я говорю, была приложением в реальном времени, работающим на VxWorks realtime OS, и теперь мы хотим перенести его на Linux RTAI, где приложения в основном работают в пространстве ядра. Но я думаю, что есть возможность иметь реальное время в пользовательском пространстве, поэтому я, вероятно, должен сделать так, как предложил Майк, и отделить код в части ядра и пользовательского пространства и общаться между ними с общей памятью.

2 ответов


я никогда не видел этого раньше. Я должен был сделать что-то подобное на предыдущей работе (в наших телефонах, по соображениям экономии энергии, мы должны были портировать часть кода из пользовательского пространства из ядра), но именно так я это сделал.. Я взял часть кода и переместил его, и небольшую часть при этом.

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

  1. он был менее запутанный таким образом (другие, глядя на код, не должны были задаваться вопросом, почему я вызывал "malloc" из ядра)

  2. malloc и kmalloc не работают точно так же. Что я имею в виду

    2a. kmalloc принимает


пытаясь сделать мой код RTAI компилируемым как в пространстве пользователя, так и в пространстве ядра (а также работать с POSIX), я разработал URT что по сути делает то, что вы просите. Это легкий уровень абстракции над системами реального времени (и даже над несогласованными функциями RTAI пространства пользователя и пространства ядра).