Linux-0.11
车子 chezi
乐于开源,善于分享。死磕自己,方便大家。广泛查阅,独立思考。持续琢磨,自成一家。
展开
-
main() 函数解析(一)——Linux-0.11 剖析笔记(六)
文章目录1. 宏定义`_syscall0`2. `setup.s`读取的参数3. 读取CMOS实时时钟信息3.1 `outb_p(value,port)`3.2 `inb_p(port)`3.3 `outb(value,port)`和`inb(port)`3.4 CMOS与RTC3.5 time_init函数4. main函数4.1 根设备号4.2 复制硬盘参数表4.3 计算主内存起始位置4.4 虚拟盘4.5 `mem_init`函数4.6 `trap_init`函数4.6.1 `set_trap_gate原创 2020-08-02 14:47:39 · 1967 阅读 · 3 评论 -
C 语言内联汇编介绍
文章目录为什么要用内联汇编内联汇编的基本要素语法汇编语句模板操作数输出部分和输入部分操作数约束常用约束寄存器操作数约束内存操作数约束 (m)匹配(数字)约束为什么要用内联汇编首先,对于那些频繁调用的函数,为了提高执行效率,直接用汇编写比较好。其次,有些功能只能用汇编实现,比如开中断和关中断:#define sti() __asm__ ("sti"::)#define cli() __asm__ ("cli"::)内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为原创 2020-07-26 15:57:31 · 2166 阅读 · 0 评论 -
head.s 剖析——Linux-0.11 剖析笔记(五)
文章目录一、加载段寄存器LSS指令二、设置中断描述符表(IDT)中断处理过程 `ignore_int`三、设置全局描述符表(GDT),加载 GDTR四、重新加载段寄存器五、检测A20是否开启六、检测 `x87` 协处理器关于异或按位异或的3个特点按位异或的几个常见用途1. 使某些特定的位翻转2. 不使用临时变量就可以实现两个值的交换3. 在汇编语言中经常用于将变量置零4. 快速判断两个值是否相等七、开启分页,跳转到 main()为调用 `main()`函数做准备设置页目录和页表八、总结head.s 程序在原创 2020-07-18 00:20:20 · 1042 阅读 · 6 评论 -
x86分页机制详解
文章目录1. 为什么会有分页机制?2. 从虚拟地址到物理地址3. 简单的分页模型4. 页表和页目录4.1 层次化的分页结构4.2 页表4.3 页目录5. 地址变换的具体过程1. 为什么会有分页机制?有些资料说是为了实现“虚拟内存”,真的是这样吗?如果没有分页机制,能否实现“虚拟内存”?答案是肯定的。当同时运行的任务很多时,内存可能就不够用。如图所示,每个段描述符都有 AVL 位(简称 A 位),用于表示一个段最近是否被访问过(准确地说是表明从上次操作系统清零该位后一个段是否被访问过)。当创建描述原创 2020-07-13 23:10:18 · 1930 阅读 · 2 评论 -
setup.s 总结——Linux-0.11 剖析笔记(四)
上一篇文章 setup.s 解读——Linux-0.11 剖析笔记(三) 详细地解释了 setup.s 的代码,整个代码完成的任务有:获取一些参数保存在 0x90000 处保存光标的位置获取从 1M 处开始的扩展内存大小获取显示模式检查显示方式(EGA/VGA)并获取参数复制硬盘参数表(包括检查系统是否有第2个硬盘)关中断移动 system 模块到 0x00000加载 IDT 和 GDT开启 A20设置 8259进入保护模式(使 CR0 的 PE 位 = 1)跳转到 0原创 2020-07-05 11:07:24 · 485 阅读 · 0 评论 -
伪指令 .align 的含义
伪指令 .align 的作用是在编译时指示编译器填充位置计数器(类似指令计数器)到一个指定的内存边界处,目的是为 了提高 CPU 访问内存中代码或数据的速度和效率。其完整格式为:.align val_1 , val_2, val_3其中第 1 个参数值 val_1 是所需要的对齐值;第 2 个是填充字节的值,填充值可以省略,若省略则编 译器使用 0 值填充。第 3 个用来指明最大用于填充或跳过的字节数。如果进行边界对齐会超过 val_3 指定的最大字节数,那么就根本不进行对齐操作。如果需要省略第 2 个原创 2020-07-01 22:47:09 · 2219 阅读 · 0 评论 -
setup.s 解读——Linux-0.11 剖析笔记(三)
题目:setup.s 解读——Linux-0.11 剖析笔记(三)更新记录版本时间修订内容1.02018-4-14增加了“获取显示模式”这一节,AL取值的表格2.02020-6-27补充了一些内容本文由 setup.s 分析—— Linux-0.11 学习笔记(二) 修改而来。文章目录定义符号常量获取一些参数保存在 0x90000 处保存光标的位置获取从 1M 处开始的扩展内存大小获取显示模式检查显示方式(EGA/VGA)并获取参数复制硬盘参数表复制 HD0原创 2020-06-27 21:25:37 · 1814 阅读 · 3 评论 -
bootsect.s 解读——Linux-0.11 剖析笔记(二)
题目:bootsect.s 解读——Linux-0.11 剖析笔记(二)文章目录一些符号常量老式Linux设备号的命名规则bootsect 把自己搬运到 0x90000,并跳转加载 setup 模块到 0x90200INT 13H AH=02H:读扇区INT 13H AH=00H:磁盘控制器复位获得磁盘驱动器参数(主要是每磁道的扇区数)INT 13H AH=08H:读取驱动器参数打印 “Loading system ...”INT 10H AH=03H:获取光标位置和形状INT 10H AH=13H:写字原创 2020-06-22 23:09:43 · 2171 阅读 · 2 评论 -
bootsect.s 预备——Linux-0.11 剖析笔记(一)
文章目录boot 目录下文件介绍16 位代码是什么意思计算机启动过程Linux 0.11 启动过程boot 目录下文件介绍boot 目录中一共有三个文件,都是用汇编语言写的,如下图(图来自赵炯的书)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQUWW8oT-1592127754860)(pics/image-20200614102237979.png)]我是在 https://mirrors.edge.kernel.org/pub/linux/kernel/His原创 2020-06-14 17:43:24 · 1066 阅读 · 3 评论 -
在 C 中引用汇编语言定义的 .globl 变量
缘起在 Linux-0.11 中遇到了这种用法,所以想做个实验以加深理解。实验代码分为2个源文件和1个Makefile.a.s.globl phone_num.dataphone_num:.word 0x1234.word 0x5678可以认为,phone_num是一个全局变量,可以供其他文件链接,phone_num的值是0x56781234.b...原创 2018-04-22 15:07:07 · 3107 阅读 · 0 评论 -
波特与比特率
题目:波特与比特率码元码元(code cell)是携带信息的波形符号,也即“时间轴上的一个信号编码单元”。码元可能是二进制的,也可能是多进制的。 二进制中,脉冲的有或无就表示这个码元状态的“1”或“0”,即码元有2种状态,这种码元称为二进制码元。在QPSK(四进制相移键控,Quaternary Phase Shift Keying)中,利用载波的四种不同相位来表示数字信息,即码...原创 2018-04-05 16:55:34 · 1097 阅读 · 0 评论 -
PC 机 UART(NS8250)详解
PC 机 UART(NS8250)详解异步串行通信原理两台计算机/设备进行数据交换,即通信,必须像人们对话一样使用同一种语言。在计算机通信术语中,我们把计算机/设备与计算机/设备之间的“语言”称为通信协议。通信协议规定了传送一个有效数据长度单位的格式。通常我们使用术语“帧”来形容这种格式。为了能让通信双方确定收/发的顺序和进行一些错误检测操作,除了必要的数据以外,在传输的一帧信息中还包含用...原创 2018-04-11 23:35:01 · 4787 阅读 · 2 评论 -
main 函数解析(二)—— Linux-0.11 学习笔记(六)
main函数解析(二)——Linux-0.11 学习笔记(六)4.6 blk_dev_init函数void blk_dev_init(void){ int i; for (i=0 ; i<NR_REQUEST ; i++) { request[i].dev = -1; //表示空闲 request[i].next = NUL...原创 2018-04-14 23:57:48 · 1530 阅读 · 1 评论 -
main函数解析(一)——Linux-0.11 学习笔记(五)
main()函数解析(一)——Linux-0.11 学习笔记(五)经过了前面的各种铺垫,终于来到了main函数。这篇博客的任务是把init/main.c讲清楚。由于牵扯到很多的函数调用,要想一次就说明白是很难的,所以我们把目标定得低一点,把脉络理清楚就行。1. 宏定义_syscall0文件开头的头文件包含等就不多说了。对于C语言比较熟悉的朋友,我想第一个拦路虎就是“GCC内嵌汇编”...原创 2018-04-01 23:17:08 · 2976 阅读 · 2 评论 -
Linux 0.11 实验环境搭建与调试
缘起之前我写过一篇博文:Linux 0.11 实验环境搭建本以为有了这个环境(gcc-3.4 & gdb-6.8),就可以调试无忧了。谁知遇到了以下问题:(1)用 gdb 调试 main 函数的时候,无法输出变量的值。总是提示: No symbol “XXX” in current context.(2)虽然在编译时为 gcc 加上了-gdwarf-2 -g3这两...原创 2018-03-25 12:05:34 · 16496 阅读 · 5 评论 -
Linux-0.00 代码解析(三)
6. 安装中断门和陷阱门# setup timer & system call interrupt descriptors. movl $0x00080000, %eax movw $timer_interrupt, %ax movw $0x8E00, %dx movl $0x08, %ecx # The PC default t原创 2018-01-21 20:18:02 · 2423 阅读 · 3 评论 -
Linux-0.00 代码解析(四)
Linux 0.00 的编译、运行、源码下载: http://blog.csdn.net/longintchar/article/details/78757065 Linux 0.00 Makefile 解读: http://blog.csdn.net/longintchar/article/details/78857966 Linux 0.00 代码解析(一): http:/原创 2018-02-04 15:32:32 · 1682 阅读 · 0 评论 -
setup.s 分析—— Linux-0.11 学习笔记(二)
更新记录 版本 时间 修订内容 1.0 2018-4-14 增加了“获取显示模式”这一节,AL取值的表格标题: setup.s 分析—— Linux-0.11 学习笔记(二)老规矩,为了节省篇幅,完整的代码就不贴了。定义符号常量INITSEG = 0x9000 ! bootsect.s 的段地址SYSSEG = 0...原创 2018-03-06 22:06:45 · 3992 阅读 · 4 评论 -
bootsect.s 分析—— Linux-0.11 学习笔记(一)
bootsect.s分析—— Linux-0.11学习笔记(一)为了节省篇幅,完整的代码就不贴了。感兴趣的朋友可以去下载,下载地址是: http://oldlinux.org/Linux.old/本文,我打算详解bootsect.s。如有纰缪,还请各位看官斧正。关于如何讲好代码,我暂时没有找到什么好的展示方法。姑且贴一段、注释一段、讲一段吧。为了不使代码片太长,我删去了一些原来的注释。...原创 2018-02-13 23:31:45 · 5673 阅读 · 8 评论 -
ORG 伪指令
汇编地址计数器汇编地址计数器用符号$表示,它用来记录正在被汇编程序翻译的语句的地址,即它的内容标示了汇编程序当前的工作位置。在一个源程序中往往包含多个段。汇编程序在将该源程序翻译成目标程序时,每遇到一个新的段,就为该段分配一个初置为0的汇编地址计数器,然后,再对该段中的指令汇编。在汇编过程中,对凡是需要申请分配存储单元的变量和产生目标代码的指令,汇编地址计数器就按存储单元数和目标代码的长度...原创 2018-03-08 21:46:48 · 4550 阅读 · 0 评论 -
在汇编程序中调用C函数
一、参数如何传递汇编程序调用C函数时,函数的入口参数使用栈来传送,参数的传递顺序是从右到左。即函数最后(最右边的)一个参数先入栈,而最左边的第一个参数最后入栈,然后执行 CALL 指令去调用C函数。二、参数的清除在C函数返回后,汇编程序需要把先前压入栈中的函数参数清除掉,即调用者负责清除参数占用的栈空间。比如要调用的C函数和要传递的参数是printSomething (arg1...原创 2018-03-10 21:30:57 · 18425 阅读 · 0 评论 -
head.s 分析——Linux-0.11 学习笔记(三)
题目:head.s 分析head.s 程序在被编译生成目标文件后会与内核其他程序一起被链接成 system 模块,它位于 system 模块的最开始部分,这也就是为什么称其为“头部(head)”程序的原因。从这里开始,内核完全是在保护模式下运行了。head.s 汇编程序与前面的语法格式不同,它采用的是AT&T汇编语言格式,并且需要使用 GNU 的 as 和 ld 进行编译和连接。因...原创 2018-03-11 00:00:49 · 3976 阅读 · 1 评论 -
Linux 0.11 实验环境搭建
如果想学习Linux 0.11,实验环境是必不可少的。最好是能编译,能运行,能调试。如今大家都是用64位的Linux操作系统,而且是高版本的GCC(4.0以上),所以环境搭建是个难题。要么就是编译后满屏报错,要么就是运行时出问题,总之各种麻烦。还好,有热心的朋友提供了可用的环境,在此深表谢意。我的环境是:Win7(64位)+Vmware+Ubuntu 16.04(64位) 如果不用虚...原创 2017-12-17 21:21:37 · 18230 阅读 · 57 评论 -
关于A20
A20是什么1981年8月,IBM 公司最初推出的个人计算机所使用的 CPU 是 Intel 8088。在该微机中地址线只有 20 根(A0~A19)。当时,计算机的 RAM 只有几百 KB 或不到 1MB 时,20 根地址线已足够用来寻址。其所能寻址的最高地址是0xffff:0xffff,即0x10ffef。对于超出 0x100000(1MB)的寻址地址, 将默认回卷到0x0ffef。I...原创 2018-02-24 22:59:57 · 2596 阅读 · 0 评论 -
kernel_mktime() 详解 —— Linux-0.11 学习笔记(四)
题目:kernel_mktime() 详解 —— Linux-0.11 学习笔记(四)在init/main.c文件中,有一个函数static void time_init(void)该函数读取 CMOS 实时时钟信息作为开机时间,并保存到全局变量startup_time (以秒为单位)中。static void time_init(void){ struct tm time;...原创 2018-03-17 22:59:42 · 1021 阅读 · 0 评论 -
详解8259A
详解8259A可编程中断控制器可编程中断控制器(PIC - Programmable Interrupt Controller)是微机系统中管理设备中断请求的管理者。当PIC向处理器的INT引脚发出一个中断信号时,处理器会立刻停下当时所做的事情并询问PIC需要执行哪个中断服务请求。PIC则通过向数据总线发出与中断请求对应的中断号来告知处理器要执行哪个中断服务过程。处理器则根据读取的中断...原创 2018-03-04 21:48:41 · 59013 阅读 · 30 评论 -
故障解决:error while loading shared libraries: libncurses.so.5
故障解决:error while loading shared libraries: libncurses.so.5 问题的提出在我准备调试 Linux-0.11 内核的时候,出现了如下故障(真奇怪,以前没有这个问题啊,怎么突然就这样了,555555555……) /rungdb ./gdb: error while loading shared libraries: l...原创 2018-03-19 23:26:23 · 43843 阅读 · 3 评论 -
Linux0.00 代码解析(二)
Linux 0.00 的编译、运行、源码下载: http://blog.csdn.net/longintchar/article/details/78757065 Linux 0.00 Makefile 解读: http://blog.csdn.net/longintchar/article/details/78857966 Linux 0.00 代码解析——boot.s: h原创 2018-01-20 13:11:06 · 2296 阅读 · 1 评论
分享