搭建一个学习ucore_OS学习的环境(第一节)

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:~
(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] 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
发布了76 篇原创文章 · 获赞 2 · 访问量 5514

猜你喜欢

转载自blog.csdn.net/qq_43373608/article/details/104382009