├── .gitignore
├── Makefile
├── README.md
├── doc
├── INSTALL.docx
├── Visio
│ ├── PCB.jpg
│ ├── PCB.vsdx
│ ├── stack1-0.jpg
│ ├── stack1-0.vsdx
│ ├── stack1-1.jpg
│ ├── stack1-1.vsdx
│ ├── stack1-2.jpg
│ ├── stack1-2.vsdx
│ ├── stack1-3.jpg
│ ├── stack1-3.vsdx
│ ├── stack1-4.jpg
│ ├── stack1-4.vsdx
│ ├── stack1-5.jpg
│ ├── stack1-5.vsdx
│ ├── stack2-0.jpg
│ ├── stack2-0.vsdx
│ ├── stack2-1.jpg
│ ├── stack2-1.vsdx
│ ├── stack2-2.jpg
│ ├── stack2-2.vsdx
│ ├── stack2-3.jpg
│ ├── stack2-3.vsdx
│ ├── stack2-4.jpg
│ ├── stack2-4.vsdx
│ ├── stack2-5.jpg
│ ├── stack2-5.vsdx
│ ├── stack3-0.jpg
│ ├── stack3-0.vsdx
│ ├── stack3-1.jpg
│ ├── stack3-1.vsdx
│ ├── stack3-2.jpg
│ ├── stack3-2.vsdx
│ ├── stack3-3.jpg
│ ├── stack3-3.vsdx
│ ├── stack3-4.jpg
│ ├── stack3-4.vsdx
│ ├── stack3-5.jpg
│ ├── stack3-5.vsdx
│ ├── stack3-6.jpg
│ ├── stack3-6.vsdx
│ ├── task0.jpg
│ ├── task0.vsdx
│ ├── 循环链表.jpg
│ ├── 循环链表.vsdx
│ ├── 循环链表1.jpg
│ ├── 循环链表1.vsdx
│ ├── 循环链表2.jpg
│ ├── 循环链表2.vsdx
│ ├── 循环链表3.jpg
│ └── 循环链表3.vsdx
├── images
│ ├── linux-3.9.4.png
│ └── linux-4.1.0.png
├── mykernel.ppt
└── os2013
│ ├── CoursePlan2013.pdf
│ ├── HowtheComputerWorks-1.pdf
│ ├── HowtheComputerWorks-2.ppt
│ ├── LinuxArchitectureAndSystemExecution.ppt
│ ├── LinuxC.pdf
│ ├── Linux_Get_Started_SOP_V1.1.0_20120806.pdf
│ ├── example_asm.c
│ ├── example_c.c
│ ├── lab3-shell.ppt
│ ├── lab3.rar
│ ├── lab4.ppt
│ ├── lab5.ppt
│ ├── lab6.pdf
│ ├── lab6.rar
│ ├── lab7.ppt
│ ├── lab7.rar
│ ├── mykernel_release_1.rar
│ └── mykernel_release_2.rar
├── kink-src
├── kink-0.0.1
│ ├── Makefile
│ ├── interrupt.c
│ ├── main.c
│ ├── pcb.h
│ └── scheduler.c
├── kink-0.0.2
│ ├── Makefile
│ ├── README.md
│ ├── interrupt.c
│ ├── main.c
│ ├── pcb.h
│ └── scheduler.c
└── kink-now
│ ├── Makefile
│ ├── README.md
│ ├── interrupt.c
│ ├── main.c
│ ├── pcb.h
│ └── scheduler.c
├── mykernel-3.9.4
├── Makefile
├── Makefile.bak
├── README.md
├── bak
│ ├── myinterrupt.c
│ ├── mymain.c
│ └── mypcb.h
├── configs
│ └── mini-x86.config
├── patches
│ └── linux-3.9.4-mykernel.patch
└── src
│ ├── Makefile
│ ├── README.md
│ ├── interrupt.c
│ ├── main.c
│ ├── pcb.h
│ └── scheduler.c
├── mykernel-4.1.0
├── Makefile
├── README.md
├── configs
│ └── mini-x86.config
├── patches
│ └── linux-4_1-mykernel.patch
└── src
│ ├── Makefile
│ ├── interrupt.c
│ ├── main.c
│ ├── pcb.h
│ └── scheduler.c
└── mykernel.sh
/.gitignore:
--------------------------------------------------------------------------------
1 | # intermediate directories
2 | mykernel-3.9.4/downloads/
3 | mykernel-3.9.4/kernel/
4 | mykernel-3.9.4/.stamps/
5 | mykernel-3.9.4/.out/
6 |
7 | mykernel-4.1.0/downloads/
8 | mykernel-4.1.0/kernel/
9 | mykernel-4.1.0/.stamps/
10 | mykernel-4.1.0/.out/
11 |
12 | # Normal rules
13 | .*
14 | *.o
15 | *.o.*
16 | *.order
17 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | COMMIT="增加了make run3和make run4直接运行..."
2 |
3 | KERNEL_3_DIR=mykernel-3.9.4
4 |
5 | KERNEL_4_DIR=mykernel-4.1.0
6 |
7 |
8 | .PNONY : github run3 run4
9 |
10 | all : github
11 |
12 | # github
13 |
14 | GITHUB_COMMIT=$(COMMIT)
15 | github :
16 | git add -A
17 | git commit -m $(GITHUB_COMMIT)
18 | git push origin master
19 |
20 | # run your kernel(KINK)
21 | run3 :
22 | cd $(KERNEL_3_DIR) && make run
23 |
24 | run4 :
25 | cd $(KERNEL_4_DIR) && make run
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Welcome to the KInK(KernelInKernel)
2 | -------
3 |
4 |
5 | It is a platform to write your own OS kernel,its based on Linux Kernel 3.9.4/4.1.0 source code
6 |
7 |
8 |
9 | 
10 |
11 |
12 | #1 Start KInK
13 | -------
14 |
15 |
16 | ##1.1 install qemu
17 | -------
18 |
19 |
20 | your can use `qemu` to run our kernel(KINK).
21 |
22 | install qemu by
23 |
24 | ```c
25 | sudo apt-get install qemu # install QEMU
26 | ```
27 |
28 |
29 | ```
30 | sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
31 | ```
32 |
33 | or
34 | ```
35 | sudo ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu
36 | ```
37 |
38 | ##1.2 make KInK
39 | -------
40 |
41 |
42 |
43 | build **linux-3.9.4**
44 |
45 | ```c
46 | cd linux-3.9.4
47 | make
48 | ```
49 |
50 | build **linux-4.1**
51 |
52 | ```c
53 | cd linux-4.1
54 | make
55 | ```
56 |
57 | ##1.3 run KInK
58 | -------
59 |
60 | run KInK in linux-3.9.4
61 |
62 | ```c
63 | cd linux-3.9.4
64 | make run
65 | ```
66 |
67 | run KInK in **linux-4.1**
68 |
69 | ```c
70 | cd linux-4.1
71 | make run
72 | ```
73 |
74 |
75 |
76 | #2 How to Make
77 | -------
78 |
79 | ##2.1 make内核
80 | -------
81 |
82 | mykernel-3.9.4是linux-3.9.4的构建目录
83 |
84 | mykernel-4.1.0是linux-4.1.0的构建目录
85 |
86 | 他们都采用了同样的构建方式
87 |
88 | 1. 首先将3.x和4.x内核的源代码, 下载到download目录下
89 |
90 | 2. 接着想内核源代码解压缩到kernel, 并拷贝处两个副本linux-x.x.x.new和linux-x.x.x.src, 前者作为我们自己的kernel构建, 后者则是一份纯净的linux内核源码, 两个副本有利于我们生成自己的patch
91 |
92 | 3. patch内核, 使linux内核开机后执行我们自己定义的start_kernel
93 |
94 | 4. 使用预先的.config(位于configs目录的下mini-86.config文件)配着linux内核的编译参数, 也可以使用make allnoconfig使用默认配置, 至此.config文件生成, 可以执行make构建内核的操作
95 |
96 | 5. make构建内核, 为了保持内核源码的纯净, 我们使用make O=.out将内核构建到.out目录下, 构建完成后将在构建目录.out的arch/x86/boot下生成内核镜像bzImage
97 |
98 | 6. qemu -kernel bzImage用qemu启动内核
99 |
100 |
101 |
102 | 我们的makefile设置了所有自动化的配置工作, 可以直接使用make来完成所有的工作,但是我们仍然有必要了解构建的过程, 这对于我们学习, 修改以及出错排查都有帮助
103 |
104 | 构建**linux-3.9.4**
105 |
106 | ```c
107 | cd linux-3.9.4
108 | make
109 | ```
110 |
111 | 构建**linux-4.1**
112 |
113 | ```c
114 | cd linux-4.1
115 | make
116 | ```
117 |
118 |
119 | 如果您想了解详细的构建机理, 请参照如下信息
120 |
121 | #2.2 根目录
122 | -------
123 |
124 | | 目录 | 描述 |
125 | |:-------:|:-------:|
126 | | mykernel-3.9.4 | linux-3.9.4的构建目录 |
127 | | mykernel-4.1.0 | linux-4.1.0的构建目录 |
128 | | kink-src | 不断开发和改进的KINK小巧内核, 开发完成后, 将导入到内核构建目录的src中参与构建 |
129 | | mykernel.sh | 早期的构建脚本, 已经废弃, 现在已经使用makefile来完成自动化构建, 但是脚本myel.sh仍可以给我们基本的构建思路 |
130 | | doc | 操作系统的文档信息 |
131 | | doc/os2013 | [2013年暑期补课计算机操作系统原理](https://github.com/mengning/mykernel/wiki/OS2013) |
132 | | README.md | 帮助文档 |
133 |
134 | ##2.3 构建目录结构
135 | -------
136 |
137 | mykernel-3.9.4是linux-3.9.4的构建目录
138 |
139 | mykernel-4.1.0是linux-4.1.0的构建目录
140 |
141 |
142 | 首先来看下mykernel-x.x的目录结构
143 |
144 | | 目录 | 描述 |
145 | |:-------:|:-------:|
146 | | downloads | 内核源代码的下载目录 |
147 | | kernel | 内核源代码将被解压到kernel目录 |
148 | | patches | 我们自己kernel的补丁 |
149 | | configs | 内核源代码的.config文件, 但是我们编译linux-3.9.4内核的时候并未使用, 而是在集结make allnoconfig |
150 | | src | 我们内核的基本框架, 它并没有patch到内核中, 内核源代码树中的mysrc目录直接链接到了源码src中 |
151 | | Makefile | 用于构建的Makefile |
152 | | README.md | 文档信息 |
153 |
154 | #2.4 makefile构建过程
155 | -------
156 |
157 |
158 | 在构建的过程中会产生几个构建隐藏目录.stamps和.out
159 |
160 | 其中.stamps为我们的构建完成准备工作
161 |
162 | | .stamps子目录 | 描述 |
163 | |:-------:|:-------:|
164 | | downloads | 用于make完成linux内核源码的下载, 内核源码下载完成后, 此文件时间戳将被更新(create/touch) |
165 | | extract | 内核源代码下载完成后, 由extract完成内核源代码的解压缩, 将解压缩两个副本(linux-x.x.src和linux-x.x.new), 其中src是最原始的源码, 用于生成新的patch时候使用, new是我们的工作源码目录, 其中包含了一个指向了kernel源码src的链接文件mysrc |
166 | | patch | extract完成了解压缩之后, 交由patch来完成内核补丁的添加, 完成后更新patch的时间戳(以供makefile完成依赖检查) |
167 | | config | 最后config完成了内核.config的配置 |
168 |
169 |
170 |
171 |
172 |
173 |
174 | #2.5 总结
175 | -------
176 |
177 |
178 | **不用makefile如何一步一步构建内核**
179 |
180 |
181 | makefile的执行过程其实相当于执行了如下命令
182 |
183 | 以内核linux-4.1为例, 其中与linux-3.9内核有差别的地方我们会单独列出
184 |
185 |
186 | **首先安装qemu**
187 | ```c
188 | sudo apt-get install qemu # install QEMU
189 | ```
190 |
191 | ```
192 | sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
193 | ```
194 |
195 | 或者
196 | ```
197 | sudo ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu
198 | ```
199 |
200 | **下载内核源码** download Linux Kernel 4.1 source code, 源代码被下载到downloads目录下
201 |
202 | ```c
203 | cd downloads
204 | wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.tar.xz
205 | ```
206 |
207 | **解压缩内核源码**, 会将内核源代码解压缩到kernel目录下
208 | ```
209 |
210 | cd download
211 | xz -d linux-4.1.tar.xz
212 | tar -Jxvf linux-4.1.tar -C ../kernel #被解压缩kernel/linux-4.1目录下
213 | ```
214 |
215 | **配置内核源代码目录**, 配置出linux-4.1.new和linux-4.1.src两个目录
216 |
217 | ```c
218 | cd ../kernel
219 | cp linux-4.1 linux-4.1.src
220 | mv linux.4.1 linux-4.1.new
221 | ```
222 |
223 | **patch内核**, 用我们的start_kernel替代linux原本的start_kernel, 以完成我们自己的内核平台
224 |
225 | ```c
226 | cd linux-4.1-new
227 | patch -p1 < ../../patches/linux-4_1-mykernel.patch
228 | ```
229 |
230 | **link我们的src目录**, 我们需要构建的是内核源码树linux-4.1.new目录, 而我们的内核kernel在src中, 因此将src连接到内核源码的mysrc, 这样我们在src中直接修改代码, 直接make即可
231 |
232 | ```c
233 | cd linux-4.1-new
234 | ln -s ../../src mysrc
235 | ```
236 | 其中连接link和删除链接rmlink的工作可以直接交给make link/rmlink来完成, 具体请见makefile
237 |
238 |
239 | **构建内核在目录.out中完成**, 需要构建的是内核源码树linux-4.1.new目录
240 |
241 | 我们为了保证内核源码树的清洁, 构建不再源码树中完成, 而是在.out隐藏目录完成此工作, 因此我们先创建此目录
242 | ```c
243 | cd ../..
244 | mkdir -p .out
245 | ```
246 |
247 | **配置内核的BUILD构建配置文件.config**
248 |
249 |
250 | linux-4.1需要拷贝.config
251 | ```c
252 | cp configs/mini-x86.config .out/config
253 | ```
254 | 如果是linux-3.9.4, 我们不使用配置好的.config而是使用默认配置, 则执行如下操作
255 |
256 | ```c
257 | make allnoconfig
258 | ```
259 |
260 | **构建内核**, 使用O=$(pwd)/../../.out将构建任务指定到.out目录下
261 |
262 | ```c
263 | cd kernel/linux-4.1.0.new
264 | make O=$(pwd)/../../.out
265 | ```
266 |
267 | **运行操作系统**, 可以使用make run直接运行, 其本质上是执行了如下命令
268 |
269 | ```c
270 | qemu -kernel .out/arch/x86/boot/bzImage
271 | ```
272 |
273 | 从qemu窗口中您可以看到my_start_kernel在执行,同时my_timer_handler时钟中断处理程序周期性执行。
274 |
275 |
276 |
277 |
278 |
279 | #3 运行KINK操作系统
280 | ------
281 |
282 | **运行操作系统**, 可以使用
283 |
284 | ```c
285 | make run
286 | ```
287 |
288 | 直接运行, 其本质上是执行了如下命令
289 |
290 | ```c
291 | qemu -kernel .out/arch/x86/boot/bzImage
292 | ```
293 |
294 |
295 | linux3.9.4的运行情况
296 |
297 | 
298 |
299 | linux4.1.0的运行情况
300 |
301 | 
302 |
303 |
304 | #4 如何生成/添加patch
305 | -------
306 |
307 |
308 | 首先我们先删除mysrc的工作目录, 当然你也可以选择不删除, 这样的话我们自己kernel的源码也会集成到patch中, 而多数情况下, 我们希望生成的是一个纯净的patch, 一个可以被被人拿来直接穿件自己kernel的patch.
309 |
310 |
311 | 使用diff对比两个new和src两个构建目录的异同, 即可生成一个patch
312 |
313 | ```c
314 | diff -Naur linux-4.1.src linux-4.1.new/ >linux-4.1-mykernel.patch
315 | ```
316 | 也可以直接使用make genpatch直接生成patch
317 |
318 | 将patch添加到内核中可以直接使用
319 |
320 | ```c
321 | patch -p1 < ../../patches/linux-4_1-mykernel.patch
322 | ```
323 |
324 | 也可以使用make patch直接添加patch
325 |
326 |
327 | #5 改进自己的KINK内核
328 | -------
329 |
330 | 我们在根目录的kink-src目录中不断完善自己的内核, 然后将内核拷贝到mykernel-x.x.x的src文件中, 执行make操作即可参与构建
331 |
332 | ##5.1 为什么使用3.9.4和4.1.0两个内核
333 |
334 | 其实完全可以使用一个内核, 但是, 基于一下几点, 我们保留了对个内核.
335 |
336 | * 我们的项目是在[jserv/kernel-in-kernel](https://github.com/jserv/kernel-in-kernel)(基于linux-4.1.0)和[mengning/mykernel](https://github.com/mengning/mykernel)(基于linux-3.9.4)的基础上整合在一起的, 而后者也是在前者的基础上改进的, 这些都是原作者的劳动成果, 我们应该给予尊重
337 | .
338 | * 该项目的本质是希望通过一个模拟的内核机制来实现我们自定义的进程调度机制或者其他内核机制, 因此在多个版本的内核中同时编译运行, 不同的内核中采用不同的机制或者不同的参数, 利于我们开发改进
339 |
340 |
341 | * 我们的KINK在不断的完善, 给出两个或者多个分支版本, 即可以方便我们对比进度和完善的情况, 也利于我们分析其在不同内核中的运行情况.
342 |
343 | * 由于linux内核在不断更新, 我们不排除后期仍然会增加其他的内核版本, 甚至可能添加一些早期版本比如2.x
344 |
345 |
346 |
347 |
348 | ##5.2 如何编写自己的内核
349 | -------
350 |
351 | 你可以直接在mykernel-x.x.x的src目录中直接修改KINK内核代码, 由于该目录被链接到了build目录kernel/linux-x.x.x.new/mysrc中, 因为我们该文件的修改将在build过程中直接更新的内核linux内核和KINK中
352 |
353 | 但是我们也提供了根的kink-src目录来开发, 这个目录可以做为KINK-src的存档目录.
354 |
355 | 即进行KINK开发, 你可以
356 |
357 | * 在mykernel-x.x.x的src目录修改, 并直接编译, 一些重要的版本可以备份到kink-src目录
358 |
359 | OR
360 |
361 | * 将kink-src作为工作目录, 在完成后, 将源码拷贝到对应内核版本的mykernel-x.x.x的src目录中, 然后执行make build操作
362 |
363 | OR
364 |
365 | * 我们说过了linux-kernel内核源代码的mysrc是一个指向了src的链接目录, 如果你觉得每次拷贝麻烦, 你甚至可以直接将mysrc连接到kink-src目录, 这样就不同每次拷贝了.
366 |
367 |
368 | kink-src中源码, 以及mysrc, src的源码结构如下
369 |
370 |
371 | | 文件 | 描述 |
372 | |:-------:|:-------:|
373 | | pcb.h | 进程的基本信息PCB结构 |
374 | | interrupt.c | 周期性中断处理, 其功能类似与周期性调度器 |
375 | | scheduler.c | 主调度器, 如果需要更改调度机制, 主要是更改此目录 |
376 | | main.c | KINK-kernel的主函数 |
377 | | Makefile | 构建内核源码需要的makefile |
378 |
379 |
380 | #6 Comments
381 | -------
382 |
383 | * KernelInKernel一个短小精悍的模拟内核,在Linux内核的基础山已补丁patch的方式实现, 通过屏蔽掉linux内核的启动函数, 实现自己的start_kernel来启动一个小巧的操作系统
384 |
385 | * 本系统在[jserv/kernel-in-kernel](https://github.com/jserv/kernel-in-kernel)(基于linux-4.1.0)和[mengning/mykernel](https://github.com/mengning/mykernel)(基于linux-3.9.4)的基础上实现, 将两者整合在一起, 借鉴了前者的makefile机制和后者的调度器.
386 |
387 |
388 | #7 Links
389 | -------
390 | * [Linux进程管理与调度-之-目录导航](http://blog.csdn.net/gatieme/article/details/51456569)
391 |
392 | * [Linux内核分析期末总结](http://blog.csdn.net/pianogirl123/article/details/51287024)
393 |
394 |
395 | * [2013年暑期补课计算机操作系统原理](https://github.com/mengning/mykernel/wiki/OS2013)
396 |
397 |
--------------------------------------------------------------------------------
/doc/INSTALL.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/INSTALL.docx
--------------------------------------------------------------------------------
/doc/Visio/PCB.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/PCB.jpg
--------------------------------------------------------------------------------
/doc/Visio/PCB.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/PCB.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack1-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-0.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack1-0.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-0.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack1-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-1.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack1-1.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-1.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack1-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-2.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack1-2.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-2.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack1-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-3.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack1-3.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-3.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack1-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-4.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack1-4.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-4.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack1-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-5.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack1-5.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack1-5.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack2-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-0.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack2-0.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-0.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack2-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-1.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack2-1.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-1.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack2-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-2.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack2-2.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-2.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack2-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-3.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack2-3.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-3.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack2-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-4.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack2-4.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-4.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack2-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-5.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack2-5.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack2-5.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-0.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-0.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-0.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-1.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-1.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-1.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-2.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-2.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-2.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-3.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-3.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-3.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-4.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-4.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-4.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-5.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-5.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-5.vsdx
--------------------------------------------------------------------------------
/doc/Visio/stack3-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-6.jpg
--------------------------------------------------------------------------------
/doc/Visio/stack3-6.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/stack3-6.vsdx
--------------------------------------------------------------------------------
/doc/Visio/task0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/task0.jpg
--------------------------------------------------------------------------------
/doc/Visio/task0.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/task0.vsdx
--------------------------------------------------------------------------------
/doc/Visio/循环链表.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表.jpg
--------------------------------------------------------------------------------
/doc/Visio/循环链表.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表.vsdx
--------------------------------------------------------------------------------
/doc/Visio/循环链表1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表1.jpg
--------------------------------------------------------------------------------
/doc/Visio/循环链表1.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表1.vsdx
--------------------------------------------------------------------------------
/doc/Visio/循环链表2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表2.jpg
--------------------------------------------------------------------------------
/doc/Visio/循环链表2.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表2.vsdx
--------------------------------------------------------------------------------
/doc/Visio/循环链表3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表3.jpg
--------------------------------------------------------------------------------
/doc/Visio/循环链表3.vsdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/Visio/循环链表3.vsdx
--------------------------------------------------------------------------------
/doc/images/linux-3.9.4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/images/linux-3.9.4.png
--------------------------------------------------------------------------------
/doc/images/linux-4.1.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/images/linux-4.1.0.png
--------------------------------------------------------------------------------
/doc/mykernel.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/mykernel.ppt
--------------------------------------------------------------------------------
/doc/os2013/CoursePlan2013.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/CoursePlan2013.pdf
--------------------------------------------------------------------------------
/doc/os2013/HowtheComputerWorks-1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/HowtheComputerWorks-1.pdf
--------------------------------------------------------------------------------
/doc/os2013/HowtheComputerWorks-2.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/HowtheComputerWorks-2.ppt
--------------------------------------------------------------------------------
/doc/os2013/LinuxArchitectureAndSystemExecution.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/LinuxArchitectureAndSystemExecution.ppt
--------------------------------------------------------------------------------
/doc/os2013/LinuxC.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/LinuxC.pdf
--------------------------------------------------------------------------------
/doc/os2013/Linux_Get_Started_SOP_V1.1.0_20120806.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/Linux_Get_Started_SOP_V1.1.0_20120806.pdf
--------------------------------------------------------------------------------
/doc/os2013/example_asm.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int z = 0;
4 | int x = 8;
5 | int y = 8;
6 |
7 | int main()
8 | {
9 | printf("x:%d,y:%d\n",x,y);
10 | /* simu z = add(x,y); */
11 | asm volatile(
12 | /* simu call */
13 | "pushl %1\n\t"
14 | "pushl %2\n\t"
15 | "pushl $0\n\t"
16 | /* simu add functon */
17 | "pushl %%ebp\n\t"
18 | "movl %%esp,%%ebp\n\t"
19 | "movl $0,%%eax\n\t"
20 | "addl 12(%%ebp),%%eax\n\t"
21 | "addl 8(%%ebp),%%eax\n\t"
22 | "movl %%ebp,%%esp\n\t"
23 | "popl %%ebp\n\t"
24 | /* add functon end */
25 | "movl %%eax,%0\n\t"
26 | :"=m"(z)
27 | : "m" (x),"m" (y)
28 | );
29 | printf("z:%d\n",z);
30 | return 0;
31 | }
32 |
--------------------------------------------------------------------------------
/doc/os2013/example_c.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | int z = 0;
4 | int x = 8;
5 | int y = 8;
6 |
7 | int add(int x,int y)
8 | {
9 | return x + y;
10 | }
11 |
12 | int main()
13 | {
14 | printf("x:%d,y:%d\n",x,y);
15 | z = add(x,y);
16 | printf("z:%d\n",z);
17 | return 0;
18 | }
19 |
--------------------------------------------------------------------------------
/doc/os2013/lab3-shell.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab3-shell.ppt
--------------------------------------------------------------------------------
/doc/os2013/lab3.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab3.rar
--------------------------------------------------------------------------------
/doc/os2013/lab4.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab4.ppt
--------------------------------------------------------------------------------
/doc/os2013/lab5.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab5.ppt
--------------------------------------------------------------------------------
/doc/os2013/lab6.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab6.pdf
--------------------------------------------------------------------------------
/doc/os2013/lab6.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab6.rar
--------------------------------------------------------------------------------
/doc/os2013/lab7.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab7.ppt
--------------------------------------------------------------------------------
/doc/os2013/lab7.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/lab7.rar
--------------------------------------------------------------------------------
/doc/os2013/mykernel_release_1.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/mykernel_release_1.rar
--------------------------------------------------------------------------------
/doc/os2013/mykernel_release_2.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gatieme/KernelInKernel/fb20116a2b7fdd90493eb8f1aaf33a61c4e2e2b2/doc/os2013/mykernel_release_2.rar
--------------------------------------------------------------------------------
/kink-src/kink-0.0.1/Makefile:
--------------------------------------------------------------------------------
1 | # used by Linux kernel
2 | obj-y = interrupt.o scheduler.o main.o
3 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.1/interrupt.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "pcb.h"
4 |
5 | extern myPCB task[MAX_TASK_NUM], *my_current_task;
6 | extern volatile int my_need_sched;
7 | volatile int time_count = 0;
8 |
9 | /*
10 | * Called by timer interrupt.
11 | * it runs in the name of current running process,
12 | * so it use kernel stack of current running process
13 | */
14 | void my_timer_handler(void)
15 | {
16 | if (time_count % 1000 == 0 && my_need_sched != 1)
17 | my_need_sched = 1;
18 | time_count++;
19 | }
20 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.1/main.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "pcb.h"
4 |
5 | myPCB task[MAX_TASK_NUM], *my_current_task = NULL;
6 | volatile int my_need_sched = 0;
7 |
8 | static void my_process(void);
9 |
10 | void __init my_start_kernel(void)
11 | {
12 | int pid = 0;
13 | int i;
14 |
15 | /* Initialize process 0 */
16 | task[pid].pid = pid;
17 | task[pid].state = S_runnable;
18 | task[pid].task_entry = task[pid].thread.ip = (uintptr_t) my_process;
19 | task[pid].thread.sp =
20 | (uintptr_t) &task[pid].stack[KERNEL_STACK_SIZE - 1];
21 | task[pid].next = &task[pid];
22 |
23 | /* fork more process */
24 | for (i = 1; i < MAX_TASK_NUM; i++) {
25 | memcpy(&task[i], &task[0], sizeof(myPCB));
26 | task[i].pid = i;
27 | task[i].state = S_stopped;
28 | task[i].thread.sp =
29 | (uintptr_t) &task[i].stack[KERNEL_STACK_SIZE - 1];
30 | task[i].next = task[i-1].next;
31 | task[i-1].next = &task[i];
32 | }
33 |
34 | /* start process 0 by task[0] */
35 | pid = 0;
36 | my_current_task = &task[pid];
37 | asm volatile(
38 | "movl %0, %%esp\n\t" /* set task[pid].thread.sp to esp */
39 | "jmp my_process\n"
40 | :
41 | : "c" (task[pid].thread.sp) /* input c mean /%edx */
42 | );
43 | }
44 |
45 | static void my_process(void)
46 | {
47 | unsigned long i = 0;
48 | while (1)
49 | {
50 | if (i++ % 10000000)
51 | continue;
52 |
53 | //printk(KERN_NOTICE "this is process %d - =WangPanPan(Soleprincess)=\n",
54 | // my_current_task->pid);
55 |
56 | if (my_need_sched == 1)
57 | {
58 | printk(KERN_NOTICE "process %d schedule\n", my_current_task->pid);
59 | my_need_sched = 0;
60 | my_schedule();
61 | printk(KERN_NOTICE "process %d re-schedule\n", my_current_task->pid);
62 | }
63 |
64 | //printk(KERN_NOTICE "this is process %d + =ChengJian(Gatieme)=\n",
65 | // my_current_task->pid);
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.1/pcb.h:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #define MAX_TASK_NUM 4
4 | #define KERNEL_STACK_SIZE (1024 * 8)
5 |
6 | /* CPU-specific state of this task */
7 | struct myThread {
8 | uintptr_t ip;
9 | uintptr_t sp;
10 | };
11 |
12 | enum myState { S_unrunnable = -1, S_runnable = 0, S_stopped = 1 };
13 | typedef struct _myPCB {
14 | int pid;
15 | volatile enum myState state;
16 | char stack[KERNEL_STACK_SIZE];
17 | /* CPU-specific state of this task */
18 | struct myThread thread;
19 | uintptr_t task_entry;
20 | struct _myPCB *next;
21 | } myPCB;
22 |
23 | void my_schedule(void);
24 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.1/scheduler.c:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include "pcb.h"
4 |
5 | extern myPCB task[MAX_TASK_NUM], *my_current_task;
6 | extern volatile int my_need_sched;
7 |
8 |
9 | void my_schedule(void)
10 | {
11 | myPCB *next, *prev;
12 |
13 | if (my_current_task == NULL
14 | || my_current_task->next == NULL)
15 | {
16 | printk(KERN_NOTICE " time out!!!,but no more than 2 task,need not schedule\n");
17 | return;
18 | }
19 | printk(KERN_NOTICE ">>> %s <<<\n", __func__);
20 | /* schedule */
21 | next = my_current_task->next;
22 | prev = my_current_task;
23 | if (next->state == S_runnable) {
24 | my_current_task = next;
25 | printk(KERN_NOTICE ">>>switch from %d to %d<<<\n",
26 | prev->pid, next->pid);
27 | /* switch to next process */
28 | asm volatile(
29 | "movl %%esp, %0\n\t" /* save esp */
30 | "movl %2, %%esp\n\t" /* restore esp */
31 | "movl $1f, %1\n\t" /* save eip */
32 | "jmp *%3\n"
33 | "1:\t" /* next process start here */
34 | : "=m" (prev->thread.sp), "=m" (prev->thread.ip)
35 | : "m" (next->thread.sp), "m" (next->thread.ip)
36 | );
37 | } else {
38 | next->state = S_runnable;
39 | my_current_task = next;
40 | printk(KERN_NOTICE ">>>switch to new process %d<<<\n",
41 | next->pid);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.2/Makefile:
--------------------------------------------------------------------------------
1 | #
2 | # Makefile for the linux mykernel.
3 | #
4 |
5 | obj-y = interrupt.o scheduler.o main.o
6 |
7 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.2/README.md:
--------------------------------------------------------------------------------
1 | # Welcome to the mykernel 1.1
2 |
3 | 增加了优先级调度方式
--------------------------------------------------------------------------------
/kink-src/kink-0.0.2/interrupt.c:
--------------------------------------------------------------------------------
1 | /* mykernel--Simple simulation of the linux OS process schedule
2 | *
3 | * linux/mykernel/myinterrupt.c
4 | *
5 | * Kernel internal my_timer_handler
6 | *
7 | * Copyright (C) 2013 Mengning
8 | *
9 | * Modified 2014 zhyq
10 | *
11 | *
12 | * You can redistribute or modify this program under the terms
13 | * of the GNU General Public License as published by
14 | * the Free Software Foundation.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program. If not, see .
18 | */
19 |
20 | #include
21 | #include
22 | #include
23 | #include
24 | #include
25 | #include
26 | #include
27 | #include
28 | #include
29 | #include
30 | #include
31 | #include
32 | #include
33 | #include
34 | #include
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 | #include
41 | #include
42 |
43 | #include
44 | #include
45 | #include
46 | #include
47 | #include
48 |
49 | #include
50 | #include
51 | #include
52 | #include
53 | #include
54 |
55 | #include "pcb.h"
56 |
57 | #define CREATE_TRACE_POINTS
58 | #include
59 |
60 | extern tPCB task[MAX_TASK_NUM];
61 | extern tPCB * my_current_task;
62 | extern volatile int my_need_sched;
63 | volatile int time_count = 0;
64 |
65 | /*
66 | * Called by timer interrupt.
67 | * it runs in the name of current running process,
68 | * so it use kernel stack of current running process
69 | */
70 | void my_timer_handler(void)
71 | {
72 | #if 1
73 | // make sure need schedule after system circle 2000 times.
74 | if(time_count%2000 == 0 && my_need_sched != 1)
75 | {
76 | my_need_sched = 1;
77 | //time_count=0;
78 | }
79 | time_count ++ ;
80 | #endif
81 | return;
82 | }
83 |
84 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.2/main.c:
--------------------------------------------------------------------------------
1 | /* mykernel--Simple simulation of the linux OS process schedule
2 | *
3 | * linux/mykernel/mymain.c
4 | *
5 | * Kernel internal my_timer_handler
6 | *
7 | * Copyright (C) 2013 Mengning
8 | *
9 | * Modified zhyq
10 | *
11 | *
12 | * You can redistribute or modify this program under the terms
13 | * of the GNU General Public License as published by
14 | * the Free Software Foundation.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program. If not, see .
18 | */
19 |
20 |
21 | #include
22 | #include
23 | #include
24 | #include
25 | #include
26 | #include
27 | #include
28 | #include
29 | #include
30 | #include
31 | #include
32 | #include
33 | #include
34 | #include
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 | #include
41 | #include
42 | #include
43 | #include
44 | #include
45 | #include
46 | #include
47 | #include
48 | #include
49 | #include
50 | #include
51 | #include
52 | #include
53 | #include
54 | #include
55 | #include
56 | #include
57 | #include
58 | #include
59 | #include
60 | #include
61 | #include
62 | #include
63 | #include
64 | #include
65 | #include
66 | #include
67 | #include
68 | #include
69 | #include
70 | #include
71 | #include
72 | #include
73 | #include
74 | #include
75 | #include
76 | #include
77 | #include
78 | #include
79 | #include
80 | #include
81 | #include
82 | #include
83 | #include
84 |
85 | #include
86 | #include
87 | #include
88 | #include
89 | #include
90 |
91 | #include
92 |
93 | #include
94 | #include
95 |
96 | #ifdef CONFIG_X86_LOCAL_APIC
97 | #include
98 | #endif
99 | #include "pcb.h"
100 |
101 | tPCB task[MAX_TASK_NUM];
102 | tPCB * my_current_task = NULL;
103 | volatile int my_need_sched = 0;
104 |
105 | void my_process(void);
106 | unsigned long get_rand(int );
107 |
108 | void sand_priority(void)
109 | {
110 | int i;
111 | for(i=0;i0 stopped */
120 | // set task 0 execute entry address to my_process
121 | task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;
122 | task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
123 | task[pid].next = &task[pid];
124 | /*fork more process */
125 | for(pid=1;pid>>process 0 running!!!<<<\n\n");
135 | /* start process 0 by task[0] */
136 | pid = 0;
137 | my_current_task = &task[pid];
138 | asm volatile(
139 | "movl %1,%%esp\n\t" /* set task[pid].thread.sp to esp */
140 | "pushl %1\n\t" /* push ebp */
141 | "pushl %0\n\t" /* push task[pid].thread.ip */
142 | "ret\n\t" /* pop task[pid].thread.ip to eip */
143 | "popl %%ebp\n\t"
144 | :
145 | : "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) /* input c or d mean %ecx/%edx*/
146 | );
147 | }
148 | void my_process(void)
149 | {
150 | int i = 0;
151 | while(1)
152 | {
153 | i++;
154 | if(i%10000000 == 0)
155 | {
156 | //printk(KERN_NOTICE "this is process %d - =WangPanPan(Soleprincess)=\n",
157 | // my_current_task->pid);
158 |
159 | if(my_need_sched == 1)
160 | {
161 | //printk(KERN_NOTICE "process %d schedule\n", my_current_task->pid);
162 | my_need_sched = 0;
163 | sand_priority();
164 | my_schedule();
165 |
166 | //printk(KERN_NOTICE "process %d re-schedule\n", my_current_task->pid);
167 | }
168 | //printk(KERN_NOTICE "this is process %d - =ChengJian(Gatieme)=\n",
169 | // my_current_task->pid);
170 | }
171 | }
172 | }//end of my_process
173 |
174 | //produce a random priority to a task
175 | unsigned long get_rand(max)
176 | {
177 | unsigned long a;
178 | unsigned long umax;
179 | umax=(unsigned long)max;
180 | get_random_bytes(&a, sizeof(unsigned long ));
181 | a=(a+umax)%umax;
182 | return a;
183 | }
184 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.2/pcb.h:
--------------------------------------------------------------------------------
1 | /* mykernel--Simple simulation of the linux OS process schedule
2 | *
3 | * linux/mykernel/mypcb.h
4 | *
5 | * Kernel internal my_timer_handler
6 | *
7 | * Copyright (C) 2013 Mengning
8 | *
9 | * Modified 2014 Yunquan Zhang
10 | *
11 | *
12 | * You can redistribute or modify this program under the terms
13 | * of the GNU General Public License as published by
14 | * the Free Software Foundation.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program. If not, see .
18 | */
19 |
20 | #define MAX_TASK_NUM 10 // max num of task in system
21 | #define KERNEL_STACK_SIZE 1024*8
22 | #define PRIORITY_MAX 30 //priority range from 0 to 30
23 |
24 | /* CPU-specific state of this task */
25 | struct Thread {
26 | unsigned long ip;//point to cpu run address
27 | unsigned long sp;//point to the thread stack's top address
28 | //todo add other attrubte of system thread
29 | };
30 |
31 | //PCB Struct
32 | typedef struct PCB{
33 | int pid; // pcb id
34 | volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
35 | char stack[KERNEL_STACK_SIZE];// each pcb stack size is 1024*8
36 | /* CPU-specific state of this task */
37 | struct Thread thread;
38 | unsigned long task_entry;//the task execute entry memory address
39 | struct PCB *next;//pcb is a circular linked list
40 | unsigned long priority;// task priority ////////
41 | //todo add other attrubte of process control block
42 | }tPCB;
43 |
44 | //void my_schedule(int pid);
45 | void my_schedule(void);
46 |
--------------------------------------------------------------------------------
/kink-src/kink-0.0.2/scheduler.c:
--------------------------------------------------------------------------------
1 | /* mykernel--Simple simulation of the linux OS process schedule
2 | *
3 | * linux/mykernel/myinterrupt.c
4 | *
5 | * Kernel internal my_timer_handler
6 | *
7 | * Copyright (C) 2013 Mengning
8 | *
9 | * Modified 2014 zhyq
10 | *
11 | *
12 | * You can redistribute or modify this program under the terms
13 | * of the GNU General Public License as published by
14 | * the Free Software Foundation.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program. If not, see .
18 | */
19 |
20 | #include
21 | #include
22 | #include
23 | #include
24 | #include
25 | #include
26 | #include
27 | #include
28 | #include
29 | #include
30 | #include
31 | #include
32 | #include
33 | #include
34 | #include
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 | #include
41 | #include
42 |
43 | #include
44 | #include
45 | #include
46 | #include
47 | #include
48 |
49 | #include
50 | #include
51 | #include
52 | #include
53 | #include
54 |
55 | #include "pcb.h"
56 |
57 | #define CREATE_TRACE_POINTS
58 | #include
59 |
60 | extern tPCB task[MAX_TASK_NUM];
61 | extern tPCB * my_current_task;
62 | extern volatile int my_need_sched;
63 |
64 |
65 | void all_task_print(void)
66 | {
67 | int i,cnum=62;//
68 | printk(KERN_NOTICE "\n current task is:%d all task in OS are:\n",my_current_task->pid);
69 |
70 | printk(" ");
71 | for(i=0;ipriority)
95 | hig_pri=&task[i];
96 | printk(" higst process is:%d priority is:%d\n",hig_pri->pid,hig_pri->priority);
97 | return hig_pri;
98 |
99 | }//end of priority_schedule
100 |
101 | void my_schedule(void)
102 | {
103 | tPCB * next;
104 | tPCB * prev;
105 | // if there no task running or only a task ,it shouldn't need schedule
106 | if(my_current_task == NULL
107 | || my_current_task->next == NULL)
108 | {
109 | printk(KERN_NOTICE " time out!!!,but no more than 2 task,need not schedule\n");
110 | return;
111 | }
112 | /* schedule */
113 |
114 | next = get_next();
115 | prev = my_current_task;
116 | printk(KERN_NOTICE " the next task is %d priority is %u\n",next->pid,next->priority);
117 | if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */
118 | {//save current scene
119 | /* switch to next process */
120 | asm volatile(
121 | "pushl %%ebp\n\t" /* save ebp */
122 | "movl %%esp,%0\n\t" /* save esp */
123 | "movl %2,%%esp\n\t" /* restore esp */
124 | "movl $1f,%1\n\t" /* save eip */
125 | "pushl %3\n\t"
126 | "ret\n\t" /* restore eip */
127 | "1:\t" /* next process start here */
128 | "popl %%ebp\n\t"
129 | : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
130 | : "m" (next->thread.sp),"m" (next->thread.ip)
131 | );
132 | my_current_task = next;//switch to the next task
133 | printk(KERN_NOTICE " switch from %d process to %d process\n >>>process %d running!!!<<<\n\n",prev->pid,next->pid,next->pid);
134 |
135 | }
136 | else
137 | {
138 | next->state = 0;
139 | my_current_task = next;
140 | printk(KERN_NOTICE " switch from %d process to %d process\n >>>process %d running!!!<<<\n\n\n",prev->pid,next->pid,next->pid);
141 |
142 | /* switch to new process */
143 | asm volatile(
144 | "pushl %%ebp\n\t" /* save ebp */
145 | "movl %%esp,%0\n\t" /* save esp */
146 | "movl %2,%%esp\n\t" /* restore esp */
147 | "movl %2,%%ebp\n\t" /* restore ebp */
148 | "movl $1f,%1\n\t" /* save eip */
149 | "pushl %3\n\t"
150 | "ret\n\t" /* restore eip */
151 | : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
152 | : "m" (next->thread.sp),"m" (next->thread.ip)
153 | );
154 | }
155 | return;
156 | }//end of my_schedule
157 |
158 |
--------------------------------------------------------------------------------
/kink-src/kink-now/Makefile:
--------------------------------------------------------------------------------
1 | #
2 | # Makefile for the linux mykernel.
3 | #
4 |
5 | obj-y = interrupt.o scheduler.o main.o
6 |
7 |
--------------------------------------------------------------------------------
/kink-src/kink-now/README.md:
--------------------------------------------------------------------------------
1 | # Welcome to the mykernel 1.1
2 |
3 | 增加了优先级调度方式
--------------------------------------------------------------------------------
/kink-src/kink-now/interrupt.c:
--------------------------------------------------------------------------------
1 | /* mykernel--Simple simulation of the linux OS process schedule
2 | *
3 | * linux/mykernel/myinterrupt.c
4 | *
5 | * Kernel internal my_timer_handler
6 | *
7 | * Copyright (C) 2013 Mengning
8 | *
9 | * Modified 2014 zhyq
10 | *
11 | *
12 | * You can redistribute or modify this program under the terms
13 | * of the GNU General Public License as published by
14 | * the Free Software Foundation.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program. If not, see .
18 | */
19 |
20 | #include
21 | #include
22 | #include
23 | #include
24 | #include
25 | #include
26 | #include
27 | #include
28 | #include
29 | #include
30 | #include
31 | #include
32 | #include
33 | #include
34 | #include
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 | #include
41 | #include
42 |
43 | #include
44 | #include
45 | #include
46 | #include
47 | #include
48 |
49 | #include
50 | #include
51 | #include
52 | #include
53 | #include
54 |
55 | #include "pcb.h"
56 |
57 | #define CREATE_TRACE_POINTS
58 | #include
59 |
60 | extern tPCB task[MAX_TASK_NUM];
61 | extern tPCB * my_current_task;
62 | extern volatile int my_need_sched;
63 | volatile int time_count = 0;
64 |
65 | /*
66 | * Called by timer interrupt.
67 | * it runs in the name of current running process,
68 | * so it use kernel stack of current running process
69 | */
70 | void my_timer_handler(void)
71 | {
72 | #if 1
73 | // make sure need schedule after system circle 2000 times.
74 | if(time_count%2000 == 0 && my_need_sched != 1)
75 | {
76 | my_need_sched = 1;
77 | //time_count=0;
78 | }
79 | time_count ++ ;
80 | #endif
81 | return;
82 | }
83 |
84 |
--------------------------------------------------------------------------------
/kink-src/kink-now/main.c:
--------------------------------------------------------------------------------
1 | /* mykernel--Simple simulation of the linux OS process schedule
2 | *
3 | * linux/mykernel/mymain.c
4 | *
5 | * Kernel internal my_timer_handler
6 | *
7 | * Copyright (C) 2013 Mengning
8 | *
9 | * Modified zhyq
10 | *
11 | *
12 | * You can redistribute or modify this program under the terms
13 | * of the GNU General Public License as published by
14 | * the Free Software Foundation.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program. If not, see .
18 | */
19 |
20 |
21 | #include
22 | #include
23 | #include
24 | #include
25 | #include
26 | #include
27 | #include
28 | #include
29 | #include
30 | #include
31 | #include
32 | #include
33 | #include
34 | #include
35 | #include
36 | #include
37 | #include
38 | #include
39 | #include
40 | #include
41 | #include
42 | #include
43 | #include
44 | #include
45 | #include
46 | #include
47 | #include
48 | #include
49 | #include
50 | #include
51 | #include
52 | #include
53 | #include
54 | #include
55 | #include
56 | #include
57 | #include
58 | #include
59 | #include
60 | #include
61 | #include
62 | #include
63 | #include
64 | #include
65 | #include
66 | #include
67 | #include
68 | #include
69 | #include
70 | #include
71 | #include
72 | #include
73 | #include
74 | #include
75 | #include
76 | #include
77 | #include
78 | #include
79 | #include
80 | #include
81 | #include
82 | #include
83 | #include
84 |
85 | #include
86 | #include
87 | #include
88 | #include
89 | #include
90 |
91 | #include
92 |
93 | #include
94 | #include
95 |
96 | #ifdef CONFIG_X86_LOCAL_APIC
97 | #include
98 | #endif
99 | #include "pcb.h"
100 |
101 | tPCB task[MAX_TASK_NUM];
102 | tPCB * my_current_task = NULL;
103 | volatile int my_need_sched = 0;
104 |
105 | void my_process(void);
106 | unsigned long get_rand(int );
107 |
108 | void sand_priority(void)
109 | {
110 | int i;
111 | for(i=0;i0 stopped */
122 | // set task 0 execute entry address to my_process
123 | task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;
124 | task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
125 | task[pid].next = &task[pid];
126 | /*fork more process */
127 | for(pid=1;pid