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插件网
安装这个这个插件
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