компилирование моего собственного ядра (не из источника linux-kernel)

м после учебника ядра отВот

У меня проблемы с компиляцией моих файлов.

я получаю следующие ошибки при попытке компиляции:

main.c:8: error: expected declaration specifiers or ‘...’ before ‘size_t’
main.c:8: error: conflicting types for ‘memcpy’                          
./include/system.h:5: note: previous declaration of ‘memcpy’ was here    
main.c: In function ‘memcpy’:                                            
main.c:12: error: ‘count’ undeclared (first use in this function)        
main.c:12: error: (Each undeclared identifier is reported only once      
main.c:12: error: for each function it appears in.)                      
main.c: At top level:                                                    
main.c:16: error: expected declaration specifiers or ‘...’ before ‘size_t’
main.c:16: error: conflicting types for ‘memset’
./include/system.h:6: note: previous declaration of ‘memset’ was here
main.c: In function ‘memset’:
main.c:19: error: ‘count’ undeclared (first use in this function)
main.c: At top level:
main.c:23: error: expected declaration specifiers or ‘...’ before ‘size_t’
main.c:23: error: conflicting types for ‘memsetw’
./include/system.h:7: note: previous declaration of ‘memsetw’ was here
main.c: In function ‘memsetw’:
main.c:26: error: ‘count’ undeclared (first use in this function)
main.c: At top level:
main.c:30: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘strlen’
main.c:49: warning: return type of ‘main’ is not ‘int’
main.c: In function ‘main’:
main.c:64: warning: pointer targets in passing argument 1 of ‘puts’ differ in    signedness
./include/system.h:13: note: expected ‘unsigned char *’ but argument is of type ‘char *’
main.c:51: warning: unused variable ‘i’
scrn.c: In function ‘scroll’:
scrn.c:24: warning: passing argument 1 of ‘memcpy’ from incompatible pointer type
./include/system.h:5: note: expected ‘unsigned char *’ but argument is of type ‘short unsigned int *’
scrn.c:24: warning: passing argument 2 of ‘memcpy’ from incompatible pointer type
./include/system.h:5: note: expected ‘const unsigned char *’ but argument is of type  ‘short unsigned int *’
scrn.c: In function ‘puts’:
scrn.c:139: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
./include/system.h:8: note: expected ‘const char *’ but argument is of type ‘unsigned char *’

Мои файлы являются точными копиями из учебника.

Я вижу, что в main.c функции определены так

void *memcpy(void *dest,const void *src, size_t count)

но в моем файле system.h они определены так

extern unsigned char *memcpy(unsigned char *dest,const unsigned char *src, int count)

C не мой основной язык, но я нахожусь в процессе его изучения, поэтому я прошу прощения, если мой вопрос прост, но я думаю, что эти определения не должны быть одинаковыми?

 Daniel Pryden06 нояб. 2009 г., 19:11
Не совсем ответ на ваш вопрос, но я бы неЯ рекомендую изучать C и изучать разработку ядра за один раз. Прежде чем начать пытаться написать свое собственное ядро, сначала поработайте над пользовательским языком в Си!
 Christoph06 нояб. 2009 г., 22:29
просто еще одно предложение для чтения: Джеймс Моллойруководство по разработке ядраjamesmolloy.co.uk/tutorial_html/index.html
 Daniel Pryden06 нояб. 2009 г., 19:28
Я не уверен, что вы понимаете, что он делает. Если С не 't ваш основной язык, вы много времени работали на ассемблере на вашей целевой платформе? Потому что если ты несделано либо C, либо сборка, тогда яМне было бы трудно представить, что вы можете полностью следовать тому, что должно делать ядро.
 Matt Phillips06 нояб. 2009 г., 19:15
Я понимаю вашу точку зрения. Учебник очень прост, хотя, и я понимаю, что он делает. Моя главная проблема - почему файлы не скомпилируются из учебника. Вы могли бы подумать, что объявления типа функций не будут проблемой, когда вы извлекаете код из учебника!

Ответы на вопрос(2)

Решение Вопроса

Возможно, ваша проблема в том, чтоsize_t ISN»так же, какint на вашей платформе, илиsize_t ISN»указано правильно вообще. Типы указателя должны быть в порядке (технически они тоже должны совпадать, но в большинстве системsizeof(char*) == sizeof(void*)).

Если ты'вы разрабатываете свое собственное ядро, выхочу написать свойsystem.h, Если ты'переписываешь обаsystem.h а такжеmain.c, вы можете сделать их совпадают, как вымне нравится Если вы посмотрите наэта страница учебника, вы'я вижу, что заголовок и источник C оба объявляютmemcpy как:

unsigned char *memcpy(unsigned char *dest, const unsigned char *src, int count);

Но если вы скачаете исходные файлы примеров в конце урока, вы обнаружите, что вместо этого:

void *memcpy(void *dest, const void *src, size_t count);

Глядя на верхнюю часть этого файла, вы найдете следующий комментарий:

/* bkerndev - Bran's Kernel Development Tutorial
*  By:   Brandon F. ([email protected])
*  Desc: Main.c: C code entry.
*
*  Notes: No warranty expressed or implied. Use at own risk. */

Это нене похоже на тебяпытаюсь следовать учебнику, а непытаемся вырезать и вставить код из учебника. Тот'Это похоже на попытку научиться выполнять операции на головном мозге, следуя инструкциям в книге. Вы можете заставить его работать, но если вы нене понимаю, что тыделаю ... ну, пожалуйста, сделайте миру одолжение и неНе используйте его для чего-либо критического.

 Matt Phillips06 нояб. 2009 г., 19:29
лол. ну, это больше похоже на то, что я пытаюсь использовать учебник, чтобы понять, как ядро работает немного лучше, но так как я неЯ знаю все входы и выходы C я вынужден просто использовать уже предоставленный код. Спасибо за совет!

Замените size_t на int в каждом определении метода на main.c

 Lee Taylor16 нояб. 2012 г., 00:48
Согласовано. Кроме того, непросто предоставьте код для ваших ответов. объяснятьЗачем.
 Ioan Paul Pirau30 июл. 2011 г., 00:05
поскольку ответ был уже предоставлен и принят ..нет смысла давать тот же ответ (опять же) гораздо позже ... :) попробуйте сосредоточиться на неотвеченных вопросах;)

Ваш ответ на вопрос