知识点
- github的文件在 https://(项目url)/archive/master.zip
- 实验参考教程[https://chyyuu.gitbooks.io/ucore_os_docs/content/](https://chyyuu.gitbooks.io/ucore_os_docs/content/)
- 搭建执行ucoreos的学习环境
- 随时复习一些linux命令
- 控制流程 (1) 输入/输出
- (2) 重定向
- (3) linux管道
- (4) 后台进程
- 环境变量
- 获得软件包
- 配置vim
- ctags命令使用
- 离线安装chrom插件
- gcc编译简单的 C 程序
- AT&T汇编基本语法 和 intel汇编的区别
- 安装硬件模拟器QEMU
- 制作lab1镜像文件并用qemu加载
github的文件在 https://(项目url)/archive/master.zip
知道一个github项目,可以直接在项目后边加上 /archive/master.zip 来,wget下载
下载操作系统源代码
wget https://github.com/chyyuu/ucore_lab/archive/master.zip
实验参考教程https://chyyuu.gitbooks.io/ucore_os_docs/content/
搭建执行ucoreos的学习环境
#创建一个 centos 开发环境,来体验开发ucoreos的过程
docker run -tdi -p 21022:22 -p 21088:8888 --name ucoreos --privileged=true registry.cn-hangzhou.aliyuncs.com/mkmk/conda:qemu init | docker exec -d ucoreos /bin/bash -c "cd /home && source /etc/profile && nohup jlab &"
#关机后重启实验环境
docker start ucoreos | docker exec -d ucoreos /bin/bash -c "cd /home && source /etc/profile && nohup jlab &"
#保存实验结果
: 后边加版本号 []
docker commit ucoreos registry.cn-hangzhou.aliyuncs.com/mkmk/conda:ucoreos1
#提交到云端
docker push registry.cn-hangzhou.aliyuncs.com/mkmk/conda:ucoreos1
随时复习一些linux命令
ps #查看当前系统进程
ps -a #可以例出系统当前运行的所有进程,包括由其他用户启动的进程;
ps auxww #是一条相当人性化的命令,它会例出除一些很特殊进程以外的所有进程,并会以一个高可读的形式显示结果,每一个进程都会有较为详细的解释;
touch 创建单个文件,我之前总是喜欢 vi 文件,在:wq 创建文件,简直傻极了
touch tempfile.txt
注意:在命令操作时系统基本上不会给你什么提示,当然,绝大多数的命令可以通过加上
一个参数 -v 来要求系统给出执行命令的反馈信息;
mv -v file1.txt new_file.txt
`file1.txt' -> `new_file.txt'
显示文件内容:cat
chy@chyhome-PC:~$ cat file1.txt
Roses are red.
Violets are blue,
and you have the bird-flue!
也可以使用less或more来显示比较大的文本文件内容。
在屏幕上输出字符: (echo)
chy@chyhome-PC:~$ echo "Hello World"
Hello World
ls / # 将列出根目录'/'下的文件清单.如果给定一个参数,则命令行会把该参数当作命令行的工作目录。换句话说,命令行不再以当前目录为工作目录。
ls -l # 将给你列出一个更详细的文件清单.
ls -a # 将列出包括隐藏文件(以.开头的文件)在内的所有文
控制流程 (1) 输入/输出
input用来读取你通过键盘(或其他标准输入设备)输入的信息,output用于在屏幕(或其他标准输出设备)上输出你指定的输出内容.另外还有一些标准的出错提示也是通过这个命令来实现的。通常在遇到操作错误时,系统会自动调用这个命令来输出标准错误提示;
我们能重定向命令中产生的输入和输出流的位置。
(2) 重定向
如果你想把命令产生的输出流指向一个文件而不是(默认的)终端,你可以使用如下的语句:
chy@chyhome-PC:~$ ls >file4.txt
chy@chyhome-PC:~$ cat file4.txt
file1.txt file2.txt file3.txt
以上例子将创建文件file4.txt如果file4.txt不存在的话。注意:如果file4.txt已经存在,那么上面的命令将复盖文件的内容。如果你想将内容添加到已存在的文件内容的最后,那你可以用下面这个语句:
重定向 向 指定文件追加内容
command >> filename
示例:
chy@chyhome-PC:~$ ls >> file4.txt
chy@chyhome-PC:~$ cat file4.txt
file1.txt file2.txt file3.txt
file1.txt file2.txt file3.txt file4.txt
在这个例子中,你会发现原有的文件中添加了新的内容。接下来我们会见到另一种重定向方式:我们将把一个文件的内容作为将要执行的命令的输入。以下是这个语句:
command < filename
示例:
chy@chyhome-PC:~$ cat > file5.txt
a3.txt
a2.txt
file2.txt
file1.txt
<Ctrl-D> # 这表示敲入Ctrl+D键
chy@chyhome-PC:~$ sort < file5.txt
a2.txt
a3.txt
file1.txt
file2.txt
(3) linux管道
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 来杀死一个前台进程。
环境变量
特殊变量。PATH, PS1, …
(1) 不显示中文
可通过执行如下命令避免显示乱码中文。在一个shell中,执行:
export LANG=””
这样在这个shell中,output信息缺省时英文。
获得软件包
(1) 命令行获取软件包
Ubuntu 下可以使用 apt-get 命令,apt-get 是一条 Linux 命令行命令,适用于 deb 包管理式的操作系统,主要用于自动从互联网软件库中搜索、安装、升级以及卸载软件或者操作系统。一般需要 root 执行权限,所以一般跟随 sudo 命令,如:
sudo apt-get install gcc [ENTER]
常见的以及常用的 apt 命令有:
apt-get install
下载 以及所依赖的软件包,同时进行软件包的安装或者升级。
apt-get remove
移除 以及所有依赖的软件包。
apt-cache search
搜索满足 的软件包。
apt-cache show/showpkg
显示软件包 的完整描述。
例如:
chy@chyhome-PC:~
a
p
t
−
c
a
c
h
e
s
e
a
r
c
h
g
c
c
g
c
c
−
4.8
−
T
h
e
G
N
U
C
c
o
m
p
i
l
e
r
g
c
c
−
4.8
−
b
a
s
e
−
T
h
e
G
N
U
C
o
m
p
i
l
e
r
C
o
l
l
e
c
t
i
o
n
(
b
a
s
e
p
a
c
k
a
g
e
)
g
c
c
−
4.8
−
d
o
c
−
D
o
c
u
m
e
n
t
a
t
i
o
n
f
o
r
t
h
e
G
N
U
c
o
m
p
i
l
e
r
s
(
g
c
c
,
g
o
b
j
c
,
g
+
+
)
g
c
c
−
4.8
−
m
u
l
t
i
l
i
b
−
T
h
e
G
N
U
C
c
o
m
p
i
l
e
r
(
m
u
l
t
i
l
i
b
f
i
l
e
s
)
g
c
c
−
4.8
−
s
o
u
r
c
e
−
S
o
u
r
c
e
o
f
t
h
e
G
N
U
C
o
m
p
i
l
e
r
C
o
l
l
e
c
t
i
o
n
g
c
c
−
4.8
−
l
o
c
a
l
e
s
−
T
h
e
G
N
U
C
c
o
m
p
i
l
e
r
(
n
a
t
i
v
e
l
a
n
g
u
a
g
e
s
u
p
p
o
r
t
f
i
l
e
s
)
c
h
y
@
c
h
y
h
o
m
e
−
P
C
:
apt-cache search gcc gcc-4.8 - The GNU C compiler gcc-4.8-base - The GNU Compiler Collection (base package) gcc-4.8-doc - Documentation for the GNU compilers (gcc, gobjc, g++) gcc-4.8-multilib - The GNU C compiler (multilib files) gcc-4.8-source - Source of the GNU Compiler Collection gcc-4.8-locales - The GNU C compiler (native language support files) chy@chyhome-PC:~
apt−cachesearchgccgcc−4.8−TheGNUCcompilergcc−4.8−base−TheGNUCompilerCollection(basepackage)gcc−4.8−doc−DocumentationfortheGNUcompilers(gcc,gobjc,g++)gcc−4.8−multilib−TheGNUCcompiler(multilibfiles)gcc−4.8−source−SourceoftheGNUCompilerCollectiongcc−4.8−locales−TheGNUCcompiler(nativelanguagesupportfiles)chy@chyhome−PC:
(2) 图形界面软件包获取 新立得软件包管理器,是 Ubuntu 下面管理软件包得图形界面程序,相当于命令行中得 apt 命令。进入方法可以是
菜单栏 > 系统管理 > 新立得软件包管理器
(System > Administration > Synaptic Package Manager)
使用更新管理器可以通过标记选择适当的软件包进行更新操作。
(3) 配置升级源
Ubuntu的软件包获取依赖升级源,可以通过修改 “/etc/apt/sources.list” 文件来修改升级源(需要 root 权限);或者修改新立得软件包管理器中 “设置 > 软件库”。
查找帮助文件 Ubuntu 下提供 man 命令以完成帮助手册得查询。man 是 manual 的缩写,通过 man 命令可以对 Linux 下常用命令、安装软件、以及C语言常用函数等进行查询,获得相关帮助。
例如:
cchy@chyhome-PC:~$man printf
PRINTF(1) BSD General Commands Manual PRINTF(1)
NAME
printf – formatted output
SYNOPSIS
printf format [arguments …]
DESCRIPTION
The printf utility formats and prints its arguments, after the first, under control of the format. The format is a character string which contains three types of objects: plain characters, which are simply copied to standard output, character escape sequences which are converted and copied to the standard output, and format specifications, each of which causes …
…
The characters and their meanings are as follows:
\e Write an character.
\a Write a character.
…
通常可能会用到的帮助文件例如:
gcc-doc cpp-doc glibc-doc
上述帮助文件可以通过 apt-get 命令或者软件包管理器获得。获得以后可以通过 man 命令进行命令或者参数查询。
配置vim
(2) Vim 编辑器:Vim是一款极方便的文本编辑软件,是UNIX下的同类型软件VI的改进版本。Vim经常被看作是“专门为程序员打造的文本编辑器”,功能强大且方便使用,便于进行程序开发。 Ubuntu 下默认安装的 vi 版本较低,功能较弱,建议在系统内安装或者升级到最新版本的 Vim。
[1]关于Vim的常用命令以及使用,可以通过网络进行查找。
[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
可以将上述配置文件保存到:
~/.vimrc
注意:.vimrc 默认情况下隐藏不可见,可以在命令行中通过 “ls -a” 命令进行查看。如果 ‘~’ 目录下不存在该文件,可以手动创建。修改该文件以后,重启 Vim 可以使配置生效。
exuberant-ctags exuberant-ctags 可以为程序语言对象生成索引,其结果能够被一个文本编辑器或者其他工具简捷迅速的定位。支持的编辑器有 Vim、Emacs 等。 实验中,可以使用命令:
ctags -h=.h.c.S -R
默认的生成文件为 tags (可以通过 -f 来指定),在相同路径下使用 Vim 可以使用改索引文件,例如:
使用 “ctrl + ]” 可以跳转到相应的声明或者定义处,
使用 “ctrl + t” 返回(查询堆栈)等。
ctags命令使用
centos下安装 ctags
yum install ctags
使用讲解,创建一个工程目录 /学习使用ctags
vi file1.c
#include<stdio.h>
void def1(){
printf("print hello");
}
int main(){
def1();
return 0;
}
然后到, def1(); 处,按下 ctrl + ] 可以跳转到 def1() 的定义处
最基本使用,在项目根目录下,使用,生成变量索引
ctags -h=.h.c.S -R
使用
熟练的使用ctags仅需记住下面七条命令:
1.$ ctags –R * ($为Linux系统Shell提示符,这个命令上面已经有所介绍)
2. $ vi –t tag (请把tag替换为您欲查找的变量或函数名)
3.:ts(ts助记字:tagslist, “:”开头的命令为VI中命令行模式命令)
4.:tp(tp助记字:tagspreview)---此命令不常用,可以不用记
5.:tn(tn助记字:tagsnext) ---此命令不常用,可以不用记
6.Ctrl+ ]跳到光标所在函数或者结构体的定义处
7.Ctrl+ T返回查找或跳转
“
v
i
–
t
t
a
g
”
:
在
运
行
v
i
m
的
时
候
加
上
“
−
t
”
参
数
,
例
如
:
[
/
u
s
r
/
s
r
c
]
vi –t tag” :在运行vim的时候加上“-t”参数,例如:[/usr/src]
vi–ttag”:在运行vim的时候加上“−t”参数,例如:[/usr/src]vim -tmain这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。如果这个变量或函数有多处定义,
在VI命令行模式 “:ts”命令就能列出一个列表供用户选择。
“:tp”为上一个tag标记文件,
“:tn”为下一个tag标记文件。
当然,若当前tags文件中用户所查找的变量或函数名只有一个,“:tp,:tn”命令不可用。
(最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中,并把光标定位到这一行。用“Ctrl+T”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个变量,按N次“Ctrl+t”也能回到最初打开的文件,它会按原路返回 。
注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:set tags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉_)。
离线安装chrom插件
安装完成后,依然无法屏蔽热键,我已经改用qq浏览器了,qq浏览器可以禁用热键
由于 ctags 的快捷键 和 chrom 快捷键冲突了
chrom插件网
http://www.cnplugins.com/
安装这个这个插件
Shortkeys (Custom Keyboard Shortcuts) v2.2.7 Chrome插件下载
Chrome插件安装时出现"CRX-INVALID-HEAD"解决方法
1.将下载的.crx格式的插件通过重命名的方式修改成.zip文件
2.解压缩.zip文件成文件夹
3.打开Chrome扩展程序管理页面,打开开发者模式
4.点击“加载已解压的扩展程序”
5.找到文件夹,选择文件夹,安装完成
6.安装好的扩展程序可能会有红色的“错误”标记,但不影响使用
gcc编译简单的 C 程序
C 语言经典的入门例子是 Hello World,下面是一示例代码:
#include <stdio.h>
int
main(void)
{
printf(“Hello, world!\n”);
return 0;
}
我们假定该代码存为文件‘hello.c’。要用 gcc 编译该文件,使用下面的命令:
$ gcc -Wall hello.c -o hello
该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件 ‘hello’中。机器码的文件名是通过 -o 选项指定的。该选项通常作为命令行中的最后一个参数。如果被省略,输出文件默认为 ‘a.out’。
注意到如果当前目录中与可执行文件重名的文件已经存在,它将被复盖。 选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。
本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。
要运行该程序,输入可执行文件的路径如下:
$ ./hello
Hello, world!
这将可执行文件载入内存,并使 CPU 开始执行其包含的指令。 路径 ./ 指代当前目录,因此 ./hello 载入并执行当前目录下的可执行文件 ‘hello’。
AT&T汇编基本语法 和 intel汇编的区别
Ucore中用到的是AT&T格式的汇编,与Intel格式的汇编有一些不同。二者语法上主要有以下几个不同:
* 寄存器命名原则
AT&T: %eax Intel: eax
* 源/目的操作数顺序
AT&T: movl %eax, %ebx Intel: mov ebx, eax
* 常数/立即数的格式
AT&T: movl $_value, %ebx Intel: mov eax, _value
把value的地址放入eax寄存器
AT&T: movl $0xd00d, %ebx Intel: mov ebx, 0xd00d
* 操作数长度标识
AT&T: movw %ax, %bx Intel: mov bx, ax
* 寻址方式
AT&T: immed32(basepointer, indexpointer, indexscale)
Intel: [basepointer + indexpointer × indexscale + imm32)
如果操作系统工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑segment:offset的问题。上式中的地址应为:
imm32 + basepointer + indexpointer × indexscale
下面是一些例子:
* 直接寻址
AT&T: foo Intel: [foo]
boo是一个全局变量。注意加上$是表示地址引用,
不加是表示值引用。对于局部变量,可以通过堆栈指针引用。
* 寄存器间接寻址
AT&T: (%eax) Intel: [eax]
* 变址寻址
AT&T: _variable(%eax) Intel: [eax + _variable]
AT&T: _array( ,%eax, 4) Intel: [eax × 4 + _array]
AT&T: _array(%ebx, %eax,8) Intel: [ebx + eax × 8 + _array]
安装硬件模拟器QEMU
centos7 安装 qemu
安装依赖
yum install git glib2-devel libfdt-devel pixman-devel zlib-devel -y
yum install libaio-devel libcap-devel libiscsi-devel libvirt-devel -y
yum -y install epel-release
刷新yum缓存
yum clean all && yum makecache
安装qemu
yum install qemu -y
安装完成后
whereis qemu
输出 qemu: /etc/qemu /usr/share/qemu
博主安装qemu后提交了一份关于qemu的镜像
docker commit ucoreos registry.cn-hangzhou.aliyuncs.com/mkmk/conda:qemu
docker push registry.cn-hangzhou.aliyuncs.com/mkmk/conda:qemu
centos7 下qemu 调用命令为 qemu-system-x86_64
觉得不方便的可以自己去建立 软连接
制作lab1镜像文件并用qemu加载
再次提醒 centos7 下qemu 使用和 ubuntu下不太相同
编译生成可以 用来加载的 img文件
cd /home/ucoreos/ucore_os_lab-master/labcodes_answer/lab1_result
make生成img镜像文件,在labcodes_answer/lab1_result 目录下
make
到生成的 bin目录查看是否生成 镜像文件
cd bin && ls
输出 bootblock kernel sign ucore.img
发现存在 ucore.img ,讲 ucore.img 挂载到 qemu 虚拟机中
开始模拟真机
qemu-system-x86_64 -hda ucore.img -parallel stdio
错误提示 缺少qemu: could not load PC BIOS 'bios-256k.bin'
yum install seabios -y
模拟真机失败
qemu-system-x86_64 -hda ucore.img -parallel stdio
(process:1165): GLib-WARNING **: 06:42:36.693: gmem.c:489: custom memory allocation vtable not supported
(qemu-system-x86_64:1165): Gtk-WARNING **: 06:42:36.716: cannot open display:
不能连接图形设备,那我们就禁用掉图形显示设备,加上参数 -nographic
模拟真机成功
qemu-system-x86_64 -hda ucore.img -parallel stdio -nographic
centos7
模拟真机成功
qemu-system-x86_64 -hda ucore.img -parallel stdio -nographic
ubuntu
qemu -hda ucore.img -parallel stdio -nographic