![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux 0.12
Hony杨
算法 内核 人生
展开
-
8259A 可编程中断控制器
一 8259A 结构图I. 主片结构 (IBM PC/XT)II. 主从结构 (IBM PC/AT)III. 微机结构 (IBM PC/AT)二 8259A pin脚介绍- CS:片选信号,只有CS有效时,CPU才能进行读写操作- WR:写信号,当WR有效且CS有效时,wr使8259A接受CPU送来的命令字- RD:读信号,当RD有效且CS有效时原创 2013-06-28 23:15:17 · 5010 阅读 · 4 评论 -
Linux 0.12 OS. block - blk.h
重点摘要i. 设备支持目前系统支持的设备为0 - unused (无设备)1 - /dev/mem (内存盘)2 - /dev/fd (软盘)3 - /dev/hd (硬盘)4 - /dev/ttyx (串口)5 - /dev/tty (控制台)6 - /dev/lp (并口)7 - unnamed pipes (无名管道)ii. 数据结构- dev原创 2013-07-03 15:51:57 · 1208 阅读 · 0 评论 -
Linux 0.12 OS. block - ll_rw_blk.c
问自己的问题- lock_buffer: static inline void lock_buffer(struct buffer_head * bh) { cli(); // 1. 为什么需要用cli/sti来控制IF中断屏蔽? while(bh->b_block) // 2. 'while'可以用'if'替换吗? sleep_o原创 2013-07-03 15:55:11 · 1629 阅读 · 0 评论 -
自己动手搭建 Linux 0.12 编译环境 — 编译
自己动手搭建 Linux 0.12 编译环境 — 编译篇作者:MTK_蛙蛙鱼写作时间:2013年11月13日更新时间:2013年11月13日一、make dep原创 2013-11-15 16:02:27 · 2516 阅读 · 0 评论 -
Intel Spec. Floating-point Instructions 7 - Floating-point Coprocessor Instruction Set Refrence
Intel Spec. Processor Instructions 6 - Floating-point Coprocessor Instruction Set RefrenceI. How to read the instruction set reference pages- Opcode column /n: This value goes in the reg原创 2013-04-30 10:30:46 · 1082 阅读 · 0 评论 -
Programming Floppy Disk Controllers (下)
原文:可编程软盘控制器Command Set总共有13个命令在uPD765和兼容的FDC上可用。还有4个命令将会在8207x的控制器上可用。扇区的识别由柱面,磁头,扇区号和扇区大小组成。这些可以告诉控制器命令执行的位置和扇区数目。所有命令和状态通过数据寄存器传输,端口号为3f7h或者377h。在写命令或者读状态之前,需要读取main status register的MRQ位。它决定翻译 2013-08-02 23:13:19 · 1098 阅读 · 0 评论 -
Intel Spec. Processor Instructions 6 - Instruction Statements
Intel Spec. Processor Instructions 6 - Instruction StatementsI. Instruction statement syntax assembler instruction: [label] : [prefix] mnemonic [argument [, . . . ]] label: a unique iden原创 2013-04-28 21:56:37 · 1510 阅读 · 0 评论 -
Intel Spec. Processor Instructions 6 - Processor Instruction Set Reference
Intel Spec. Processor Instructions 6 - Processor Instruction Set ReferenceI. How to read the instruction set reference pages- Opcode column /digital: It indicates that the ModRM byte of原创 2013-04-29 15:43:41 · 1327 阅读 · 0 评论 -
Programming Floppy Disk Controllers (上)
原文:可编程软盘控制器这篇文章是想介绍一下使用一些寄存器对NEC uPD765和Intel 82072/7软盘控制器(FDCs)进行编程,文章分为下面4个部分: 1. Overview 2. Configuration of an FDC on a PC 3. FDC Registers 4. Command SetOverviewPC机常常使用NEC uPD7翻译 2013-07-06 11:52:02 · 1305 阅读 · 0 评论 -
Programming Floppy Disk Controllers (中)
Data Register数据寄存器是一个8位的寄存器,类似其他的寄存器,它间接的提供了一个寄存器栈。一个命令可能是0~9个字节长,第一个字节告诉控制器可能的字节数目。控制器发送命令字节给栈里正确的寄存器,保存程序员需要的索引寄存器,类似于其他的设备(比如VGA的寄存器)。有些控制器,比如i82077A,它有一块可编程范围的缓冲区,允许一次传输多个字节。这样可以提高数据和命令的传输和减少u翻译 2013-07-06 12:01:16 · 1163 阅读 · 0 评论 -
自己动手搭建 Linux 0.12 编译环境 — Makefile
自己动手搭建 Linux 0.12 编译环境——Makefile篇作者:MTK_蛙蛙鱼写作时间:2013年11月13日序:时隔几个月,我又开始了Linux 0.12的征程,现在的我变得更加成熟,掌握了更多的技能。时间在变,环境在变,心情也在变,唯一不变的是我探究你玩弄你的心,我喜欢沉浸在思考的世界里,喜欢揣测你想干什么,这好像已经成为了我生活的另外一个分支,一直一直伴随我的原创 2013-11-15 09:46:48 · 2048 阅读 · 0 评论 -
自己动手搭建 Linux 0.12 编译环境 — Bochs
从一篇开始,我们慢慢会展开主题。Linux 0.12已经是一个可以运行起来的OS,它需要一个Intel 386的硬件环境来支撑,选择Bochs作为虚拟环境完全是因为当初学习Oldlinux的缘故,慢慢地也就懒得去尝试其他的虚拟机了,这部分我会在闲下来后或者觉得有必要尝试更优秀的软件的时候去做它。因此此刻此景,我们还是将就一下吧,如果你在使用qemu虚拟机,完全可以直接跳过~[Bochs].原创 2013-03-26 19:39:46 · 2753 阅读 · 0 评论 -
自己动手搭建 Linux 0.12 编译环境 — Linux主机
Hi,又见面了,这两天事情比较少,所以又快速构思这篇的内容。上篇我用极简模式说完了关于Linux 0.12的模拟环境Bochs,这篇同样沿袭上篇的思路,不过主要内容是关于Linux主机。在搭建Linux 0.12编译环境的时候,你需要一个Linux主机环境来完成几乎你想实现的所有工作,这里我选择了CentOS,这完全又是一个巧合,我一开始也是使用的是Ubuntu,后来为什么换成CentOS了,原创 2013-03-31 11:28:46 · 2439 阅读 · 0 评论 -
Linux 0.12 OS. math - math_emulate.c
好像math模块的分析接近尾声了,其实不然,之前的内容可以归纳为它的核心算法介绍,而这篇文章将勾画出它的框架。所谓的‘框架’就是把浮点处理器能支持的所有指令给解析了一遍,多是多了点儿,可结构清晰简单。一 math结构图二 FPU指令分类三 code部分I. __math_abortvoid __math_abort(struc原创 2013-06-15 10:29:26 · 1060 阅读 · 0 评论 -
Linux 0.12 OS. math - mul.c
/* c数组有128位,采用加法加自身即可 */static void shift(int * c){ __asm__("movl (%0),%%eax ; addl %%eax,(%0)\n\t" "movl 4(%0),%%eax ; adcl %%eax,4(%0)\n\t" "movl 8(%0),%%eax ; adcl %%eax,8(%0)\n\t" "movl 1原创 2013-06-15 10:25:06 · 1123 阅读 · 2 评论 -
Linux 0.12 OS. math - error.c
这是math模块里最后一个文件,对这个模块的学习前前后后到现在也有半年时间了,我还依稀记得是从年初那时的一个论坛帖子开始的,它记录下了我前期大量的准备工作。学习从大的说是一件一辈子都不能忘记的事情,如果你是一个上进的人,那么请抽出适量的时间来提升自己,这点我个人还做的不是很好,因为我总是在闲得无聊的时候才想起来学点东西。如果你是搞IT这行当的,那么技术学习是一门永远的课程,你可以选择自己喜原创 2013-06-15 10:30:47 · 1178 阅读 · 0 评论 -
Linux 0.12 OS. math - compare.c
#define clear_Cx() (I387.swd &= ~0x4500) /* reset C0,C3,C2 */static void normalize(temp_real * a){ int i = a->exponent & 0x7fff; int sign = a->exponent & 0x8000; if (!(a->a || a->b)) { /* zero原创 2013-06-15 10:25:48 · 951 阅读 · 0 评论 -
Linux 0.12 OS. math - div.c
static void shift_left(int * c){ __asm__ __volatile__("movl (%0),%%eax ; addl %%eax,(%0)\n\t" "movl 4(%0),%%eax ; adcl %%eax,4(%0)\n\t" "movl 8(%0),%%eax ; adcl %%eax,8(%0)\n\t" "movl 12(%0),%原创 2013-06-15 10:25:24 · 969 阅读 · 0 评论 -
Linux 0.12 OS. math - get_put.c
get_put.c提供浮点协处理器与操作数之间的交互功能,get_xxx可以把操作数读取出来转换为临时实数,put_xxx可以把浮点指令计算结果写到目的操作数里。一 get/put_xxx说明- get/put_short_real:load/store单精度实数(m32r)- get/put_long_real:load/store双精度实数(m64r)- get原创 2013-06-01 09:14:43 · 1015 阅读 · 0 评论 -
Linux 0.12 OS. math - CR0
从这篇文章开始算是正式进入math模块的学习,前期我花了大量的时间来储备必要的知识,这个工作早在今年年初就进行了,可是被各种原因耽搁,我也寄希望于接下来能顺利进行。这里得说一下,我是一边学习一边做的笔记,因此非常大可能出现错误。如果在文章发表后发现错误,我会及时更新上去,希望尽可能不给大家的理解造成困扰。一 CR0控制寄存器- NE浮点处理器操作模式,0为MS-DOS co原创 2013-05-10 22:38:00 · 1228 阅读 · 0 评论 -
自己动手搭建 Linux 0.12 编译环境 — Boot
通过前面两篇的介绍,相信对搭建Linux 0.12编译环境的诸多工具有了基础的了解,但不论是Bochs还是Linux主机,它们只是你搭建过程中的棋子而已,因为真正的工作环境是Linux 0.12 OS,前面铺垫了很多就是为了它能快速简单的搭建。下面两篇的内容个人觉得很赞,是搭建Linux 0.12 OS的重点。首先通过这篇文章我们来了解一下Linux 0.12的启动过程,然后学习如何修改b原创 2013-04-20 11:18:54 · 1979 阅读 · 0 评论 -
自己动手搭建 Linux 0.12 编译环境 — 开篇
起因 =>在想到说要搭建0.12的编译环境之前,我一直在学习0.12的math/模块,从基础知识延伸出很多内容都是我从未涉足过的东西。我翻看了Intel Spec的很多章节,虽然英文很差,可是我会多看一遍,久而久之,感觉比较乏味。我不是很耐得住很长一段时间做同一件事情的人,不过这样的僵局即将打开。偶然看到论坛中有人分享Linus早期经历,看得很兴奋,Linux在Linus设定的一个个目标中原创 2013-03-23 23:16:04 · 2415 阅读 · 5 评论 -
Linux 0.12 OS. math - add.c
临时实数的加法运算模拟了整数的加法运算,把符号位和尾数部分整合成一个signed整数,在利用add指令完成加法操作。一 正数与负数这里说一下我自己理解的另一种补码的表现方式,以下用一个byte来做解释,先来举个例子5的补码:0b00000101,它对应的无符号值也是为5-5的补码:0b00000101 -> 取反-> 0b11111010 -> +1 ->0b11111011,它对原创 2013-06-01 09:15:11 · 948 阅读 · 0 评论 -
Linux 0.12 OS. math - ea.c
这个.c档可以计算出操作数的内存地址,当然既然内存地址那必须是内存操作数。浮点协处理器内存操作数包括短整(m16j)、整数(m32j)、长整(m64j)、单精度实数(m32r)、双精度实数(m64r)、临时实数(m80r)。要读懂ea.c的两个函数,需要先学习Intel指令解析的一些内容,建议阅读Intel spec的第6、7章节。一 r/m字段/*计算出info结构体里成员的地原创 2013-06-01 09:14:11 · 1008 阅读 · 0 评论 -
Linux 0.12 OS. math - convert.c
convert.c提供了多种数据格式转换的功能,包含了单精度实数、双精度实数、临时实数和整数。I. short_to_temp单精度实数的格式:符号位/bit31指数/bit30~23 尾数/bit22~0临时实数的格式:符号位/bit79指数/bit78~64 尾数/bit63~0void short_to_temp(const short_real * a, temp_re原创 2013-05-25 09:11:50 · 1011 阅读 · 0 评论 -
Linux 0.12 OS. math - math_emu.h
算是把math模块读了个大概了,已经可以着手把该记录的写下来了。总体来讲,math结构简单便于理解,而且它本身与系统之间的耦合度很低,所以我们可以把更多的时间花在知识点的学习上面。直白的说,这个模块非常独立,完全超出了你的预期!一 结构体I. struct infostruct info { long ___math_ret; long ___orig_eip; long原创 2013-05-25 09:10:29 · 1349 阅读 · 0 评论