diff --git a/playground/oexp/kadc2024/Code/helloworld.cpp b/playground/oexp/kadc2024/Code/helloworld.cpp deleted file mode 100644 index 0194844e7ce21c476413f1fdf459053a8978df65..0000000000000000000000000000000000000000 --- a/playground/oexp/kadc2024/Code/helloworld.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) { - QApplication app(argc, argv); - QLabel *label = new QLabel("Hello, world!"); - label->show(); - - return app.exec(); -} \ No newline at end of file diff --git a/playground/oexp/kadc2024/Images/TigerVNC-Viewer.png b/playground/oexp/kadc2024/Images/TigerVNC-Viewer.png deleted file mode 100644 index 75de96fec1ff435ca1c1058f5603fd32be451018..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/TigerVNC-Viewer.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/VNC-Viewer-Connection.png b/playground/oexp/kadc2024/Images/VNC-Viewer-Connection.png deleted file mode 100644 index 134fed7ef5044c89694cddb962debf5b7567c91a..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/VNC-Viewer-Connection.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/VNC-authentication.png b/playground/oexp/kadc2024/Images/VNC-authentication.png deleted file mode 100644 index c465f898ac2d45e9d38bfb6ae75d4028f97e1587..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/VNC-authentication.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/Windows-Key.png b/playground/oexp/kadc2024/Images/Windows-Key.png deleted file mode 100644 index 32c2ebb3cb615894b7f1d1bacc00febb30c8f866..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/Windows-Key.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/hello-world.png b/playground/oexp/kadc2024/Images/hello-world.png deleted file mode 100644 index cea656e3ea48544f7cc0dd519ae41e36db706803..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/hello-world.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/kadc2024.jpg b/playground/oexp/kadc2024/Images/kadc2024.jpg deleted file mode 100644 index 1d8834b54d1c1c89e4e59a72ff0236060a14584b..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/kadc2024.jpg and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/kdb-connection.png b/playground/oexp/kadc2024/Images/kdb-connection.png deleted file mode 100644 index 673241ce3029f8c323cd3832683c8eba7aa6efbd..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/kdb-connection.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/xterm_logo.png b/playground/oexp/kadc2024/Images/xterm_logo.png deleted file mode 100644 index 9e69e9970b74a0392c6792f9b8573a890fb0f2a7..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/xterm_logo.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/yum-install-qt5-all.png b/playground/oexp/kadc2024/Images/yum-install-qt5-all.png deleted file mode 100644 index 1d86e3eb37e1e76a280530fd562911118dea01ac..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/yum-install-qt5-all.png and /dev/null differ diff --git a/playground/oexp/kadc2024/Images/yum-install-qt5.png b/playground/oexp/kadc2024/Images/yum-install-qt5.png deleted file mode 100644 index db19c44d03bd8e062e85cb0525ccb2a7b61c9fc3..0000000000000000000000000000000000000000 Binary files a/playground/oexp/kadc2024/Images/yum-install-qt5.png and /dev/null differ diff --git a/playground/oexp/kadc2024/KADC2024.md b/playground/oexp/kadc2024/KADC2024.md deleted file mode 100644 index 052d94a6d68bb72bd274548275862b3e7bf560a7..0000000000000000000000000000000000000000 --- a/playground/oexp/kadc2024/KADC2024.md +++ /dev/null @@ -1,234 +0,0 @@ -# Kunpeng Ascend Developer Conference - -[**Kunpeng Developer Summit 2024**](https://www.hikunpeng.com/activities/kunpeng-developer-summit2024) - -![kadc2024](./Images/kadc2024.jpg) - -[中国北京,2024年5月9日] 以“鲲鹏原生,力算未来”为主题的[鲲鹏开发者峰会2024](https://www.hikunpeng.com/zh/activities/dynamic-news/456?id=456https://www.hikunpeng.com/zh/activities/dynamic-news/456?id=456)在北京中关村国际创新中心成功举办。大会旨在汇聚开发者、产业组织、生态伙伴和行业组织的创新力量,分享计算产业趋势与前沿技术,探索未来,共创非凡。 - -华为公司副总裁、ICT产品与解决方案总裁马海旭正式发布Kunpeng Pro。Kunpeng Pro是一块面向开发者的鲲鹏开发板,具有鲲鹏主板的完整能力,内置openEuler开源操作系统、openGauss开源数据库和鲲鹏开发套件DevKit,外置丰富接口,易于扩展,帮助开发者更快速、便捷的进行各种实践和创新。 - - - -## I 实验设备及其连接 - -本次大会基于“[鲲鹏开发板](http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-kunpeng.html)”进行实验。 - -![kdb-connection](./Images/kdb-connection.png) - -如上图所示,开发板与其他实验设备之间的连接方式有三: - -- PC通过以太网和开发板相连 - - 利用PC机中的Console命令行终端通过以太网+TCP/IP+SSH登录系统(用`ssh`命令) - - 通过VNC(Virtual Network Computing)登录系统 - -- PC通过串口(Serial)和开发板相连 - - 注意鲲鹏开发板串口的波特(Baud,symbol/s)为115200bps - -- 开发板+显示器+键盘+鼠标相连 - - - -## II 登录系统 - -本实验在PC上以**ssh**命令通过“以太网+TCP/IP”登录系统。 - -🤚 *动手操作* - -- 在Windows操作系统中按“![Windows-Key](./Images/Windows-Key.png) +R”打开命令窗,或者 -- 按“![Windows-Key](./Images/Windows-Key.png) +X, i”打开Terminal(PowerShell),或者 -- 通过![xterm_logo](./Images/xterm_logo.png)[“MobaXterm”软件](https://mobaxterm.mobatek.net/)选择使用SSH协议登录系统 - -输入以下`ssh`命令: - -```shell -ssh openEuler@192.168.1.105 -``` - -这里“openEuler”是用户名,*192.168.1.105*是开发板的IP地址,登录时要输入密码,密码也是“openEuler”。 - -🔒🗝 *安全* - -为系统安全起见,进行应用编程实验时,我们一般以非root用户登录,进行内核模块编程时,我们以root身份登录。 - - - -## III 进行实验 - -请根据实验指南进行实验。 - - - -## 附录A 安装Qt - -如何在开发板上安装Qt开发环境?不妨假设您通过“以太网+TCP/IP”在一台PC上登录到开发板上的openEuler操作系统进行Qt GUI程式开发。在这种情形下,我们需要: -- 安装Qt -- 安装VNC - -### 一、安装Qt - -可以以以下命令安装Qt及其开发组件(以Qt5为例): -```shell -yum install qt5 qt5-devel -``` -安装完成后在鲲鹏开发板上“Applications”中会有如下显示(请注意和Qt有关的图标): - -![yum-install-qt5](./Images/yum-install-qt5.png) - -如果要全面安装Qt,请使用以下命令: -```shell -yum install qt5* # Total download size: 2.3 G; Installed size: 8.7 G -``` - -以下是在鲲鹏开发板上安装完成后的截图(请注意和Qt有关的图标): - -![yum-install-qt5-all](./Images/yum-install-qt5-all.png) - - - -### 二、安装VNC - -安装VNC(Virtual Network Console)是为了让PC通过“以太网+TCP/IP”登录到开发板的桌面系统。 - -由于openEuler操作系统的repo源中有tigervnc与tigervnc-server,因此就安装它们: -```shell -yum install -y tigervnc tigervnc-server -``` - -安装完毕后启动VNC Server: -```shell -vncserver -``` -注意:如果是第一次启动,则需要设置和再次输入密码,按照提示设置和再次输入即可: -``` - -You will require a password to access your desktops. - -Password: -Verify: -Would you like to enter a view-only password (y/n)? y -Password: -Verify: -``` - -可以确认是否启动: -```shell -vncserver -list -``` - -可能的输出如下: -``` -TigerVNC server sessions: - -X DISPLAY # PROCESS ID -:1 2593 -``` - -在用客户端进行连接之前需要检查VNC服务器(即开发板)上的防护墙是否开启: -```shell -systemctl status firewalld -``` - -如果防护墙处于开启状态则可以直接关闭防护墙: -```shell -systemctl stop firewalld -``` - -注意:由于是学生实验,所以可以简单关闭防火墙。若其他安全性比较高的场景,请参照如下命令: -```shell -firewall-cmd --zone=public --add-port=5900/tcp -``` -VNC的默认端口是5900,远程桌面连接端口则是5900+n(n是vncserver命令指定的)。如果使用“vncserver”命令启动后“X DISPLAY”的端口号为“:1”,则其相应VNC Server端口号为则5901,其余以此类推。 - -最后请在Windows终端安装TigerVNC客户端并启动之: - -![TigerVNC-Viewer](./Images/TigerVNC-Viewer.png) - -![VNC-Viewer-Connection](./Images/VNC-Viewer-Connection.png) - -在本例中假设开发板的IP地址为“192.168.1.105”,VNC Server端口号为5901(如果使用两位端口号格式,则在客户端输入的是“01”),然后点击“Connect”按钮。 - -然后输入先前在服务器(即开发板)上第一次运行`vncserver`命令时所设置的密码并按“OK”按钮进行连接: - -![VNC-authentication](./Images/VNC-authentication.png) - -如果没有出什么差错,则会在PC上显示开发板上openEuler操作系统的桌面。 - -### 三、Hello, world! - -现在是以一个简单的例子验证我们安装的Qt开发环境的时候了。 - -步骤1:创建工作目录并进入 -```shell -mkdir -p ~/qt/helloworld/ && cd $_ -``` - -步骤2:准备源代码 -请参考本例所附helloworld.cpp源代码进行准备: - -```shell -vim helloworld.cpp -``` - -步骤3:产生工程文件 -```shell -qmake-qt5 -project -echo "QT += widgets" >> helloworld.pro -``` - -步骤4:编译源文件 -```shell -qmake-qt5 -make -``` - -步骤5:在桌面环境中运行 -```shell -~/qt/helloworld/helloworld -``` -![hello-world](./Images/hello-world.png) - -步骤6:清理文件 -```shell -cd ~/qt/helloworld/ -find * | grep -v helloworld.cpp | xargs rm -``` - - - -## 附录B 软件包安装汇总 - -在开发板上进行一次比较全面的软件包安装以支持内核模块编程、系统环境实验以及Qt软件开发,可以参考以下命令: -```shell -yum group install "Development Tools" -yum install bc # It is a command line calculator and contains an arbitrary precision numeric processing language. -yum install openssl-devel - -yum install mlocate # for locate command -yum install nano -yum install git - -yum install qt5 qt5-devel -``` - -注意:如果在安装的过程中出现“Error: GPG check FAILED”错误则可在`yum install`命令后增加`--nogpgcheck`选项,例如: -```shell -yum group install -y "Development Tools" --nogpgcheck -``` - - - -## 附录C 术语表 - -本实验中所用术语列表如下: - -🏷*术语表* - -- PC - - Personal Computer,个人电脑 -- SSH - - Secure Shell,安全外壳。一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。 -- VNC - - Virtual Network Console,虚拟网络控制台 -- TCP/IP - - Transmission Control Protocol / Internet Protocol,传输控制协议/网际协议。其不仅仅指TCP和IP两个协议,而是一个由ARP(Address Resolution Protocol)、IP、UDP(User Datagram Protocol)、TCP、HTTP(Hypertext Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)、Telnet等协议构成的协议簇,尤其以TCP和IP最具代表性。 \ No newline at end of file diff --git a/playground/oexp/kmp/openEuler-KMP.md b/playground/oexp/kmp/openEuler-KMP.md deleted file mode 100644 index bad5e0885d95d0409e9e55974d77648bd506fb09..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/openEuler-KMP.md +++ /dev/null @@ -1,501 +0,0 @@ -# openEuler内核模块编程 - -**openEuler Kernel Module Programming** - -内核模块是一种可以扩展运行时内核功能的目标文件(Object File)。大多数类Unix及Windows系统均使用模块,这种机制使得允许内核在运行过程中动态地插入或者移除代码。 - -本实验通过在鲲鹏平台上编译、安装openEuler操作系统新内核以及实现简单的内核模块编程任务带领大家了解操作系统及其内核模块编程。 - -🏷 *术语* - -鲲鹏云是“华为云鲲鹏云”的简称,本实验的鲲鹏平台是鲲鹏云ECS(也称鲲鹏弹性云服务器,Kunpeng Elastic Cloud Server,KECS)。 - -🔒🗝 *何时使用root身份* - -为系统安全起见,进行应用编程实验时,我们一般以非root用户登录,但在进行内核编译、安装和内核模块编程实验时,为方便起见(不用频繁输入sudo命令),我们以root身份登录。 - - - -## I 内核编译 - -### 一、内核编译与安装 - -#### 1. 准备环境 - -准备好编译内核的环境: - -```shell -yum group install -y "Development Tools" -yum install -y bc -yum install -y openssl-devel -``` -注意:如果在安装的过程中出现“Error: GPG check FAILED”错误则可在`yum install`命令后增加`--nogpgcheck`选项,例如: -```shell -yum group install -y "Development Tools" --nogpgcheck -``` - -#### 2. 备份 - -备份boot目录以防后续步骤更新内核失败: - -```shell -tar czvf boot.origin.tgz /boot/ -uname -r > uname_r.log # 保存当前内核版本信息 -``` - -#### 3. 获取源代码 - -获取内核源代码并解压: - -```shell -wget https://gitee.com/openeuler/kernel/repository/archive/openEuler-20.03-LTS-SP3.zip -unzip openEuler-20.03-LTS-SP3.zip # kernel-openEuler-20.03-LTS-SP3 -mv kernel-openEuler-20.03-LTS-SP3 kernel -``` - -🔔 *注意* - -您需要在[openEuler内核代码仓](https://gitee.com/openeuler/kernel)获取到正确的内核代码URL地址并更新其源代码包的具体文件名称。 - -解压后的内核源码文件夹名称可能和“*kernel-openEuler-20.03-LTS-SP3*”不一样,我们仅以此为例。 - -#### 4. 编译内核 - -先进入内核目录查看内核可以编译成为何种类型的文件: - -```shell -cd kernel -make help | grep Image -``` - -这里输出结果为: - -``` -* Image.gz - Compressed kernel image (arch/arm64/boot/Image.gz) - Image - Uncompressed kernel image (arch/arm64/boot/Image) -``` - -表示内核可编译为Image类型的文件。 - -配置内核: - -```shell -make openeuler_defconfig -``` - -在这里,我们按源代码文件`kernel/arch/arm64/configs/openeuler_defconfig`配置了内核(会产生一个默认名称为`.config`的配置文件)。 - -```shell -echo $(nproc) # For instance: 4 -make -j$(nproc) Image -make -j$(nproc) modules -make -j1 dtbs -``` - -上面的命令是以多线程编译内核和内核模块。为简单起见,我们将线程数设置成了核数。然后,又以单线程编译了dtbs。那么,这里的`make dtbs`是什么意思呢?下面是一个参考回答: - -> 在Linux内核编译的上下文中,make dtbs 通常用于构建设备树源文件(Device Tree Source files)或设备树二进制文件(Device Tree Blobs, DTBs)。设备树(Device Tree)是一种数据结构,它描述了非平台特定的硬件细节,允许操作系统内核为给定硬件板卡上的设备提供合适的驱动程序和配置。 -> -> 具体来说,make dtbs 命令会执行内核源代码树中定义的规则,这些规则用于从设备树源文件(.dts 文件)生成二进制设备树(.dtb 文件)。这些 .dtb 文件随后可以被引导加载程序(如U-Boot)加载到内核,以便内核在启动时可以知道哪些设备存在以及它们的配置。 -> -> 在较新的内核版本中,你可能还会看到 make dtbs_install 这样的命令,它通常用于将生成的 .dtb 文件安装到某个特定的目录(如 /boot),以便在引导时可以被加载。 -> -> 注意:不是所有的内核配置都需要设备树,这通常取决于你的硬件平台和内核配置。例如,传统的PC硬件通常不需要设备树,但许多嵌入式系统和ARM板卡确实需要。 -> -> 如果你正在编译一个需要设备树的内核,并且你的内核源代码树中包含了相应的 .dts 文件,那么运行 make dtbs(或类似的命令)就是必要的步骤之一。 - -#### 5. 安装内核 - -安装内核模块: - -```shell -make modules_install -``` - -会有类似以下的输出: - -``` -...... -INSTALL sound/soundcore.ko -DEPMOD 4.19.90 -``` - -安装内核: - -```shell -make install -``` - -最后的输出类似这样: - -``` -/bin/sh ./arch/arm64/boot/install.sh 4.19.90 \ -arch/arm64/boot/Image System.map "/boot" -dracut-install: Failed to find module 'xen-blkfront' -dracut: FAILED: /usr/lib/dracut/dracut-install -D /var/tmp/dracut.tlIdPu/initramfs --kerneldir /lib/modules/4.19.90/ -m virtio_gpu xen-blkfront xen-netfront virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio -``` - -注意:这里出现的“dracut: FAILED”错误可以忽略之。 - -#### 6. 重启系统并以新的内核引导 - -通常,我们需要借助VNC(Virtual Network Computing)窗口在GRUB菜单显示时用上下光标键选择新编译出来的内核来启动系统。或者,对于本实验而言,也可以使用以下方法: - -首先查看新编译出来的内核GRUB菜单: -```shell -cat /etc/grub2-efi.cfg -``` - -我们应该可以找到类似这样的菜单项: -``` -menuentry 'openEuler (4.19.90) 20.03 (LTS)' -``` -这就是本例中我们新编译出来的内核版本菜单项(请留意前述编译内核时的一些命令行输出信息)。这时我们可以对默认启动项进行设置: -```shell -grub2-set-default 'openEuler (4.19.90) 20.03 (LTS)' -``` - -确认: -```shell -grub2-editenv list -``` - -应该类似如下所示的输出: -``` -saved_entry=openEuler (4.19.90) 20.03 (LTS) -boot_success=0 -``` - -随后重启系统: -```shell -reboot -``` - -登录并验证: -```shell -uname -r # Desire 4.19.90 -``` -可以看出内核版本已更新。我们可以通过如下命令查看新内核的一些信息: -```shell -ls /lib/modules/`uname -r` -``` - -🔔 *注意* - -您编译出来的新内核版本通常会与此不同。 - - -### 二、验证:Hello, world! - -#### 1. 准备源代码 - -正确编写满足功能的源文件,包括.c源文件和Makefile文件。在这里请参照示例源文件hello_world.c及其Makefile(您可以用scp命令将它们上传到ECS。)假设您的源文件在`hello-world`目录下: -```shell -cd hello-world -``` - -#### 2. 编译源文件 - -```shell -make -``` - -#### 3. 加载内核模块 - -加载编译完成的内核模块,并查看加载结果: - -```shell -insmod hello_world.ko guy="Andy" year=2024 -lsmod | grep hello_world -# For instance: -# hello_world 262144 0 -``` - -#### 4. 卸载内核模块 -卸载内核模块,并查看结果: - -```shell -rmmod hello_world -dmesg | tail -n5 -``` - -输出结果类似如下所示: - -``` -[ 55.787283] hello_world: loading out-of-tree module taints kernel. -[ 55.787798] hello_world: module verification failed: signature and/or required key missing - tainting kernel -[ 55.788937] Init module. -[ 55.789115] Hello, Andy, 2024! -[ 55.789283] Exit module. -``` - -如果您打开了VNC窗口,那么它相当于虚拟机的屏幕,因此您在VNC窗口中也会看到程序输出结果。 - -🔔 *注意* - -- 第一次装在hello_world模块时,请忽略掉最开始安装模块时出现的两行错误提示信息。 - -- 以上步骤输出的进程号以及时间戳可能和您实际的情况不一致。 - -#### 5. 清理 - -```shell -make clean -``` - -#### 6. 关机 - -实验做完后可以关闭虚拟机: - -```shell -poweroff -``` - -🔔 *注意* - -如果是按需购买的ECS,实验做完后更要关机以节约云资源(这时仍有扣费,除非完全删除云资源)。 - -♾ *从具体到一般* - -我们可以从这个例子中窥探到Linux内核模块的基本结构。 - -Linux的内核模块(Module)是一种具有独立功能的程序,它可以被单独编译,但是只能被链接到内核作为内核的一部分在内核空间中运行。模块本身不被编译入内核映像,从而避免使得内核过大,而其一旦被加载,其地位就和内核中的其它部分一样。 - -现在的内核模块一般具有如下形式的基本结构: - -```C -#include //包含了对模块的结构定义 - -static __init my_module_init(void) { - //加载模块 -} - -static __exit my_module_exit(void) { - //卸载模块 -} - -module_init(my_module_init); //指定初始化函数 -module_exit(my_module_exit); //指定卸载函数 - -MODULE_LICENSE("GPL"); //声明版权 -``` - - - - -## II 两个模块的内核编程 - -🔔 *说明* - -这里简单编写了两个内核模块作为示例,更深入的内核模块编程请参考其他相关资料。 - -这两个模块分别实现以下功能: - -- 模块1:支持数组参数,加载时读入并打印。 -- 模块2:在/proc目录下创建只读文件。 - -需要注意以下问题: - -- 模块可以写在一个C文件中,模块参数传递参考宏定义`module_param(name, type, perm)`,需要用到头文件linux/moduleparam.h。 -- 编写Makefile文件将C源码编译成.ko模块。 - -🎵 *准备代码* - -请参考所附源代码文件(module_1.c、module_2.c以及Makefile)准备您的文件。 - -🤚 *动手操作* - -请参考命令行文件cmdline.sh进行实验。 - - - -## 附录A 在x64平台上编译内核 - -除了鲲鹏平台,openEuler操作系统也支持x86_64、RISC-V等架构。兹列出在x86_64平台上的openEuler编译内核的步骤以供参考。 - -### 一、内核编译与安装 - -#### 1. 查看系统信息 - -先查看当前的系统信息: - -```shell -uname -m # Desire x86_64 -uname -r # For instance: 4.19.90-2003.4.0.0036.oe1.x86_64 -``` - -注意此例当前所用内核版本为4.19.XX-XXXX.X.X.XXXX.XXX.x86_64。 - -```shell -cat /etc/os-release -``` - -会有类似以下的输出信息: - -``` -NAME="openEuler" -VERSION="20.03 (LTS)" -ID="openEuler" -VERSION_ID="20.03" -PRETTY_NAME="openEuler 20.03 (LTS)" -ANSI_COLOR="0;31" -``` - -这表明当前是公元2020年3月发布的长期支持版openEuler操作系统。 - -🔔 *注意* - -您的系统的版本号可能与此不同。 - -```shell -lscpu | grep '^CPU(s):' -``` - -输出如下表示本例所用CPU为4核(您的系统可能与此不同): - -``` -CPU(s): 4 -``` - -也可以用以下命令查看CPU核数: - -```shell -cat /proc/cpuinfo | grep "processor" | wc -l -grep processor /proc/cpuinfo | wc -l -echo $(nproc) # For instance: 4 -``` - -#### 2. 准备环境 - -准备编译内核的软件环境: - -```shell -yum group install -y "Development Tools" -yum install -y bc -yum install -y openssl-devel -yum install -y elfutils-libelf-devel -``` - -#### 3. 获取源码 - -获取内核源代码(假设把它放在Home目录下): - -```shell -cd ~ -wget https://gitee.com/openeuler/kernel/repository/archive/kernel-4.19.zip -unzip kernel-4.19.zip -ls # For instance: kernel-4.19.zip kernel-kernel-4.19 -mv kernel-kernel-4.19/ kernel/ -``` - -#### 4. 编译、安装内核 - -先进入内核目录查看内核可以编译成为何种类型的文件: - -```shell -cd kernel -make help | grep Image -``` - -如果显示如下则表示内核可编译为bzImage类型的文件: - -``` -* bzImage - Compressed kernel image (arch/x86/boot/bzImage) -``` - -产生配置文件: - -```shell -make openeuler_defconfig -``` - -以下是一些可能的输出信息示例: - -``` -arch/x86/configs/openeuler_defconfig:2534:warning: override: reassigning to symbol HINIC -# -# configuration written to .config -# -``` - -编译内核: - -```shell -make -j$(nproc) bzImage -``` - -这里以多线程编译内核,我们简单地将线程数设置成核数。编译完成通常会输出: - -``` -Kernel: arch/x86/boot/bzImage is ready (#1) -``` - -编译内核模块: - -```shell -make -j$(nproc) modules -``` - -安装内核模块: - -```shell -make modules_install # For instance: DEPMOD 4.19.208 -``` - -安装内核: - -```shell -make install -``` - -在本例中有以下输出: - -``` -sh ./arch/x86/boot/install.sh 4.19.208 arch/x86/boot/bzImage \ - System.map "/boot" -dracut-install: ERROR: installing 'virtio_pci' -dracut: FAILED: /usr/lib/dracut/dracut-install -D /var/tmp/dracut.R4CHaO/initramfs --kerneldir /lib/modules/4.19.208/ -m virtio_gpu xen-blkfront xen-netfront virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio -``` - -注意:这里的“dracut: FAILED”错误请忽略。 - -#### 5. 重启系统 - -```shell -reboot -``` - -重启并在GRUB菜单中选择以新的内核来引导操作系统,登录系统的shell然后检查内核版本: - -```shell -uname -r # For instance: 4.19.208 -``` - -这和原来的内核版本号不同,表明确实以新版本的内核启动了系统。 - -🔔 *注意* - -您编译出来的新内核版本通常会与此不同。 - - -### 二、验证 - -从略。 - - - -## 附录B 术语表 - -本实验中所用术语列表如下: - -🏷*术语表* - -- KMP - - Kernel Module Programming,内核模块编程。 -- KECS - - Kunpeng Elastic Cloud Server,鲲鹏弹性云服务器 -- VNC - - Virtual Network Console,虚拟网络控制台 -- GRUB - - Grand Unified Boot Loader,大一统引导装载程序 - diff --git a/playground/oexp/kmp/src/hello-world/Makefile b/playground/oexp/kmp/src/hello-world/Makefile deleted file mode 100644 index b0634051f7196e0ac353ab5e04188d52b99d6d22..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/hello-world/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# Build hello_world module - -obj-m := hello_world.o -KDIR := /lib/modules/$(shell uname -r)/build -PWD := $(shell pwd) - -default: - make -C $(KDIR) M=$(PWD) modules - -.PHONY:clean -clean: - rm -f *.ko *.mod *.mod.? *.o *.order *.symvers diff --git a/playground/oexp/kmp/src/hello-world/cmdline.sh b/playground/oexp/kmp/src/hello-world/cmdline.sh deleted file mode 100644 index 1b964fcc064edb353df1fe5e3d0c7c549b0050f7..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/hello-world/cmdline.sh +++ /dev/null @@ -1,15 +0,0 @@ - -make - -insmod hello_world.ko guy="Andy" year=2024 -lsmod | grep hello -#hello_world 262144 0 - -rmmod hello_world - -dmesg | tail -n3 -#[ 6228.122161] Init module. -#[ 6228.122433] Hello, Andy, 2024! -#[ 6254.880206] Exit module. - -make clean diff --git a/playground/oexp/kmp/src/hello-world/hello_world.c b/playground/oexp/kmp/src/hello-world/hello_world.c deleted file mode 100644 index 835d698a831a16385110d28ab5ab3f4179392613..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/hello-world/hello_world.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Hello from Kernel! */ - -#include -#include -#include - -static char* guy = "Dinu"; -module_param(guy, charp, 0644); -MODULE_PARM_DESC(guy, "char* param\n"); - -static int year = 2013; -module_param(year, int, 0644); -MODULE_PARM_DESC(year, "int param\n"); - -void hello_world(char* guy, int year) { - printk(KERN_ALERT "Hello, %s, %d!\n", guy, year); -} - -int __init hello_init(void) { - printk(KERN_ALERT "Init module.\n"); - hello_world(guy, year); - - return 0; -} - -void __exit hello_exit(void) { - printk(KERN_ALERT "Exit module.\n"); -} - -module_init(hello_init); -module_exit(hello_exit); - -MODULE_LICENSE("GPL"); diff --git a/playground/oexp/kmp/src/m2/Makefile b/playground/oexp/kmp/src/m2/Makefile deleted file mode 100644 index d8d77239369c111b6b6ee310bda0721c03c5c19c..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/m2/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# Build modules - -obj-m := module_1.o module_2.o -KDIR := /lib/modules/$(shell uname -r)/build -PWD := $(shell pwd) -all: - make -C $(KDIR) M=$(PWD) modules -clean: - rm -f *.ko *.mod *.mod.? *.o *.order *.symvers diff --git a/playground/oexp/kmp/src/m2/cmdline.sh b/playground/oexp/kmp/src/m2/cmdline.sh deleted file mode 100644 index eddd65f4165e5aa9e0bc9e41bd1204aefa8a6074..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/m2/cmdline.sh +++ /dev/null @@ -1,20 +0,0 @@ - -# Step 1: Compile the source code -make clean -make - -# Step 2: Install the module and test -insmod module_1.ko my_array=1,2,3,4,5,6,7 -insmod module_2.ko - -lsmod | grep module - -cat /proc/hello_proc - -# Step 3: Uninstall the module -rmmod module_2.ko -rmmod module_1.ko - -# Step 4: Review the system log information -clear -dmesg | tail -n80 diff --git a/playground/oexp/kmp/src/m2/module_1.c b/playground/oexp/kmp/src/m2/module_1.c deleted file mode 100644 index dd3ca185d57fa656df1bd2b71059e2ad8b022653..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/m2/module_1.c +++ /dev/null @@ -1,33 +0,0 @@ -// Module that support for array parameter - -#include -#include -#include - -#define MAX_LENGTH 7 - -static int my_array[MAX_LENGTH]; -int array_num; - -module_param_array(my_array, int, &array_num, 0644); -MODULE_PARM_DESC(my_array, "A integer array"); - -static int __init my_module_init(void) { - int i; - printk("The module 1 is loaded!\n"); - - for(i = 0; i < array_num; i++) { - printk("%d\n", my_array[i]); - } - - return 0; -} - -static void __exit my_module_exit(void) { - printk("The module 1 is removed!\n"); -} - -module_init(my_module_init); -module_exit(my_module_exit); - -MODULE_LICENSE("GPL"); diff --git a/playground/oexp/kmp/src/m2/module_2.c b/playground/oexp/kmp/src/m2/module_2.c deleted file mode 100644 index e00fde6ccbeafe29ded2634ad8006655d1c24b22..0000000000000000000000000000000000000000 --- a/playground/oexp/kmp/src/m2/module_2.c +++ /dev/null @@ -1,38 +0,0 @@ -// Read-only proc file - -#include -#include -#include - -static int hello_proc_show(struct seq_file *m, void *v) { - seq_printf(m, "This is a proc message!\n"); - return 0; -} - -static int hello_proc_open(struct inode *inode, struct file *file) { - return single_open(file, hello_proc_show, NULL); -} - -static const struct file_operations hello_proc_fops = { - .owner = THIS_MODULE, - .open = hello_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static int __init hello_proc_init(void) { - printk("The module 2 is loaded!\n"); - proc_create("hello_proc", 0, NULL, &hello_proc_fops); - return 0; -} - -static void __exit hello_proc_exit(void) { - printk("The module 2 is removed!\n"); - remove_proc_entry("hello_proc", NULL); -} - -module_init(hello_proc_init); -module_exit(hello_proc_exit); - -MODULE_LICENSE("GPL"); diff --git a/playground/oexp/see/code/abc.c b/playground/oexp/see/code/abc.c deleted file mode 100644 index 65faa064d22afa5f1799cb75d7d0eff55b3ec047..0000000000000000000000000000000000000000 --- a/playground/oexp/see/code/abc.c +++ /dev/null @@ -1,13 +0,0 @@ -// abc.c -// -// gcc -g abc.c -// objdump -S ./a.out -// - -int main() { - int a = 1; - int b = 2; - int c = a + b; - - return a+b+c; -} diff --git a/playground/oexp/see/code/add.c b/playground/oexp/see/code/add.c deleted file mode 100644 index 07c35790b2f337faeb9a6bb6f6e468a1dc0eab70..0000000000000000000000000000000000000000 --- a/playground/oexp/see/code/add.c +++ /dev/null @@ -1,41 +0,0 @@ -/* - -add.c -gcc thisfile - -R0-R30 31 general-purpose registers, R0 to R30. Each register can be accessed as: -o A 64-bit general-purpose register named X0 to X30. -o A 32-bit general-purpose register named W0 to W30. - -63 32 31 0 -|================================|================================| - |<--------------Wn-------------->| -|<-------------------------------Xn------------------------------>| - -*/ - -#include -#include - -int add(int i, int j) { - int res = 0; - asm ( - "ADD %w[result], %w[input_i], %w[input_j]" - : [result] "=r" (res) - : [input_i] "r" (i), [input_j] "r" (j) ); - - return res; -} - -int main(int argc, char *argv[]) { - if (argc < 3) { - printf("Usage: %s \n", argv[0]); - return -1; - } - - int i = atoi(argv[1]); - int j = atoi(argv[2]); - - printf("%d + %d = %d\n", i, j, add(i, j)); - return 0; -} diff --git a/playground/oexp/see/code/ch.c b/playground/oexp/see/code/ch.c deleted file mode 100644 index 0cf41a444605c185c92252c4d0168c13e5895c5c..0000000000000000000000000000000000000000 --- a/playground/oexp/see/code/ch.c +++ /dev/null @@ -1,33 +0,0 @@ -// -// ch.c -// gcc thisfile -// -// The default type of char is 'unsigned char' in the Kunpeng platform. -// -// gcc thisfile in both x86 and Kunpeng architecture. And try to -// gcc -fsigned-char thisfile in Kunpeng architecture. And try to -// gcc -funsigned-char thisfile in x86 architecture -// - -#include - -// positive or non positive, is a problem -#define PNP(x) \ - ((x) < 0 ? printf("negative") : \ - ((x) == 0) ? printf("zero") : \ - printf("positive")) - -int main() { - // original code of 1: 0000 0001b - // ones' complement of 1: 1111 1110b - // two's complement of -1: 1111 1111b - char ch = -1; - - printf("sizeof ch is %zu, %zu, %zu, %zu\n\n", sizeof(char), sizeof(ch), sizeof(signed char), sizeof(unsigned char)); - - printf(" char ch = %2xh, %+4d, ", ch & 0xff, ch); PNP(ch); printf("\n\n"); - printf(" signed char ch = %2xh, %+4d, ", (signed char)ch & 0xff, (signed char)ch); PNP((signed char)ch); printf("\n"); - printf("unsigned char ch = %2xh, %+4d, ", (unsigned char)ch & 0xff, (unsigned char)ch); PNP((unsigned char)ch); printf("\n"); - - return 0; -} diff --git a/playground/oexp/see/code/hello.s b/playground/oexp/see/code/hello.s deleted file mode 100644 index 4b3a6498d465510923543c87a1224bbb0d1c3275..0000000000000000000000000000000000000000 --- a/playground/oexp/see/code/hello.s +++ /dev/null @@ -1,24 +0,0 @@ -# -# hello.s for Kunpeng architecture -# -# as -o hello.o hello.s -# ld -o hello hello.o -# - -.text -.global _start -_start: - mov x0,#0 - ldr x1,=msg - mov x2,len - mov x8,64 - svc #0 - - mov x0,123 - mov x8,93 - svc #0 - -.data -msg: - .ascii "Hello openEuler!\n\0" -len=.-msg diff --git a/playground/oexp/see/openEuler-SEE.md b/playground/oexp/see/openEuler-SEE.md deleted file mode 100644 index 59bb0dc8f9624a04902114c9ed1d715c7324acc1..0000000000000000000000000000000000000000 --- a/playground/oexp/see/openEuler-SEE.md +++ /dev/null @@ -1,550 +0,0 @@ -# openEuler系统环境实验 - -**openEuler System Environment Experiments** - - - -## I 什么是系统环境实验 - -所谓**系统环境**,是指运行在一定硬件系统之上的操作系统所提供的软件运行环境,在本实验中特指运行于**鲲鹏处理器**之上的**openEuler操作系统 **向上层软件提供的运行环境。 - -窥探并研究系统环境的实验即为**系统环境实验**。从广泛的角度而言,内核编译、内核模块编程、系统编程(System Programming)都为系统环境实验提供了案例,但为初学者简单起见,本文探讨如下几个实验: - -- 通过Linux shell命令查看系统信息 -- 观察C语言char数据类型 -- 体验aarch64架构精简指令集 -- C代码中的汇编语句 -- 纯汇编程序 - -💡 *小知识* - -- **鲲鹏处理器**是华为基于ARMv8架构开发的通用处理器。作为一款现代处理器,在芯片内部架构中,鲲鹏处理器涉及到了体系结构中的SoC、Chip、DIE、Cluster以及Core等概念,从而组成了一个复杂的综合体。 - -- **openEuler**既是一个操作系统,又是一个开源、免费的Linux发行平台,其致力于打造中国原生开源、可自主演进操作系统根社区。作为操作系统,当前openEuler内核源于[Linux](https://www.kernel.org/),支持鲲鹏及其他多种处理器。 - -🔗 *学习资源* - -- [《openEuler操作系统》(第二版)](http://www.tup.tsinghua.edu.cn/booksCenter/book_09568001.html)“第2章 鲲鹏处理器” - -- [openEuler门户网站](https://www.openeuler.org/zh/) -- [openEuler代码仓](https://gitee.com/openeuler/) -- [openEuler软件包仓](https://gitee.com/src-openeuler/) -- [高校子站](https://edu.hicomputing.huawei.com/) -- [鲲鹏生态官网](https://www.hikunpeng.com/) - - - -## II 实验设备与实验流程 - -```mermaid -flowchart TD - Start([Start]) - Start --> A1 - Start --> A2 - Start --> A3 - A1[KPM] --> B{Ready?} - A2[KECS] --> B - A3[KDB]:::ActiveClass --> B - B -- Yes --> C[openEuler SEE]:::ActiveClass - C --> End([End]) - B -- No ----> End - - classDef ActiveClass fill:#f96 -``` -上图所用术语含义如下所示: - -🏷 *术语表* - -- KPM - - Kunpeng Physical Machine,鲲鹏物理机 -- KECS - - Kunpeng Elastic Cloud Server,鲲鹏弹性云服务器 -- KDB - - Kunpeng Development Board,鲲鹏开发板 -- SEE - - System Environment Experiments,系统环境实验 - -### 一、实验设备 - -目前有三种鲲鹏平台可供选择: - -- 鲲鹏物理机:包括基于鲲鹏处理器的PC机、服务器(如泰山2280物理服务器)等。 -- 鲲鹏ECS:即基于鲲鹏处理器的华为云ECS(弹性云服务器,Elastic Cloud Server)。 -- 鲲鹏开发板:类似于树莓派但是以鲲鹏处理器为CPU的开发板。 - -### 二、实验流程 - -实验流程如下: - -1. 准备好一个“鲲鹏平台+openEuler操作系统”的实验环境 -2. 登录到实验环境 -3. 进行实验 - -登录到实验环境(操作系统)的方式: - -- 通过本地终端登录系统,这里的本地终端包括键盘、鼠标(物理输入设备)和显示器(物理输出设备),适用于鲲鹏物理机、鲲鹏开发板。 -- 通过串口登录系统,适用于鲲鹏开发板。 -- 利用PC机中的Console命令行终端通过以太网+TCP/IP+SSH登录系统(用`ssh`命令),适用于鲲鹏物理机、鲲鹏ECS、鲲鹏开发板。 - -🔒🗝 *安全* - -为方便和学习的缘故,本实验我们以root用户登录,但为系统安全起见,特别是在进行应用编程时,我们最好是以非root用户登录。 - -## III openEuler系统环境实验 - -### 一、查看系统信息 - -本实验通过Linux shell命令查看系统信息以增进对鲲鹏处理器和openEuler操作系统的了解。 - -#### 1. 查看系统架构信息 - -🤚 *动手操作* - -```shell -uname -m # aarch64, i.e. arm64 -uname -r -uname -a # ...... aarch64 GNU/Linux -``` - -以上一系列`uname`命令分别查看了系统的CPU架构、操作系统内核版本及其他信息。 - -⚛ *进一步研究* - -试用“`uname --help`”命令探索更多选项。 - -#### 2. 查看CPU信息 - -🤚 *动手操作* - -```shell -lscpu # ...... -``` - -❓ *回答问题* - -试着说出上述命令执行结果所代表的含义。 - -⚛ *进一步研究* - -以下是在运行于泰山2280物理服务器(搭载鲲鹏920处理器)的openEuler操作系统中执行该命令的结果: - -``` -Architecture: aarch64 -CPU op-mode(s): 64-bit -Byte Order: Little Endian -CPU(s): 128 -On-line CPU(s) list: 0-127 -Thread(s) per core: 1 -Core(s) per socket: 64 -Socket(s): 2 -NUMA node(s): 4 -Vendor ID: HiSilicon -Model: 0 -Model name: Kunpeng-920 -Stepping: 0x1 -CPU max MHz: 2600.0000 -CPU min MHz: 200.0000 -BogoMIPS: 200.00 -L1d cache: 8 MiB -L1i cache: 8 MiB -L2 cache: 64 MiB -L3 cache: 256 MiB -NUMA node0 CPU(s): 0-31 -NUMA node1 CPU(s): 32-63 -NUMA node2 CPU(s): 64-95 -NUMA node3 CPU(s): 96-127 -Vulnerability Itlb multihit: Not affected -Vulnerability L1tf: Not affected -Vulnerability Mds: Not affected -Vulnerability Meltdown: Not affected -Vulnerability Spec store bypass: Vulnerable -Vulnerability Spectre v1: Mitigation; __user pointer sanitization -Vulnerability Spectre v2: Not affected -Vulnerability Tsx async abort: Not affected -Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm -``` - -这里以L1、L2级缓存大小为例分析一下上面的数据。我们知道鲲鹏920处理器有L1、L2、L3三级cache,其中L1的指令cache(L1I)和数据cache(L1D)大小都是64KiB,L2 cache不区分指令或数据,大小为512KiB,L1和L2两级cache由各个CPU core独享。一颗鲲鹏920芯片包含64个core,故: -- L1d cache:64Kib x 64 = 4096Kib 即4MiB -- L1i cache:64Kib x 64 = 4096Kib 即4MiB -- L2 cache:512Kib x 128 = 32768Kib 即32MiB - -在泰山2280 V2服务器有2个CPU socket,4个NUMA节点,总核数达到128个,故L1d/L1i cache大小分别是8MiB,L2 cache大小是64MiB。 - -#### 3. 查看操作系统版本 - -🤚 *动手操作* - -```shell -cat /etc/os-release # ...... -``` - -❓ *回答问题* - -你能根据命令显示结果说出openEuler的版本号吗? - -### 二、观察C语言char数据类型 - -C是一种“强类型、弱检查”的系统级通用编程语言,我们通过对比运行在aarch64和x64架构上C语言char默认数据类型的不同进一步了解硬/软件系统某一个小小环节的差异便可使上层应用产生截然不同的结果,从而从见微知著之处体会鲲鹏平台与其他平台的不同。 - -🔔 *说明* - -本节实验所用源代码在“`code`”目录中。 - -#### 1. 检查GCC版本 - -🤚 *动手操作* - -```shell -gcc --version # ...... -``` - -推荐使用gcc7.3.0及以上版本(不低于4.8.5)。 - -#### 2. 准备C程序源代码 - -🎵 *准备代码* - -请按`ch.c`的内容准备源代码,我们假设您放在操作系统Home目录的code目录下: - -```shell -cd ~/code -``` - -#### 3. 编译并执行 - -在鲲鹏开发板上编译并执行: - -🤚 *动手操作* - -```shell -gcc ch.c -./a.out -``` - -以下是在鲲鹏平台上的执行结果: - -``` -sizeof ch is 1, 1, 1, 1 - - char ch = ffh, +255, positive - - signed char ch = ffh, -1, negative -unsigned char ch = ffh, +255, positive -``` - -可以看出: - -- 由于计算机中的整数用补码表示的原因,`-1`在内存中的数值是`0xff` -- 在鲲鹏平台上`char`的默认数据类型与`unsigned char`同 - -#### 4. 在x64平台上进行同样的实验 - -🤲 *与x64平台比较* - -以下是在x86_64(即x64)平台上的执行结果: - -``` -sizeof ch is 1, 1, 1, 1 - - char ch = ffh, -1, negative - - signed char ch = ffh, -1, negative -unsigned char ch = ffh, +255, positive -``` - -可见,在x64平台上,`char`的默认数据类型与`signed char`同。 - -⚛ *进一步研究* - -其实,C语言标准并没有规定`char`应该是`unsigned char`还是`signed char`: - -> “The C standards do say that "char" may either be a "signed char" or "unsigned char" and it is up to the compilers implementation or the platform which is followed.” - -所以,在C语言中,`char`类型是不是就相当于`unsigned char`和`signed char`的泛型,仅仅代表一个8bit位数的集合,至于这个集合的具体含义(是`unsigned char`还是`signed char`),那是和C编译器与CPU指令集都有关的,可以看出:**信息就是上下文**。 - -❓ *回答问题* - -你可以举出另外一些“信息就是上下文”的例子吗? - -#### 5. 编译时指定char的类型 - -🤚 *动手操作* - -```shell -gcc -fsigned-char ch.c -./a.out -``` - -看看这一次的结果是怎样的。 - -❓ *回答问题* - -在软件行业有一个灵丹妙药,即“**再加一层**”,这里gcc编译时所带参数-f算不算是加了一层? - -💡 *小知识* - -> “All problems in computer science can be solved by another level of indirection, except for the problem of too many layers of indirection.” -> “计算机科学中的所有问题都可以通过另外一个分层来解决,除了太多间接分层的问题外。” -> ——Butler Lampson 1992年图灵奖获奖报告(其本人认为这句著名格言最早出自于David Wheeler) - - - -### 三、体验aarch64架构精简指令集 - -由于鲲鹏处理器是基于aarch64架构的,故其采用的是精简指令集。 - -#### 1. 准备源代码 - -🎵 *准备代码* - -请按`abc.c`的内容准备源代码,我们假设您放在操作系统Home目录的code目录下: - -```shell -cd ~/code -``` - -#### 2. 编译然后反汇编 - -编译源文件并进行反汇编: - -🤚 *动手操作* - -```shell -gcc -g abc.c -./a.out -echo $? # Desire 6 -objdump -S ./a.out -``` - -请查看在咱们所用鲲鹏平台(RISC)上反汇编的结果。 - -🤲 *与x64平台比较* - -以下是在“x86_64 + openEuler 22.03 (LTS-SP3) + gcc (GCC) 10.3.1”平台上进行同样实验的结果: - -``` -gcc -g abc.c -objdump -S ./a.out - -./a.out: file format elf64-x86-64 - - -Disassembly of section .init: - -0000000000401000 <_init>: - 401000: f3 0f 1e fa endbr64 - 401004: 48 83 ec 08 sub $0x8,%rsp - 401008: 48 8b 05 e1 2f 00 00 mov 0x2fe1(%rip),%rax # 403ff0 <__gmon_start__@Base> - 40100f: 48 85 c0 test %rax,%rax - 401012: 74 02 je 401016 <_init+0x16> - 401014: ff d0 call *%rax - 401016: 48 83 c4 08 add $0x8,%rsp - 40101a: c3 ret - -Disassembly of section .text: - -0000000000401020 <_start>: - 401020: f3 0f 1e fa endbr64 - 401024: 31 ed xor %ebp,%ebp - 401026: 49 89 d1 mov %rdx,%r9 - 401029: 5e pop %rsi - 40102a: 48 89 e2 mov %rsp,%rdx - 40102d: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp - 401031: 50 push %rax - 401032: 54 push %rsp - 401033: 45 31 c0 xor %r8d,%r8d - 401036: 31 c9 xor %ecx,%ecx - 401038: 48 c7 c7 02 11 40 00 mov $0x401102,%rdi - 40103f: ff 15 9b 2f 00 00 call *0x2f9b(%rip) # 403fe0 <__libc_start_main@GLIBC_2.34> - 401045: f4 hlt - 401046: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) - 40104d: 00 00 00 - -0000000000401050 <_dl_relocate_static_pie>: - 401050: f3 0f 1e fa endbr64 - 401054: c3 ret - 401055: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1) - 40105c: 00 00 00 - 40105f: 90 nop - -0000000000401060 : - 401060: 48 8d 3d c1 2f 00 00 lea 0x2fc1(%rip),%rdi # 404028 <__TMC_END__> - 401067: 48 8d 05 ba 2f 00 00 lea 0x2fba(%rip),%rax # 404028 <__TMC_END__> - 40106e: 48 39 f8 cmp %rdi,%rax - 401071: 74 15 je 401088 - 401073: 48 8b 05 6e 2f 00 00 mov 0x2f6e(%rip),%rax # 403fe8 <_ITM_deregisterTMCloneTable@Base> - 40107a: 48 85 c0 test %rax,%rax - 40107d: 74 09 je 401088 - 40107f: ff e0 jmp *%rax - 401081: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) - 401088: c3 ret - 401089: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) - -0000000000401090 : - 401090: 48 8d 3d 91 2f 00 00 lea 0x2f91(%rip),%rdi # 404028 <__TMC_END__> - 401097: 48 8d 35 8a 2f 00 00 lea 0x2f8a(%rip),%rsi # 404028 <__TMC_END__> - 40109e: 48 29 fe sub %rdi,%rsi - 4010a1: 48 89 f0 mov %rsi,%rax - 4010a4: 48 c1 ee 3f shr $0x3f,%rsi - 4010a8: 48 c1 f8 03 sar $0x3,%rax - 4010ac: 48 01 c6 add %rax,%rsi - 4010af: 48 d1 fe sar %rsi - 4010b2: 74 14 je 4010c8 - 4010b4: 48 8b 05 3d 2f 00 00 mov 0x2f3d(%rip),%rax # 403ff8 <_ITM_registerTMCloneTable@Base> - 4010bb: 48 85 c0 test %rax,%rax - 4010be: 74 08 je 4010c8 - 4010c0: ff e0 jmp *%rax - 4010c2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1) - 4010c8: c3 ret - 4010c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) - -00000000004010d0 <__do_global_dtors_aux>: - 4010d0: 80 3d 51 2f 00 00 00 cmpb $0x0,0x2f51(%rip) # 404028 <__TMC_END__> - 4010d7: 75 17 jne 4010f0 <__do_global_dtors_aux+0x20> - 4010d9: 55 push %rbp - 4010da: 48 89 e5 mov %rsp,%rbp - 4010dd: e8 7e ff ff ff call 401060 - 4010e2: c6 05 3f 2f 00 00 01 movb $0x1,0x2f3f(%rip) # 404028 <__TMC_END__> - 4010e9: 5d pop %rbp - 4010ea: c3 ret - 4010eb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) - 4010f0: c3 ret - 4010f1: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1) - 4010f8: 00 00 00 00 - 4010fc: 0f 1f 40 00 nopl 0x0(%rax) - -0000000000401100 : - 401100: eb 8e jmp 401090 - -0000000000401102
: -// -// gcc -g abc.c -// objdump -S ./a.out -// - -int main() { - 401102: 55 push %rbp - 401103: 48 89 e5 mov %rsp,%rbp - int a = 1; - 401106: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp) - int b = 2; - 40110d: c7 45 f8 02 00 00 00 movl $0x2,-0x8(%rbp) - int c = a + b; - 401114: 8b 55 fc mov -0x4(%rbp),%edx - 401117: 8b 45 f8 mov -0x8(%rbp),%eax - 40111a: 01 d0 add %edx,%eax - 40111c: 89 45 f4 mov %eax,-0xc(%rbp) - - return a+b+c; - 40111f: 8b 55 fc mov -0x4(%rbp),%edx - 401122: 8b 45 f8 mov -0x8(%rbp),%eax - 401125: 01 c2 add %eax,%edx - 401127: 8b 45 f4 mov -0xc(%rbp),%eax - 40112a: 01 d0 add %edx,%eax -} - 40112c: 5d pop %rbp - 40112d: c3 ret - -Disassembly of section .fini: - -0000000000401130 <_fini>: - 401130: f3 0f 1e fa endbr64 - 401134: 48 83 ec 08 sub $0x8,%rsp - 401138: 48 83 c4 08 add $0x8,%rsp - 40113c: c3 ret -``` - -❓ *回答问题* - -观察两者的机器码,你能说出精简指令集和复杂指令集各自的特点吗? - -### 四、C代码中的汇编语句 - -#### 1. 准备源代码 - -🎵 *准备代码* - -请按`add.c`的内容准备源代码,我们假设您放在操作系统Home目录的code目录下: - -```shell -cd ~/code -``` - -#### 2. 编译并执行 - -🤚 *动手操作* - -```shell -gcc -o add add.c -./add 2 3 # Desire 5 -``` - -⚛ *进一步研究* - -试着将代码中32位的寄存器Wn换成64位的寄存器Xn再重新编译运行一遍。 - -### 五、纯汇编程序 - -#### 1. 准备汇编代码 - -🎵 *准备代码* - -请按`hello.s`的内容准备源代码,我们假设您放在操作系统Home目录的code目录下: - -```shell -cd ~/code -``` - -#### 2. 编译、链接 - -🤚 *动手操作* - -```shell -as -o hello.o hello.s -ld -o hello hello.o -``` - -#### 3. 执行 - -🤚 *动手操作* - -```shell -./hello # Hello openEuler! -``` - -⚛ *进一步研究* - -试着弄懂上述程序中汇编代码的含义。 - - - -## IV 术语表 - -本实验中所用术语列表如下: - -🏷 术语表 - -- PC - - Personal Computer,个人电脑 -- ECS - - Elastic Cloud Server,弹性云服务器 -- SoC - - System on Chip,片上系统 -- Chip - - 通常指一块物理芯片 -- DIE - - 芯片的最小物理单元 -- Cluster - - 族,若干个core的集合 -- Core - - 核,真正负责做计算的单元 -- RISC - - Reduced Instruction Set Computer,精简指令集计算机 -- CISC - - Complex InstrucTIon Set Computer,复杂指令集计算机 -- NUMA - - Non-Uniform Memory Access,非统一内存访问 -- SSH - - Secure Shell,安全外壳。一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。 - diff --git a/primary/pr/1321Ada b/playground/pr/1321Ada similarity index 100% rename from primary/pr/1321Ada rename to playground/pr/1321Ada diff --git a/primary/pr/1329syj b/playground/pr/1329syj similarity index 100% rename from primary/pr/1329syj rename to playground/pr/1329syj diff --git a/primary/pr/2201620113SCK b/playground/pr/2201620113SCK similarity index 100% rename from primary/pr/2201620113SCK rename to playground/pr/2201620113SCK diff --git a/primary/pr/320220941761-liuquansheng b/playground/pr/320220941761-liuquansheng similarity index 100% rename from primary/pr/320220941761-liuquansheng rename to playground/pr/320220941761-liuquansheng diff --git a/primary/pr/Aneyre b/playground/pr/Aneyre similarity index 100% rename from primary/pr/Aneyre rename to playground/pr/Aneyre diff --git a/primary/pr/Apriori b/playground/pr/Apriori similarity index 100% rename from primary/pr/Apriori rename to playground/pr/Apriori diff --git a/primary/pr/AsparticGuan b/playground/pr/AsparticGuan similarity index 100% rename from primary/pr/AsparticGuan rename to playground/pr/AsparticGuan diff --git a/primary/pr/B4holder b/playground/pr/B4holder similarity index 100% rename from primary/pr/B4holder rename to playground/pr/B4holder diff --git a/primary/pr/B_ay b/playground/pr/B_ay similarity index 100% rename from primary/pr/B_ay rename to playground/pr/B_ay diff --git a/primary/pr/BigCowHorse b/playground/pr/BigCowHorse similarity index 100% rename from primary/pr/BigCowHorse rename to playground/pr/BigCowHorse diff --git a/primary/pr/BitterGourd b/playground/pr/BitterGourd similarity index 100% rename from primary/pr/BitterGourd rename to playground/pr/BitterGourd diff --git a/primary/pr/Bunnycxk b/playground/pr/Bunnycxk similarity index 100% rename from primary/pr/Bunnycxk rename to playground/pr/Bunnycxk diff --git a/primary/pr/C_Xing b/playground/pr/C_Xing similarity index 100% rename from primary/pr/C_Xing rename to playground/pr/C_Xing diff --git a/primary/pr/Capolavoro b/playground/pr/Capolavoro similarity index 100% rename from primary/pr/Capolavoro rename to playground/pr/Capolavoro diff --git a/primary/pr/DissCheng b/playground/pr/DissCheng similarity index 100% rename from primary/pr/DissCheng rename to playground/pr/DissCheng diff --git a/primary/pr/Dream-Sun b/playground/pr/Dream-Sun similarity index 100% rename from primary/pr/Dream-Sun rename to playground/pr/Dream-Sun diff --git a/primary/pr/HC b/playground/pr/HC similarity index 100% rename from primary/pr/HC rename to playground/pr/HC diff --git a/primary/pr/HUSTJiang b/playground/pr/HUSTJiang similarity index 100% rename from primary/pr/HUSTJiang rename to playground/pr/HUSTJiang diff --git a/primary/pr/J1nzhao b/playground/pr/J1nzhao similarity index 100% rename from primary/pr/J1nzhao rename to playground/pr/J1nzhao diff --git a/primary/pr/Joker_Wan b/playground/pr/Joker_Wan similarity index 100% rename from primary/pr/Joker_Wan rename to playground/pr/Joker_Wan diff --git a/primary/pr/KMRider_V3 b/playground/pr/KMRider_V3 similarity index 100% rename from primary/pr/KMRider_V3 rename to playground/pr/KMRider_V3 diff --git a/primary/pr/Katachi1 b/playground/pr/Katachi1 similarity index 100% rename from primary/pr/Katachi1 rename to playground/pr/Katachi1 diff --git a/primary/pr/LZYczxt b/playground/pr/LZYczxt similarity index 100% rename from primary/pr/LZYczxt rename to playground/pr/LZYczxt diff --git a/primary/pr/Li-danya b/playground/pr/Li-danya similarity index 100% rename from primary/pr/Li-danya rename to playground/pr/Li-danya diff --git a/primary/pr/Lunoker b/playground/pr/Lunoker similarity index 100% rename from primary/pr/Lunoker rename to playground/pr/Lunoker diff --git a/primary/pr/Lyikun15 b/playground/pr/Lyikun15 similarity index 100% rename from primary/pr/Lyikun15 rename to playground/pr/Lyikun15 diff --git a/primary/pr/Marxist0119 b/playground/pr/Marxist0119 similarity index 100% rename from primary/pr/Marxist0119 rename to playground/pr/Marxist0119 diff --git a/primary/pr/Metafora b/playground/pr/Metafora similarity index 100% rename from primary/pr/Metafora rename to playground/pr/Metafora diff --git a/primary/pr/Misaka_Liu b/playground/pr/Misaka_Liu similarity index 100% rename from primary/pr/Misaka_Liu rename to playground/pr/Misaka_Liu diff --git a/primary/pr/NOSIXS b/playground/pr/NOSIXS similarity index 100% rename from primary/pr/NOSIXS rename to playground/pr/NOSIXS diff --git a/primary/pr/N_E_E b/playground/pr/N_E_E similarity index 100% rename from primary/pr/N_E_E rename to playground/pr/N_E_E diff --git a/primary/pr/NethengeicWE b/playground/pr/NethengeicWE similarity index 100% rename from primary/pr/NethengeicWE rename to playground/pr/NethengeicWE diff --git a/primary/pr/Ph128 b/playground/pr/Ph128 similarity index 100% rename from primary/pr/Ph128 rename to playground/pr/Ph128 diff --git a/primary/pr/SHIBATORI b/playground/pr/SHIBATORI similarity index 100% rename from primary/pr/SHIBATORI rename to playground/pr/SHIBATORI diff --git a/primary/pr/Sakura_sshly b/playground/pr/Sakura_sshly similarity index 100% rename from primary/pr/Sakura_sshly rename to playground/pr/Sakura_sshly diff --git a/primary/pr/ShpiTT b/playground/pr/ShpiTT similarity index 100% rename from primary/pr/ShpiTT rename to playground/pr/ShpiTT diff --git a/primary/pr/SiChuchen b/playground/pr/SiChuchen similarity index 100% rename from primary/pr/SiChuchen rename to playground/pr/SiChuchen diff --git a/primary/pr/Synclaw b/playground/pr/Synclaw similarity index 100% rename from primary/pr/Synclaw rename to playground/pr/Synclaw diff --git "a/primary/pr/U202114700-\351\235\263\345\256\217\345\215\232" "b/playground/pr/U202114700-\351\235\263\345\256\217\345\215\232" similarity index 100% rename from "primary/pr/U202114700-\351\235\263\345\256\217\345\215\232" rename to "playground/pr/U202114700-\351\235\263\345\256\217\345\215\232" diff --git "a/primary/pr/U202115652\346\235\216\345\230\211\351\271\217" "b/playground/pr/U202115652\346\235\216\345\230\211\351\271\217" similarity index 100% rename from "primary/pr/U202115652\346\235\216\345\230\211\351\271\217" rename to "playground/pr/U202115652\346\235\216\345\230\211\351\271\217" diff --git a/primary/pr/U202115661-cjj b/playground/pr/U202115661-cjj similarity index 100% rename from primary/pr/U202115661-cjj rename to playground/pr/U202115661-cjj diff --git a/primary/pr/V_Ronaldo b/playground/pr/V_Ronaldo similarity index 100% rename from primary/pr/V_Ronaldo rename to playground/pr/V_Ronaldo diff --git a/primary/pr/Yu_Zhenghao_789 b/playground/pr/Yu_Zhenghao_789 similarity index 100% rename from primary/pr/Yu_Zhenghao_789 rename to playground/pr/Yu_Zhenghao_789 diff --git a/primary/pr/a123456_icode b/playground/pr/a123456_icode similarity index 100% rename from primary/pr/a123456_icode rename to playground/pr/a123456_icode diff --git a/primary/pr/ai_junshun b/playground/pr/ai_junshun similarity index 100% rename from primary/pr/ai_junshun rename to playground/pr/ai_junshun diff --git a/primary/pr/alexi b/playground/pr/alexi similarity index 100% rename from primary/pr/alexi rename to playground/pr/alexi diff --git a/primary/pr/anecd b/playground/pr/anecd similarity index 100% rename from primary/pr/anecd rename to playground/pr/anecd diff --git a/primary/pr/aptx618 b/playground/pr/aptx618 similarity index 100% rename from primary/pr/aptx618 rename to playground/pr/aptx618 diff --git a/primary/pr/auspiciousing b/playground/pr/auspiciousing similarity index 100% rename from primary/pr/auspiciousing rename to playground/pr/auspiciousing diff --git a/primary/pr/bikoc b/playground/pr/bikoc similarity index 100% rename from primary/pr/bikoc rename to playground/pr/bikoc diff --git a/primary/pr/bx09 b/playground/pr/bx09 similarity index 100% rename from primary/pr/bx09 rename to playground/pr/bx09 diff --git a/primary/pr/cao_jingwei b/playground/pr/cao_jingwei similarity index 100% rename from primary/pr/cao_jingwei rename to playground/pr/cao_jingwei diff --git a/primary/pr/cflbea b/playground/pr/cflbea similarity index 100% rename from primary/pr/cflbea rename to playground/pr/cflbea diff --git a/primary/pr/chen-jiayi-2389 b/playground/pr/chen-jiayi-2389 similarity index 100% rename from primary/pr/chen-jiayi-2389 rename to playground/pr/chen-jiayi-2389 diff --git a/primary/pr/chengsgd b/playground/pr/chengsgd similarity index 100% rename from primary/pr/chengsgd rename to playground/pr/chengsgd diff --git a/primary/pr/chenying031003 b/playground/pr/chenying031003 similarity index 100% rename from primary/pr/chenying031003 rename to playground/pr/chenying031003 diff --git a/primary/pr/cherryJane b/playground/pr/cherryJane similarity index 100% rename from primary/pr/cherryJane rename to playground/pr/cherryJane diff --git a/primary/pr/chiaroscuro b/playground/pr/chiaroscuro similarity index 100% rename from primary/pr/chiaroscuro rename to playground/pr/chiaroscuro diff --git a/primary/pr/chimeng018 b/playground/pr/chimeng018 similarity index 100% rename from primary/pr/chimeng018 rename to playground/pr/chimeng018 diff --git a/primary/pr/computerexplorer b/playground/pr/computerexplorer similarity index 100% rename from primary/pr/computerexplorer rename to playground/pr/computerexplorer diff --git a/primary/pr/constancyy b/playground/pr/constancyy similarity index 100% rename from primary/pr/constancyy rename to playground/pr/constancyy diff --git a/primary/pr/dai-shixian b/playground/pr/dai-shixian similarity index 100% rename from primary/pr/dai-shixian rename to playground/pr/dai-shixian diff --git a/primary/pr/darkfallqweww_20240723 b/playground/pr/darkfallqweww_20240723 similarity index 100% rename from primary/pr/darkfallqweww_20240723 rename to playground/pr/darkfallqweww_20240723 diff --git a/primary/pr/docs/How-to-submit-a-PR/How-to-submit-a-PR.md b/playground/pr/docs/How-to-submit-a-PR/How-to-submit-a-PR.md similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/How-to-submit-a-PR.md rename to playground/pr/docs/How-to-submit-a-PR/How-to-submit-a-PR.md diff --git a/primary/pr/docs/How-to-submit-a-PR/images/fork.png b/playground/pr/docs/How-to-submit-a-PR/images/fork.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/fork.png rename to playground/pr/docs/How-to-submit-a-PR/images/fork.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/fork2woodrabbit.png b/playground/pr/docs/How-to-submit-a-PR/images/fork2woodrabbit.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/fork2woodrabbit.png rename to playground/pr/docs/How-to-submit-a-PR/images/fork2woodrabbit.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/git_logo@2x.png b/playground/pr/docs/How-to-submit-a-PR/images/git_logo@2x.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/git_logo@2x.png rename to playground/pr/docs/How-to-submit-a-PR/images/git_logo@2x.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/gitee_id.png b/playground/pr/docs/How-to-submit-a-PR/images/gitee_id.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/gitee_id.png rename to playground/pr/docs/How-to-submit-a-PR/images/gitee_id.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/macos-key.png b/playground/pr/docs/How-to-submit-a-PR/images/macos-key.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/macos-key.png rename to playground/pr/docs/How-to-submit-a-PR/images/macos-key.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/openEuler-git-basics-my-pull-request.png b/playground/pr/docs/How-to-submit-a-PR/images/openEuler-git-basics-my-pull-request.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/openEuler-git-basics-my-pull-request.png rename to playground/pr/docs/How-to-submit-a-PR/images/openEuler-git-basics-my-pull-request.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/pr.png b/playground/pr/docs/How-to-submit-a-PR/images/pr.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/pr.png rename to playground/pr/docs/How-to-submit-a-PR/images/pr.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/sign_individual_cla.png b/playground/pr/docs/How-to-submit-a-PR/images/sign_individual_cla.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/sign_individual_cla.png rename to playground/pr/docs/How-to-submit-a-PR/images/sign_individual_cla.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/submission_email.png b/playground/pr/docs/How-to-submit-a-PR/images/submission_email.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/submission_email.png rename to playground/pr/docs/How-to-submit-a-PR/images/submission_email.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/windows-key.png b/playground/pr/docs/How-to-submit-a-PR/images/windows-key.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/windows-key.png rename to playground/pr/docs/How-to-submit-a-PR/images/windows-key.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-complete-pull-request.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-complete-pull-request.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-complete-pull-request.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-complete-pull-request.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-create-pull-request.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-create-pull-request.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-create-pull-request.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-create-pull-request.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-new-branch.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-new-branch.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-new-branch.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-new-branch.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-pull-requests.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-pull-requests.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-pull-requests.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics-pull-requests.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-git-basics.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-2.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-2.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-2.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-2.png diff --git a/primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-3.png b/playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-3.png similarity index 100% rename from primary/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-3.png rename to playground/pr/docs/How-to-submit-a-PR/images/woodrabbit-pr-3.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/A-successful-coder-starts-with-a-qualified-PR.md b/playground/pr/docs/Starts-with-a-qualified-PR/A-successful-coder-starts-with-a-qualified-PR.md similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/A-successful-coder-starts-with-a-qualified-PR.md rename to playground/pr/docs/Starts-with-a-qualified-PR/A-successful-coder-starts-with-a-qualified-PR.md diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/A-successful-coder-starts-with-a-qualified-PR.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/A-successful-coder-starts-with-a-qualified-PR.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/A-successful-coder-starts-with-a-qualified-PR.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/A-successful-coder-starts-with-a-qualified-PR.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_0.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_0.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_0.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_0.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_1.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_1.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_1.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_1.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_2.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_2.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_2.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_2.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3a_mosaic.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3a_mosaic.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3a_mosaic.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3a_mosaic.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3b_mosaic.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3b_mosaic.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3b_mosaic.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_3b_mosaic.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4_mosaic.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4_mosaic.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4_mosaic.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/PR_Example_4_mosaic.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/openEuler-problem-coaching.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/openEuler-problem-coaching.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/openEuler-problem-coaching.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/openEuler-problem-coaching.png diff --git a/primary/pr/docs/Starts-with-a-qualified-PR/Images/xiongwei.png b/playground/pr/docs/Starts-with-a-qualified-PR/Images/xiongwei.png similarity index 100% rename from primary/pr/docs/Starts-with-a-qualified-PR/Images/xiongwei.png rename to playground/pr/docs/Starts-with-a-qualified-PR/Images/xiongwei.png diff --git a/primary/pr/dong-zhun b/playground/pr/dong-zhun similarity index 100% rename from primary/pr/dong-zhun rename to playground/pr/dong-zhun diff --git a/primary/pr/dongwei11 b/playground/pr/dongwei11 similarity index 100% rename from primary/pr/dongwei11 rename to playground/pr/dongwei11 diff --git a/primary/pr/dont-try-to-knock-me-down b/playground/pr/dont-try-to-knock-me-down similarity index 100% rename from primary/pr/dont-try-to-knock-me-down rename to playground/pr/dont-try-to-knock-me-down diff --git a/primary/pr/dou-jitong b/playground/pr/dou-jitong similarity index 100% rename from primary/pr/dou-jitong rename to playground/pr/dou-jitong diff --git a/primary/pr/driht b/playground/pr/driht similarity index 100% rename from primary/pr/driht rename to playground/pr/driht diff --git a/primary/pr/duan-wuhui b/playground/pr/duan-wuhui similarity index 100% rename from primary/pr/duan-wuhui rename to playground/pr/duan-wuhui diff --git a/primary/pr/duiri b/playground/pr/duiri similarity index 100% rename from primary/pr/duiri rename to playground/pr/duiri diff --git a/primary/pr/dwb1306 b/playground/pr/dwb1306 similarity index 100% rename from primary/pr/dwb1306 rename to playground/pr/dwb1306 diff --git a/primary/pr/dweang22713 b/playground/pr/dweang22713 similarity index 100% rename from primary/pr/dweang22713 rename to playground/pr/dweang22713 diff --git a/primary/pr/elan2017 b/playground/pr/elan2017 similarity index 100% rename from primary/pr/elan2017 rename to playground/pr/elan2017 diff --git a/primary/pr/elksmmx b/playground/pr/elksmmx similarity index 100% rename from primary/pr/elksmmx rename to playground/pr/elksmmx diff --git a/primary/pr/faiz3327774009 b/playground/pr/faiz3327774009 similarity index 100% rename from primary/pr/faiz3327774009 rename to playground/pr/faiz3327774009 diff --git a/primary/pr/fan-chaoming b/playground/pr/fan-chaoming similarity index 100% rename from primary/pr/fan-chaoming rename to playground/pr/fan-chaoming diff --git a/primary/pr/fanguangyin b/playground/pr/fanguangyin similarity index 100% rename from primary/pr/fanguangyin rename to playground/pr/fanguangyin diff --git a/primary/pr/fhy1201 b/playground/pr/fhy1201 similarity index 100% rename from primary/pr/fhy1201 rename to playground/pr/fhy1201 diff --git a/primary/pr/flavor-strawberry b/playground/pr/flavor-strawberry similarity index 100% rename from primary/pr/flavor-strawberry rename to playground/pr/flavor-strawberry diff --git a/primary/pr/fllm2 b/playground/pr/fllm2 similarity index 100% rename from primary/pr/fllm2 rename to playground/pr/fllm2 diff --git a/primary/pr/fxplorer b/playground/pr/fxplorer similarity index 100% rename from primary/pr/fxplorer rename to playground/pr/fxplorer diff --git a/primary/pr/gao-xiaobo b/playground/pr/gao-xiaobo similarity index 100% rename from primary/pr/gao-xiaobo rename to playground/pr/gao-xiaobo diff --git a/primary/pr/geek15 b/playground/pr/geek15 similarity index 100% rename from primary/pr/geek15 rename to playground/pr/geek15 diff --git a/primary/pr/geeuser b/playground/pr/geeuser similarity index 100% rename from primary/pr/geeuser rename to playground/pr/geeuser diff --git a/primary/pr/gmh1889 b/playground/pr/gmh1889 similarity index 100% rename from primary/pr/gmh1889 rename to playground/pr/gmh1889 diff --git a/primary/pr/gmscofield b/playground/pr/gmscofield similarity index 100% rename from primary/pr/gmscofield rename to playground/pr/gmscofield diff --git a/primary/pr/gui-junbin b/playground/pr/gui-junbin similarity index 100% rename from primary/pr/gui-junbin rename to playground/pr/gui-junbin diff --git a/primary/pr/guo-yiyang2004 b/playground/pr/guo-yiyang2004 similarity index 100% rename from primary/pr/guo-yiyang2004 rename to playground/pr/guo-yiyang2004 diff --git a/primary/pr/gyzxxzwaa b/playground/pr/gyzxxzwaa similarity index 100% rename from primary/pr/gyzxxzwaa rename to playground/pr/gyzxxzwaa diff --git a/primary/pr/h-sunset b/playground/pr/h-sunset similarity index 100% rename from primary/pr/h-sunset rename to playground/pr/h-sunset diff --git a/primary/pr/haha-cui b/playground/pr/haha-cui similarity index 100% rename from primary/pr/haha-cui rename to playground/pr/haha-cui diff --git a/primary/pr/hahhhmxsm b/playground/pr/hahhhmxsm similarity index 100% rename from primary/pr/hahhhmxsm rename to playground/pr/hahhhmxsm diff --git a/primary/pr/hanhong123456 b/playground/pr/hanhong123456 similarity index 100% rename from primary/pr/hanhong123456 rename to playground/pr/hanhong123456 diff --git a/primary/pr/he-hangyu1 b/playground/pr/he-hangyu1 similarity index 100% rename from primary/pr/he-hangyu1 rename to playground/pr/he-hangyu1 diff --git a/primary/pr/hmhhmh123 b/playground/pr/hmhhmh123 similarity index 100% rename from primary/pr/hmhhmh123 rename to playground/pr/hmhhmh123 diff --git a/primary/pr/hongmengchukai b/playground/pr/hongmengchukai similarity index 100% rename from primary/pr/hongmengchukai rename to playground/pr/hongmengchukai diff --git a/primary/pr/hu-yue111 b/playground/pr/hu-yue111 similarity index 100% rename from primary/pr/hu-yue111 rename to playground/pr/hu-yue111 diff --git a/primary/pr/huangxingyang b/playground/pr/huangxingyang similarity index 100% rename from primary/pr/huangxingyang rename to playground/pr/huangxingyang diff --git a/primary/pr/huisicnd b/playground/pr/huisicnd similarity index 100% rename from primary/pr/huisicnd rename to playground/pr/huisicnd diff --git a/primary/pr/hustzxl b/playground/pr/hustzxl similarity index 100% rename from primary/pr/hustzxl rename to playground/pr/hustzxl diff --git a/primary/pr/icecider b/playground/pr/icecider similarity index 100% rename from primary/pr/icecider rename to playground/pr/icecider diff --git a/primary/pr/iiii37 b/playground/pr/iiii37 similarity index 100% rename from primary/pr/iiii37 rename to playground/pr/iiii37 diff --git a/primary/pr/impultra b/playground/pr/impultra similarity index 100% rename from primary/pr/impultra rename to playground/pr/impultra diff --git a/primary/pr/isgaosn b/playground/pr/isgaosn similarity index 100% rename from primary/pr/isgaosn rename to playground/pr/isgaosn diff --git a/primary/pr/jiangdongyu b/playground/pr/jiangdongyu similarity index 100% rename from primary/pr/jiangdongyu rename to playground/pr/jiangdongyu diff --git a/primary/pr/jiangyimingqwer b/playground/pr/jiangyimingqwer similarity index 100% rename from primary/pr/jiangyimingqwer rename to playground/pr/jiangyimingqwer diff --git a/primary/pr/jieyun_dragon b/playground/pr/jieyun_dragon similarity index 100% rename from primary/pr/jieyun_dragon rename to playground/pr/jieyun_dragon diff --git a/primary/pr/jin-hongbo b/playground/pr/jin-hongbo similarity index 100% rename from primary/pr/jin-hongbo rename to playground/pr/jin-hongbo diff --git a/primary/pr/jingqiyue b/playground/pr/jingqiyue similarity index 100% rename from primary/pr/jingqiyue rename to playground/pr/jingqiyue diff --git a/primary/pr/jt-small-ash b/playground/pr/jt-small-ash similarity index 100% rename from primary/pr/jt-small-ash rename to playground/pr/jt-small-ash diff --git a/primary/pr/jun-kai-wang1 b/playground/pr/jun-kai-wang1 similarity index 100% rename from primary/pr/jun-kai-wang1 rename to playground/pr/jun-kai-wang1 diff --git a/primary/pr/junsd5 b/playground/pr/junsd5 similarity index 100% rename from primary/pr/junsd5 rename to playground/pr/junsd5 diff --git a/primary/pr/jwyuwcwjie b/playground/pr/jwyuwcwjie similarity index 100% rename from primary/pr/jwyuwcwjie rename to playground/pr/jwyuwcwjie diff --git a/primary/pr/kiedyffiy b/playground/pr/kiedyffiy similarity index 100% rename from primary/pr/kiedyffiy rename to playground/pr/kiedyffiy diff --git a/primary/pr/ksplite b/playground/pr/ksplite similarity index 100% rename from primary/pr/ksplite rename to playground/pr/ksplite diff --git a/primary/pr/kyrie2003 b/playground/pr/kyrie2003 similarity index 100% rename from primary/pr/kyrie2003 rename to playground/pr/kyrie2003 diff --git a/primary/pr/laijiayi b/playground/pr/laijiayi similarity index 100% rename from primary/pr/laijiayi rename to playground/pr/laijiayi diff --git a/primary/pr/lantianao b/playground/pr/lantianao similarity index 100% rename from primary/pr/lantianao rename to playground/pr/lantianao diff --git a/primary/pr/lcMiller b/playground/pr/lcMiller similarity index 100% rename from primary/pr/lcMiller rename to playground/pr/lcMiller diff --git a/primary/pr/lgood47 b/playground/pr/lgood47 similarity index 100% rename from primary/pr/lgood47 rename to playground/pr/lgood47 diff --git a/primary/pr/li-song-yang b/playground/pr/li-song-yang similarity index 100% rename from primary/pr/li-song-yang rename to playground/pr/li-song-yang diff --git a/primary/pr/li-taoos b/playground/pr/li-taoos similarity index 100% rename from primary/pr/li-taoos rename to playground/pr/li-taoos diff --git a/primary/pr/li-xin_yu b/playground/pr/li-xin_yu similarity index 100% rename from primary/pr/li-xin_yu rename to playground/pr/li-xin_yu diff --git a/primary/pr/li-xueyan0 b/playground/pr/li-xueyan0 similarity index 100% rename from primary/pr/li-xueyan0 rename to playground/pr/li-xueyan0 diff --git a/primary/pr/li-yacheng1100 b/playground/pr/li-yacheng1100 similarity index 100% rename from primary/pr/li-yacheng1100 rename to playground/pr/li-yacheng1100 diff --git a/primary/pr/li-zhuotong b/playground/pr/li-zhuotong similarity index 100% rename from primary/pr/li-zhuotong rename to playground/pr/li-zhuotong diff --git a/primary/pr/lianliansuki b/playground/pr/lianliansuki similarity index 100% rename from primary/pr/lianliansuki rename to playground/pr/lianliansuki diff --git a/primary/pr/lieninguiiijnnmm b/playground/pr/lieninguiiijnnmm similarity index 100% rename from primary/pr/lieninguiiijnnmm rename to playground/pr/lieninguiiijnnmm diff --git a/primary/pr/lin-sifan b/playground/pr/lin-sifan similarity index 100% rename from primary/pr/lin-sifan rename to playground/pr/lin-sifan diff --git a/primary/pr/listen-to-bai b/playground/pr/listen-to-bai similarity index 100% rename from primary/pr/listen-to-bai rename to playground/pr/listen-to-bai diff --git a/primary/pr/liu-yuhan1124 b/playground/pr/liu-yuhan1124 similarity index 100% rename from primary/pr/liu-yuhan1124 rename to playground/pr/liu-yuhan1124 diff --git a/primary/pr/ljm_tc b/playground/pr/ljm_tc similarity index 100% rename from primary/pr/ljm_tc rename to playground/pr/ljm_tc diff --git a/primary/pr/ljn2201630408 b/playground/pr/ljn2201630408 similarity index 100% rename from primary/pr/ljn2201630408 rename to playground/pr/ljn2201630408 diff --git a/primary/pr/lokite b/playground/pr/lokite similarity index 100% rename from primary/pr/lokite rename to playground/pr/lokite diff --git a/primary/pr/lu-zhongbai b/playground/pr/lu-zhongbai similarity index 100% rename from primary/pr/lu-zhongbai rename to playground/pr/lu-zhongbai diff --git a/primary/pr/luan-yunqin b/playground/pr/luan-yunqin similarity index 100% rename from primary/pr/luan-yunqin rename to playground/pr/luan-yunqin diff --git a/primary/pr/lucky_square b/playground/pr/lucky_square similarity index 100% rename from primary/pr/lucky_square rename to playground/pr/lucky_square diff --git a/primary/pr/luoisland b/playground/pr/luoisland similarity index 100% rename from primary/pr/luoisland rename to playground/pr/luoisland diff --git a/primary/pr/luxinhui b/playground/pr/luxinhui similarity index 100% rename from primary/pr/luxinhui rename to playground/pr/luxinhui diff --git a/primary/pr/luyoulongyicheng b/playground/pr/luyoulongyicheng similarity index 100% rename from primary/pr/luyoulongyicheng rename to playground/pr/luyoulongyicheng diff --git a/primary/pr/lwq2201630409 b/playground/pr/lwq2201630409 similarity index 100% rename from primary/pr/lwq2201630409 rename to playground/pr/lwq2201630409 diff --git a/primary/pr/lyq88888 b/playground/pr/lyq88888 similarity index 100% rename from primary/pr/lyq88888 rename to playground/pr/lyq88888 diff --git a/primary/pr/lzu-Glock b/playground/pr/lzu-Glock similarity index 100% rename from primary/pr/lzu-Glock rename to playground/pr/lzu-Glock diff --git a/primary/pr/m_engmeng b/playground/pr/m_engmeng similarity index 100% rename from primary/pr/m_engmeng rename to playground/pr/m_engmeng diff --git a/primary/pr/maasduan b/playground/pr/maasduan similarity index 100% rename from primary/pr/maasduan rename to playground/pr/maasduan diff --git a/primary/pr/mariohung128 b/playground/pr/mariohung128 similarity index 100% rename from primary/pr/mariohung128 rename to playground/pr/mariohung128 diff --git a/primary/pr/mawei6699 b/playground/pr/mawei6699 similarity index 100% rename from primary/pr/mawei6699 rename to playground/pr/mawei6699 diff --git a/primary/pr/mei_101 b/playground/pr/mei_101 similarity index 100% rename from primary/pr/mei_101 rename to playground/pr/mei_101 diff --git a/primary/pr/miraclemoutain/test.txt b/playground/pr/miraclemoutain/test.txt similarity index 100% rename from primary/pr/miraclemoutain/test.txt rename to playground/pr/miraclemoutain/test.txt diff --git a/primary/pr/mnbvlkjh098 b/playground/pr/mnbvlkjh098 similarity index 100% rename from primary/pr/mnbvlkjh098 rename to playground/pr/mnbvlkjh098 diff --git a/primary/pr/mourongc b/playground/pr/mourongc similarity index 100% rename from primary/pr/mourongc rename to playground/pr/mourongc diff --git a/primary/pr/mrhuang110014 b/playground/pr/mrhuang110014 similarity index 100% rename from primary/pr/mrhuang110014 rename to playground/pr/mrhuang110014 diff --git a/primary/pr/mtcmqq b/playground/pr/mtcmqq similarity index 100% rename from primary/pr/mtcmqq rename to playground/pr/mtcmqq diff --git a/primary/pr/muheart-xi b/playground/pr/muheart-xi similarity index 100% rename from primary/pr/muheart-xi rename to playground/pr/muheart-xi diff --git a/primary/pr/ni-nan b/playground/pr/ni-nan similarity index 100% rename from primary/pr/ni-nan rename to playground/pr/ni-nan diff --git a/primary/pr/ni-yutian b/playground/pr/ni-yutian similarity index 100% rename from primary/pr/ni-yutian rename to playground/pr/ni-yutian diff --git a/primary/pr/nighty-night-wu b/playground/pr/nighty-night-wu similarity index 100% rename from primary/pr/nighty-night-wu rename to playground/pr/nighty-night-wu diff --git a/primary/pr/niquange b/playground/pr/niquange similarity index 100% rename from primary/pr/niquange rename to playground/pr/niquange diff --git a/primary/pr/nivag8899 b/playground/pr/nivag8899 similarity index 100% rename from primary/pr/nivag8899 rename to playground/pr/nivag8899 diff --git a/primary/pr/obrian b/playground/pr/obrian similarity index 100% rename from primary/pr/obrian rename to playground/pr/obrian diff --git a/primary/pr/omittee b/playground/pr/omittee similarity index 100% rename from primary/pr/omittee rename to playground/pr/omittee diff --git a/primary/pr/one_above_all b/playground/pr/one_above_all similarity index 100% rename from primary/pr/one_above_all rename to playground/pr/one_above_all diff --git a/primary/pr/ones-gitee b/playground/pr/ones-gitee similarity index 100% rename from primary/pr/ones-gitee rename to playground/pr/ones-gitee diff --git a/primary/pr/oratous b/playground/pr/oratous similarity index 100% rename from primary/pr/oratous rename to playground/pr/oratous diff --git a/primary/pr/owenramber1989 b/playground/pr/owenramber1989 similarity index 100% rename from primary/pr/owenramber1989 rename to playground/pr/owenramber1989 diff --git a/primary/pr/panjunl b/playground/pr/panjunl similarity index 100% rename from primary/pr/panjunl rename to playground/pr/panjunl diff --git a/primary/pr/pfb2201620215 b/playground/pr/pfb2201620215 similarity index 100% rename from primary/pr/pfb2201620215 rename to playground/pr/pfb2201620215 diff --git a/primary/pr/phDc1301 b/playground/pr/phDc1301 similarity index 100% rename from primary/pr/phDc1301 rename to playground/pr/phDc1301 diff --git a/primary/pr/pygone b/playground/pr/pygone similarity index 100% rename from primary/pr/pygone rename to playground/pr/pygone diff --git a/primary/pr/qing-shu12 b/playground/pr/qing-shu12 similarity index 100% rename from primary/pr/qing-shu12 rename to playground/pr/qing-shu12 diff --git a/primary/pr/qscao b/playground/pr/qscao similarity index 100% rename from primary/pr/qscao rename to playground/pr/qscao diff --git a/primary/pr/resurgram b/playground/pr/resurgram similarity index 100% rename from primary/pr/resurgram rename to playground/pr/resurgram diff --git a/primary/pr/rogerson b/playground/pr/rogerson similarity index 100% rename from primary/pr/rogerson rename to playground/pr/rogerson diff --git a/primary/pr/rookie-pi b/playground/pr/rookie-pi similarity index 100% rename from primary/pr/rookie-pi rename to playground/pr/rookie-pi diff --git a/primary/pr/rosy b/playground/pr/rosy similarity index 100% rename from primary/pr/rosy rename to playground/pr/rosy diff --git a/primary/pr/s6ZnrKQK b/playground/pr/s6ZnrKQK similarity index 100% rename from primary/pr/s6ZnrKQK rename to playground/pr/s6ZnrKQK diff --git a/primary/pr/saber07 b/playground/pr/saber07 similarity index 100% rename from primary/pr/saber07 rename to playground/pr/saber07 diff --git a/primary/pr/sarisliu b/playground/pr/sarisliu similarity index 100% rename from primary/pr/sarisliu rename to playground/pr/sarisliu diff --git a/primary/pr/sdtf b/playground/pr/sdtf similarity index 100% rename from primary/pr/sdtf rename to playground/pr/sdtf diff --git a/primary/pr/seasonhan b/playground/pr/seasonhan similarity index 100% rename from primary/pr/seasonhan rename to playground/pr/seasonhan diff --git a/primary/pr/sgsrgsvsg b/playground/pr/sgsrgsvsg similarity index 100% rename from primary/pr/sgsrgsvsg rename to playground/pr/sgsrgsvsg diff --git a/primary/pr/shining-at-night b/playground/pr/shining-at-night similarity index 100% rename from primary/pr/shining-at-night rename to playground/pr/shining-at-night diff --git a/primary/pr/shiyan2 b/playground/pr/shiyan2 similarity index 100% rename from primary/pr/shiyan2 rename to playground/pr/shiyan2 diff --git a/primary/pr/sjzjn b/playground/pr/sjzjn similarity index 100% rename from primary/pr/sjzjn rename to playground/pr/sjzjn diff --git a/primary/pr/snyhai b/playground/pr/snyhai similarity index 100% rename from primary/pr/snyhai rename to playground/pr/snyhai diff --git a/primary/pr/song-yida b/playground/pr/song-yida similarity index 100% rename from primary/pr/song-yida rename to playground/pr/song-yida diff --git a/primary/pr/songyifan3367163 b/playground/pr/songyifan3367163 similarity index 100% rename from primary/pr/songyifan3367163 rename to playground/pr/songyifan3367163 diff --git a/primary/pr/src/main.c b/playground/pr/src/main.c similarity index 100% rename from primary/pr/src/main.c rename to playground/pr/src/main.c diff --git a/primary/pr/starry_night126 b/playground/pr/starry_night126 similarity index 100% rename from primary/pr/starry_night126 rename to playground/pr/starry_night126 diff --git a/primary/pr/stone320 b/playground/pr/stone320 similarity index 100% rename from primary/pr/stone320 rename to playground/pr/stone320 diff --git a/primary/pr/sunrise-zy b/playground/pr/sunrise-zy similarity index 100% rename from primary/pr/sunrise-zy rename to playground/pr/sunrise-zy diff --git a/primary/pr/sych b/playground/pr/sych similarity index 100% rename from primary/pr/sych rename to playground/pr/sych diff --git a/primary/pr/tang-siy b/playground/pr/tang-siy similarity index 100% rename from primary/pr/tang-siy rename to playground/pr/tang-siy diff --git a/primary/pr/tanying123456 b/playground/pr/tanying123456 similarity index 100% rename from primary/pr/tanying123456 rename to playground/pr/tanying123456 diff --git a/primary/pr/taoyinuo b/playground/pr/taoyinuo similarity index 100% rename from primary/pr/taoyinuo rename to playground/pr/taoyinuo diff --git a/primary/pr/tatongjinguang b/playground/pr/tatongjinguang similarity index 100% rename from primary/pr/tatongjinguang rename to playground/pr/tatongjinguang diff --git a/primary/pr/thezmmm b/playground/pr/thezmmm similarity index 100% rename from primary/pr/thezmmm rename to playground/pr/thezmmm diff --git a/primary/pr/timeokai b/playground/pr/timeokai similarity index 100% rename from primary/pr/timeokai rename to playground/pr/timeokai diff --git a/primary/pr/treasurejasmine b/playground/pr/treasurejasmine similarity index 100% rename from primary/pr/treasurejasmine rename to playground/pr/treasurejasmine diff --git a/primary/pr/trent66 b/playground/pr/trent66 similarity index 100% rename from primary/pr/trent66 rename to playground/pr/trent66 diff --git a/primary/pr/unhail b/playground/pr/unhail similarity index 100% rename from primary/pr/unhail rename to playground/pr/unhail diff --git a/primary/pr/w213123124214 b/playground/pr/w213123124214 similarity index 100% rename from primary/pr/w213123124214 rename to playground/pr/w213123124214 diff --git a/primary/pr/wang-hao-abcd b/playground/pr/wang-hao-abcd similarity index 100% rename from primary/pr/wang-hao-abcd rename to playground/pr/wang-hao-abcd diff --git a/primary/pr/wangkeli b/playground/pr/wangkeli similarity index 100% rename from primary/pr/wangkeli rename to playground/pr/wangkeli diff --git a/primary/pr/wei-yuhangngm b/playground/pr/wei-yuhangngm similarity index 100% rename from primary/pr/wei-yuhangngm rename to playground/pr/wei-yuhangngm diff --git a/primary/pr/weigaoyu b/playground/pr/weigaoyu similarity index 100% rename from primary/pr/weigaoyu rename to playground/pr/weigaoyu diff --git a/primary/pr/wffty b/playground/pr/wffty similarity index 100% rename from primary/pr/wffty rename to playground/pr/wffty diff --git a/primary/pr/wjdnmx b/playground/pr/wjdnmx similarity index 100% rename from primary/pr/wjdnmx rename to playground/pr/wjdnmx diff --git a/primary/pr/wlhqwq b/playground/pr/wlhqwq similarity index 100% rename from primary/pr/wlhqwq rename to playground/pr/wlhqwq diff --git a/primary/pr/woodrabbit b/playground/pr/woodrabbit similarity index 100% rename from primary/pr/woodrabbit rename to playground/pr/woodrabbit diff --git a/primary/pr/woodrabbit1 b/playground/pr/woodrabbit1 similarity index 100% rename from primary/pr/woodrabbit1 rename to playground/pr/woodrabbit1 diff --git a/primary/pr/woodrabbit_20240723 b/playground/pr/woodrabbit_20240723 similarity index 100% rename from primary/pr/woodrabbit_20240723 rename to playground/pr/woodrabbit_20240723 diff --git a/primary/pr/woodrabbit_bit b/playground/pr/woodrabbit_bit similarity index 100% rename from primary/pr/woodrabbit_bit rename to playground/pr/woodrabbit_bit diff --git a/primary/pr/woodrabbit_hust b/playground/pr/woodrabbit_hust similarity index 100% rename from primary/pr/woodrabbit_hust rename to playground/pr/woodrabbit_hust diff --git a/primary/pr/wtz b/playground/pr/wtz similarity index 100% rename from primary/pr/wtz rename to playground/pr/wtz diff --git a/primary/pr/wu-jh-hhh b/playground/pr/wu-jh-hhh similarity index 100% rename from primary/pr/wu-jh-hhh rename to playground/pr/wu-jh-hhh diff --git a/primary/pr/wxc b/playground/pr/wxc similarity index 100% rename from primary/pr/wxc rename to playground/pr/wxc diff --git a/primary/pr/wxr6666 b/playground/pr/wxr6666 similarity index 100% rename from primary/pr/wxr6666 rename to playground/pr/wxr6666 diff --git a/primary/pr/wyf b/playground/pr/wyf similarity index 100% rename from primary/pr/wyf rename to playground/pr/wyf diff --git a/primary/pr/wzx040728 b/playground/pr/wzx040728 similarity index 100% rename from primary/pr/wzx040728 rename to playground/pr/wzx040728 diff --git a/primary/pr/xieyan166 b/playground/pr/xieyan166 similarity index 100% rename from primary/pr/xieyan166 rename to playground/pr/xieyan166 diff --git a/primary/pr/xiong-youyue b/playground/pr/xiong-youyue similarity index 100% rename from primary/pr/xiong-youyue rename to playground/pr/xiong-youyue diff --git a/primary/pr/xixixixiaxiaxia b/playground/pr/xixixixiaxiaxia similarity index 100% rename from primary/pr/xixixixiaxiaxia rename to playground/pr/xixixixiaxiaxia diff --git a/primary/pr/xu-yuanqi b/playground/pr/xu-yuanqi similarity index 100% rename from primary/pr/xu-yuanqi rename to playground/pr/xu-yuanqi diff --git a/primary/pr/xuyuankun b/playground/pr/xuyuankun similarity index 100% rename from primary/pr/xuyuankun rename to playground/pr/xuyuankun diff --git a/primary/pr/xxy-k b/playground/pr/xxy-k similarity index 100% rename from primary/pr/xxy-k rename to playground/pr/xxy-k diff --git a/primary/pr/yang b/playground/pr/yang similarity index 100% rename from primary/pr/yang rename to playground/pr/yang diff --git a/primary/pr/yang-shengdeng b/playground/pr/yang-shengdeng similarity index 100% rename from primary/pr/yang-shengdeng rename to playground/pr/yang-shengdeng diff --git a/primary/pr/yang1416 b/playground/pr/yang1416 similarity index 100% rename from primary/pr/yang1416 rename to playground/pr/yang1416 diff --git a/primary/pr/yangle2004 b/playground/pr/yangle2004 similarity index 100% rename from primary/pr/yangle2004 rename to playground/pr/yangle2004 diff --git a/primary/pr/yangyangtai b/playground/pr/yangyangtai similarity index 100% rename from primary/pr/yangyangtai rename to playground/pr/yangyangtai diff --git a/primary/pr/yannnff b/playground/pr/yannnff similarity index 100% rename from primary/pr/yannnff rename to playground/pr/yannnff diff --git a/primary/pr/yesitis b/playground/pr/yesitis similarity index 100% rename from primary/pr/yesitis rename to playground/pr/yesitis diff --git a/primary/pr/yifan--001 b/playground/pr/yifan--001 similarity index 100% rename from primary/pr/yifan--001 rename to playground/pr/yifan--001 diff --git a/primary/pr/yinchangh b/playground/pr/yinchangh similarity index 100% rename from primary/pr/yinchangh rename to playground/pr/yinchangh diff --git a/primary/pr/yinzida b/playground/pr/yinzida similarity index 100% rename from primary/pr/yinzida rename to playground/pr/yinzida diff --git a/primary/pr/yoruet b/playground/pr/yoruet similarity index 100% rename from primary/pr/yoruet rename to playground/pr/yoruet diff --git a/primary/pr/ypl001 b/playground/pr/ypl001 similarity index 100% rename from primary/pr/ypl001 rename to playground/pr/ypl001 diff --git a/primary/pr/yu-wenzhe b/playground/pr/yu-wenzhe similarity index 100% rename from primary/pr/yu-wenzhe rename to playground/pr/yu-wenzhe diff --git a/primary/pr/yumuyumuyumu b/playground/pr/yumuyumuyumu similarity index 100% rename from primary/pr/yumuyumuyumu rename to playground/pr/yumuyumuyumu diff --git a/primary/pr/yuukoaioi b/playground/pr/yuukoaioi similarity index 100% rename from primary/pr/yuukoaioi rename to playground/pr/yuukoaioi diff --git a/primary/pr/yuwenzhou b/playground/pr/yuwenzhou similarity index 100% rename from primary/pr/yuwenzhou rename to playground/pr/yuwenzhou diff --git a/primary/pr/yuxuan292 b/playground/pr/yuxuan292 similarity index 100% rename from primary/pr/yuxuan292 rename to playground/pr/yuxuan292 diff --git a/primary/pr/yzfqy b/playground/pr/yzfqy similarity index 100% rename from primary/pr/yzfqy rename to playground/pr/yzfqy diff --git a/primary/pr/zbh b/playground/pr/zbh similarity index 100% rename from primary/pr/zbh rename to playground/pr/zbh diff --git a/primary/pr/zed-lee b/playground/pr/zed-lee similarity index 100% rename from primary/pr/zed-lee rename to playground/pr/zed-lee diff --git a/primary/pr/zetaohong b/playground/pr/zetaohong similarity index 100% rename from primary/pr/zetaohong rename to playground/pr/zetaohong diff --git a/primary/pr/zhang--chenhao b/playground/pr/zhang--chenhao similarity index 100% rename from primary/pr/zhang--chenhao rename to playground/pr/zhang--chenhao diff --git a/primary/pr/zhang-chengran b/playground/pr/zhang-chengran similarity index 100% rename from primary/pr/zhang-chengran rename to playground/pr/zhang-chengran diff --git a/primary/pr/zhang-chi118_admin b/playground/pr/zhang-chi118_admin similarity index 100% rename from primary/pr/zhang-chi118_admin rename to playground/pr/zhang-chi118_admin diff --git a/primary/pr/zhang-senlei b/playground/pr/zhang-senlei similarity index 100% rename from primary/pr/zhang-senlei rename to playground/pr/zhang-senlei diff --git a/primary/pr/zhang-shengheng b/playground/pr/zhang-shengheng similarity index 100% rename from primary/pr/zhang-shengheng rename to playground/pr/zhang-shengheng diff --git a/primary/pr/zhang-yaozhi233 b/playground/pr/zhang-yaozhi233 similarity index 100% rename from primary/pr/zhang-yaozhi233 rename to playground/pr/zhang-yaozhi233 diff --git a/primary/pr/zhao-shu-bo b/playground/pr/zhao-shu-bo similarity index 100% rename from primary/pr/zhao-shu-bo rename to playground/pr/zhao-shu-bo diff --git a/primary/pr/zhao-yaze b/playground/pr/zhao-yaze similarity index 100% rename from primary/pr/zhao-yaze rename to playground/pr/zhao-yaze diff --git a/primary/pr/zhaoli7979 b/playground/pr/zhaoli7979 similarity index 100% rename from primary/pr/zhaoli7979 rename to playground/pr/zhaoli7979 diff --git a/primary/pr/zhaoyanhaotian b/playground/pr/zhaoyanhaotian similarity index 100% rename from primary/pr/zhaoyanhaotian rename to playground/pr/zhaoyanhaotian diff --git a/primary/pr/zheng-lingfeng1 b/playground/pr/zheng-lingfeng1 similarity index 100% rename from primary/pr/zheng-lingfeng1 rename to playground/pr/zheng-lingfeng1 diff --git a/primary/pr/zheng-runoeng b/playground/pr/zheng-runoeng similarity index 100% rename from primary/pr/zheng-runoeng rename to playground/pr/zheng-runoeng diff --git a/primary/pr/zhisheng471 b/playground/pr/zhisheng471 similarity index 100% rename from primary/pr/zhisheng471 rename to playground/pr/zhisheng471 diff --git a/primary/pr/zhouzac b/playground/pr/zhouzac similarity index 100% rename from primary/pr/zhouzac rename to playground/pr/zhouzac diff --git a/primary/pr/zhuyunCynthia b/playground/pr/zhuyunCynthia similarity index 100% rename from primary/pr/zhuyunCynthia rename to playground/pr/zhuyunCynthia diff --git a/primary/pr/zjhhjz b/playground/pr/zjhhjz similarity index 100% rename from primary/pr/zjhhjz rename to playground/pr/zjhhjz diff --git a/primary/pr/zlj b/playground/pr/zlj similarity index 100% rename from primary/pr/zlj rename to playground/pr/zlj diff --git a/primary/pr/zou-xuemei b/playground/pr/zou-xuemei similarity index 100% rename from primary/pr/zou-xuemei rename to playground/pr/zou-xuemei diff --git a/primary/pr/zqipeng b/playground/pr/zqipeng similarity index 100% rename from primary/pr/zqipeng rename to playground/pr/zqipeng diff --git a/primary/pr/zqy411 b/playground/pr/zqy411 similarity index 100% rename from primary/pr/zqy411 rename to playground/pr/zqy411 diff --git a/primary/pr/ztong b/playground/pr/ztong similarity index 100% rename from primary/pr/ztong rename to playground/pr/ztong diff --git a/primary/pr/zxm b/playground/pr/zxm similarity index 100% rename from primary/pr/zxm rename to playground/pr/zxm diff --git a/primary/pr/zxyybb b/playground/pr/zxyybb similarity index 100% rename from primary/pr/zxyybb rename to playground/pr/zxyybb diff --git a/primary/pr/zy20031014 b/playground/pr/zy20031014 similarity index 100% rename from primary/pr/zy20031014 rename to playground/pr/zy20031014 diff --git a/primary/pr/zzb20106 b/playground/pr/zzb20106 similarity index 100% rename from primary/pr/zzb20106 rename to playground/pr/zzb20106 diff --git a/primary/pr/zzzzzz333333 b/playground/pr/zzzzzz333333 similarity index 100% rename from primary/pr/zzzzzz333333 rename to playground/pr/zzzzzz333333 diff --git "a/primary/pr/\345\274\240\346\231\272\351\223\255" "b/playground/pr/\345\274\240\346\231\272\351\223\255" similarity index 100% rename from "primary/pr/\345\274\240\346\231\272\351\223\255" rename to "playground/pr/\345\274\240\346\231\272\351\223\255" diff --git "a/primary/pr/\345\274\240\351\241\272\346\211\254" "b/playground/pr/\345\274\240\351\241\272\346\211\254" similarity index 100% rename from "primary/pr/\345\274\240\351\241\272\346\211\254" rename to "playground/pr/\345\274\240\351\241\272\346\211\254" diff --git "a/primary/pr/\346\235\216\345\263\245\350\277\234" "b/playground/pr/\346\235\216\345\263\245\350\277\234" similarity index 100% rename from "primary/pr/\346\235\216\345\263\245\350\277\234" rename to "playground/pr/\346\235\216\345\263\245\350\277\234" diff --git a/primary/info.txt b/primary/info.txt new file mode 100644 index 0000000000000000000000000000000000000000..8275d9c93eb21b659d88c7f7228d5f32c9490f6a --- /dev/null +++ b/primary/info.txt @@ -0,0 +1 @@ +Do: 基础知识与技能的PR。