2016-03-30 7 views
-1

Я разрабатываю свою собственную операционную систему. Я завершил загрузочный сектор и успешно загрузил мое ядро. Моя среда разработки - Ubuntu 14.04 и GCC 4.8. Мое ядро ​​будет работать под BOCHS. Я хотел бы напечатать определенный символ в определенной позиции на экране, так что я создал такую ​​функцию:Удивительное явление, когда я вызываю функцию для печати символа

void print_char(char target, int col, int row, unsigned char attribute) { 
    //attribute controls the colour of the character 
    char * vidmem = (char *) VIDEO_ADDRESS; //#define VIDEO_ADDRESS 0xb8000 
    *vidmem = target; 
    //TODO: add other control statements 
} 

Я называю эту функцию в моей main функции, которая является точкой входа моего ядра:

print_char('T', 0, 0, (unsigned char) 0x0f);

Приведенный выше код должен печатать символ «Т» в левом верхнем углу экрана. Он не появляется! После того, как я изменил декларацию print_char:

void print_char(char target, int col, int row, int attribute)

Или что-то вроде этого:

void print_char(char target, int col, int row) затем называют это как print_char('T', 0, 0)

После того как я изменить его, все работает! Я действительно смущен этой проблемой. Может ли кто-нибудь объяснить это мне?

+0

Это почти невозможно для нас, чтобы помочь вам с такой неполной информацией. Но когда у вас странные симптомы, подобные этому, это часто является результатом ошибок в коде, вызывающих неопределенное поведение. Ошибка может быть даже не в той части кода, где проявляются симптомы. Но из информации, которую вы предоставили, мы не можем сказать. – kaylum

+0

Я не использовал Bochs в то время, но я помню, что он имеет относительно приличный отладчик сборки. – immibis

+0

Возможно, я просто неправильно читаю код. Но предположим '* vidmem = attribute'; , а 'vidmem' имеет адрес 0xB8000, который записывал бы атрибут в 0xB8000. 0xB8000 - первый символ, 0xB8001 - атрибут первого символа, 0xb8002 - второй символ, а 0xb8003 - атрибут второго символа и так далее. На мой взгляд, этот атрибут, похоже, написан неверным байтом. –

ответ

1

меня решить эту проблему путем изменения флагов gcc и ld для создания 32-битного .o файла и».bin' файл (My убунту это 64-разрядная версия) с помощью следующих statemens.

%.o: %.c ${HEADERS} gcc -ffreestanding -m32 -c $< ${CFLAG} -o [email protected]

kernel.bin: kernel/kernel_entry.o ${OBJ} ld -o [email protected] -melf_i386 -Ttext 0x1000 $^ --oformat binary

где kernel_entry.o будет убедиться, что наша программа находит вхождение main функции в коде ядра. Затем я получаю свой образ ОС по:

os-image: boot/boot_sect.bin kernel.bin cat $^ > os-image

где boot_sect.bin играет роль загрузочного сектора.

Но я до сих пор не знаю, почему 64-разрядная цель файла будет вызывать явления, которые я описал выше ...