📄 readme.txt
字号:
4.写到软盘时应该去掉pad吧(?!), 否则可能出错. (partcopy 的错, 见修改记录41) 3.修改这个文档,修改 Boot.s和setup.s 的输出信息,使其更加美观. 2002.9.1 2.定制djgpp nasm 在win下编译 1. 开发工具升级到: vmWare 3.1, gcc 3.1. 编译不再中断.(djgpp's mini bug) 修改记录: 52. 2003.4.22 ld 在输出输入的文件名包含 console 时会等待键盘输入或者输出. 真是郁闷. 只好叫onsole 了. 51. 2003.4.21 终于决定使用lds. 因为迄今为止对用做初始化的页表仍然使用" 绝对 " 定位. 见head.s . 在coff中, lds 中的变量到c中访问需要注意下划线的问题. 另外 PROVIDE 宏是不是 export 一个变量就没有深究了. 以前试过在head.s 中使用 align 4096, 但是总是把_pgdir 定位于 0x200 这样的地址. 今天看了看默认的lds, 发现其中有align(0x200) 等定位语句. 以前做不成应该是这个问题. 51. 2003.4.20 修改目录结构. 1) 保持了include 目录的含义: 体系无关. 增加了arch.h 在include 目录. 用于隔离 体系特定的文件. 2003.4.21 2) driver/keyboard 在include 目录新增drv目录. driver/keyboard 向 include/drv 提供头文件 kbd.h. 50. 2003.4.19 修改setup.s . 我们在setup.s 中不对8259 重编程. 这个工作main 做了. 但是禁止8259 响应任何中断. 把8259 的代码分离到setup/8259.s . 49. 2003.4.17 给编译选项加上 -nostdlib . 48. 2003.4.17 把vga, kernel 都换成子make. 发现写到软盘的系统不太正常. 键盘驱动有问题. 按a, 不出a,出一堆乱码. 切换到图形模式后log信息不能正常输出. 怀疑是rawrite 没有把最后一个磁道或者扇区写到软驱,导致数据不正常. 把软盘影像扩大一点, 正常, 好像证实了以上猜测. 共享一个 img 吧,测试出一个512K+2K, 写软驱费点时间吧. 47.2003.4.16 e820 基本上可以正常工作了. 46.2003.4.16 昨天和今天做了一些工作. 1. 收集mem map 信息. boot/setup/detectmem.s e820 boot/setup/setupvga.s 提供字符串输出 boot/setup.s 和boot/setup 目录构成 setup 程序 boot/boot.h boot.inc 启动规范,分别给c 和 asm 使用的头文件 搞了一段 e820 的代码来跑. 但是printf 好像不支持打印 long long ,挺郁闷. 于是 2. 移植linux的vsprint 系统 include/ ctype.h isdigital 等支持字符解析的宏 linkage.h asmlinkage, extern "C" 的封装 stdarg.h 多参数函数支持 stddef.h NULL offsetof limits.h 空文件 /////////// posix_types.h 空文件, 包含stddef.h 和 i386目录下同名文件 string.h 空文件, 包含i386 目录下同名文件 types.h 各种数据类型的别名 include/i386 div64.h 64bit 除法运算 , vsprintf 有直接使用 //////////// posix_types.h __kernel_xxxx_t 定义, 间接包含 string.h string 库, 间接使用 types.h 类型定义, 间接使用 kernel/ ctype.c 对应于ctype.h 的数组 kprintf.c kprintf 实现 vsprintf.c vsprintf 实现 3.发现printf("%02x" 0x333333) 不会截断 0x333333. 记得有的系统下时只输出2个char的 45.2003.4.14 改进makefile. 使用子make的方式工作. 另外由于setup.s 要和 detectmem.s 连接到一起, 引起了不少问题. 1. setup.s 中原来使用nasm的times机制使setup.s 生成的bin的大小严格的为2k. 但是 把两个文件连接到一起时就不能使用这种机制了. 我们采用了partcopy. 见/boot/makefile 2. 因为要连接到一起,所以, 使用了a.out格式. 但是,nasm在生成a.out格式时生成32bits 代码. 所以在setup.s detectmem.s 中要使用 [bits 16] 强制nasm生成16 bit代码. 3. 连接到一起时起初没有注意到必须在ld 中指定生成 binary 格式的文件, 并且.text 从 0 地址开始. 见/boot/makefile 的rule : setup.bin ld $(setupo) -Ttext 0x0 -O binary -o setup.oo objcopy -R .comment -R .note -S -O binary setup.oo $@ 44.2003.4.14 fsector.s 软驱启动记录,自举到0x90000 setup.s 由fsector.s 加载到 0x10000,长2048 字节, 其后是以head.s 开始的内核. kernel/head.s 内核被setup.s 装载到 0x100000 (1M). boot.h 定义由setup.s 传递到内核的各种数据结构,由setup.s 和head.s 共同使用. 目前参数放在 0x90000, 即覆盖 fsector.s. boot.inc 和boot.h完全相同, 但由.s 文件引用. 注意保持一致. boot/setup 目录是 setup.s 需要的各个文件,如内存探测等. detectmem.s 内存检测 ////////////////////////////////////////////////////// 43. 2003.4.6 @@@@@@@@ 移植Lingix 的汉字系统. 发现不能输出汉字. steup.s 中吧内核搬移到物理地址1M 时,搬移的块大小不足, 把 line 116 行的0x30000, 改成0x60000 才解决问题. 否则, 虽然系统不死,但是任何文字都不输出, 漆黑一片. ??? 这是第二次发现boot 能力不足. 42. 2003.4.6 建立build 目录, 从此在这个目录下编译. 把软盘安装从partcopy 升级成rawrite. 把bootimg 改名为bootimg.flp 方便vmware使用. 把fbootimg 改名为fboot.img. 41. 2003.3.30 发现一个bug. 从0.0.6.3 开始, 写到软盘的ExpOS 开始不能正常启动. 而vmware 模拟就正常. 经查因为partcopy 有问题, 大于14k 的内核不能正确的写到软盘. 换成rawrite 以后问题解决. rawrite -f bootimg -d a: rawrite 再各种linux安装盘的dosutils目录中很容易找的到. 40. 2003.2.22 在一个c 文件中可以如下的写一段代码 /* * Test Gcc feature */ __asm__( "_interrupt:\n\t" "pushl -256\n\t" "jmp 1f \n\t 1:"); 这段代码可以不在任何函数中. linux 用gcc 的这个特性构造他的中断处理函数.见hw_irq.h 宏BUILD_IRQ. 39. 2003.1.5 函数命名规则: 1) 下划线 如果一个函数以下划线开始, 则函数应该是一下情况之一: a) 该函数是一个硬件特性的第一级封装, 如 _gate_fill b) 该函数是本模块提供给其他模块的接口如 _fill_int_gate _irq_reg _enirq_8259 _init_8259 这样好像不合linux 的做法噢, 去掉b) 吧.(2003.3.30) 38. 2002.11.11 ia32.c 更名为archlib.c , ia32.h 更名为arch.h 37. 2002.11.8 exception 处理. 写了一些代码处理error code , i386 中有些exception带有errcode, 一些没有. 36. 2002.11.3 0.0.6.4 begin. 删除临时代码, 如arch.s 中的中断处理函数kbd, timer. /////////////////////////////////////////// 35 2002.10.25 修改makefile 生成fimg, 方便安装软盘映象, 因为安装到软盘无须pad. 中断处理中无法保存fs gs 这两个寄存器,否则就死掉. 到底为什么啊
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -