自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

whime

或许是不知梦的缘故,流离之人追逐幻影。

  • 博客(140)
  • 收藏
  • 关注

原创 Boot loader:grub2

  由于grub2太大,不可能只装在mbr一个扇区。 /boot/grub2/grub.cfg对硬盘的代号设置grub2 配置文件维护 /etc/default/grub 与 /etc/grub.d  主要环境配置文件编写完毕之后,必须要使用 grub2-mkconfig 来重建 grub.cfg/etc/grub.d/*grub2-mk...

2018-10-31 10:09:24 281

原创 操作系统的引导区块

pdf地址:https://pan.baidu.com/s/1ix6rDfE4rLxazcwwKPlbNQ,仅供学习之用。 按照上图使用二进制编辑器BZ写一个512字节的引导区块,中间*  为省略的零,做成VMware镜像,然后开启虚拟机,但是出现operating system not found的情况:代码说明如下:这里的magic number(幻数)为0x aa...

2018-10-31 10:08:55 406

原创 再谈引导区

这次我们使用汇编语言创建引导区,我们可以使用以下命令将汇编语言源程序汇编成机器语言源程序-f bin 意味着生成单纯的机器码文件而不是经过链接的文件,因为现在还不需要。在汇编程序文件里面,在幻数0x aa55之前填充510个字节0x 00,生成512个字节的文件。可以使用以下方式进行引导使用以下命令可以查看二进制文件包含的内容: ...

2018-10-31 10:08:10 231

原创 16位实模式

      Intel 8086 CPU采用的是16位实模式,没有内存保护的概念。之后随着CPU的发展,为了兼容16位机器和系统,所有的系统都是从16位模式开始引导,采用32/64位的CPU的机器需要从16位切换到32/64位模式。      想要在屏幕上输出信息,必须知道屏幕的接口,为此可以调用BIOS函数帮助我们完成这一任务。不过不同机器的BIOS例程的差异可能会导致错误。所以可以借助...

2018-10-31 10:07:58 739

原创 打印字符

调用BIOS 0x10号中断打印字符,ah设置为0x 0e,表示tele-type模式,al 为需要打印的字符。对应的机器码:       为了不破乱存放在0x00内存地址的中断向量表,BIOS经常将引导分区存放在内存地址0x7c00中。  ...

2018-10-31 10:07:41 2384

原创 声明字符串,堆栈,函数调用

  声明字符串并使用0 标识字符串长度。   在函数调用前,可以使用CPU实现的两个指令pusha和popa保存所有寄存器值。  

2018-10-31 10:07:24 196

原创 使用BIOS读磁盘

      16位实模式中使用段地址:偏移地址寻址的方式扩大内存寻址空间。调用BIOS 0x13号中断可以读写磁盘到指定内存位置。al保存读写的扇区数,dl保存磁盘号,ah=0x02表示读函数,ch保存柱面号,dh保存磁头号(0,1),cl保存起始扇区号(从1开始编号)。读取的数据保存在es:bx所指的数据中。        BIOS通过设置IF标志位为1,al为实际读取的扇区号,检查是否...

2018-10-31 10:07:11 1641

原创 使用VGA显示字符串

    32位保护模式提供了更大的内存寻址空间,cpu执行速度,更好的内存保护机制。       将CPU从16位切换到32位需要一个复杂的数据结构,全局描述符表GDT, 其中定义了内存分段和它们的保护模式属性。我们使用一个特殊的指令加载之后,再对CPU的一个特殊的控制寄存器设置单独的一个位来进行转换。        直接写string进video  memory。 ...

2018-10-31 10:06:56 1689

原创 GDT-全局描述符表

    32位保护模式下段寄存器保存的是GDT表项的索引。    GDT的入口8个字节是一个无效的空描述符,以防止我们在寻址前错误的设置段寄存器为0x0,这时候CPU会抛出一个异常,实际上是一个中断。   GDT结构:   ...

2018-10-31 10:06:12 759

原创 使用汇编描述GDT

使用6个字节的gdt descriptor记录GDT的地址和大小。复杂的设置:  

2018-10-31 10:05:57 890 2

原创 从16位实模式切换到32位保护模式

     通过设置一个特殊的CPU控制寄存器的首位开启32位保护模式。      为了使所有的指令在切换前全部执行完毕,可以通过段远程调用迫使CPU完成管道流水中不同状态的指令。       jmp  <segment>: < address offset >      整个切换过程可以如下:  ...

2018-10-30 10:34:47 1227 1

原创 从16位实地址模式转换到32位保护模式的引导区程序

    根据之前的几个程序,可以写出一个从16位实地址模式转换到32位保护模式的引导区程序。 

2018-10-30 10:34:20 313

原创 了解C的编译

 使用反汇编器可以对目标文件进行反汇编,可得到类似下面的汇编文件: 从左至右依次是指令在文件中的偏移地址,机器码,对应的汇编指令。        当发生函数调用时,C语言会先将原栈底ebp入栈。在原有堆栈上面建立一个空栈,这个叫做建立栈帧,用于分配所有的局部变量。使用eax来传递返回值。...

2018-10-30 10:33:49 131

原创 局部变量

使用如下代码声明一个int类型的局部变量。反汇编结果为:(eax存储返回值)这里有两个注意的点:Sub esp,byte + 0x10       首先堆栈使用时的地址是逐渐递减的,使用esp 减去0x10,即减去16字节,是因为编译器处理堆栈时进行了优化,减少低效的处理大量的内存边界(?)和数据类型倍数不一致(对齐?)的情况。通过浪费一些内存,为每一个栈元素分配最大数据类型...

2018-10-30 10:33:36 347

原创 执行我们的内核代码

 本小节将分为以下步骤先写一个简单的内核,只显示一个字符。创建一个加载内核的引导区 可以使用如下代码将引导区和内核代码连接成一个内核镜像。源代码如下: 如何进入内核      为了防止进入内核执行时的首条指令不是main函数的,比如这样子的程序,执行时将不会执行到main函数。为此增加一个内核入口函数:kernel_entry.nas之后将...

2018-10-30 10:33:16 518

原创 组织操作系统代码库

  通过使用make变量和wildcard的方法避免单独地对单个文件进行编译。 也可以使用如下方法减少重复代码的编写。 

2018-10-30 10:33:01 134

原创 硬件IO

对于显示器工作原理的解释 使用in,out指令读写设备控制器的寄存器。行内汇编 

2018-10-30 10:32:33 398

原创 基本屏幕驱动实现

       实现一个新的驱动实现文件screen.c和一个驱动接口文件screen.h,实现屏幕输出功能,代替C语言printf函数。(不知道为啥做这个)在头文件中定义一些端口常数: screen.c:  在计算screen_offset时,offset=(row*80+col)*2,使用以下端口访问方式写入offset。 获得光标位置:使用特殊的...

2018-10-30 10:32:11 2206

原创 使用二进制编辑器制作操作系统启动盘

       通过二进制编辑器BZ制作引导扇区,写入软盘,也可以通过模拟器运行。一开始在虚拟机无法引导,总是提示找不到系统,之后找到了本书的光盘资源,里面提供完整的代码和软件,将里面的helloos.img拿出来按照教程跑一遍发现可以,应该是自己的错误。      通过windows的fc指令比较发现映像文件有不一样的地方,但是无法输出确切的是哪一行,文件是二进制文件,输出是乱码的,只好一个一...

2018-10-30 10:31:48 701

原创 换用汇编程序写映像文件

       这个部分就是使用汇编程序代替二进制编辑器制作helloos.img,作者提供了一个汇编源程序hellloos.nas,使用自己开发的汇编器nask,对nasm进行了优化,其中有一个就是对resb指令的优化,在当前指令预留指定字节并填充0x 00。      运行!cons_nt.bat或者!cons_9x.bat,其实这个批处理就是在当前目录调出命令行,接着运行asm.bat,其...

2018-10-30 10:31:32 407

原创 512字节的启动盘和make工具

        这个和第一天的差不多,只是制作启动区,使用nask汇编ipl.nas,生成ipl.bin和ipl.lst(列表文件,用于简单确认每个指令是怎样翻译成机器语言的)。之后使用makeimg.bat将ipl.bin制作成镜像文件helloos.img,各种工具均有提供。 Ipl.bin:ipl.nas  Makefile,制作ipl.bin之前先检查ipl.nas和mak...

2018-10-29 00:55:24 188

原创 制作真正的IPL

        今天通过修改启动区,使其装载程序,主要是使用BIOS  INT 0x13读盘操作。逐渐修改代码,使用循环读入18个扇区和10个柱面。  接下来使用一个小程序作为加载对象,制作磁盘映像haribote.img 打开haribote.sys和haribote.img比较异同:             之...

2018-10-29 00:55:07 750

原创 进入32位模式并导入C语言

       显卡内存和一般的内存一样可以存储数据,它的每个地址都对应着画面上的像素,可以利用这一机制在画面上绘制出五彩缤纷的图案。VRAM 分布在内存分布图上好几个不同的地方。这是因为不同的画面模式的像素数也不一样,不同的画面模式可以使用的内存也不一样。     32位模式下可使用的内存容量远远大于1MB。CPU的自我保护功能(识别出可疑机器语言并进行屏蔽)在16位下不能用,但在32位下能用...

2018-10-29 00:54:42 306

原创 用C语言实现内存写入

英特尔CPU迭代:创建直接写入内存的汇编程序 通过C语言程序调用汇编函数_write_mem8;由于VRAM写入了15,意味着所有像素颜色使用第15种颜色,所以画面是白色的。将程序改写使每隔16个像素色号就反复一次,可以呈现条纹图案。挑战指针使用C语言指针存储值。C程序改为同样可以输出条纹图案如上。...

2018-10-29 00:54:13 6933 1

原创 结构体的使用和显示模式的保存

  使用结构体这部分主要是对asmhead.nas保存下来的状态信息读出,在bootpack.c里面使用。将0x0ff0即VRAM地址使用结构体指针存放,按照结构体存储,注意对应的结构体声明顺序应该与汇编语言里的顺序一致。(个人理解)  显示字符  要显示字符,可以用8X16长方形像素点阵表示,像如下转换:         只需要根据对应的字体0...

2018-10-29 00:52:25 208

原创 GDT与IDT的初始化

GDT      实地址模式:        286架构以前的采用实地址模式,使用16位段寄存器的内容乘以16得到段基地址,加上16位的偏移地址得到内存地址。这种方式只能访问1MB的内存地址。保护地址模式:80286开始出现的保护模式可以寻址1MB以上的内存,采用的是段号加GDT的方式。         CPU用8个字节的数据表示这些信息,由于段寄存器只有16位,加上...

2018-10-29 00:52:05 1466

原创 分割源文件,整理makefile

 makefile可修改为:使用makefile一般规则: 

2018-10-29 00:51:22 195

原创 善用判断式

利用 test 指令的测试功能测试文件是否存在,选项-e代表exist。 输入文件名,判断是否为空,是否存在该文件,存在则判断是目录还是文件,并给出执行者对该文件的权限。 利用判断符号 [ ] 中括号两端需要使用空格隔开。用不用引号都可以。 例子: Shell script 的默认变量($0, $1...) s...

2018-10-29 00:49:59 103

原创 Shell script

范例依据时间创建三个文件数值计算,也可以使用  declare -i total=${firstnu}*${secnu}。借助bc计算计算pi  4*a(1) 是 bc 主动提供的一个计算 pi 的函数, scale 就是要 bc 计 算几个小数点下位数的意思。当 scale 的数值越大, 代表 pi 要被计算的越精确。script 的...

2018-10-29 00:49:06 149

原创 文件的格式化与相关处理

格式化打印: printf 格式化输出,%8.2f 小数点占一位。输出字符并换行。 awk:好用的数据处理工具 适合小型数据处理$0代表整行,$1代表第一栏,$2代表第二栏。awk的内置变量。 加上个换行格式化输出。awk的逻辑运算符。 解决第一行没有正确显示。 计算薪资数据表awk支持if...

2018-10-29 00:18:59 175

原创 延伸正则表达式

    grep 默认仅支持基础正则表达式,如果要使用延伸型正则 表达式,你可以使用 grep -E , 不过更建议直接使用 egrep。 ! 在正则表达式 当中并不是特殊字符,找出文件中含有!或>的行,-n显示行数 ...

2018-10-28 09:52:15 249

原创 基础正则表达式

  基础正则表达式练习 搜寻特定字串 利用中括号 [] 来搜寻集合字符 反向选择[:lower:]相当于a-z,[:digit:]相当于0-9。 行首与行尾字符 ^ $ 查找以小写字母开头的,^是在方括号外面。^ 符号,在字符集合符号(括号[])之内与之外是不同的。在 [] 内代表“反向选择”,在 [] 之外则代表定位...

2018-10-28 09:51:55 157

原创 管线命令

       指令必须要能够接受 standard input 的数据才行,这样的指令才可以是为“管线命令”,例如 less, more, head, tail 等都是可以 接受 standard input 的管线命令。撷取命令: cut, grepcut(以行为单位)grep排序命令: sort, wc, uniqsort uniq重复的数据...

2018-10-28 09:50:14 211

原创 数据流重定向

数据流重定向/dev/null使用cat创建文件,使用ctrl+D结束输入。可以使用eof结束输入。数据流重定向 命令执行的判断依据: ; , &&, | 一般假设判断式,command2 与 command3 会放置肯定可以执行成功的指令。 ...

2018-10-28 09:48:38 92

原创 Bash Shell 的操作环境

由于ls指令使用alias ls="ls --color=auto",直接使用ls会有颜色区分,而使用/bin/ls则没有。使用type -a ls 查看指令搜寻的路径。tty的欢迎讯息/etc/issue  通过编辑/etc/motd将显示一些讯息在欢迎讯息后面。/etc/profilebash 的 login shell 情况下所读取的整体环境...

2018-10-28 09:48:17 179

原创 命令别名与历史命令

root用户一般没有设置vi的别名。History  

2018-10-28 09:47:42 124

原创 shell的变量功能

          在变量的设置当中,单引号与双引号的用途有何不同?单引号与双引号的最大不 同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号。可以使用反单引号 ` 或者$()将指令连接起来。环境变量的功能用 env 观察环境变量与常见环境变量说明产生0~9的随机整数用 set 观察所有变量 (含环境变量与自订...

2018-10-28 09:46:25 165

原创 shell杂记

查看可用shell。~/.bash_history会记录使用过的bash指令历史。 查询指令是否为 Bash shell 的内置命令: type bash下快速移动关闭光标  

2018-10-28 09:45:07 83

原创 Vim 的额外功能

使用alias查看vi是否被vim所替代。区块选择(Visual Block) 可以像长方形一样选择区块。多文件编辑 多窗口功能在命令模式下使用:sp {filename}可以在新窗口启动一个新文件,省略filename则是使用当前文件。 vim的挑字补全功能 语法提示功能,使用扩展名为html时,先按ctrl+x,再按ctrl+...

2018-10-28 09:44:04 300 2

原创 Vi 的使用

第一部份:一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等第二部份:一般指令模式切换到编辑模式的可用的按钮说明第三部份:一般指令模式切换到命令行界面的可用按钮说明         当我们在使用 vim 编辑时, vim 会在与被编辑的文件的目录下,再创建一个名为 .filename.swp 的文件。比如说我们在上一个小节谈到的编辑 /tmp/vi...

2018-10-28 09:43:31 403

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除