- Windows10
- bochs 2.6.11
- NASM 2.11.02.exe
- rawrite2.0
- /boot all the flies that controls the bootup
- /fs all the files that related to the filesystem
- /include xx.h files
- /init init the OS and run main.c
- /kernel all the system_call
- /lib lib files
- /mm all the files to manage memory
- /tools
- Makefile
Makefile calls up all the makefile in the directories and make them together to get the LiNOS
add some function to get a better debug experience
such as:
print_ln
print_hex
chang some ungly writing style in linux-0.11 such as mov ax,#0 -> xor ax, ax
when failing to kill_driver_motor, now I printed the status of the dirver
add some fucntion to get a better debug experience
add some fucntion to get a better debug experience
[] implement buddy system
[] fix the xv6 & ucore together
[] rewrite the file system
[] add GUI
[] add Network Protocol Stack
[] maybe rewrite it in Rust
-
And I'm going to start the OS Writing *
-
If I have enough time, I will write a detailed turtorials to talk about the way to write a personal toy system
AT&T: immed32(basepointer, indexpointer, indexscale) imm32 + basepointer + indexpointer × indexscale 寄存器命名必带% AT&T: movl $_value, %ebx
顺序从前到后 AT&T: movl %eax, %ebx
直接寻址 AT&T: foo
寄存器间接寻址 AT&T: (%eax)
变址寻址
AT&T: _variable(%eax)
AT&T: _array( ,%eax, 4)
AT&T: _array(%ebx, %eax,8)
基本内联汇编语句(basic inline asm statement)和扩展内联汇编语句(extended inline asm statement)
如果有多行汇编,则每一行都要加上 "\n\t"。其中的 “\n” 是换行符,"\t” 是 tab 符,在每条命令的 结束加这两个符号,是为了让 gcc 把内联汇编代码翻译成一般的汇编代码时能够保证换行和留有一定的空格
一些寄存器或者串口变量值会随时变化,volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出 Debug模式下,编译器不会对代码进行优化,输出结果正确 Release模式下,结果错误
volatile用在如下的几个地方:
- 中断服务程序中修改的供其它程序检测的变量需要加 volatile;
- 多任务环境下各任务间共享的标志应该加 volatile;
- 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同
volatile指针 和 const 修饰词类似,const 有常量指针和指针常量的说法,volatile 也有相应的概念: 数据const,指针指的对象 const char* cpch; volatile char* vpch;
地址,或者说指针自身的值 char* const pchc; char* volatile pchv;
(1) 可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象。 (2) 除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。 (3) C++中一个有volatile标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户只能用const_cast来获得对类型接口的完全访问。此外,volatile向const一样会从类传递到它的成员。
多线程下volatile 当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中 如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行