资源简介
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个文件信息
相关资源
- 数学模型第4版及参考答案 姜启源
- 电路与模拟电子技术慕课版李广明节
- 线性代数及其应用原书第四版习题解
- 信息论基础Thomas M.Cover第2版参考答案
- 北大青鸟Y2认证试题内附参考答案
- 计算机程序的构造和解释第二版中文
- 信息安全原理与实践第二版思考题参
- 计算机组成与体系结构 裘雪红 西电
- 参考答案_工程电磁场导论_(冯慈璋
- 2007-2019年系统分析师真题及参考答案
- 数值分析.索尔.习题参考答案
- 算法设计与分析基础习题参考答案
- 数理方程试卷及详细的参考答案
- 2017年11月下半年网络工程师上下午试
- 华为软件工程师面试和参考答案
- GIS空间分析试题范围及参考答案.doc
- 南大计算机系-软件学院本科历年考试
- 《计算机应用基础》试卷及参考答案
- 算法设计技巧与分析(沙特版)习题
- 《软件测试技术》期末试卷与参考答
- 通信网性能分析基础参考答案
- 计算方法模拟试题及参考答案.doc
- 《实变函数》试卷及参考答案
- 国科大计算机网络题目参考答案2016年
- 第三章习题参考答案.rar
- malloclab全套资料及参考答案
- 计算机网络安全复习试题及参考答案
- 跨文化交际实用教程-胡超-练习参考答
- 数据挖掘原理与实践课后习题及参考
- 信息安全数学基础教程(第2版) 参考
评论
共有 条评论