• 大小: 11.25MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-07-06
  • 语言: 其他
  • 标签: ucore  参考答案  

资源简介

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个文件信息

评论

共有 条评论