自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(203)
  • 收藏
  • 关注

原创 【嵌入式修炼】8052-串口发送数据

【代码】【嵌入式修炼】8052-串口发送数据。

2023-03-04 07:15:00 237 1

原创 【嵌入式修炼】89C52-LED灯间隔500ms亮灭

【代码】【嵌入式修炼】89C52-LED灯间隔500ms亮灭。

2023-03-02 08:00:00 391

原创 《Robotics, Vision & Control》学习笔记20221114

标称工作构型qn(nominal)如下图所示。待机构型qr(ready pose)如下所示。零位构型qz(Zero angle)如下所示。展平构型qs(stretch)如下所示。打开puma560机器人。安装方式可见如下链接。

2022-11-14 12:00:00 462

原创 坐标系的旋转与投影

坐标系的旋转与投影

2022-11-13 00:26:56 312 1

原创 旋转矩阵的数学表述

的坐标系旋转矩阵用matlab可以表示为expm(为旋转轴的单位矢量;

2022-11-07 09:00:00 203

原创 MATLAB live editor设置

修改MATLAB live editor需要通过代码进行。

2022-10-30 23:32:08 356

原创 刚体旋转杂谈

一个坐标系可以表示成三个正交矢量张成的空间,那么如何表示旋转了一个矢量?矢量可以表示成一个坐标系下的一个坐标,是坐标与坐标系的组合体。如何区分每次均绕固定轴的旋转和绕各次欧拉轴的旋转?那么如何表示一个坐标系?旋转的是一个坐标系。

2022-10-27 23:20:41 96

原创 【日拱一卒行而不辍20221018】自制操作系统

uboot和Linux kernel启动的时候是没有ELF Loader的,所以烧在flash上的文件只能是raw binary格式的,即镜像文件image。ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等。执行raw binary很简单,只需要将程序加载到其起始地址,就可以执行;BIN文件是 raw binary 文件,这种文件只包含机器码。2. 通过objcpy可以把elf文件转换为bin文件。所以ELF文件的体积比对应的BIN文件要大。

2022-10-19 23:26:07 101

原创 【日拱一卒行而不辍20221017】自制操作系统

o文件是Linux中gcc生成的标准文件格式,这个现状就决定了loader必须能够“翻译”这种格式的文件,并转换成机器可直接执行的格式。

2022-10-18 22:54:48 144

原创 【日拱一卒行而不辍20221016】自制操作系统

loader.asm根据ELF文件信息转移到正确的位置。至于global和extern等语法层面的事情,可以在完全进入C语言编程之后细细解决。在Chapter5B的foo.asm中,有如下典型的入栈结构,即。第一个把ELF格式的文件拆解成BIN文件的程序肯定是汇编的。而且,参数列表最后的参数先入栈,参数列表最前的参数后入栈。call之后会自动pop,不用通过显式指令手动出栈。生成可执行文件的过程是在上述过程的基础上,增加了链接。生成目标文件的过程是组件编译。就是loader.asm。

2022-10-18 22:47:05 182

原创 【日拱一卒行而不辍20221015】自制操作系统

应用程序被加载进内存后,由操作系统为其分配堆栈,程序的入口函数会是main函数。函数运行完成时,会将压入栈中的rbp重新出栈到rbp中(popq %rbp)。可以看到当函数被调用时,首先会把。

2022-10-16 23:19:59 192

原创 【日拱一卒行而不辍20221014】自制操作系统

最近几天一直在折腾qemu如何做到从软盘引导,到硬盘启动,今天终于获得了重要进展。修改后的chapter/11B/的Makefile如下所示。其中最关键的几行代码如下,尤其是qemu设置启动盘。和原书的效果已经很接近了。

2022-10-16 00:41:23 160

原创 【日拱一卒行而不辍20221013】自制操作系统

单独把/boot/boot.bin写入硬盘第一扇区,是可以工作的。

2022-10-13 23:50:18 184

原创 【日拱一卒行而不辍20221012】自制操作系统

另外,从接口驱动的角度。当把硬盘研究清楚后,以键盘为代表的的流设备和以硬盘为代表的块设备均得到了实践,为广阔的接口设计打下了模式基础。软盘的标称容量是1.44M,而硬盘动辄几十上百G,可以使用的空间远远超过软盘,而且远超过32位操作系统的4G内存,从而可以从实用意义上实现内存的换页。平时从硬盘复制粘贴删除的操作均是基于GUI的界面操作,当可以通过命令行直接进行操作后,打开了新世界的又一扇大门。基于软盘Floppy的操作系统的研究已经基本告一段落。后面要做的是把整个系统移植到从硬盘直接启动。

2022-10-12 23:15:31 96

原创 【日拱一卒行而不辍20221011】自制操作系统

在原书中,第九十章用到了硬盘,目前还没有攻克此项问题。第十章E部分的Makefile修改后如下。

2022-10-11 22:54:42 249

原创 【日拱一卒行而不辍20221010】自制操作系统

的Makefile如下所示如下。与原书中图6.18基本一致。

2022-10-10 07:00:00 248

原创 【日拱一卒行而不辍20221009】自制操作系统

修改后的如下chapter5I的Makefile如下所示。略有不一致的是出现了两个疑似故障码(#OF和#BR)。与原书中图5.16基本一致。

2022-10-09 20:36:27 216

原创 【日拱一卒行而不辍20221008】自制操作系统

我用的ubuntu是64位的,在x86_64上编译/链接32位应用程序时,设置模拟以elf_i386提供正确的elf格式。(3)生成完整软盘(包括填充的第一扇区boot.bin和复制进去的文件loader.bin)主要的修改在最后一行代码,原来的代码中如下所示。与书中图4.6一致,图4.6如下所示。写入Elf格式文件后,运行结果如下所示。修改后的Makefile可以正常运行。与原书P117图4.5内容一致。修改后的Makefile如下所示。和书中图5.9一致,原图如下所示。(1)清除原有过程文件。

2022-10-08 04:00:00 362

原创 【日拱一卒行而不辍20221007】自制操作系统

每个进程所看到的的线性地址集合是不同的,一个进程所使用的地址与另外一个进程所使用的地址之间没有什么关系。当用户最终控制台输入一个命令时,shell进程创建一个新的进程去执行这个命令。一个全新的地址空间分配给了新进程。与进程地址空间有关的全部信息都包含这种一个叫做内存描述符的数据结构中mm_struct,进程描述符的mm字段就指向这个结构。对任何程序的执行而言,至少要将CS,DS,SS赋予有效的段选择符,处理器还提供了ES、FS、GS供进程使用;当一个进程要访问某个段时候,需使用段寄存器进行加载。这也是系统

2022-10-07 09:59:42 414

原创 【日拱一卒行而不辍20221006】自制操作系统

为了加速逻辑地址到线性地址的转换,x86提供一种附加的非编程的寄存器(不能被程序员所设置的寄存器),供6个可编程的段寄存器使用。与段相关的线性地址从0x00000000H开始,到达4G限长。这意味着在用户态或内核态的所有进程可以使用相同的逻辑地址。每一个非编程的寄存器含有8个字节的段描述符,由相应的段寄存器的段描述符来指定。从那时起,针对那个段的逻辑地址转换就可以不访问主存中的GDT或LDT。(2)第2位是TI表指示器(TI=0,GDT;可编程段寄存器有6个,cs,ss,ds,ef,fs,gs.

2022-10-06 23:35:08 408

原创 【日拱一卒行而不辍20221005】自制操作系统

编码的过程就是从高维信息扁平化到线性空间的过程;执行的过程就是从线性空间展开到高维空间的过程。在页目录及页表划分中,每一页指向4K空间。在分段中,当G=1时,段长度的颗粒度为4K。分段与分页的颗粒度是一致的。都可以实现4K边界对齐。分段与分页,分的都是4G线性地址空间。分段是从逻辑层面进行的划分;分页是从存储层面进行的划分。以上为windows的段描述符表。

2022-10-05 11:27:17 314

原创 【日拱一卒行而不辍20221004】自制操作系统

只有在保护模式下,80386 的全部 32 根地址线有效,可寻址高达 4G 字节的线性地址空间和物理地址空间,可访问 64TB(有 2^14214 个段,每个段最大空间为 2^32232 字节)的逻辑地址空间,可采用分段存储管理机制和分页存储管理机制。分段地址转换:CPU 把逻辑地址(由段选择子 selector 和段偏移 offset 组成)中的段选择子的内容作为段描述符表的索引,找到表中对应的段描述符,然后把段描述符中保存的段基址加上段偏移值,形成线性地址(Linear Address)。

2022-10-04 11:43:22 274

原创 【日拱一卒行而不辍20221003】自制操作系统

换句话说,对内存进行操作的时候,需要找到操作对象所对应的一个索引,通过索引找到操作的起始地址,再加上偏移量找到具体地址。这种寻址方式安全的地方就在于,

2022-10-03 14:44:41 414

原创 【日拱一卒行而不辍20221002】自制操作系统

这是CPU在地址总线上可以寻址的地址空间。系统中所有进程共享的段由GDT来映射,这样的段通常包含操作系统的段。这种技术将内存空间分成一个或者多个段的线性区域,从而对内存中一个数据对象的寻址就需要使用一个段的起始地址(即段地址)和一个段内偏移地址二部分组成。在后续的一段时间内,需要将保护模式的特征进行系统再认识后才能继续进行更精细的后续实现。因此GDT映射的一半虚拟地址空间是系统中所有进程所共享的,但是LDT所映射的一半是在进程切换时被修改。一个进程到两个进程是质的飞跃,两个进程到三个进程是量的积累。

2022-10-02 23:17:37 339

原创 【日拱一卒行而不辍20221001】自制操作系统

Linux操作系统为了兼容相当多的硬件,对操作系统源代码进行了精妙的设计,初学者稍有不慎,就会陷入盘根错节的细节中,并不适合新手直接下手学习。在具体编写代码的过程中,一定要清楚当前使用的是哪个堆栈,以免破坏掉不应破坏的数据。进程的本质是一个函数,函数的输入和输出都在栈上,函数的具体操作内容就是进程体。进程的切换过程中用到了许多不同特权级的堆栈,因此需要进行特权级的转换。要写恢复不同的进程,只需要将esp指向不同的进程表就可以。进程表是用来描述进程的,所以它必须独立于进程之外。把线性的资源整理成树状的资源。

2022-10-01 23:31:32 441

原创 【日拱一卒行而不辍20220930】自制操作系统

普林斯顿结构的特点是微机只有一个地址空间,ROM和RAM地址统一编址,一个地址对应唯一的一个地址单元,CPU访问ROM和RAM使用的是相同的访问指令。哈佛结构的特点是微机的ROM和RAM被分别安排在两个不同的地址空间,ROM和RAM可以有相同的地址,CPU访问ROM和RAM使用的是不同的访问指令。51单片机采用哈佛结构。

2022-09-30 23:32:01 371

原创 【日拱一卒行而不辍20220929】自制操作系统

一个进程虽然拥有3G虚拟内存访问权限,但是实际需要的内存可能很少,另外一个进程大部分的主体,比如代码段、只读数据段等并不需要实时驻留在内存中,因为这些内容是“死的”。当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存。一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的。的虚拟地址空间,这个虚拟地址空间是面向此进程的。

2022-09-29 23:51:48 171

原创 【日拱一卒行而不辍20220928】自制操作系统

TSS初始化

2022-09-28 23:40:53 73

原创 【日拱一卒行而不辍20220927】自制操作系统

测试分页机制中的测试分页,其实是为多任务操作系统运行时切换进程所在页表的前奏。切换页过程中:(1)将页目录段首地址为由PageDirBase0修改为了 PageDirBase1;(2)把页表段首基址由PageTblBase0修改为了PageTblBase1。切换之前,代码是运行在[PageDirBase0:PageTblBase0]里面的;切换之后,代码是运行在[PageDirBase1:PageTblBase1]里面的。这个过程中仍然是一个进程,只不过人工切换了代码的运行物理地址,虚拟地址不变。

2022-09-27 13:53:46 63

原创 【日拱一卒行而不辍20220926】自制操作系统

32位处理程序,一共可以操作的内存为2^32B=4GB。所以1K个表项,每一个表项管理1K个页,每一个页的大小为4K,则总共刚好为1K×1K×4K=4GB,在汇编文件chapter3/f/pmtest6.asm中,关于分页设置的代码如下。此时还未开启多进程,仅有的一个进程中这个表有什么作用吗?页表需要进行切换吗?不管后续如何进行优化,让页表更省存储空间,基本原理还是如上所示。

2022-09-26 12:13:12 250

原创 【日拱一卒行而不辍20220925】自制操作系统

下面这段系统联调的代码始终没有调通。

2022-09-25 12:02:09 91

原创 【日拱一卒行而不辍20220924】自制操作系统

每个表项都有4个字节,前两个字节表示中断服务程序的段基址,后两个字节表示偏移量。IDT被初始化两次。第一次是在BIOS程序中,此时CPU还运行在实模式下,IDT被初始化并由bootloader程序使用。内核在启用中断机制之前,必须把IDT表的起始地址载入IDTR寄存器,并初始化表中的每一个表项。同时,在保护模式下,中断描述符表也不需要在地址为0的地方开始,可以常驻于内存的任何地方。为查询IDT的起始地址,在CPU中专门设置了一个IDTR——中断描述符表寄存器。指令是有长度的,一条指令是由多个字节构成的。

2022-09-24 10:04:06 422

原创 【日拱一卒行而不辍20220923】自制操作系统

这好像操作系统为应用程序提供了一个不依赖于硬件(物理内存)的平台,应用程序不必关心实际上有多少物理内存,也不必关心正在使用的是那一段内存,甚至不必关心某一个地址是在物理内存里面还是在硬盘中。在任务切换时,通过改变cr3的值来切换页目录,从而改变地址映射关系。操作系统全权负责了这其中的转换工作。

2022-09-23 21:02:13 418

原创 【日拱一卒行而不辍20220922】自制操作系统

这里就有一个很重要的问题:指令INC DWORD [EAX] 是直接对内存进行寻址操作,内存直接寻址默认的寄存器应该是DS,所以这个数据访问寻址实际上是:DS:-4+EBP(LEA指令的作用是取偏移地址,这里LEA EAX,DWORD [-4+EBP]实际上等效于mov eax,-4+EBP,只不过nasm语法要求必须要加[])。到这里,我们访问32位地址的内存就没有障碍了,方法是把寄存器GDTR和表GDT的内容分别设置好,就能通过操控16位段寄存器(CS,DS,ES,SS,FS,GS)来实现目标。

2022-09-22 12:57:23 218

原创 【日拱一卒行而不辍20220921】自制操作系统

剩下的从0x00500H开始的到0xA0000H总共不到640KB的内存是操作系统和应用程序所能够使用的,应用程序不能够使用这600KB以外的内存,这就是著名的“640KB限制”。从上图可以看出,0xB0000H开始到0xB8000H为单色字符模式视频缓冲区;系统硬件使用的存储器地址被安排在高端,地址从0xA0000H(684KB)开始的384KB中,其中有用于显示的视频缓冲区;对于昨天的第二扇区的代码,直接把数据放到了0xB8000H开始的彩色字符模式视频缓冲区内。第2、1、0 位:字符颜色的rgb。

2022-09-21 09:57:41 310

原创 【日拱一卒行而不辍20220920】自制操作系统

在sect2中,也就是第二扇区中编写了部分演示代码。前两个扇区的二进制文件如下所示。如何把第二个扇区及后续扇区的内容加载入内存并执行?不能是只在第一扇区进行操作了。shell脚本如下所示runboot.sh,生成两个扇区的虚拟硬盘镜像。功能:读写磁盘的中断调用,将指定扇区的代码加载到内存的指定位置。采用如下代码加载第二扇区的代码pmtest2.S。最终运行结果如下所示,显示了第二扇区的彩色的。

2022-09-20 19:04:52 255

原创 【日拱一卒行而不辍20220919】自制操作系统

初步分析认为是初次接触此类代码,没有理解关键变量的含义,囫囵运行之后无法达到预期目的。查看对应的os.raw二进制文件,也不足512字节。参照《ORANGE’S:一个操作系统的实现》第一感觉是以下的标签代码怎么不见了?以下是pmtest1.S。

2022-09-19 13:24:15 208

原创 【日拱一卒行而不辍20220918】自制操作系统

根据上述表格,我们也很容易知道BIOS是如何被进行加载的——直接映射入内存的对应地址即可。这里的映射是通过硬件实现,因此和借助于操作系统等程序进行的加载不同。

2022-09-18 12:18:41 183

原创 【日拱一卒行而不辍20220917】自制操作系统

实际上BIOS程序也主要就是简单的检测内存、显卡等外设信息,并初始化硬件并完成中断向量表IVT等并完成向量表的填写等。当执行完这些操作后,BIOS最后会校验启动盘位于0盘0道1扇区的内容——如果该扇区末尾的两个字节分别是0x55、0xaa,则将该扇区内容加载到。前两日写的程序本质上是占据了MBR的512字节空间。处,然后跳转至该地址并执行;,因此恰好可以复制完全。

2022-09-18 11:46:39 87

原创 【日拱一卒行而不辍20220916】自制操作系统

在实模式下,16位的寄存器需要用“段:偏移”这种方法才能达到1MB的寻址能力,如今我们有了32位寄存器,一个寄存器就 可以寻址4GB的空间,是不是从此段值就被抛弃了呢?实际上并没有,新政策下的地址仍然用“段:偏移”这样的形式来表示,只不 过保护模式下“段”的概念发生了根本性的变化。而保护模式下,虽然段值仍然由原来16位的cs、ds等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向一 个数据结构的一个表项,表项中详细定义了段的起始地址、界限、属性等内容。然后在保护模式下运行内核。利用nasm进行编译。

2022-09-18 11:45:14 339

空空如也

空空如也

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

TA关注的人

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