資源簡介
ucore的實驗答案,還是不錯,值得一看。
代碼片段和文件信息
/*
定義并實現了bootmain函數實現了通過屏幕、串口和并口顯示字符串
*/
#include?
#include?
#define?COM1 0x3F8
#define?CRTPORT 0x3D4
#define?LPTPORT 0x378
#define?COM_TX 0 //?Out:?Transmit?buffer?(DLAB=0)
#define?COM_LSR 5 //?In:??Line?Status?Register
#define?COM_LSR_TXRDY 20 //?Transmit?buffer?avail
static?uint16_t?*crt?=?(uint16_t?*)?0xB8000; //?CGA?memory
/*?stupid?I/O?delay?routine?necessitated?by?historical?PC?design?flaws?*/
static?void
delay(void)?{
inb(0x84);
inb(0x84);
inb(0x84);
inb(0x84);
}
/*
考慮到簡單性,在proj1中沒有對并口設備進行初始化,通過并口進行輸出的過程也很簡單:
第一步:執行inb指令讀取并口的I/O地址(LPTPORT?+?1)的值,如果發現發現讀出的值代表并口忙,
則空轉一小會再讀;
如果發現發現讀出的值代表并口空閑,則執行outb指令把字符寫到并口的I/O地址(LPTPORT?),
這樣就完成了一個字符的并口輸出。
*/
/*?lpt_putc?-?copy?console?output?to?parallel?port?*/
static?void
lpt_putc(int?c)?{
int?i;
for?(i?=?0;?!(inb(LPTPORT?+?1)?&?0x80)?&&?i?12800;?i?++)?{
delay();
}
outb(LPTPORT?+?0?c);
outb(LPTPORT?+?2?0x08?|?0x04?|?0x01);
outb(LPTPORT?+?2?0x08);
}
/*
通過CGA顯示控制器進行輸出的過程也很簡單:首先通過in/out指令獲取當前光標位置;
然后根據得到的位置計算出顯存的地址,直接通過訪存指令寫內存來完成字符的輸出;
最后通過in/out指令更新當前光標位置。
*/
/*?cga_putc?-?print?character?to?console?*/
static?void
cga_putc(int?c)?{
int?pos;
//?cursor?position:?col?+?80*row.
outb(CRTPORT?14);
pos?=?inb(CRTPORT?+?1)?<8;
outb(CRTPORT?15);
pos?|=?inb(CRTPORT?+?1);
if?(c?==?‘\n‘)?{
pos?+=?80?-?pos?%?80;
}
else?{
crt[pos?++]?=?(c?&?0xff)?|?0x0700;
}
outb(CRTPORT?14);
outb(CRTPORT?+?1?pos?>>?8);
outb(CRTPORT?15);
outb(CRTPORT?+?1?pos);
}
/*
通過串口進行輸出的過程也很簡單:第一步:執行inb指令讀取串口的I/O地址(COM1?+?COM_LSR)的值,
如果發現發現讀出的值代表串口忙,則空轉一小會(0x84是什么地址???);
如果發現發現讀出的值代表串口空閑,則執行outb指令把字符寫到串口的I/O地址(COM1?+?COM_TX),
這樣就完成了一個字符的串口輸出。
*/
/*?serial_putc?-?copy?console?output?to?serial?port?*/
static?void
serial_putc(int?c)?{
????int?i;
for?(i?=?0;?!(inb(COM1?+?COM_LSR)?&?COM_LSR_TXRDY)?&&?i?12800;?i?++)?{
delay();
}
outb(COM1?+?COM_TX?c);
}
/*?顯示字符的函數接口*/
/*?一個cons_putc函數接口,完成字符的輸出*/
/*?cons_putc?-?print?a?single?character?to?console*/
static?void
cons_putc(int?c)?{
lpt_putc(c);
cga_putc(c);
serial_putc(c);
}
/*?提供了一個cons_puts函數接口:完成字符串的輸出*/
/*?cons_puts?-?print?a?string?to?console?*/
static?void
cons_puts(const?char?*str)?{
int?i;
for?(i?=?0;?*str?!=?‘\0‘;?i?++)?{
cons_putc(*str?++);
}
}
/*?bootmain?-?the?entry?of?bootloader?*/
void
bootmain(void)?{
cons_puts(“This?is?a?bootloader:?Hello?world!!“);
/*?do?nothing?*/
while?(1);
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-06-08?10:52??ucore\
?????目錄???????????0??2013-06-08?10:52??ucore\ucore-lab1\
?????文件?????1022890??2011-02-23?10:01??ucore\ucore-lab1\lab0-manual-20110218.pdf
?????目錄???????????0??2014-08-05?11:12??__MACOSX\
?????目錄???????????0??2014-08-05?11:12??__MACOSX\ucore\
?????目錄???????????0??2014-08-05?11:12??__MACOSX\ucore\ucore-lab1\
?????文件?????????212??2011-02-23?10:01??__MACOSX\ucore\ucore-lab1\._lab0-manual-20110218.pdf
?????文件??????562751??2011-02-23?10:02??ucore\ucore-lab1\lab1-manual-20110221.pdf
?????文件?????????212??2011-02-23?10:02??__MACOSX\ucore\ucore-lab1\._lab1-manual-20110221.pdf
?????文件???????18179??2011-04-10?20:30??ucore\ucore-lab1\lab1-report.txt
?????目錄???????????0??2013-06-08?10:52??ucore\ucore-lab1\proj1\
?????目錄???????????0??2013-06-08?10:52??ucore\ucore-lab1\proj1\bin\
?????文件?????????512??2011-03-02?14:00??ucore\ucore-lab1\proj1\bin\bootblock
?????目錄???????????0??2014-08-05?11:12??__MACOSX\ucore\ucore-lab1\proj1\
?????目錄???????????0??2014-08-05?11:12??__MACOSX\ucore\ucore-lab1\proj1\bin\
?????文件?????????212??2011-03-02?14:00??__MACOSX\ucore\ucore-lab1\proj1\bin\._bootblock
?????文件???????12212??2011-03-02?14:00??ucore\ucore-lab1\proj1\bin\sign
?????文件?????????212??2011-03-02?14:00??__MACOSX\ucore\ucore-lab1\proj1\bin\._sign
?????文件?????5120000??2011-03-02?14:00??ucore\ucore-lab1\proj1\bin\ucore.img
?????文件?????????212??2011-03-02?14:00??__MACOSX\ucore\ucore-lab1\proj1\bin\._ucore.img
?????文件?????????212??2013-06-08?10:52??__MACOSX\ucore\ucore-lab1\proj1\._bin
?????目錄???????????0??2013-06-08?10:52??ucore\ucore-lab1\proj1\boot\
?????文件?????????875??2011-04-10?20:23??ucore\ucore-lab1\proj1\boot\asm.h
?????文件????????3358??2011-04-11?13:49??ucore\ucore-lab1\proj1\boot\bootasm.S
?????文件????????2787??2011-04-10?21:36??ucore\ucore-lab1\proj1\boot\bootmain.c
?????文件?????????212??2013-06-08?10:52??__MACOSX\ucore\ucore-lab1\proj1\._boot
?????目錄???????????0??2013-06-08?10:52??ucore\ucore-lab1\proj1\libs\
?????文件?????????501??2011-04-10?20:17??ucore\ucore-lab1\proj1\libs\types.h
?????文件?????????503??2011-02-17?01:23??ucore\ucore-lab1\proj1\libs\x86.h
?????文件?????????212??2013-06-08?10:52??__MACOSX\ucore\ucore-lab1\proj1\._libs
?????文件????????4445??2011-02-28?11:05??ucore\ucore-lab1\proj1\Makefile
............此處省略3892個文件信息
評論
共有 條評論