-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTODO.txt
166 lines (142 loc) · 7.99 KB
/
TODO.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
OK-用820初始化buddy
OK-实现buddy
OK-人肉测试buddy(我甚至写了自动化测试用例!)
OK-实现slab
OK-实现malloc
OK-高于物理内存的部分不做虚拟地址映射,这样有非法访问的时候可以直接page fault
OK-所有abort能改成panic就改panic,带有出错原因
OK-实现内核线程
OK-用户程序编译系统
OK-重新看下整个启动流程和内存布局的情况
OK-slab重新检查,加上注释。为什么不支持4M分配?
OK-实现记录物理-虚拟内存对应关系的一种数据结构
OK-vma
ok-4k小页映射
OK-加载用户程序到内存
OK-跑第一行用户态代码,然后返回
OK-用户进程/线程
OK-用户进程地址空间
OK-syscall返回值
OK-中断可以嵌套吗(可以)
OK-是不是没有清中断掩码?(应该是CPU做了)
OK-实现memory fence
OK-实现atomic int
OK-实现spinlock
OK-给现有的某些代码加锁(包括如果关了中断,这个中断会丢失吗?(不会)如果处理中断的时候又有中断,会怎么样?(会像递归调用函数那样))
OK-实现timer
OK-完整实现task接口,线程创建、线程调度(包括K和U之间)、线程退出
OK-实现用户的malloc的按页内存分配
OK-exit
OK-想个办法访问地址0时候报错
OK-vma相邻合并
OK-重写有问题的virtual_memory_find_fit
OK-加上avl_node_init
OK-find_fit支持设置flags
OK-测一下第二次find_fit找出来的地方是不是正接着第一个findfit
OK-测试umalloc_pgfault
OK-实现ufree
OK-析构vm的时候回收用户malloc相关内存
OK-实现用户的malloc的页内内存分配
OK-实现task传参数
OK-画一下内核内存布局
OK-getpid
OK-实现系统调用 printf
OK-用户只需要调用那个中断就可以提权到ring0,修复这问题
OK-task返回值
OK-考虑一下switch_to里面没有储存eax有没有问题?-没有问题,反正本身eax就是用来返回值的,这也就意味着不储存它不会有什么影响
OK-实现一个打印vm内存布局的函数,打印内核布局和用户布局出来看
OK-实现内核之外的物理内存的页分配
OK-用户malloc使用FREE REION的内存
OK-实现简单调度算法
OK-sleep
OK-yield
OK-修复现在看到的args生命周期问题 其实不是生命周期问题,是因为free region access那里修改页表没刷缓存导致的奇怪现象
OK-实现共享内存的系统调用
OK-完成task_test程序,测试用户态程序创建多个线程和多个进程,以及共享内存,最后启动几个countdown和几个schd_test
OK-所有内核对象(目前有shm、mut、cv)都在统一的地方生成id并记录id对应的对象类型,线程使用一个对象的时候要ref它,可以手动unref或退出时自动unref。当一个对象的引用计数降到0时要析构
OK-检查task对象的不安全使用情况,不在临界区内访问
OK-实现join
OK-支持进程内线程,至少栈位置不能写死了
OK-mutex
OK-cv
OK-lock
OK-unlock
OK-wait
OK-notify
OK-实现task的系统调用(join用一个条件变量来实现)
OK-解决偶然出现的page not found问题
无法重现-打印满一行之后换行时不会滚屏
OK-实现用户态abort,只是abort用户进程
OK-处理用户程序BAD ACCESS、执行错误的代码、seg fault等情况
OK之前就已经实现了-帮用户程序回收内存
OK-实现锁了之后有的SMART REGION要换成锁(特别是对于一些并发访问的数据结构来说),这样粒度小很多
ok-考虑操作当前vm时候需不需要关中断,主要是有没有可能在中断里也操作vm,如果要,就要去加上(因为一个进程有很多个线程啊,不管中断里操不操作,都要加吧?)
这样说来的话,所有带有vm参数的函数都要重新考虑这个问题了,因为那个vm有可能是current vm!最简单的方式可以是禁止参数是currentvm
OK-检查对包括avl树的许多共享数据的操作是否有互斥
OK-检查vm和vma是否存在不安全访问
PENDING-CRITICAL_REGION和lock是矛盾的,必须删掉CRITICAL_REGION。
这是因为,如果你进入CRITICAL_REGION后开始等待锁,那么那个持有锁的线程是不是会永远不被调度到?从而死锁
这个问题先暂时放着:目前没有发现这样问题的实例。而且,即使这个问题真的存在,现在我也没有想好怎么改。
注意mutex_lock函数里有个
// 陷入等待
task_schd(true, true, WAITING);
如果你从这里追进去会发现,不管当前调度标志为何,这个调用都一定会导致一次手动调度,而且会打开此后的调度标志。
因此,真正的矛盾其实在于,task_schd调用可以直接无视SMART_CRITICAL_REGION。。。
-实现nosh(nonoShell)
OK-每个进程要有一个输入缓冲区,当键盘输入的时候,存到前台进程的输入缓冲区中
OK-每个进程scanf时从自己的缓冲区中读取
OK-shell模块记录前台进程,如果没有前台进程,则shell是前台进程
OK-getchar其实只是scanf("%c")
-实现系统调用scanf(参考https://cplusplus.com/reference/cstdio/scanf/)
感觉实际上并不难,就是一个状态机而已
OK-实现系统调用gets
OK-b panic时,task_test有概率出问题
OK-实现执行程序命令
OK-实现查看进程表命令
OK-回格
OK-没有-看看libno里有没有需要单独实现用户态版本的函数
OK-信号系统
------------------
-测试用户设置的信号处理器
-实现以下功能:
OK-1.ctrl-c中断前台程序
2.ctrl-z将前台程序置于后台,回到shell
3.将某个后台进程设为前台进程(fg命令)
-实现查看内核对象表命令
-执行用户程序支持带参数!
-image to ascii
-运行 ASCII RayTracing
-用户设置的信号处理函数目前是在内核态直接运行的,这样不行。看看是不是开一个新的栈,然后切到用户权限去运行。或者,直接在用户栈上运行
-我觉得信号处理器应该以isr的方式运行,而不是延迟到调回之后。看看linux的信号处理是怎么做的?这个可以暂时先不改
以上两点现在至少导致了2个问题:
1.内核态执行用户空间那个函数的时候,用的printf是用户态的printf,于是开始做syscall那一套然后就出问题了
2.对于正在sleep的线程来说,无法立即响应事件。例如如果它正在读stdin,那么它永远不会响应
现在发现其实是多个syscall是可以在栈上叠加的
那么,现在还剩的问题就是,如何从用户转回内核?特别是,如果又开一个中断来转到内核,那是不是又是一层新的中断栈,把原来的中断栈埋在底下了
这个问题目前认为可以解决,但是会比较复杂,先不解决。
-图形接口参考:https://github.com/SerenityOS/serenity/blob/master/Documentation/Kernel/GraphicsSubsystem.md
-支持更高分辨率,目前考虑使用boch图形接口,还需要调研这是否合适,主要是它最大分辨率是多少?是否能在物理设备上运行?
-编译系统和脚本改进,并发编译自动检测核心数,可设置release/debug
-整理编译系统,支持配置tool prefix,DEBUG/RELEASE
-docker?
-在物理机上运行
-接入v86,在浏览器中运行
-1.0版本!
-实现C文件API
-文件系统
-实现页面swap
-到此可作为毕业设计(可以单独开一个面子工程branch,专门做一些酷炫但粗糙的功能,像简单的gui和网络之类的)
-每个进程的cpu占用率计算
-内存不够的时候打印slab和buddy的情况
-有没有其他地方需要更新tlb却没更新?找一下
-flush tlb的地方能不能只更新某个特定条目
-看看能不能实现打印调用栈
-想办法看看taskswitch耗时多少,考虑怎么根据耗时动态计算时间片
-给slab写一个buddy那样的测试用例
-安全问题1)内核线程栈溢出的处理 2)用户进程有没有可能访问到内核栈或代码
-考虑怎么检测内存泄漏
-如果不实现POSIX的信号概念,如何实现程序动态处理各种外部事件如停止或挂起
-实现POSIX接口
GUI(http://members.chello.at/~easyfilter/bresenham.html)
网络
多核心支持