Перенос кода пользовательского пространства в пространство ядра
у меня есть большая система, написанная в основном на 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 ответов
я никогда не видел этого раньше. Я должен был сделать что-то подобное на предыдущей работе (в наших телефонах, по соображениям экономии энергии, мы должны были портировать часть кода из пользовательского пространства из ядра), но именно так я это сделал.. Я взял часть кода и переместил его, и небольшую часть при этом.
когда я это сделал, я изменил вызовы пользовательского пространства на вызовы ядра по ряду причин два основных:
он был менее запутанный таким образом (другие, глядя на код, не должны были задаваться вопросом, почему я вызывал "malloc" из ядра)
-
malloc
иkmalloc
не работают точно так же. Что я имею в виду2a.
kmalloc
принимает
пытаясь сделать мой код RTAI компилируемым как в пространстве пользователя, так и в пространстве ядра (а также работать с POSIX), я разработал URT что по сути делает то, что вы просите. Это легкий уровень абстракции над системами реального времени (и даже над несогласованными функциями RTAI пространства пользователя и пространства ядра).