Скомпилируйте ядро Linux (2.6) модуль включая не заголовки ядрa

Вы используете функцию до ее объявления. Или объявите это вперед и объявите после или переместите объявление до main().

То, что вы сделали в своем коде, - это прямое объявление, а затем объявление внутри main() , что не является правильным местом для этого кода.

Он должен быть вне основной функции.

Самое простое исправление здесь - исключить предварительное объявление и вместо этого объявить функцию:

#include <stdio.h>

double Calculate_charge(double y)
{
    if (kwh <= 300) {
        y = .09 * kwh;  
    }
    else if (kwh > 300 &&  kwh <= 600){
        y = .08 * kwh;
    }
    else if (kwh > 600 && kwh <= 1000){
        y = .06 *kwh;
    }
    else {
        y = .05 * kwh;
    }
    return y;
}

int main() {
  // ...

  return 0;
}
7
задан Mike Hamer 3 May 2009 в 16:56
поделиться

2 ответа

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

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

Невозможно связать ядро ​​с библиотеками, предназначенными для использования в пространстве пользователя - даже если они не делают никаких вызовов ОС - потому что среда связывания в ядре не может их забрать.

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


Последние версии linux в любом случае содержат криптографические функции, включая различные хэши SHA - возможно, вместо этого вы можете использовать одну из них.


Другая идея - перестать пытаться сделать шифрование в пространстве ядра и переместить код в пространство пользователя. Код пользовательского пространства легче писать / отлаживать / поддерживать и т. Д.


Другая идея - перестать пытаться делать криптографию в пространстве ядра и переместить код в пространство пользователя. Код пользовательского пространства легче писать / отлаживать / поддерживать и т. Д.


Другая идея - перестать пытаться делать криптографию в пространстве ядра и переместить код в пространство пользователя. Код пользовательского пространства легче писать / отлаживать / поддерживать и т. Д.

11
ответ дан 6 December 2019 в 11:52
поделиться

Я взял биты кода пользовательского пространства, который я написал, и преобразовал его для работы в пространстве ядра (т.е. используя kmalloc () и т. Д.), Это не так сложно. Однако вы ограничены пониманием ядра C, а не пользовательского пространства, которое немного отличается ... особенно с различными стандартными типами int.

Простое связывание с DSO пользовательского пространства невозможно - ядро ​​Linux является монолитным, полностью автономным. Он не использует пользовательское пространство libc, библиотеки или другие биты, как отметили другие.

9/10 раз вы найдете то, что вам нужно где-нибудь в ядре. Вполне вероятно, что кто-то еще столкнулся с той же потребностью, что и у вас, и написал несколько статических функций в каком-то модуле, чтобы делать то, что вы хотите ... просто захватите их и используйте их повторно.

В случае криптографии, как говорили другие , просто используйте то, что в ядре. Стоит отметить, что вам нужно, чтобы они были включены в kconfig, что может происходить или не происходить в зависимости от того, что пользователь выбирает при его создании. Так что следите за зависимостями и будьте явными, вам, возможно, придется взломать несколько записей в kconfig, которые также выбирают нужный вам крипто-API при выборе вашего модуля. Делать это может быть немного больно при сборке из дерева.

Итак, с одной стороны, у нас есть «просто копировать и переименовывать вещи, добавляя общий объем», с другой стороны, вы «говорите людям, что у них должно быть полное источник ядра ". Это одна из странностей, которые идут с монолитным ядром.

С микроядром почти все работает в пользовательском пространстве, не беспокоясь о соединении с DSO для какого-то драйвера ... это не проблема. Пожалуйста, не'

6
ответ дан 6 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: