目录
实习题目
软件准备
VirtualBox安装
题目一
Windows11安装
Ubuntu安装
题目二
题目三
题目三已经提前发布了,操作流程在该链接中
在此提出几个最近常被问到的问题和解决办法:
1.编辑完成后启动时内核崩溃显示类似如下界面:
2.串口输出日志为空
题目四
1、在一台机器上(真机或虚拟机)安装ubuntu和windows双系统。
2、练习linux常用命令,在报告中简述不少于20个命令的作用及示例。
3、通过在Grub中修改Ubuntu内核启动参数,获取Ubuntu启动日志,在Ubuntu的系统初始化一开始输出:操作系统原理实习一-班学号-姓名。
4、增加系统功能调用sys_syscall_XXXXXXX并建立简单用户程序进行调用测试,在内核日志中输出:操作系统原理实习一-班学号-姓名。XXXXXXX为班学号
实习之前需要准备虚拟机,以及windows和ubuntu各一个镜像文件。毕竟这么一个看上去就容易崩系统的课设,还是不要折腾自己的电脑了。
老师提供了如下软件下载链接:
VirtualBox: Downloads – Oracle VM VirtualBox
VMWare:VMware Workstation 17 Player 中文版-官方免费版虚拟机软件丨简而易网
Ubuntu:Enterprise Open Source and Linux | Ubuntu
Windows11:Download Windows 11 (下载ISO)
Windows10:下载 Windows 10(先下载MediaCreationTool22H2.exe,再选择为另一台电脑创建安装介质,即可获得ISO)
就我个人而言,电脑上一直是有装VM的,里面有一个ubuntu18。但是我对它的印象一直是:软件很大、有时报错重装、功能复杂(可能是第一次使用时啥也不会,带来的痛苦回忆)。所以很久没用了,依稀记得最后一次使用时候有个网络问题没解决。然后我简单了解了一下VirtualBox,发现这个软件令人惊喜的小。启动也很快,直接就是一个更换阵地的操作。
点击链接进入官网之后就是这个界面:
最好还是不要使用自动翻译,不然容易导致自己不认识,点击画出来的链接就是下载windows使用的版本。同样的,它下面则是其它平台使用的版本。
下载好后就打开开始安装:
接下来的步骤基本用不着调整,除了调整默认安装位置。当时安装的时候没截图,这里偷个懒,借用一下其它博客的图片:
原文链接:VirtualBox的下载与安装_virtualbox下载教程_角落遗失的眼泪的博客-CSDN博客
由于这个博客所用的VB比较老,界面有所差别。调整的话就是点浏览(Browse)然后将地址前面的C改成你想存到的盘,比如D:\Program Files\Oracle\VirtualBox\。
安装完成后可以参考以下步骤对虚拟机文件夹所在位置进行调整
原文链接:虚拟机VirtualBox下载与安装、安装Ubuntu超详细图文步骤,对一些配置问题也有所写。_virtualbox安装_橙木博客的博客-CSDN博客
题目要求装双系统,因为我本来电脑上装了个Ubuntu虚拟机,所以第一时间想到的是搜搜怎么在Ubuntu上装Windows,但是搜完之后一是博客少,而且看上去超级难,就罢了,在此放一篇Ubuntu上装windows的博客:
[详细教程] 在现有Ubuntu系统上安装Windows 10 (双系统)_ubuntu安装windows_宇内虹游的博客-CSDN博客
从官网上可以直接下载windows11的镜像文件,链接在上面有给(但是是真的慢,可以考虑从别的途径下载)。有了镜像文件之后,打开virtualbox新建
名字自己随意定一个就可以,ISO Image那里选你下载好的win11镜像文件 ,把下面的skip我几次建虚拟机都是直接选上了,省些步骤,目前没发现什么问题。然后next
内存和cpu的数量可以自己看着给,但是我的建议是尽量给多点,不然容易卡得怀疑人生。next
这里也同理,建议磁盘空间给大一点,最好不要低于默认值。这里要注意,虚拟机的磁盘其实就是电脑里的一个文件,数值是限定它的存储上限,不是说立马就会占那么多空间,所以不用太担心。 next
finish之后返回virtualBox界面,在右边栏可以看到你刚才建的虚拟机,点设置:
进入系统界面,把这几个选项调出来,不然安装不了win11
点OK保存退出后就可以点击设置右边,启动虚拟机了,然后由于某些暂时还不太清楚的设置问题,启动的时候会进入shell界面;
这个时候不要急。输入“exit”再回车就可以回到上一界面——BIOS界面(同时,这个画面可能会有点小,是虚拟机默认分辨率太低导致的,你可以在左上角的视图中选择自动缩放模式 )
进入BIOS界面后通过方向键选中Boot Manager,回车进入。
这个界面的条目顺序可能不同,选择名字里带CD-ROM的那行(如果有多个就从上到下挨个试试吧),回车后就进入安装流程,具体不细讲了,当进入下面的界面时,选择我没有产品密钥就行,版本就是你电脑的版本,或者家庭版、专业版之类的:
后续就是跟随引导安装windows,安装完成后就可以为装双系统做准备了,在刚安装的Windows里,首先打开文件资源管理器或者任意一个文件夹,右键点击左边栏中的此电脑。
然后就是:显示更多选项-》管理 -》磁盘管理:
在最大的磁盘上右键选择压缩卷,在输入框里输入想要分给Ubuntu的硬盘大小后选择压缩
( 这里注意,压缩后不要再做别的操作了——指新建简单卷,直接关机就可以)
在之前的链接中下载Ubuntu,不过我个人还是建议选上一个版本,会更稳定些,比如说20.04:
https://releases.ubuntu.com/20.04.5/?_ga=2.188593900.573092987.1677985002-1582932756.1677985002
下载好后打开之前建的Windows虚拟机的设置-》存储,然后点光盘形状图标那行显示如下界面
然后把原本的win11虚拟盘换成Ubuntu虚拟盘,确定后再次启动此虚拟机
在启动还是黑屏的时立刻点击虚拟机页面,把鼠标键盘捕获到虚拟机中,然后狂按ESC键进入我们熟悉的BIOS界面,老方法Boot Manager,然后是有CD-ROM那行,回车后就会开始进入Ubuntu安装界面,在出现下面第二幅图画面前应该不用动,或者是第一行选项回车
这里存在一个问题,可能大多数人进去之后界面不是这样的,很小且界面也不完整,左侧语言栏下滑选简体中文后先选试用Ubuntu
会进入这个界面,打开右上角设置
然后是显示器,把分辨率调高,直至可以完整显示界面
应用后关闭设置界面,点击桌面上安装Ubuntu20.04的软件图标,后回到安装流程,不停继续后直至出现如下选择界面
选择其他选项进行手动分区,这里参考其他博客分区方案就可以,有很多,这里随意找一篇:
Ubuntu 20.04系统分区-CSDN博客
注意一般比例一致就行,唔,或者全分配给根目录好像也行,舍友说可以,我自己没试过。
分区步骤:
选中之前标着空闲的大小最大的分区,右键添加,或者左下角的加号
上面输入框分配大小(不要太在意我这只有2M,懒得再弄给虚拟机了,所以这个虚拟机的windows没有压缩卷),然后下面的选项对应分区方案中的各项值
分完区后就是现在安装就可,安装完成后按照提示重启,之后会进入grub选择界面来选择是windows还是Ubuntu,默认不点就是Ubuntu。
这样双系统就装完成了
这里是一些常用linux指令
cd [-L][-P [-e]] [dir] #切换用户当前工作目录
#-L和-P是可选参数 dir是想要转到的目录位置
#例子
cd #进入用户主目录
cd / #进入根目录
cd ~ #进入用户主目录
cd .. #返回上级目录
cd 桌面 #转到桌面
cd /sbin #转到根目录下的sbin文件夹(目录)
ls [选项] [文件名...] #显示当前目录下的文件
ls # 仅列出当前目录可见文件
ls -l # 列出当前目录可见文件详细信息
ls -hl # 列出详细信息并以可读大小显示文件大小
ls -al # 列出所有文件(包括隐藏)的详细信息
ls --human-readable --size -1 -S --classify # 按文件大小排序
du -sh * | sort -h # 按文件大小排序(同上)
ls -a #显示当前目录下包括隐藏文件的所有文件
ls -1 #单列输出(这是数字)
ls -m #水平输出
ls -t #按修改时间排序
ls -l #列出文件和文件夹详细信息(这是字母)
mkdir (选项)(参数) #用来创建目录
#-p 如果路径上级目录尚未建立则一并建立
mkdir 我的文件
mkdir -p 我的文件/文件1/文件1.1
mv (选项)(参数) #用于将一个目录以另一给名字转移到另一个目录
#-b 文件存在时,覆盖前先为其创建备份
#-f 存在同名文件直接覆盖
#-u 若目标路径所在位置不存在同名文件才执行操作
mv /usr/men/* #将/usr/men中所有文件转移到当前目录
mv file_1.txt /home/office/ #移动文件
mv file_1.txt file_2.txt #重命名文件
rm (选项)(参数) #用于删除给定的文件和目录
#-r 递归处理删除目录中所有子目录(不然只能删除空目录)
#-f 强制删除
rm -r * #删除当前目录下除隐含文件外所有文件和子目录
rm -rf testdir #强制删除testdir目录及其内容
sudo (选项)(参数) #以其他身份来执行,默认为root
#-k 结束密码有效期限
#-l 列出目前用户可执行与无法执行的指令
#-v 延长密码有效期限5min
sudo su #以root身份重新登录
sudo mv init init.1 #以root身份执行mv指令
make (选项)(参数) #GNU的工程化编译工具
make #编译当前目录
reboot (选项) #重新启动正在运行的Linux系统
reboot
#变更文件或目录的权限
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
#linux文件的用户权限说明:
# 查看当前目录(包含隐藏文件)的长格式。
ls -la
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
'''
第1位如果是d则代表目录,是-则代表普通文件。
更多详情请参阅info coreutils 'ls invocation'(ls命令的info文档)的'-l'选项部分。
第2到4位代表当前用户的权限。
第5到7位代表组用户的权限。
第8到10位代表其他用户的权限。
参考man chmod文档的DESCRIPTION段落得知:
u符号代表当前用户。
g符号代表和当前用户在同一个组的用户,以下简称组用户。
o符号代表其他用户。
a符号代表所有用户。
r符号代表读权限以及八进制数4。
w符号代表写权限以及八进制数2。
x符号代表执行权限以及八进制数1。
X符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。
s符号代表设置权限suid和sgid,使用权限组合u+s设定文件的用户的ID位,g+s设置组用户ID位。
t符号代表只有目录或文件的所有者才可以删除目录下的文件。
+符号代表添加目标用户相应的权限。
-符号代表删除目标用户相应的权限。
=符号代表添加目标用户相应的权限,删除未提到的权限。
'''
chmod +x init #为init添加执行权限
apt-get [OPTION] PACKAGE #Debian Linux发行版中的APT软件包管理工具
apt-get install vim # 安装新包
apt-get remove vim # 卸载已安装的包(保留配置文件)
apt-get -purge remove vim # 卸载已安装的包(删除配置文件)
apt-get update # 更新软件包列表
apt-get upgrade # 更新所有已安装的包
apt-get autoremove # 卸载已不需要的包依赖
apt-get dist-upgrade # 自动处理依赖包升级
apt-get autoclean # 将已经删除了的软件包的.deb安装文件从硬盘中删除掉
apt-get clean # 删除软件包的安装包
cat [OPTION]... [FILE]...
#连接多个文件并打印到标准输出,显示文件内容,如果没有文件或文件为-则读取标准输入等作用
cat init #查看编辑好的init内容
cat ./1.log ./2.log ./3.log # 合并显示多个文件
cat -A test.log # 显示文件中的非打印字符、tab、换行符
cat -s test.log # 压缩文件的空行
cat -n test.log # 显示文件并在所有行开头附加行号
cat -b test.log # 显示文件并在所有非空行开头附加行号
echo '######' |cat - test.log # 将标准输入的内容和文件内容一并显示
pwd [-LP] #显示当前工作目录的绝对路径
#-L (默认值)打印环境变量"$PWD"的值,可能为符号链接。
#-P 打印当前工作目录的物理位置。
[root@localhost var]# pwd
/var
echo(选项)(参数) #输出指定的字符串或者变量
#-e:启用转义字符。
#-E: 不启用转义字符(默认)
#-n: 结尾不换行
'''
使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 不产生进一步输出 (\c 后面的字符不会输出);
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入 nnn(八进制)所代表的ASCII字符;
'''
echo -e "\e[1;31mThis is red text\e[0m"
This is red text
#\e[1;31m 将颜色设置为红色
#\e[0m 将颜色重新置回
#颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
exec(选项)(参数) #调研并执行指定的命令
exec /lib/systemd/systemd
rmdir [选项] 目录 #从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限
#-p 递归删除目录dir,当子目录删除后其父目录为空时,也一同被删除。
#-v, --verbose 显示指令执行过程
rmdir test1 #删除空目录 test1,非空目录无法删除
rmdir -p test2 # test 目录下仅有 test2
sleep (参数) #将目前动作延迟一段时间
sleep 5 #延迟5秒
sleep 5m #延迟5分
sleep 5h #延迟5时
sleep 5d #延迟5天
nl [选项] [文件] #输出内容且自动加上行号
'''
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t :如果有空行,空的那一行不要列出行号(默认值)
-n :列出行号表示的方法,主要有三种:
-n ln :行号在萤幕的最左方显示
-n rn :行号在自己栏位的最右方显示,且不加 0
-n rz :行号在自己栏位的最右方显示,且加 0
-w :行号栏位的占用的位数
'''
nl test.log
more (语法)(参数) #显示文件内容,每次显示一屏
'''
-<数字>:指定每屏显示的行数;
-d:显示“[press space to continue,'q' to quit.]”和“[Press 'h' for instructions]”;
-c:不进行滚屏操作。每次刷新这个屏幕;
-s:将多个空行压缩成一行显示;
-u:禁止下划线;
+<数字>:从指定数字的行开始显示。
'''
more -dc file
more -c -10 file #翻页显示,每页10行
less (选项)(参数) #分屏上下翻页浏览文件内容
'''
-e:文件内容显示完毕后,自动退出;
-f:强制显示文件;
-g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;
-l:搜索时忽略大小写的差异;
-N:每一行行首显示行号;
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符。
'''
sudo less /var/log/s.log
wget [参数][URL地址] #Linux系统下载文件工具
wget http://www.jsdig.com/testfile.zip
操作系统原理实习题三操作流程_kyle_pyl的博客-CSDN博客
首先表示抱歉,代码中!打成中文字符了,现已修改,然后在把我提到了的步骤完成外有以下几点需要注意
cat init
ls -al init
对于这个问题,如果其它步骤没有出错的话,要注意串口要开第一个串口,因为ttyS0对应的是串口1,如果是串口2则需要把所有ttyS0改成ttyS1,以此类推。不过我还是建议尽量都是用串口1,其它串口没用过,不能保证是正确的。
以下代码和过程来自chat,本人还在尝试,先发出来以供参考
以下是在Ubuntu 20.04中下载一个版本对应的内核并添加系统调用的步骤以及相关代码。
首先确认当前系统中的内核版本:
uname -r
在网上找到一个合适的内核版本,例如下载Linux 5.15.6的源代码:
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.15.6.tar.xz
解压源代码包:
tar -xvf linux-5.15.6.tar.xz
进入解压后的目录,并进行配置:
cd linux-5.15.6 make menuconfig
这一步会打开一个界面,可以在其中对内核进行各种配置,但一般情况下直接保存退出即可。
备份原有的内核文件,以防意外情况:
sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-$(uname -r)-backup sudo cp /boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r)-backup
编译内核,这个过程可能需要较长时间:
make -j4
这里使用-j参数可以启用4个线程进行编译,可以根据自己机器的CPU核心数适当调整。
安装内核模块,这一步会将编译后的内核模块安装到系统中:
sudo make modules_install
安装内核,这一步将编译后的内核安装到系统中:
sudo make install
重启系统,进入新安装的内核:
sudo reboot
添加系统调用,首先进入内核源代码目录下的
arch/x86/entry/syscalls
目录,并在其中找到syscall_64.tbl
文件。在该文件中添加一行:546 common syscall_111211 __x64_sys_syscall_111211
这里的
546
是该系统调用在表中的编号,可以根据需要调整。syscall_111211
是系统调用的名字,可以根据自己的需求修改。__x64_sys_syscall_111211
是系统调用的实现函数,在下一步中会定义。在内核源代码目录下的
include/linux/syscalls.h
文件中添加一行:asmlinkage long sys_syscall_111211(void);
实现系统调用,在内核源代码目录下的
kernel/sys.c
文件中添加以下代码:SYSCALL_DEFINE0(syscall_111211) { printk("操作系统原理实习一-111211-Peng Yinlun\n"); return 0; }
这里的
printk
函数用于输出信息到内核日志中
一些过程中发现需要的配置(看情况更新):
apt update
apt install make
apt-get update
apt-get install build-essential
apt-get install libncurses5-dev libncursesw5-dev
apt-get install flex
apt-get install bison
之前通过老师提供的博客进行尝试过,但出现了一些问题
Ubuntu增加一个系统调用(20.04)西电软工OS实验专题二_ubuntu添加系统调用_李黎玖的博客-CSDN博客
在执行到这一步时,因为要求并不一致所以自己写了一个函数,但是忘了加"return 0;"导致后续编译失败
这一步时"make modules_install"代码一直失败,后来问Chat,它说先运行make,后来成功运行了一晚上,第二天完成 。不过不一定是因为这个,因为当时同时改了好几个地方。
最后重启的时候内核报错了
截至目前,尚未解决,重装系统后正在尝试chat给的方法