Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何创建我自己的库以开始使用操作系统?_C_Assembly_Operating System_Kernel_Bootloader - Fatal编程技术网

C 如何创建我自己的库以开始使用操作系统?

C 如何创建我自己的库以开始使用操作系统?,c,assembly,operating-system,kernel,bootloader,C,Assembly,Operating System,Kernel,Bootloader,我正在学习操作系统的概念。我在ASM中创建了一个简单的引导加载程序,在C中创建了一个循环内核文件。我编译了这两个文件,并且都能正常工作 现在我需要使用C语言的内核打印一些文本。我了解到,在开发操作系统时,必须省略标准库函数的使用。那么我如何创建自己的库呢。我的意思是在不包含任何标准头文件的情况下将文本打印到屏幕上。我该怎么做?我应该使用内联汇编还是其他方法 简单地说,我的问题是,没有标准库,C语言如何与硬件交互?我15年前也是这么做的:),您不得不使用基于HAL概念(硬件抽象层)的自己的内核函数

我正在学习操作系统的概念。我在ASM中创建了一个简单的引导加载程序,在C中创建了一个循环内核文件。我编译了这两个文件,并且都能正常工作

现在我需要使用C语言的内核打印一些文本。我了解到,在开发操作系统时,必须省略标准库函数的使用。那么我如何创建自己的库呢。我的意思是在不包含任何标准头文件的情况下将文本打印到屏幕上。我该怎么做?我应该使用内联汇编还是其他方法


简单地说,我的问题是,没有标准库,C语言如何与硬件交互?

我15年前也是这么做的:),您不得不使用基于HAL概念(硬件抽象层)的自己的内核函数。您构建了一个基于HAL的模块,例如屏幕输出驱动程序。这个驱动程序应该由两个方面组成:一个是与您自己的定制操作系统接触的方面,另一个是与您非常特定的硬件接触的方面。因此,如果在任何给定时刻您更改了硬件,那么您的操作系统不会受到此更改的影响。这称为(正式):接口。是一个软件模式概念。 好看。是一个非常有趣的项目:)

作为伪代码示例:

// yourclientprogram.c
include "screendriver.h"
i = new instance of LCDScreenDriver;
i.selectScreen(0);
i.printf("%s","hello");
因此,您的内核文件如下所示:

//screendriver.h
class LCDScreenDriver extends ScreenDriver {
    protected function output(data){
         ...very specific ASM code for your LCD monitor goes here..
         ...this code is very specific to output a -data- buffer
         ...and nothing more than this  
    }
}

class ScreenDriver {
   protected function output(data); // a virtual pure function

   public function printf(args,...){
       dataTobePrinted = ..make your own printf methods...
       this.output(dataToBePrinted);
   }
}

我在15年前也是这样做的:),您被迫使用基于HAL概念(硬件抽象层)的自己的内核函数。您构建了一个基于HAL的模块,例如屏幕输出驱动程序。这个驱动程序应该由两个方面组成:一个是与您自己的定制操作系统接触的方面,另一个是与您非常特定的硬件接触的方面。因此,如果在任何给定时刻您更改了硬件,那么您的操作系统不会受到此更改的影响。这称为(正式):接口。是一个软件模式概念。 好看。是一个非常有趣的项目:)

作为伪代码示例:

// yourclientprogram.c
include "screendriver.h"
i = new instance of LCDScreenDriver;
i.selectScreen(0);
i.printf("%s","hello");
因此,您的内核文件如下所示:

//screendriver.h
class LCDScreenDriver extends ScreenDriver {
    protected function output(data){
         ...very specific ASM code for your LCD monitor goes here..
         ...this code is very specific to output a -data- buffer
         ...and nothing more than this  
    }
}

class ScreenDriver {
   protected function output(data); // a virtual pure function

   public function printf(args,...){
       dataTobePrinted = ..make your own printf methods...
       this.output(dataToBePrinted);
   }
}

简单回答:直接与硬件对话。其他答案将过于宽泛,这不是答案,但我的问题正是答案。你带上文档,开始相应地访问你想要的硬件。简单的回答是:直接与硬件对话。其他答案将过于宽泛,这不是答案,但我的问题正是答案。你获取文档并开始相应地访问你想要的硬件。因此,用C编写我自己的驱动程序。如果没有标准库,我如何实现它。在C中使用内联汇编?你应该选择标准库的一个子集,只选择那些与外部代码或为特定操作系统设计的其他库没有依赖关系的库。因此,用C编写我自己的驱动程序。如果没有标准库,我如何完成它。在C中使用内联汇编?您应该选择该标准库的子集,只选择那些与外部代码或为特定操作系统设计的其他库没有依赖关系的库。