跟我一起写操作系统

    返回首页    发表留言
本文作者:李德强
          第十六章 结束语
 
 

        到此为止,我们学习编写操作系统的内容全部结束了。虽然如此,但操作系统内在的知识和技术还浩如烟海。我们所学习的内容也不过是沧海一粟而已。希望读者能够通过本教程的学习对操作系统的相关知识有所提升,并通过自己的努力写出一个自己风格的操作系统。本教程的LidqOS中并没有实现文本编辑器(类vi/vim)程序和C语言编译器(类gcc)。文本编辑器的实现相对简单,而自己编写一个C语言的编译器可不是一件容易的事情。有兴趣的读者可以根据自己的能力来尝试实现它们。

        另外,在实现了信号量、多线程功能之后,作者编写了一个小程序来测试内核对信号量和多线程的管理功能:

        在一个冰激凌店中经理、店员、收银员和顾客四个角色。从店外走进来十个顾客来购买冰激凌。每个顾客需要买一到五个冰激凌不等。当有顾客购买冰激凌时,需要在三个收银员面前排队成三队付款购买冰激凌。每当收银员接收到顾客购买冰激凌后通知一个店员来制作,店中共有五名店员为顾客制作他们所要购买的冰激凌。当店员将冰激凌制作完成后,必须到2名经理办公室交给经理审核,这两个经理公室在同一时刻只能一个店员进入,不可同时进入两个店员,二名经理办公室同时只可对二个店员制作的冰激凌做审核。如果审核不通过,店员则需要重做;审核通过后才能交给顾客。店员一次只能制作一个冰激凌,做好一个就交给经理审核一次,经理一次也只能审核一个冰激凌。顾客拿到自己的全部的冰激凌之后才能离开冰淇淋店。当所有顾客离开之后冰激凌店关门打烊,程序结束。

        这是一个非常有趣的问题,请你不要参看源代码试着自己编写一下这个程序,你会有很大的收获。作者实现这个问题的程序运行结果如下:

    返回首页    返回顶部
#1楼  小七  于 2018年07月15日19:12:07 发表
 
我想问一个问题,我在编译您的这个kernel,链接时,出现下面的问题

uild/kernel/osiso.o: In function `osiso_read_block':

osiso.c:(.text+0x331): undefined reference to `__stack_chk_fail'

build/kernel/osiso.o: In function `osiso_read_block_phy':

osiso.c:(.text+0x4de): undefined reference to `__stack_chk_fail'

...

我在CFLAGS中加了-fno-stack-protector这个选项,编译是通过了,但是内核在虚拟机的运行效果是:

void schedule()

{

//取得链表头

s_list *list_header = list_pcb;

if (list_header == NULL)

{

printf(0, "empty\n");

return;

}

...

}

这个函数list_header = NULL,走了printf(0, "empty\n");

注:用branch:v16

当我用您master的编译时,也是上面link的错误,加了-fno-stack-protector这个选项编译是通过了,运行的时候,不打印任何信息,不知道为什么

出现这个问题是gcc版本的问题还是有其它方面的原因,您用的gcc版本是?,还是缺什么库
#2楼  李德强  于 2018年07月19日17:26:01 发表
 
我现在用gcc (GCC) 8.1.1 20180502 (Red Hat 8.1.1-1)编译也没问题,我已经给您回复了邮件,可以试试将编译选项加到源代之后。
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号