30天自制操作系统——第二十天保护操作系统

在实现保护操作系统之前,我们先来实现两个功能。一个是使用API显示字符串,另一个是用C语言编写应用程序。

使用API显示字符串

显示字符串有两种方法,一种是显示一串字符,当遇到字符编码0时结束。另一种是先指定要显示的字符串的长度,然后进行显示。

实现方式如下:

console.c节选:

void cons_putstr0(struct CONSOLE *cons, char *s)
{
   
	for (; *s != 0; s++) {
   
		cons_putchar(cons, *s, 1);
	}
	return;
}

void cons_putstr1(struct CONSOLE *cons, char *s, int l)
{
   
	int i;
	for (i = 0; i < l; i++) {
   
		cons_putchar(cons, s[i], 1);
	}
	return;
}

我们把上面两个函数变成API,用之前的方法就是给每个函数分配一个INT。可是如果每次都给新的函数分配一个INT,IDT(只能设置256个)很快就会用完。因此我们学习BIOS中的方法,用EDX来存放功能号,这样就能够设置上亿个API函数了。

naskfunc.nas节选

_asm_hrb_api:
		STI
		PUSHAD	; 用于保存寄存器值的PUSH
		PUSHAD	; 用于向hrb_api的PUSH
		CALL	_hrb_api
		ADD		ESP,32
		POPAD
		IRETD

需要注意的是,hrb_api并不知道需要显示的代码段起始位置位于内存的什么地址,因此我们在内存中存放一下这个地址,这个地址暂时就放在0xfe8。

console.c节选:

int cmd_app(struct CONSOLE *cons, int *fat, char *cmdline)
{
   
	()
	if (finfo != 0) {
   
		/* 找到文件的情况 */
		p = (char *) memman_alloc_4k(memman, finfo->size);
		*((int *) 0xfe8) = (int) p;
		file_loadfile(finfo
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值