ucore lab0的学习: 2.6 了解 ucore 编程方法

今天开始学习ucore的lab。

按照lab0的文档,显示介绍了80386的4个工作模式:real-address
mode, protected mode, SMM mode, virtual 8086 mode.

ia-32-architectures-software-developer-system-programming-manual-VOL3_Feb2014中的Figure
2-3. Transitions Among the Processor’s Operating Modes是4个mode FSM。

在Lab
0的2.6节介绍了ucore的编程方法:用C实现C++的OOP思想:interface(API)。在Absolute C++的Chap
6的tip里面讲了:princeple of encapsulation is on: separate "interface" and
"implementation of class".

在http://www.tutorialspoint.com/cplusplus/cpp_interfaces.htm
里面讲了interface一般是用abstract class作为base class。

在 http://www.bottomupcs.com/abstration.html
详述了linux kernal, system with large C based code. 通过使用function
pointer来模拟C++的interface/class的OOP。

在 understanding and
using pointer in C 中的function pointer里面提到一个drawback: "One concern
regarding the use of function pointers is a potentially slower
running program. The processor may not be able to use branch prediction in
conjunction with pipelining."

这印证了ucore lab0的说法:“Core
的面向对象编程方法,目前主要是采用了类似
C++的接口(interface)概念,即是让实现 细节不同的某类内核子系统(比如物理内存分配器、调度器,文件系统等)有共同的操作方式
... 接口在 C 语言中,表现为一组函数指针的集合。放在 C++ 中,即为虚表。”

先复习一下 function pointer,
structure in C.


 1 /*
2 * function pointers in C as the interface in C++
3 * used widely in linux kernal, or lab0 of ucore
4 * Jun 8, 2014
5 *
6 * http://www.bottomupcs.com/abstration.html#ftn.d5e116
7 */
8
9 #include <stdio.h>
10
11 /* The API to implement */
12 struct greet_api {
13 int (*say_hello)(char *name);
14 int (*say_goodbye)(void);
15 };
16
17 /* Our implementation of the hello function */
18 int say_hello_fn(char *name) {
19 printf("Hello %s\n", name);
20 return 0;
21 }
22
23 /* Our implementation of the goodbye function */
24 int say_goodbye_fn(void) {
25 printf("Goodbye\n");
26 return 0;
27 }
28
29 /* A struct implementing the API */
30 /*
31 * Designated Initializers for Structures
32 * See <C primer plus 5th>
33 * the name of a function can be used to represent the address of the function
34 */
35 struct greet_api greet_api = { .say_hello = say_hello_fn, .say_goodbye =
36 say_goodbye_fn };
37
38 /* main() doesn‘t need to know anything about how the
39 * say_hello/goodbye works, it just knows that it does */
40 int main(int argc, char *argv[]) {
41 greet_api.say_hello(argv[1]);
42 greet_api.say_goodbye();
43
44 printf("%p, %p, %p\n", greet_api.say_hello, say_hello_fn, &say_hello_fn);
45
46 //exit(0);
47 return 0;
48 }

然后可以看看ucore是怎么用structure of function pointer去实现一个C++的interface。

在lab2/kern/mm/pmm.h里面的pmm_manager:


 1 // pmm_manager is a physical memory management class. A special pmm manager - XXX_pmm_manager
2 // only needs to implement the methods in pmm_manager class, then XXX_pmm_manager can be used
3 // by ucore to manage the total physical memory space.
4 struct pmm_manager {
5 const char *name; // XXX_pmm_manager‘s name
6 void (*init)(void); // initialize internal description&management data structure
7 // (free block list, number of free block) of XXX_pmm_manager
8 void (*init_memmap)(struct Page *base, size_t n); // setup description&management data structcure according to
9 // the initial free physical memory space
10 struct Page *(*alloc_pages)(size_t n); // allocate >=n pages, depend on the allocation algorithm
11 void (*free_pages)(struct Page *base, size_t n); // free >=n pages with "base" addr of Page descriptor structures(memlayout.h)
12 size_t (*nr_free_pages)(void); // return the number of free pages
13 void (*check)(void); // check the correctness of XXX_pmm_manager
14 };
15
16 extern const struct pmm_manager *pmm_manager;

然后在2.6.2.1
双向循环链表中学习了ucore中常用的数据结构。这在uc/os-II和freertos里面的freelistTable也用到了。

注意:ucore的double linked list 和C/C++里面的设计方法有点点区别。这是为了适应不同功能的双向链表:有保存task
table的,有空闲内存块列表,或者、内存页链表等等。

ucore lab0的学习: 2.6 了解 ucore 编程方法

时间: 2024-10-18 19:46:39

ucore lab0的学习: 2.6 了解 ucore 编程方法的相关文章

std::sort 学习:一种递归分治方法

// std::sort 学习:一种递归分治方法 今天看了看 stl 的 std::sort 的代码,众所周知,这个函数是在快速排序递归太深的时候使用堆排序防止过度退化,但是今天说的不是这个.我们只看快速排序的部分. 我们一般实现快速排序大概是这样的(本王随意写了个用下标当参数的排序函数,领会意思即可). void quick_sort(int first, int last) // 某个数组的 [first, last) {  if ((last - first) > 1) {  int mi

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

黑马程序员_学习IOS之字典常用的方法

字典是无序的 数组是有序的.字典分为:可变字典和不可变字典  不可变字典对象 NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",@"four",@"4", nil]; //value = ke

java学习之第五章编程题示例(初学篇)

1 /* 2 Animal.java 3 */ 4 package animal; 5 6 public abstract class Animal { 7 public abstract void cry(); 8 public abstract String getanimalName(); 9 } 1 //Dog.java 2 package animal; 3 4 public class Dog extends Animal 5 { 6 7 String aa="旺旺"; 8

Java学习-024-获取当前类名或方法名二三文

今天,看朋友编写程序,打印日志时,需要记录当前类的类名以及当前方法的方法名,我发现 TA 将类名或者方法名直接写死在了代码中...虽说这样可以实现记录类名和方法名,但是当有特殊情况需要修改类名或者方法名时,源码中涉及类名或者方法名的地方必须同步变更,若修改的地方比较多,难免可能发生有遗漏的地方,那么后续通过日志查看分析原因时,就会找不到相应的地方,导致无法分析,查找原因. 为何要获取类名? 调试源码 记录日志 生成报告 统计分析,对调用比例占比大的方法,增强单元测试 构建系统调用关系链,对主要关

嘿嘿。今天学习了AJAX的几个方法

今天学习了AJAX的几个方法,其实我很早在公司实习的时间就认识了它,但是对它一无所知,也并没有去学习它,今天学习它让我感到很兴奋因为重新了解了它,嘿嘿,下面就来总结一下今天学习的吧. 一.在javascript中写AJAX <script> window.onload = function () { document.getElementById("txtName").onblur = function () { var xml = new XMLHttpRequest()

Linux学习记录--文件管理相关系统编程

文件管理相关系统编程 重要文件标识 打开文件标识 O_RDONLY:只读方式打开 O_WRONLY:只写方式打开 O_RDWR:可读写方式打开 打开文件操作副标识 O_CREAT:若路径中文件不存在则创建,使用Open函数时需同时指定文件权限 O_EXCL:若与O_CREAT连用,检查文件是否已经存在,若不存在则建立文件存在则返回错误,这使创建和测试成为一个原子操作 O_APPEND:读写文件从文件尾部开始移动,所有写入数据都加入文件尾部 O_TRUNC:若文件存在并且可以写入,此标识会将源文件

JavaSE入门学习47:Socket网络通信编程(一)

今天既然我们学习Java的Socket网络通信编程,那么在我们的现实生活中那些是Socket编程的应用呢?可以想象 我们最常用的聊天工具软件QQ就是,当然MSN也是啦. 一网络基础知识 两台计算机通过网络进行通信的必要条件: 1)IP地址 2)网络协议 3)端口号 两台计算机网络通信示意图: (1)TCP/IP协议 1)TCP/IP协议是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也称 TCP/IP协议族或TCP/IP协议栈. 2)TCP:Transmissi

Linux 程序设计学习笔记----终端及串口编程及实例应用

转载请注明出处,http://blog.csdn.net/suool/article/details/38385355. 部分内容类源于网络. 终端属性详解及设置 属性 为了控制终端正常工作,终端的属性包括输入属性.输出属性.控制属性.本地属性.线路规程属性以及控制字符. 其在系统源代码的termios.h中定义(具体的说明文档http://pubs.opengroup.org/onlinepubs/7908799/xsh/termios.h.html),其结构体成员主要是 Thetermios