文章目录

  • 应该养成的好习惯
  • 删除 替换 修改 内容时 记得留备份
  • 遇到问题要通过文字 图片 等多种途径去记录
  • 不同的项目应该在不同的文件夹进行处理
  • 代码文档 记得添加一些注释用于说明功能
  • 多输出有区别度的提示信息
  • s找bug 先定位错误 再改
  • 当一份代码有不同版本的时候 记得说明每份代码的版本 可能存在的bug 现在具备的功能
  • 写代码 先写思路 待思路明确后再进行修改
  • 多用man
  • lab 0熟悉实验环境
  • lab 1输出硬件参数
    • 前言
    • 实验环境
    • 实验内容
    • 说明:
    • 需要知道的基础知识
    • 修改/boot/bootsect.s 使其能在屏幕上输出提示信息(xxx is booting)
    • 修改/boot/setup.s 使其能输出(now we are in SETUP)
    • 将硬件参数(内存大小、硬盘参数)输出到屏幕上
  • lab2-system call
    • 实验目的
    • 实验内容
      • 指导书给的内容
        • iam()
        • whoami()
      • 简单点
    • 实验中的记录
      • 第一次报错信息
      • 怎么传值
      • 第二次错误 segment fault
      • 第三个错误
      • 第四个问题
    • 实验原理
    • 附记
      • 将测试脚本 挂载到linux0.11中(在files文件夹中)
      • 测试程序(防止没有files)
      • kernel中的makefile代码
  • lab 3进程运行轨迹的跟踪和统计
    • 实验目的
    • 实验内容
    • 几个问题
    • sched.c & sleep_on()
    • process.c
    • 监控命令
    • process.c v2
    • W阻塞态 E退出 J就绪态 R运行态 N新建
    • 去除掉window下的^M
    • ubuntu可过编译 linux0.11挂了
    • 出现了连续两行一样的内容
    • 某个进程前后两个状态是一致的
    • 修改完的代码如下
    • process.c v3
    • process.sh
    • sleep on
    • 思考问题
      • 结合自己的体会 从程序设计者的角度看 单进程编程和多进程编程最大的区别是什么
      • 你是如何修改时间片的? 仅仅针对样本程序建立的进程,在修改时间片前后 log文件的统计结果都是怎么样的,结合你的修改分析一下为什么会这样,或者为什么没变化?
  • lab 7 Proc 文件系统的实现
    • 实验内容
    • procfs简介
    • 实现思路
    • ll /proc
    • cat
    • cat /proc/psinfo
    • cat /proc/meminfo
    • cat /proc/hdinfo
    • include/sys/stat.h
    • fs/namei.c
    • init/main.c
    • fs/read_write.c
    • fs/proc_dev.c
    • 死循环了
    • mycat.c
    • proc.sh
    • fs/final proc_dev.c
    • read_write.c
    • fs/Makefile
    • include/linux/mm.h
    • 思考问题
    • 遇到的几个问题BUG
  • lab 6 字符显示
  • lab4 实现信号量
    • int sys_lseek(unsigned int fd, off_t offset, int origin) 文件句柄 新的文件读写偏移 偏移起始位置 SEEK_SET (0) SEEK_CUR(1)SEEK_END
    • gcc -o test test.c -lpthread
    • 很有意思一错误 if(!fork)
    • ubuntu下信号量使用不对
    • bug1,if(!fork);
    • bug2,fopen,open失效;
    • bug3,创建了进程和信号量,但是消费者无限等待,
    • bug4,在0.11上一直出现string or char...编译错误,
    • pc.c
    • pc_hdc.c > pc_hdc.log
    • pv.c
    • sem.h
    • sem.c
    • test.c
    • testsem.c v2
    • sem.c v2
    • sem.c v3
    • sem.c v3.5
    • sem v4
  • lab5 address
    • shmid_ds
    • int shmget(key_t key, size_t size, int shmflg)
    • int shmat(int shmid, const void *shmaddr, int shmflg)
    • int shmdt(const void *shmaddr)
    • shm_com.h
    • shmread.c
    • shmwrite.c
    • mmpc.c v1 -pthread
    • include/unistd.h
    • kernel/system_call.s
    • include/linux/shm.h
    • mmpc_hdc.c
    • kernel/shm.c
    • linux shmid_ds linux2.6
    • unsigned long get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags)

应该养成的好习惯

删除 替换 修改 内容时 记得留备份

遇到问题要通过文字 图片 等多种途径去记录

不同的项目应该在不同的文件夹进行处理

代码文档 记得添加一些注释用于说明功能

多输出有区别度的提示信息

s找bug 先定位错误 再改

当一份代码有不同版本的时候 记得说明每份代码的版本 可能存在的bug 现在具备的功能

写代码 先写思路 待思路明确后再进行修改

多用man

lab 0熟悉实验环境

IA-32(X86)结构的PC机

主要的软件环境是Bochs + gcc + 编辑器 + OS + Linux0.11源代码

根据要求编写程序,修改Linux0.11的源代码

用gcc编译后,

在bochs中的虚拟环境中运行,调试目标代码(bochs是一个免费开源的IA-32架构的PC机模拟器,在它模拟出的环境中可以运行多种操作系统。)

在Ubuntu上制作了hit-oslab集成环境。解压就可以使用。

cd /home/shiyanlou/oslab/tar -zxvf hit-oslab-linux-20110823.tar.gzls -al

oslab采用bochs 模拟器加载这个image文件,模拟执行Linux0.11。

bochs目录

与bochs相关的执行文件、数据文件和配置文件

run脚本

run是运行bochs的脚本命令

  • run 脚本

run 是运行 bochs 的脚本命令。

运行后 bochs 会自动在它的虚拟软驱 A 和虚拟硬盘上各挂载一个镜像文件,软驱上挂载是 linux-0.11/Image,硬盘上挂载的是 hdc-0.11.img。

因为 bochs 配置文件中的设置是从软驱 A 启动,所以 Linux 0.11 会被自动加载。

而 Linux 0.11 会驱动硬盘,并 mount 硬盘上的文件系统,也就是将 hdc-0.11.img 内镜像的文件系统挂载到 0.11 系统内的根目录 —— /。在 0.11 下访问文件系统,访问的就是 hdc-0.11.img 文件内虚拟的文件系统。

  • hdc-0.11.img 文件

hdc-0.11.img 文件的格式是 Minix 文件系统的镜像。

Linux 所有版本都支持这种格式的文件系统,所以可以直接在宿主 Linux 上通过 mount 命令访问此文件内的文件,达到宿主系统和 bochs 内运行的 Linux 0.11 之间交换文件的效果。

Windows 下目前没有(或者是还没发现)直接访问 Minix 文件系统的办法,所以要借助于 fdb.img,这是一个 1.44M 软盘的镜像文件,内部是 FAT12 文件系统。将它挂载到 bochs 的软驱 B,就可以在 0.11 中访问它。而通过 filedisk 或者 WinImage,可以在 Windows 下访问它内部的文件。

hdc-0.11.img 内包含有:

  • Bash shell;
  • 一些基本的 Linux 命令、工具,比如 cp、rm、mv、tar;
  • vi 编辑器;
  • gcc 1.4 编译器,可用来编译标准 C 程序;
  • as86 和 ld86;
  • Linux 0.11 的源代码,可在 0.11 下编译,然后覆盖现有的二进制内核。

其他文件在后面用到的时候会进行单独讲解。

pwdcd ./linux-0.11/make clean && make all
# linux-0.11/imagecd ~/oslab/./run# asm level
cd ~/oslab/./dbg-asmhelp
# reg = watch reg
# # c level
cd ~/oslab
./dbg-c# open new terminator
cd ~/oslab
./rungdb
#次序不能变 否则无法连接gdb
gcc test.cgcc test.c -o testgcc -E test.c -o test.igcc -S test.igcc -c test.sgcc test.o -o testgcc -o1 test.c -o test
apt install gcc make dkms
apt install build-essential linux-headers-`uname -r`
./share.sh # 执行文件
ls -l share.sh # 查看文件权限
chmod u+x share.sh  # 修改用户模式
./share.shls

文章目录

  • 应该养成的好习惯
  • 删除 替换 修改 内容时 记得留备份
  • 遇到问题要通过文字 图片 等多种途径去记录
  • 不同的项目应该在不同的文件夹进行处理
  • 代码文档 记得添加一些注释用于说明功能
  • 多输出有区别度的提示信息
  • s找bug 先定位错误 再改
  • 当一份代码有不同版本的时候 记得说明每份代码的版本 可能存在的bug 现在具备的功能
  • 写代码 先写思路 待思路明确后再进行修改
  • 多用man
  • lab 0熟悉实验环境
  • lab 1输出硬件参数
    • 前言
    • 实验环境
    • 实验内容
    • 说明:
    • 需要知道的基础知识
    • 修改/boot/bootsect.s 使其能在屏幕上输出提示信息(xxx is booting)
    • 修改/boot/setup.s 使其能输出(now we are in SETUP)
    • 将硬件参数(内存大小、硬盘参数)输出到屏幕上
  • lab2-system call
    • 实验目的
    • 实验内容
      • 指导书给的内容
        • iam()
        • whoami()
      • 简单点
    • 实验中的记录
      • 第一次报错信息
      • 怎么传值
      • 第二次错误 segment fault
      • 第三个错误
      • 第四个问题
    • 实验原理
    • 附记
      • 将测试脚本 挂载到linux0.11中(在files文件夹中)
      • 测试程序(防止没有files)
      • kernel中的makefile代码
  • lab 3进程运行轨迹的跟踪和统计
    • 实验目的
    • 实验内容
    • 几个问题
    • sched.c & sleep_on()
    • process.c
    • 监控命令
    • process.c v2
    • W阻塞态 E退出 J就绪态 R运行态 N新建
    • 去除掉window下的^M
    • ubuntu可过编译 linux0.11挂了
    • 出现了连续两行一样的内容
    • 某个进程前后两个状态是一致的
    • 修改完的代码如下
    • process.c v3
    • process.sh
    • sleep on
    • 思考问题
      • 结合自己的体会 从程序设计者的角度看 单进程编程和多进程编程最大的区别是什么
      • 你是如何修改时间片的? 仅仅针对样本程序建立的进程,在修改时间片前后 log文件的统计结果都是怎么样的,结合你的修改分析一下为什么会这样,或者为什么没变化?
  • lab 7 Proc 文件系统的实现
    • 实验内容
    • procfs简介
    • 实现思路
    • ll /proc
    • cat
    • cat /proc/psinfo
    • cat /proc/meminfo
    • cat /proc/hdinfo
    • include/sys/stat.h
    • fs/namei.c
    • init/main.c
    • fs/read_write.c
    • fs/proc_dev.c
    • 死循环了
    • mycat.c
    • proc.sh
    • fs/final proc_dev.c
    • read_write.c
    • fs/Makefile
    • include/linux/mm.h
    • 思考问题
    • 遇到的几个问题BUG
  • lab 6 字符显示
  • lab4 实现信号量
    • int sys_lseek(unsigned int fd, off_t offset, int origin) 文件句柄 新的文件读写偏移 偏移起始位置 SEEK_SET (0) SEEK_CUR(1)SEEK_END
    • gcc -o test test.c -lpthread
    • 很有意思一错误 if(!fork)
    • ubuntu下信号量使用不对
    • bug1,if(!fork);
    • bug2,fopen,open失效;
    • bug3,创建了进程和信号量,但是消费者无限等待,
    • bug4,在0.11上一直出现string or char...编译错误,
    • pc.c
    • pc_hdc.c > pc_hdc.log
    • pv.c
    • sem.h
    • sem.c
    • test.c
    • testsem.c v2
    • sem.c v2
    • sem.c v3
    • sem.c v3.5
    • sem v4
  • lab5 address
    • shmid_ds
    • int shmget(key_t key, size_t size, int shmflg)
    • int shmat(int shmid, const void *shmaddr, int shmflg)
    • int shmdt(const void *shmaddr)
    • shm_com.h
    • shmread.c
    • shmwrite.c
    • mmpc.c v1 -pthread
    • include/unistd.h
    • kernel/system_call.s
    • include/linux/shm.h
    • mmpc_hdc.c
    • kernel/shm.c
    • linux shmid_ds linux2.6
    • unsigned long get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags)

lab 1输出硬件参数

前言

此文为哈工大李治军老师所教授操作系统课程的配套实验中的实验一 —— 操作系统的引导 的记录。

在学完李志军老师所教授课程后,决定通过实验加深对OS的进一步理解。

所需要说明的是,linux-0.11是linux最早的版本。当前的linux和其相比,早已天差地别。

同时,硬件也发生了较大的变化。(0.11还考虑软盘 floppy disk)

因此,在现在的环境下学习linux0.11,其意义更多的在于扫除操作系统的神秘感。

那为什么不选择更现代的操作系统来进行实验呢?

因为操作系统是真正的复杂系统。太过于庞大,太过于复杂,容易在细节中迷失对操作系统整体的把握。
(太难了, 代码看不懂)

linux0.11相较于其他OS,已算小型,但代码量也不小。学起来也不算容易。

同时,其较好地实现了操作系统的几个视图(进程,内存,文件),可供初学者仔细研究。
(多看看进程调度函数)

实验环境

该实验可在蓝桥云课对应实验课中进行实验。

但是很麻烦,不保存之前结果,还吃网络,操作的很烦。

于是,我就在我的虚拟机上配置了相关环境。

环境配置可参考该博文。
(记得关注自己的实验文件夹,我曾以为自己没出最后的oslab,还自己一个一个解压,配置环境变量,最后发现别人的脚本早做好了)

另外,建议做一个共享文件夹,用git去管理源码。能省不少麻烦。

软件环境:Bochs + Ubuntu14.04 + gcc3.4 + vim

模拟硬件环境:IA-32 X86架构

汇编语言:as86语法

实验内容

说明:

原实验内容如下:

此次实验的基本内容是:

阅读《Linux内核完全注释》的第6章,对计算机和Linux 0.11的引导过程进行初步的了解;
按照下面的要求改写0.11的引导程序bootsect.s
有兴趣同学可以做做进入保护模式前的设置程序setup.s。
改写bootsect.s主要完成如下功能:

bootsect.s能在屏幕上打印一段提示信息“XXX is booting…”,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等(可以上论坛上秀秀谁的OS名字最帅,也可以显示一个特色logo,以表示自己操作系统的与众不同。)
改写setup.s主要完成如下功能:

bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s向屏幕输出一行"Now we are in SETUP"。
setup.s能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。
setup.s不再加载Linux内核,保持上述信息显示在屏幕上即可。

如果直接按照它的来,则每次不再编译全部的OS,只是编译一小部分。
这样的话,就不能直接用它给的命令快速完成,而且无法看到这么修改是否会对OS整体产生影响。(输出能产生什么影响呢)
又因为我懒(不想写硬件读写,太折磨了),所以我直接在linux-0.11源代码的基础上做出了要求实现的功能。

需要知道的基础知识

由于当前仍然处于操作系统的引导时期,因此并不存在操作系统所提供给你的系统调用。

可以用的,只有BIOS的中断。

在实验中会用到的是int 0x10

具体的解释可见该博文

另外就是基础的汇编知识
在此仅仅对几个在接下来的实验中容易出错的进行说明。
bp默认寻址es,bx默认寻址ds。
si默认寻址ds,di默认寻址es
sp寻址ss 压栈 sp = sp - 2 出栈sp = sp + 2

call 会将当前的cs,ip进行压栈
ret 会从栈中弹出ip,cs。

rep movsb 串传送指令(按照字节传输cx次 依据df决定传输方向,cld指令将df置为0 , 正向传输 传输完一个后 si,di自增, std将DF置为1,逆向传输,传输完一字节后,si,di自减)。
movsw 按照字(此时是2byte)其余类似

lds reg, mem 将内存处的字 赋值给 对应寄存器
lds si, [40x41] 即将 40x41 = 0x104地址处的 字 赋值给 si

以及
盘片(platter)
磁头(head)
磁道(track)
扇区(sector)
柱面(cylinder)

修改/boot/bootsect.s 使其能在屏幕上输出提示信息(xxx is booting)

很简单,直接修改源码中的输出字符串(msg1) 和 对应的长度(cx)即可。

! Print some inane message
! read the cursor positionmov   ah,#0x03        ! read cursor posxor    bh,bhint    0x10mov cx,#46 ! length of string for output # mov  bx,#0x0007      ! page 0, attribute 7 (normal)mov   bp,#msg1mov ax,#0x1301      ! write string, move cursorint  0x10msg1:.byte 13,10.ascii "Lucifer system Created by rebelOverWaist".byte 13,10,13,10

之后用提供的make clean && make all 命令进行编译
再用./run 脚本运行

修改/boot/setup.s 使其能输出(now we are in SETUP)

这个也没什么难的。

只不过是自己写了bootsect中的字符串输出代码罢了。

(注意,此时需要将es置为9200 因为要寻址字符串 否则结果不对)

  mov ax, #SETUPSEGmov es, axmov ah, #0x03xor bh, bhint 0x10mov cx, #12mov bx, #0x0007mov bp, #msgmov ax, #0x1301int 0x10msg:.byte 13, 10.ascii "setup...".byte 13, 10, 13, 10

然后再编译运行即可。
就可看到字符显示了。

将硬件参数(内存大小、硬盘参数)输出到屏幕上

分为两步,第一步读取硬件参数,第二步,拿到硬件参数,通过一定格式显示。
第一步我没写,直接用linux源码去解决了。
第二步需要将数据按16进制进行输出,所以需要写以下两个函数,将一个16位数按16进制输出,输出回车换行。实验指导给了如下实例代码。
(也不一定非要用给的代码 实现这两个函数的功能的方法有很多)
(在此提供一下思路 对于16进制的输出,可以先打表 "0123…f"然后利用si这种去偏移寻址 就不用去看是数字还是字符了 至于回车换行,要是懒的话 可以直接在字符串后面加一个CRLF(13,10))
如果按照实验指导给的代码直接写:

    !以16进制方式打印栈顶的16位数print_hex:mov    cx,#4         ! 4个十六进制数字mov    dx,(bp)     ! 将(bp)所指的值放入dx中,如果bp是指向栈顶的话print_digit:rol    dx,#4        ! 循环以使低4比特用上 !! 取dx的高4比特移到低4比特处。mov    ax,#0xe0f     ! ah = 请求的功能值,al = 半字节(4个比特)掩码。and    al,dl         ! 取dl的低4比特值。add    al,#0x30     ! 给al数字加上十六进制0x30cmp    al,#0x3ajl    outp          !是一个不大于十的数字add    al,#0x07      !是a~f,要多加7outp: int    0x10loop    print_digitret
    !打印回车换行print_nl:mov    ax,#0xe0d     ! CRint    0x10mov    al,#0xa     ! LFint    0x10ret

会被栈搞得头晕。
因为call 和 ret 存在入栈和出栈的存在, 会对SS和SP进行修改。
如果按照默认的,可能会不小心修改了什么代码,什么数据。
(这个时候还在实地址模式,只有BIOS这种才是只读的)
这种时候会出现各类奇奇怪怪的BUG,只有调试了。

设置好ss和sp

【HIT-OSLAB-实验中的碎碎念】相关推荐

  1. 前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序

    『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到. 我会查阅一些资料并可能加上自己的理解,来记录这些问题.更多文章请前往我的个人博客 ...

  2. 计算机应用退修后多久知道结果,计算机核心论文投稿的一点碎碎念

    此次小论文能够发表到核心成功,实属不易,经历太多曲折,通过这个过程也成长了很多,觉得有必要记录说一点自己的碎碎念: 投稿期刊:计算机工程与应用 历时:两个半月 期刊:14晋级核心级别 对期刊印象:严格 ...

  3. 计算机核心论文投稿的一点碎碎念

    引 此次小论文能够发表到核心成功,实属不易,经历太多曲折,通过这个过程也成长了很多,觉得有必要记录说一点自己的碎碎念:         投稿期刊:计算机工程与应用         历时:两个半月   ...

  4. 【BUAA_CO_LAB】计组p3p4碎碎念

    文章目录 计组P3&P4碎碎念 前言 正文 初见单周期CPU 具体搭建步骤 算术逻辑运算单元ALU 指令存储器IM 通用寄存器堆GRF Ext扩展部件 数据存储器DM 控制信号生成单元CU N ...

  5. 每月碎碎念 | 2019.09

    Hi,这里是新开辟的"碎碎念"的世界. 这个区域作为记录心情的地方,把每日的所思所想所感所悟记录在这里,当做一个写日记的地方,每个月底汇总成一篇文章,只给我的朋友看. 2019-9 ...

  6. 每月碎碎念 | 2019.7

    Hi,这里是新开辟的"碎碎念"的世界. 这个区域作为记录心情的地方,把每日的所思所想所感所悟记录在这里,当做一个写日记的地方,每个月底汇总成一篇文章,只给我的朋友看. 2019-7 ...

  7. 参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...

    上周末去清华建筑学院开了个会,叫做海峡两岸城市地理信息系统论坛2010 年会,主题很大,但是内容比较集中一些,就是围绕着GIS与城市规划.一天下来听了20个报告,挺佩服主办方的时间控制,这么密集的报告 ...

  8. PMcaff写给大家的年终碎碎念 PMcaff | 记录

    今天是大年三十,2014马上就要结束了,送上新春祝福之前,碎碎念的小希有话想跟大家说. 瞧这一年 小米在硬件行业继续如鱼得水,科幻片里的智能家居生慢慢变成生活. 阿里巴巴在纳克达斯扬眉吐气了一把,一夜 ...

  9. 数据结构碎碎念(一)

    碎碎念 在大一学习C语言的时候,举过一个用栈实现的括号匹配算法,当时觉得很难,不过现在回顾起来,这个算法也算是比较简单的一个关于栈的应用了.而现在所常见的算法问题也都是什么中缀表达式转后缀表达式,双栈 ...

最新文章

  1. 用C语言解“求特殊方程得正整数解”题
  2. junit-4.9.jar_JUnit 4.9(测试版3)中的规则
  3. c 文件怎么进行读取和写入操作?
  4. 电路设计之干扰问题总结与分析
  5. java maven 操作 收集的一些命令
  6. ffmpeg命令 抓屏_使用FFmpeg从视频中截图的命令 | 学步园
  7. 10.14-10.20学习总结
  8. android绘制过程3d图形,Android开发 OpenGL ES绘制3D 图形实例详解
  9. 安天移动安全:重视用户个人信息保护,是App长效发展的关键
  10. 计算机中丢失d3dx9-41,雨林木风win10系统提示“计算机中丢失d3dx9-41.dll”的详细技巧...
  11. pytorch Vgg网络模型
  12. Android网易评论盖楼效果实现
  13. 面向对象的三个基本特征
  14. 项目中的用户鉴权是如何实现的?
  15. 【源码开发分享】计算机毕业设计之Python+Spark+Scrapy新闻推荐系统 新闻大数据 新闻情感分析 新闻文本分类 新闻数据分析 新闻爬虫可视化 大数据毕业设计
  16. 深入了解 vue-cli
  17. 用MATLAB画国旗
  18. axios修改服务器地址,axios 生产环境和开发环境 ip 切换(修改文件配置)
  19. Vue教程,React教程
  20. 编码影响页面的渲染:utf-8下的Arial字体中文显示

热门文章

  1. vue 高德地图api爬坑之路(一)初始化
  2. 华为支付切换到某国家后支付报错60003
  3. 4 NLP之数据平滑技术
  4. InnoDB和Myisam引擎的优缺点
  5. android 下载txt文件恢复,牛学长安卓数据恢复(UltData - Android)
  6. 浅议Linq和MoreLinq
  7. 内核程序临界区和普通临界区
  8. 熬夜程序猿的膳食调养
  9. 程序员小说 Out Of Memory (一)
  10. 如何进行日内趋势量化交易系统的设计?这篇文章可以给你启发!