操作系统 mooc 实验0

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DanielDingshengli/article/details/82253292

1.linux 操作的注意点

首先我们通过ls命令查询可知当前目下有两个文件和一个文件夹;
[1] 你可以用参数 -p来让系统显示某一项的类型,比如是文件/文件夹/快捷链接等等;
[2] 接下来我们用rm -i尝试删除文件,-i参数是让系统在执行删除操作前输出一条确认提示;i(interactive)也就是交互性的意思;
[3] 当我们尝试用上面的命令去删除一个文件夹时会得到错误的提示,因为删除文件夹必须使用-R(recursive,循环)参数
特别提示:在使用命令操作时,系统假设你很明确自己在做什么,它不会给你太多的提示,比如你执行rm -Rf /,它将会删除你硬盘上所有的东西,并且不会给你任何提示,所以,尽量在使用命令时加上-i的参数,以让系统在执行前进行一次确认,防止你干一些蠢事。如 果你觉得每次都要输入-i太麻烦,你可以执行以下的命令,让-i成为默认参数: +
alias rm=’rm -i’
Linux的强大之处在于它能把几个简单的命令联合成为复杂的功能,通过键盘上的管道符号’|’ 完成。现在,我们来排序上面的”grep”命令:
grep -i command < myfile | sort > result.text
搜索 myfile 中的命令,将输出分类并写入分类文件到 result.text 。 有时候用ls列出很多命令的时候很不方便 这时“|”就充分利用到了 ls -l | less 慢慢看吧.
(4) 后台进程
CLI 不是系统的串行接口。您可以在执行其他命令时给出系统命令。要启动一个进程到后台,追加一个“&”到命令后面。
sleep 60 &
ls
睡眠命令在后台运行,您依然可以与计算机交互。除了不同步启动命令以外,最好把 ‘&’ 理解成 ‘;’。
如果您有一个命令将占用很多时间,您想把它放入后台运行,也很简单。只要在命令运行时按下ctrl-z,它就会停止。然后键入 bg使其转入后台。fg 命令可使其转回前台。
sleep 60
# 这表示敲入Ctrl+Z键
bg
fg
最后,您可以使用 ctrl-c 来杀死一个前台进程。

常见的以及常用的 apt 命令有:+
apt-get install
下载 以及所依赖的软件包,同时进行软件包的安装或者升级。
apt-get remove
移除 以及所有依赖的软件包。
apt-cache search
搜索满足 的软件包。
apt-cache show/showpkg
显示软件包 的完整描述。

2.vim的配置

set nocompatible
set encoding=utf-8
set fileencodings=utf-8,chinese
set tabstop=4
set cindent shiftwidth=4
set backspace=indent,eol,start
autocmd Filetype c set omnifunc=ccomplete#Complete
autocmd Filetype cpp set omnifunc=cppcomplete#Complete
set incsearch
set number
set display=lastline
set ignorecase
syntax on
set nobackup
set ruler
set showcmd
set smartindent
set hlsearch
set cmdheight=1
set laststatus=2
set shortmess=atI
set formatoptions=tcrqn
set autoindent 

3.文件对比

diff & patch+
diff 为 Linux 命令,用于比较文本或者文件夹差异,可以通过 man 来查询其功能以及参数的使用。使用 patch 命令可以对文件或者文件夹应用修改。
例如实验中可能会在 proj_b 中应用前一个实验proj_a 中对文件进行的修改,可以使用如下命令:
diff -r -u -P proj_a_original proj_a_mine > diff.patch
cd proj_b
patch -p1 -u < ../diff.patch
注意:proj_a_original 指 proj_a 的源文件,即未经修改的源码包,proj_a_mine 是修改后的代码包。第一条命令是递归的比较文件夹差异,并将结果重定向输出到 diff.patch 文件中;第三条命令是将 proj_a 的修改应用到 proj_b 文件夹中的代码中。
提示:习惯GUI方式的同学,可采用图形界面的meld、kdiff3、UltraCompare等软件。

4.编写并编译 c程序
这里写图片描述
注意到如果当前目录中与可执行文件重名的文件已经存在,它将被复盖。 选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。

5.GCC内联汇编
内联汇编,指在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法。

6.make和makefile
这里写图片描述
7.gdb的使用
这里写图片描述

下面以一个有错误的例子程序来介绍gdb的使用:
/*bugging.c*/
#include <stdio.h>
#include <stdlib.h>

static char buff [256];
static char* string;
int main ()
{
    printf ("Please input a string: ");
    gets (string);
    printf ("\nYour string is: %s\n", string);
}
这个程序是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初始化的字符串地址 string,因此,编译并运行之后,将出现 "Segment Fault"错误:
$ gcc -o bugging -g  bugging.c
$ ./bugging
Please input a string: asdf
Segmentation fault (core dumped)
为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行:
[1] 运行 “gdb bugging” ,加载 bugging 可执行文件;
$gdb bugging 
[2] 执行装入的 bugging 命令;
(gdb) run
[3] 使用 where 命令查看程序出错的地方;
(gdb) where
[4] 利用 list 命令查看调用 gets 函数附近的代码;
(gdb) list
[5] 在 gdb 中,我们在第 11 行处设置断点,看看是否是在第11行出错;
(gdb) break 11
[6] 程序重新运行到第 11 行处停止,这时程序正常,然后执行单步命令next;
(gdb) next
[7] 程序确实出错,能够导致 gets 函数出错的因素就是变量 string。重新执行测试程,用 print 命令查看 string 的值;
(gdb) run
(gdb) print string
(gdb) $1=0x0
[8] 问题在于string指向的是一个无效指针,修改程序,在10行和11行之间增加一条语句 “string=buff; ”,重新编译程序,然后继续运行,将看到正确的程序运行结果。

这里写图片描述

  1. qemu 用到了再学

9.了解处理器硬件
这里写图片描述
10.编程方法和通用数据结构

uCore的面向对象编程方法,目前主要是采用了类似C++的接口(interface)概念,即是让实现细节不同的某类内核子系统(比如物理内存分配器、调度器,文件系统等)有共同的操作方式,这样虽然内存子系统的实现千差万别,但它的访问接口是不变的。这样不同的内核子系统之间就可以灵活组合在一起,实现风格各异,功能不同的操作系统。接口在 C 语言中,表现为一组函数指针的集合。放在 C++ 中,即为虚表。接口设计的难点是如果找出各种内核子系统的共性访问/操作模式,从而可以根据访问模式提取出函数指针列表。

猜你喜欢

转载自blog.csdn.net/DanielDingshengli/article/details/82253292