LAB1实验

2023-11-20

Part 1:

遇到问题1:我将JOS放在Windows的目录下 ,通过VMware设置共享该文件夹来编译JOS,但是Windows更改linux下设置的权限,导致GDB无法调试QEMU.
  解决方法:将JOS放在虚拟机下的linux的目录下 2011.12.13

问题2: make qemu-gdb启动qemu后,在令一个终端中gdb调试,则qemu关闭,原因不知
 原因:可能是安装qemu时使用的root权限,而使用qemu时,为用户态权限
 解决方法:执行make qemu-gdb与执行gdb的两个权限相同。(注意启动gdb时,别忘记进入到lab的目录下)

 

Part2 :

   main.c 的作用是将内核ELF文件读写到内存0x10000开始的地方 2012.1.10

  boot loader的入口地址为0x7c00,kernel的入口地址为0x10000c 2012.1.13

       问题1: i386-jos-elf-objdump 无法找到?
 由于我们采用fedaro,没有自己建立编译链,所以这里使用objdump  2012.1.10

      问题2:如果将boot/makefrag中的链接地址由0x7c00改为0x7ccc,则boot部分执行,但是kernel跑不起来
  这是为什么呢?2012.1.11 其实并没有执行boot loader,本系统中VMA=LMA,所以当bios跳转到0x7c00时,boot loader无法执行,导致kernel无法加载,进而无法执

 行。2012.4.4
Kernel的LMA和VMA的地址不一致?请参看part3开头部分,Kernel的LMA和VMA就是不一样,而boot loader的LMA和VMA 是一样的2012.4.7

    问题3:boot.asm中,7d74语句(也就是ELFHDR->e_entry)语句中,call *0x10018, 但是GDB中,如果开始便设置断点0x100018,便开始C命令,执行不到0x10018,便把内核给启动起来了,这是为什么呢?2012.1.13
 在0x7d74处设置断点,执行到此处,而后用si命令执行一条指令,就跳转到0x10000c处了,...这个为什么?  难道内核入口地址为0x10000c? 经验证,果然如此,与objdump -f kernel看到的一致

     问题4:boot loader编译为ELF格式吗?Kernel编译为ELF格式,那么在硬盘中如何指定boot loader 放在第一个扇区,kernel放在哪里呢? Kernel与bootloader是放在文件系统中吗?2012..4.4

 boot loader为ELF格式,在obj/boot中;kernel也为ELF格式,在obj/kern中。而最后 生成的image应该为这两个的结合(猜测)2012.4.7


Part3:

 问题1: kernel的LMA和VMA为什么不一致?

                      因为一般在虚拟地址空间中,操作系统占据高地址内存,而用户程序占用低地址内存,所以kernel的VMA为很大的值0xf0100000开始的。而LMA为kernel的加载地址,这个加载器就是boot loader,boot loader将kernel加载到物理内存LMA地址处,那么怎么让这个地址与VMA地址对应起来,这就需要MMU地址映射来实现了。LMA由程序加载进内存物理地址和加载器有关。(boot/boot.S set up an identity mapping from linear addresses to physical addresses)
     操作系统需要在高地址执行,但是只能被boot拷贝到低地址!

   Exercise7解答:
     将mov %eax,%cr0 注释(comment out)后,执行到0x10002d: jmp *%eax处出错,因为map不成功,则eax中的地址0xf010002f无效,所以出错。这也看出,程序中地址都是virtual地址,gdb调试时也是虚拟地址。2012.4.7此处由于GDT设置,如果没有页机制,则物理地址与虚拟地址一样。2012.7.7

   Exercise8解答:

             vprintfmt函数中,

case 'o':
    num=getuint(&ap,lflag);
    base=8;
    goto number;


    Question1: kern/printf.c中调用lib/printfmt.c中的vprintfmt(),vprintfmt()调用kern/printf.c中的putch函数,putch函数调用kern/console.c中的cputchar函数。最终cputchar函数实现了字符打印。2012.4.7

  Question2:当屏幕打满时,需要将第一行去掉。所以进行这些处理。

  Question3:请先参看我的文章《esp ebp eip 函数压栈
             ap类型为va_list,指后面的几个参数。fmt指向前面的字符串。

 Question4: 打印出来是He110, World ,其中0x00646c72,翻译为ASCII就是rld.
 Question5: 这个结果是不可欲知的,原因请看<<c and pointers>>中关于可变参数的介绍
 Question6:未做 2012.7.9

 Exercise9 :
       在文件entry.S中,bootstack与bootstacktop定义了堆栈,KSTKSIZE为堆栈大小,为8页内存大小。使用movl $(bootstacktop),%esp对堆栈指针进行赋值。kernel stack的load地址为KSTACKTOP,值为KERNBASE-PTSIZE.
    有些东西未搞明白! 2012.7.9
    在entry.s中,Jump up above KERNBASE enterting的做法,说明ld后的这些relocated这样的符号都转化为了vm地址。
 Exercies10:
    

其他
1. 为什么kern/kernel中的makefile文件中,生成OS image的方法为:

    $(V)dd if=/dev/zero of=$(OBJDIR)/kern/kernel.img~ count=10000 2>/dev/null
    $(V)dd if=$(OBJDIR)/boot/boot of=$(OBJDIR)/kern/kernel.img~ conv=notrunc 2>/dev/null
    $(V)dd if=$(OBJDIR)/kern/kernel of=$(OBJDIR)/kern/kernel.img~ seek=1 conv=notrunc 2>/dev/null
    $(V)mv $(OBJDIR)/kern/kernel.img~ $(OBJDIR)/kern/kernel.img
     这个kernel是什么格式的?是elf还是bin格式? 我感觉应该是ELF格式的两个文件拼接到了一起。ELF 是X86可以执行的二进制文件(ELF binary)
2. boot/main.c中,最后((void *)(void)(ELFHDR->e_entry))(),这个跳转到0xf010000x处,但是gdt表中,这个地址超出了实际物理内存范围,怎么能够跳转到kern/entry.s中去呢?
     entry.s中,_start的定义应该是启到了某种作用,但是不明白!!!??????
3. 汇编语言中的标号,经连接后变为线性地址,是以线性地址的值来保存的。 2013.7.12
4.数组在栈上分配时什么意思? 函数传递过程中,参数是什么?是值吗? 应该是的!
5. 汇编器生成ELF,可链接格式,可relocation重定位的多个section, 有section table;连接器将多个section进行合并成segment,生成可执行的elf,有program table.
6. 汇编器生成的为相对地址,而链接后生成为绝对线性地址。使用ld链接脚本来控制内存分布。
7. entry入口点:现在要执行程序B, 如果A知道要调转到B的何处去执行,则不使用entry;如果A不知道跳转到B的何处去执行,则跳转到entry去执行,因为这是B希望的入口点。
8. 可见.shstrtab段保存着各Section的名字,.strtab段保存着程序中用到的符号的名字和地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LAB1实验 的相关文章

  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 如何使用 python 操作系统更改驱动器?

    我正在尝试更改当前目录C to Y 我试过 import os os chdir Y 但我不断收到错误消息 提示无法找到驱动器 本质上我正在寻找相当于 cd d cmd 中的命令 你确定吗Y 确实是有效的驱动器号吗 Try os chdir
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • 批量读取INI文件并将其设置为全局变量

    我有一个批处理文件 它已经做了很多事情 并试图扩展它以从 ini 文件中获取一些数据 例如 ini 文件看起来像这样 Settings1 Text Text Text1 Text Text2 Text Settings2 Text Text
  • 有没有办法在 Windows 上全局安装 Composer?

    我读过全局安装文档 http getcomposer org doc 00 intro md globally对于 Composer 但仅适用于 nix 系统 curl s https getcomposer org installer p
  • 为什么 FindWindow 找到了 EnumChildWindows 找不到的窗口?

    我正在寻找一个类名称为 CLIPBRDWNDCLASS 的窗口 它可以在办公应用程序和其他应用程序中找到 如果我使用 FindWindow 或 FindWindowEx 我找到第一个具有此类的 HWND 但我想要all具有该类的窗口 因此我
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • Powershell 设置盖子关闭操作

    我想自动设置 Windows 7 在我的工作笔记本电脑上合上盖子时所执行的操作 因为每次登录时都会通过 GPO 重置该操作 我知道我可以在批处理脚本中使用 powercfg 命令来实现此目的 powercfg setacvalueindex
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • Jenkins 执行 PowerShell 脚本

    我正在尝试从 Jenkins 运行 PowerShell 脚本 但它似乎完全忽略了执行策略 可以通过直接执行 powershell exe 或使用PowerShell插件 https wiki jenkins ci org display
  • 防止 Windows 中的崩溃消息

    我的应用程序需要扫描经常导致崩溃的第三方文件 为了克服这个问题 它使用一个单独的进程来扫描这些文件并 每当这个进程崩溃时 我的应用程序就会实例化另一个应用程序 我的问题是 每次崩溃后我都会收到 Windows 崩溃消息 AuxScanner
  • Windows 应用程序事实上的标准键盘快捷键列表?

    假设我正在为 Windows 开发一个新的桌面应用程序 是否有我可以查阅的所有 Windows 应用程序都应支持的键盘快捷键列表 来自 Microsoft 或第三方 注意 当我在这里说 所有 Windows 应用程序 时 我的真正意思是 特
  • 命令行显示文件的属性?

    我想编写一个显示默认 Windows 属性表的应用程序 我找不到太多关于以正常编程方式执行此操作的信息 所以我想也许可以使用命令行调用 有谁知道 Windows 命令行调用文件的属性 详细信息窗口吗 没有任何运气去寻找它 这个窗口在这里 看
  • 为什么 ld 无法从 /etc/ld.so.conf 中的路径找到库?

    我想添加 opt vertica lib64进入系统库路径 所以我执行以下步骤 1 添加 opt vertica lib64 into etc ld so conf 然后运行ldconfig 2 检查 bash ldconfig p gre
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa

随机推荐

  • 关于Socket通信客户端是否需要绑定端口号

    参见http blog chinaunix net uid 23193900 id 3199173 html 无连接的socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息 使用bind函数时 通过将
  • C++输出二进制数

    示例 include
  • Lattice Diamond安装

    1 下载 到Lattice官网 http www latticesemi com 注册一个lattice的账号后就可以去下载Diamond 登陆后如下图 根据自己系统情况选择对应的版本 我用的是32位win8 Diamond软件安装包和La
  • DenseFusion复现-可以在30系/40系显卡运行

    笔者电脑显卡为4060 因为使用DenseFusion作者pytorch1 0的代码没有成功 发现很多人在30系显卡上复现失败 经过查资料后发现是因为cuda版本与显卡算力不匹配 需要提高cuda版本 因此也需要提高pytorch版本 后来
  • vue动态添加style样式

    注意 凡是有 的style属性名都要变成驼峰式 比如font size要变成fontSize 除了绑定值 其他的属性名的值要用引号括起来 比如backgroundColor 00a2ff 而不是 backgroundColor 00a2ff
  • 数据库服务器操作系统升级方案,PostgreSQL 数据库跨版本升级常用方案解析

    大家好 我是只谈技术不剪发的 Tony 老师 对于企业而言 将数据库系统升级到新版本通常可以获得更好的性能 更多的功能 最新的安全补丁和错误修复等 因此 本文就来介绍一下 PostgreSQL 数据库版本升级的 3 种常用方案 升级方案概述
  • Element Plus 实例详解(五)___Scrollbar 滚动条

    Element Plus 实例详解 五 Scrollbar 滚动条 本文目录 一 前言 二 搭建Element Plus试用环境 1 搭建Vue3项目 基于Vite Vue 2 安装Element Plus 三 Element Plus S
  • 讲解+可执行完整代码 C++单链表(2)查找、插入、删除元素

    目录 一 查找元素 代码部分 核心代码 完整代码 二 插入元素 核心思路 代码部分 核心代码 完整代码 编辑 三 删除元素 核心思路 代码部分 核心代码 完整代码 一 查找元素 此段代码仅实现查找元素的功能 代码部分 核心代码 node l
  • 探究 Nginx 中 reload 流程的真相

    点击上方 程序员小乐 关注 星标或置顶一起成长 每天凌晨00点00分 第一时间与你相约 每日英文 Try to hold the right hand with your left hand and gave yourself most s
  • web前端技术笔记(二)html 表单 和页面嵌套

    1 相对路径和绝对路径 2 有序和无序列表 3 表格 4 注册表单 表单用于搜集不同类型的用户输入 表单由不同类型的标签组成 相关标签及属性用法如下 1
  • 基于 Zipkin的链路追踪

    Zipkin介绍 Zipkin 是 Twitter 的一个开源项目 它基于 Google Dapper 实现 它致力于收集服务的定时数据 以 解决微服务架构中的延迟问题 包括数据的收集 存储 查找和展现 我们可以使用它来收集各个服务器 上请
  • 每日一练-仓库日志

    仓库日志 题目描述 解题思路 Python源码 Summary Date 2023年1月9日 Author 小 y 同 学 Classify 蓝桥杯每日一练 Language Python 题目描述 题意 M海运公司最近要对旗下仓库的货物进
  • ST公司 Lis2dh12 三轴加速度传感器,计算加速度值转成角度值

    目录 概述 项目上使用了一款Lis2dh12三轴加速度传感器 开发前要准备的工作 1 原理图 1 1 创建lis2dh12 c文件 1 2 在此重点说明 如果想调传感器的中断灵敏度 注意 关注1 INT1 THS 32h 2 INT1 DU
  • 华为OD机试真题- 任务混部【2023Q1】【JAVA、Python、C++】

    题目描述 公司创新实验室正在研究如何最小化资源成本 最大化资源利用率 请你设计算法帮他们解决一个任务混部问题 有taskNum项任务 每个任务有开始时间 startTime 结束时间 endTime 并行度 parallelism 三个属性
  • 什么是分布式架构

    一 分布式架构定义 什么是分布式架构 分布式系统 distributed system 是建立在网络之上的软件系统 内聚性 是指每一个数据库分布节点高度自治 有本地的数据库管理系统 透明性 是指每一个数据库分布节点对用户的应用来说都是透明的
  • 多处理器编程的艺术(二)-并行程序设计

    当处理器的性能的发展受到各方面因素的限制的时候 计算机产业开始用多处理器结构实现并行计算来提高计算的效率 我们使用多处理器共享存储器的方式实现了多处理器编程 也就是多核编程 当然在这样的系统结构下我们面临着各种各样的挑战 例如如何协调各个处
  • 十四、java版 SpringCloud分布式微服务云架构之Java String 类

    Java String 类 字符串广泛应用 在 Java 编程中 在 Java 中字符串属于对象 Java 提供了 String 类来创建和操作字符串 创建字符串 创建字符串最简单的方式如下 String str xxx 在代码中遇到字符串
  • STM32串口中断、DMA接收的几点注意地方

    STM32串口中断 DMA接收的几点注意地方 https tieba baidu com p 5978431198 red tag 1717231177 traceid 这个文章棒 今天写点大家常问 也是常见的关于UART串口的内容 这几点
  • Ubuntu 18.04安装教程(转)

    https blog csdn net qq 39478237 article details 83084515 参考这个播客安装
  • LAB1实验

    Part 1 遇到问题1 我将JOS放在Windows的目录下 通过VMware设置共享该文件夹来编译JOS 但是Windows更改linux下设置的权限 导致GDB无法调试QEMU 解决方法 将JOS放在虚拟机下的linux的目录下 20