20211111 update

This commit is contained in:
shzhxh 2021-11-11 20:24:26 +08:00
parent 2dfd219d7c
commit 0e0d7eff50
26 changed files with 735 additions and 44 deletions

View File

@ -44,6 +44,8 @@ word$ # 行尾匹配
\b # 单词边缘的空字符串
\w # 相当于[:alnum:]
\W # 相当于[^_[:alnum:]]
\n # 在vim里搜索的时候代表换行在vim替换的时候代表0x00
\r # 在vim里搜索的时候代表CR在vim里替换的时候代表换行
```

View File

@ -0,0 +1,45 @@
```c
// 作用:创建连接的端点
// 返回值:一个指向网络插座的文件描述符
// domain定义连接域即协议族。
// AF_INET - IPv4协议
// type网络插座的类型也叫通信语义。
// SOCK_STREAM - 提供顺序的、可靠的、双向的、基于连接的字节流。
// SOCK_DGRAM - 支持数据报(无连接的,不可靠的,消息有最大长度)。
// protocol指定网络插座要用的协议。通常一个网络插座的类型对应唯一的协议此时此参数可指定为0但若存在对应多个协议的情况此时必须指定协议号。
int socket(int domain, int type, int protocol);
```
结构体
```c
/* 网络插座的地址 */
struct sockaddr {
__SOCKADDR_COMMON (sa_); /* 通用数据: 地址族和长度 */
// 注上一行展开后是unsigned short int sa_family;
char sa_data[14]; /* 地址数据,包含了端口号和地址 */
};
/* Internet网络插座的地址 */
struct sockaddr_in {
__SOCKADDR_COMMON (sin_);
// 注上一行展开后是unsigned short int sin_family;
in_port_t sin_port; /* 端口号 */
// 注in_port_t即uint16_t
// 注可以使用htons()把端口号由主机字节序转换为网络字节序
struct in_addr sin_addr; /* 地址 */
// 注inet_addr()可以把IP地址的点分十进制形式转换为网络字节序
// 注htonl()可以把IP地址由主机字节序转换为网络字节序
/* sin_zero是为了和`struct sockaddr'对齐,仅占位不使用 */
unsigned char sin_zero[sizeof (struct sockaddr)
- __SOCKADDR_COMMON_SIZE
- sizeof (in_port_t)
- sizeof (struct in_addr)];
};
// 关于struct in_addr的定义
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
```

View File

@ -45,10 +45,17 @@ $ # 变量参数
{} # 在子shell执行括号内的一组命令
[...] # 匹配括号内的任意一个字符
[!...] # 不包含括号内的所有字符
> # 输出重定向
> # 标准输出重定向
cmd 2> file # 把标准错误重定向到file
2>&1 # 把标准错误和标准输出都作为标准输出,然后重定向。其实现原理是把标准输出的文件描述符复制给标准错误。
>> # 标准输出追加
cmd 2>> file # 把标准错误追加到file
# cmd >> file 2>&1把标准输出和标准错误都追加到file里等同于cmd &>> file
< # 输入重定向
>> # 追加
# cat < abc.txt 意思就是把abc.txt作为cat命令的输入
命令 << 分界符 # 从标准输入设备读入直到分界符才停止
# cat << 0 意思是从键盘(标准输入)输入字符到cat命令直到0才停止
cmd < file1 > file2 # file1的内容作为cmd命令的输入cmd命令的输出放在file2里。
# shell可识别4种引字符号
' # 单引号。两个单引号之间的特殊字符均被识别为普通字符。

View File

@ -0,0 +1,47 @@
> 系统Ubuntu 18.04.6
>
> 内核版本5.4.0-87-generic
#### 1 下载内核与补丁
```
# 内核下载地址https://mirrors.edge.kernel.org/pub/linux/kernel/
# 补丁下载地址https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
# 通过与本地内核版本对比最接近的应该是5.4.154,故下载此版本的内核与补丁
mkdir rt_kernel && cd rt_kernel
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.154.tar.xz
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.154-rt65.patch.xz
tar xf linux-5.4.154.tar.xz
cd linux-5.4.154
xzcat ../patch-5.4.154-rt65.patch.xz | patch -p1
```
#### 2 配置内核
```
cp /boot/config-5.4.0-87-generic linux-5.4.154/.config
sudo apt install libncurses-dev bison flex bc libelf-dev libssl-dev
make oldconfig # 选Fully Preemptible Kernel (RT)
```
#### 3 编译内核
```
vim .config # 可注释掉CONFIG_DEBUG_INFO以减少内核大小
make -j4 deb-pkg # 我的CPU是4核故选-j4
```
##### 错误解决
```
##### 错误1
# 错误描述No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'
# 解决方法:编辑.config将CONFIG_SYSTEM_TRUSTED_KEYS置为空。
```
#### 4 安装deb包
```
sudo dpkg -i ../*.deb
```

11
OS/kerla/readme.md Normal file
View File

@ -0,0 +1,11 @@
#### boot
kernel/arch/x64/boot.S
#### bsp_early_init
kernel/arch/x64/boot.rs
#### boot_kernel
kernel/arch/x64/boot.rs

View File

@ -1,27 +1,26 @@
#### 1
#### 编译过程
`make rv64-image`
```bash
make rv64-image # 从Makefile可见是使用rcore-fs-fuse命令创建文件系统riscv64.img文件系统的内容来自于rootfs目录。
cd zCore && make build linux=1 arch=riscv64 # 从Makefile可见最终执行的是cargo build $(build_args)
# $(build_args)默认自带-Z build-std=core,alloc --target $(arch).json还会附加其它参数这是由make build的参数引入的比如linux=1会引入--features linux比如arch=riscv64且没有指定board的值会引入--features board_qemu等
# $(arch).json指定了链接脚本对于riscv64它是linker64.ld对于x86_64它是linker.ld在链接脚本里指定内核入口点为_start
```
使用`rcore-fs-fuse`命令创建文件系统riscv64.img文件系统的内容来自于rootfs目录。
#### 执行过程
#### 2
##### _start
`make run linux=1 arch=riscv64`
对于riscv64入口点`_start`定义在`entry64.asm`,通过`global_asm!`把这段汇编代码嵌入到`main.rs`。从`_start`开始先设置`satp`寄存器以映射虚拟地址,然后在虚拟空间里设置`sp`寄存器,跳转到`rust_main`。(`rust_main`仅有一个是针对riscv64平台的)
依赖于`build`和`justrun`。`build`先执行了`kernel`,后执行了`kernel_bin`。
对于x86_64入口点`_start`定义在`main.rs`,它最后跳转到`main`。(`main`有两个是针对linux和zircon两种情况)
`build`的参数有:`-Z build-std=core,alloc --target $(arch).json`,这是默认自带的;`--features linux`,这是`linux=1`引入的。
##### rust_main
`arch=riscv64`则规定了`build_args, build_path, qemu, OBJDUMP, OBJCOPY, ARCH, qemu_opts`
`rust_main`仅针对riscv64平台位置在`main.rs`。它的两个参数是来自于opensbi由`fw_platform_init`函数设置`a0,a1`两个寄存器得到的
#### 3
`rust_main`初始化日志系统,可以打印字符。初始化内存,重新映射内核。然后跳转到`main`开始执行。(`main`有两个是针对linux和zircon两种情况)
`build`的参数`rsicv.json`里指定了链接的方式,即`lnker64.ld`。它说入口点为`_start`。
##### main
#### 4
对于riscv64入口点`_start`在`entry64.asm`。它设置`satp`寄存器以映射虚拟地址,然后在虚拟空间里设置`sp`寄存器,跳转到`rust_main`。
#### 5
`rust_main`在`main.rs`。初始化日志系统,可以打印字符。初始化内存,重新映射内核。然后跳转到`main`开始执行。
`main`最后执行`run`函数开始调度用户态进程。

View File

@ -54,3 +54,14 @@ git submodule update # 更新子模块
```
#### 错误解决
1. could not get a repository handle for submodule 'rboot'
```
# git submodule update出错此错误提示删除了rboot目录下的.git文件即可原因未知。
# 曾尝试过git submodule deinit无效
# 曾尝试过rm -rf .git/modules/rboot无效
```

View File

@ -0,0 +1,13 @@
是catkin仓库下bin目录下的一个python脚本。
执行步骤:
1. 在安装catkin或覆盖之前catkin版本的时候找到相关的可导入的模块。
2. 通过`if __name__ == '__main__'`执行main函数
3. 使用`parse_args()`函数解析传入的参数
4. `apply_platform_specific_defaults()`来自于catkin包的builder模块用于为win32平台添加特定的参数
5. `handle_cmake_args()`函数如果定义了参数列表里的cmake参数`XXX_PREFIX`,则转化为其它参数
6. 设置参数列表里的`no_color`参数。
7. 解析参数列表,给相关变量赋值。
8. 使用相关的变量,执行`build_workspace_isolated()`函数。这个函数也来自于`catkin.builder`它通过cmake和make命令执行构建的过程。

256
Software/_ros命令/ros.md Normal file
View File

@ -0,0 +1,256 @@
#### 编译安装
##### 准备
```
# 1 安装bootstrap工具
sudo apt-get install python3-rosdep2 python3-rosinstall-generator python3-vcstool python3-rosinstall build-essential
pip3 install python3-nose # for test
pip3 install vcstool # for cmd : vcs
rosdep init
rosdep update
```
##### 安装ros_comm
```bash
# 2 安装
mkdir -p ros_catkin_ws/src && cd ros_catkin_ws
# 选项1:ros_comm基本库无GUI
rosinstall_generator ros_comm --rosdistro melodic --deps --tar > melodic-ros_comm.rosinstall
vcs import src < melodic-ros_comm.rosinstall
# 选项2desktop建议安装
rosinstall_generator desktop --rosdistro melodic --deps --tar > melodic-desktop.rosinstall
vcs import src < melodic-desktop.rosinstall
# 选项3desktop_full
rosinstall_generator desktop_full --rosdistro melodic --deps --tar > melodic-desktop-full.rosinstall
vcs import src < melodic-desktop-full.rosinstall
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
# 安装依赖
```
> ERROR: the following packages/stacks could not have their rosdep keys resolved
> to system dependencies:
> rosconsole: No definition of [log4cxx] for OS version []
> cpp_common: No definition of [boost] for OS version []
> message_filters: No definition of [boost] for OS version []
> rostest: No definition of [boost] for OS version []
> rosbag_storage: No definition of [libgpgme-dev] for OS version []
> class_loader: No definition of [boost] for OS version []
> pluginlib: No definition of [boost] for OS version []
> catkin: No definition of [python-argparse] for OS version []
> xmlrpcpp: No definition of [boost] for OS version []
> rostime: No definition of [boost] for OS version []
> rosbag: No definition of [boost] for OS version []
> rospack: No definition of [boost] for OS version []
```
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
```
> classloader 问题一:
>
> can not find lpthreads
>
> 解决方法apt install libevent-pthreads-2.1-7
>
> classloader问题二
>
> CMake Error at /usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
> Could NOT find Boost (missing: Boost_INCLUDE_DIR thread system)
> Call Stack (most recent call first):
> /usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
> /usr/share/cmake-3.18/Modules/FindBoost.cmake:2177 (find_package_handle_standard_args)
> CMakeLists.txt:12 (find_package)
>
> 解决方法apt install libboost-all-dev
>
> classloader问题三
>
> CMake Error at CMakeLists.txt:19 (find_package):
> By not providing "Findconsole_bridge.cmake" in CMAKE_MODULE_PATH this
> project has asked CMake to find a package configuration file provided by
> "console_bridge", but CMake did not find one.
>
> 解决方法apt install libconsole-bridge-dev
>
> classloader问题四
>
> CMake Error at /root/Code/ros_catkin_ws/install_isolated/share/cmake_modules/cmake/Modules/FindPoco.cmake:189 (MESSAGE):
> Poco was not found. Set the Poco_INCLUDE_DIR cmake cache entry to the
> top-level directory containing the poco include directories. E.g
> /usr/local/include/ or c:\poco\include\poco-1.3.2
> Call Stack (most recent call first):
> CMakeLists.txt:23 (find_package)
>
> 解决方法apt install libpoco-dev
>
> rospack问题五
>
> CMake Error at /usr/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
>
> Could NOT find TinyXML2 (missing: TinyXML2_LIBRARY TinyXML2_INCLUDE_DIR)
>
> 解决方法apt install libtinyxml2-dev
>
> rosconsole问题六
>
> CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
> Please set them or make sure they are set and tested correctly in the CMake files:
> LOG4CXX_LIBRARIES
> linked by target "rosconsole-utest" in directory /root/Code/ros_catkin_ws/src/rosconsole
> linked by target "rosconsole-thread_test" in directory /root/Code/ros_catkin_ws/src/rosconsole
>
> 解决方法: apt install liblog4cxx-dev
>
> roslz4问题七
>
> CMake Error at CMakeLists.txt:13 (message):
> lz4 includes not found
>
> 解决方法apt install liblz4-dev
>
> roscpp问题八
```
In file included from /root/Code/ros_catkin_ws/src/ros_comm/roscpp/src/libros/wall_timer.cpp:29:
/root/Code/ros_catkin_ws/src/ros_comm/roscpp/include/ros/timer_manager.h: In member function int32_t ros::TimerManager<T, D, E>::add(const D&, const boost::function<void(const E&)>&, ros::CallbackQueueInterface
*, const VoidConstPtr&, bool):
/root/Code/ros_catkin_ws/src/ros_comm/roscpp/include/ros/timer_manager.h:344:70: error: _1 was not declared in this scope
344 | waiting_.sort(boost::bind(&TimerManager::waitingCompare, this, _1, _2));
解决方法:在wall_timer.cpp里把_1替换为boost::placeholder::_1把_2替换为boost::placeholders::_2。
原因分析可能是编译器版本过高使用_1,_2作为bind占位符的方法已被弃用。请看提示#pragma message: The practice of declaring the Bind placeholders (_1, _2, ...) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.
```
> rosbag_storage问题九
>
> CMake Error at /usr/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
> Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR)
>
> 解决方法apt install libbz2-dev
>
> rosbag_storage问题十
>
> Linking CXX shared library /root/Code/ros_catkin_ws/devel_isolated/rosbag_storage/lib/librosbag_storage.so
>
> /usr/bin/ld: cannot find -lGPGME_LIBRARY-NOTFOUND
>
> 解决方法apt install libgpgme-dev libgpgme-dev-dbgsym libcrypto++-dev
>
> 修改CMakeFiles/rosbag_storage.dir/link.txt把-lGPGME_LIBRARY-NOTFOUND删掉
>
> 修改./CMakeFiles/rosbag_default_encryption_plugins.dir/link.txt把-lGPGME_LIBRARY-NOTFOUND删掉
>
> 问题分析:-lGPGME_LIBRARY-NOTFOUND太奇怪了不可能有这样的库吧
```
source install_isolated/setup.bash # 让安装的包生效
```
##### 安装mavros
```bash
# 1 创建工作区
mkdir -p mavros_ws/src && cd mavros_ws
catkin_init_workspace
wstool init src
# 2 安装mavlink
rosinstall_generator --tar --deps --rosdistro melodic mavlink | tee mavros.rosinstall
# 3 安装mavros
rosinstall_generator --tar --deps --upstream --rosdistro melodic mavros | tee -a mavros.rosinstall
# 4 创建工作区
vcs import src < mavros.rosinstall # 如存在下载错误则手动下载并解压到src目录
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
# 安装依赖
```
> ERROR: the following packages/stacks could not have their rosdep keys resolved
> to system dependencies:
> tf2_kdl: No definition of [eigen] for OS version []
> xmlrpcpp: No definition of [boost] for OS version []
> tf_conversions: No definition of [eigen] for OS version []
> rostest: No definition of [boost] for OS version []
> diagnostic_aggregator: No definition of [bondpy] for OS [debian]
> class_loader: No definition of [boost] for OS version []
> ros_comm: No definition of [roslisp] for OS [debian]
> libmavconn: No definition of [boost] for OS version []
> actionlib: No definition of [boost] for OS version []
> tf2_eigen: No definition of [eigen] for OS version []
> catkin: No definition of [python-argparse] for OS version []
> rospack: No definition of [boost] for OS version []
> trajectory_msgs: No definition of [rosbag_migration_rule] for OS [debian]
> pluginlib: No definition of [boost] for OS version []
> cpp_common: No definition of [boost] for OS version []
> orocos_kdl: No definition of [eigen] for OS version []
> rostime: No definition of [boost] for OS version []
> eigen_conversions: No definition of [eigen] for OS version []
> mavros_extras: No definition of [urdf] for OS [debian]
> message_filters: No definition of [boost] for OS version []
> test_rosbag: No definition of [boost] for OS version []
> rosbag: No definition of [boost] for OS version []
> tf2_sensor_msgs: No definition of [eigen] for OS version []
> rosconsole: No definition of [log4cxx] for OS version []
> python_orocos_kdl: No definition of [eigen] for OS version []
> test_mavros: No definition of [control_toolbox] for OS [debian]
> rosbag_storage: No definition of [libgpgme-dev] for OS version []
> mavros: No definition of [boost] for OS version []
```
# 5 安装GeographicLib数据集
./src/mavros/mavros/scripts/install_geographiclib_datasets.sh
# 6 编译
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
# catkin问题一:
CMake Warning at /usr/share/cmake/GMock/GMockConfig.cmake:68 (message):
Could not detect GTest version, Assuming v1.7.0 (or compatible) and hoping for the best
CMake Error at /usr/share/cmake-3.21/Modules/ExternalProject.cmake:2866 (message):
No download info given for 'GMock' and its source directory:
/usr/src/gmock
# 解决方法apt install libgmock-dev libgtest-dev
```
##### 更新
```
mv -i melodic-desktop-full.rosinstall melodic-desktop-full.rosinstall.old
rosinstall_generator desktop_full --rosdistro melodic --deps --tar > melodic-desktop-full.rosinstall
diff -u melodic-desktop-full.rosinstall melodic-desktop-full.rosinstall.old # 比较差异
vcs import src < melodic-desktop-full.rosinstall
./src/catkin/bin/catkin_make_isolated --install # 重新构建
source install_isolated/setup.bash
```
#### 初级教程
##### 配置
```
source /opt/ros/noetic/setup.bash
mkdir -p catkin_ws/src && cd catkin_ws
catkin_make # 在当前目录下创建工作空间
source devel/setup.bash # 把当前工作空间设置在环境变量的最顶层
echo $ROS_PACKAGE_PATH # 确认上一条source命令生效
```
##### 文件系统工具
```
rospack find roscpp # 查找roscpp包所在路径
rospack list # 列出所有已安装的包
rospack depends roscpp # 递归检查出roscpp所有的依赖包
rospack depends1 roscpp # 递归检查出roscpp的一级依赖
roscd roscpp # 切换到roscpp包所在路径
roscd log # 如运行过ros程序则切换到存储ros日志的目录。否则报错。
rosls roscpp # 显示roscpp包所在路径下的文件
```
##### 创建ros软件包
```
cd catin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp # 创建ros软件包beginner_tutorials它依赖于std_msgs、roscpp、rospy。
# package.xml
```

View File

@ -0,0 +1,12 @@
```
rosinstall_generator [options] --rosdistro <ROSDISTRO> [pkgnames]
```
#### 选项
```
--deps # 对依赖进行递归包含
--deps-up-to [DEPS_UP_TO...] #
--tar # 使用tarball而不是catkin包rosbuild栈总是tarball
```

View File

@ -11,13 +11,19 @@ tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]
#### 操作
```
# A:append
# c:create
# d:differences
# r:append
# t:list
# u:update
# x:extract
tar {-A|--catenate|--concatenate} [options] <archive> <archive>: 把归档文件添加到其它的归档文件
tar {-c|--create} [-f <achive>] [options] [file...] : 创建归档文件
tar {-d|--diff|--compare} [-f <achive>] [options] [file...] : 查找归档文件与文件系统的差别
tar --delete [-file <achive>] [options] [member...]: 从归档文件中删除。
tar {-r|--append} [-f <achive>] [options] [file...] : 向归档文件中添加文件
tar {-t|--list} [-f <achive>] [options] [member...] : 列出归档文件的内容
--test-label测试归档文件的卷标
tar {-u|--update} [-f <achive>] [options] [file...] : 更新归档文件的内容(即用新文件替代归档文件里的内容)
tar {-x|--extract|--get} [-f <achive>] [options] [member...]: 从归档文件中释放文件
--show-defaults 打印默认值
-?, --help : 打印帮助信息
--usage :打印可用的选项
--version : 打印版本信息
```
#### 选项

View File

@ -1,12 +0,0 @@
#### 编译安装
##### 准备
```
# 安装bootstrap工具
sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstool python3-rosinstall build-essential
rosdep init
rosdep update
```

View File

@ -0,0 +1,127 @@
rt-tests是一个用于测试各种Linux的实时特性的测试套件。包含的程序
##### [cyclictest](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start)
通过精确测量线程的预期唤醒时间和实际唤醒时间,以提供系统时延的统计信息。这些时延是由硬件、固件和操作系统引起的。
cyclictest通过运行一个非实时的主线程(调度类型SCHED_OTHER)来测试时延,它会启动固定数量的度量线程,这此度量线程有固定的实时优先级(调度类型SCHED_FIFO)。度量线程被在固定间隔内被计时器周期性地唤醒。随后,预期唤醒时间和实际唤醒时间通过共享内存传给主线程。主线程追踪时延的值并打印出它们。
```
cyclictest [options]
# 选项
-a, --affinity[=PROC-SET] # 指定哪些核来运行线程。不指定[PROC-SET],则使用所有的核。
-d, --distance=<DIST> # 线程间隔之间的距离单位us默认值500。当每个核上只有1个线程建议设置为0.当每个核上有多个线程用来隔开线程唤醒的时间这个值会累加到interval的值上。
-h, --histogram=<US> # 输出时延直方图(latency histogram)的数据,这些数据可以用来生成一个时延直方图。<US>是要跟踪的最大时延,以毫秒为单位。此选项会使所有线程的优先级相等。
-i, --interval=<INTV> # 线程间的基本间隔单位微秒默认值1000。即线程多久被唤醒1次。
-l, --loops=<LPS> # 设定循环的次数。默认为0(无限循环)。
-m, --mlockall # 锁定当前及未来的内存分配,以防止被换页的时候换出
-n, --nanosleep # 使用clock_nanosleep运行测试这样精度就更高了。如不用此选项则使用posix间隔计数器。
-p, --priority=<PRIO> # 设置第一个线程的优先级。
-S, --smp # 对SMP系统的标准测试选项。相当于"-t -a -n",且让所有线程的优先级保持相等
-t, --threads[=num] # 设置测试线程的数量。如果不指定[num]则为处理器的核心数。若不使用此选项则线程数为1.
# 示例
sudo cyclictest -t 5 -p 80 -n # 5个线程最高优先级80无限循环
sudo cyclictest -t 1 -p 99 -n -l 1000 -m -i 2 -h 100 # 1个线程优先级99循环1000次输出时延直方图
sudo cyclictest -m -S -p 80 -i 200 -d 0 # 测试smp系统的时延
```
结果的含意:
| 缩写 | 含义 | 描述 |
| ---- | -------- | ---------------------------------- |
| T | Thread | 线程索引和线程ID |
| P | Priority | RT线程的优先级 |
| I | Interval | 度量线程的预期唤醒周期单位us |
| C | Count | 时延被测量的次数,例如:迭代次数 |
| Min | Minimum | 测量到的最小时延单位us |
| Act | Actual | 最近完成的迭代测量到的时延单位us |
| Max | Maximum | 测量到的最大时延单位us |
##### cyclicdeadline
##### deadline_test
##### [hackbench](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/hackbench)
hackbench用来定位系统中的瓶颈这些瓶颈应该被消除或优化。
hackbench测试的是内核里的调度器。它还可以通过重复设置和删除线程来对内存子系统进行压力测试。此外它还可以在一定程度上对进程间通信如本地的网络插座管道等进行压力测试。
它可以测试系统的负载,但不能精确测试应用的负载,因为它不测试与设备的通信。
它创建若干对可调度实体(进程或线程),每对调度实体之间通过网络插座或管道通信,它会记录每对之间来回发送数据的时间。
```
hackbench [options]
# 选项
-p, --pipe # 使用管道发送数据。(默认用网络插座发送数据。)
-s, --datasize=<SIZE> # 每条消息的大小。默认100字节。
-l, --loops=<NUM> # 每个实体发送消息的数量。默认100条。
-g, --groups=<NUM> # 指定可调度实体的对数。默认10对。
-f, --fds=<NUM> # 每个实体要用的文件描述符数量。默认40个。
-T, --threads # 创建的是线程。
-P, --process # 创建的是进程。默认参数。
--help
# 示例
hackbench # 创建10对进程每个进程都通过网络插座发100条数据每条数据包含100字节每个进程使用40个文件描述符。
hackbench -p -T # 创建10对线程每个线程都通过管道发100条数据每条数据包含100字节每个线程使用40个文件描述符。
hackbench -s 512 -l 200 -g 15 -f 25 -P # 创建15对进程每个进程都通过网络插座发200条数据每条数据包含512字节每个进程使用25个文件描述符。
```
##### pip_stress
##### pi_stress
对互斥锁的优先级继承的压力测试。它作为时间优先级任务运行并启动inversion machine thread groups。每个inversion group都会导致优先级反转条件这样如果优先级继承不起作用则会死锁。
pi_stress线程是作为SCHED_FIFO或SCHED_RR线程运行的这意味着它们可以使系统关键线程饥饿。建议在pi_stress之前把系统关键线程的调度策略改为SCHED_FIFO并使用10以上的优先级以避免pi_stress使这些线程饥饿。
```
pi_stress [options]
# 选项
-i, --inversions=<n> # 指定反转条件的数量即所有inversion group可以反转条件的总数。默认是-1代表无限次。
-t, --duration=<n> # 指定测试运行时间为n秒。
-g, --groups=<n> # inversion group的数量默认10.
-d, --debug # 调试模式,会输出大量信息
-v, --verbose # 输出详细信息
-s, --signal # 在接收到SIGTERM信号(Ctrl+C)后结束。默认按下任意键结束。
-r, --rr # 让inversion threads作为SCHED_RR(round-robin)线程运行。默认是SCHED_FIFO。
-p, --prompt # 在真正进行压力测试之前进行提示
-u, --uniprocesor # 用一个处理器运行所有的线程。默认是inversion threads在一个处理器admin threads在其它的处理器。
-m, --mlockall # 锁定当前及未来的内存分配,以防止被换页的时候换出
-h
```
##### pmqtest
##### ptsematest
##### queuelat
##### rt-migrate-test
##### signaltest
##### sigwaittest
##### ssdd
##### svsematest
#### 编译与安装
```
sudo apt-get install build-essential libnuma-dev # 安装编译环境和必需的库
git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
cd rt-tests
git checkout stable/v1.0 # master分支不是稳定版所以要切换到stable分支
make all
make install
```

View File

@ -0,0 +1,17 @@
```
install [options] [-T] <src> <dst> # 把src复制为dst
install [options] <srcs> <dir> # 把srcs复制到dir目录
install [options] -t <dir> <srcs> # 把srcs复制到dir目录
install [options] -d <dirs> # 为dirs创建所有的组件
```
#### 选项
```
-d, --directory # 把所有参数都视为目录名,并给这些目录创建所有的组件
-D # 创建组件(对于-T选项是除了dst的所有先导组件对于-t选项是所有组件)然后把src复制到dst
-m, --mode=<MODE> # 指定权限模式(就像chmod命令那样比如0755代表rwxr-xr-x)
-t, --target-directory=<dir> # 把所有的src都复制进dir目录里
-T, --no-target-directory # 把dts视为普通文件
```

View File

@ -54,6 +54,9 @@ sed -i "s/oldstr/newstr/g" `grep oldstr -rl path`
#
sed -n 's/ magicmagicmagic/ /p' file1 > file2
# 把file1里278-280行的内容重定向到file2里
sed -n '278,280p' file1 > file2
```
#### 参考文档

View File

@ -12,7 +12,15 @@ sudo [option] <command> # 以其它用户的权限来执行命令
#### 添加sudo权限
```
# 方法一
visudo # 或vi /etc/sudoers
# 模仿root ALL=(ALL) ALL添加新行user_name ALL=(ALL) ALL
# 模仿root ALL=(ALL) ALL添加新行user_name ALL=(ALL) ALL
# 方法二
usermod -aG sudo <user_name>
# 在/etc/sudoers可以看到admin和sudo两个组都有sudo权限故可把用户加到这些个组以获得sudo权限
# 方法三
vi /etc/group # 直接修改/etc/group命令把用户加到admin或sudo组
```

View File

@ -96,3 +96,7 @@ cd .ssh && touch config # 创建config文件
> 如允许root登陆则“PermitRootLogin yes”不能注释
>
> 如允许使用密钥登陆则“PubkeyAuthentication yes”和“AuthorizedKeysFile .ssh/authorized_keys”不能注释
2. 提示对方机器"Connection refused"
> 经查是目标机器没有运行sshd故sudo apt install openssh-server

View File

@ -0,0 +1,14 @@
```
hash [options] [name...] # 显示或记住命令的位置。Linux每次启动会创建一个哈希表用来记住执行过的命令。执行命令的时候是先查哈希表再查PATH路径。这样就可以提高命令的调用效率。
```
选项
```
-d
-l
-p <pathname>
-r
-t
```

View File

@ -0,0 +1,4 @@
```
unset [options] [name...] # 在shell变量和函数里取消其值或属性的设置。即对于每个name删除其对应的变量或函数。
```

View File

@ -7,6 +7,8 @@ apt-cache [options] <command> # 检索apt缓存
```
depends <pkgs> # 列出pkg所依赖的包
rdepends <pkgs> # 列出所有依赖pkg的包
search <regex...> # 通过正则表达式搜索
show <pkg...> # 显示包的记录类似于dpkg --print-avail的功能
```

View File

@ -40,3 +40,18 @@ sudo apt install xxxx:i386 # 安装软件包并指定其架构为i386
# 原因分析:设置了代理
```
#### sources.list文件
- 以`#`开头:注释
- 以deb开头二进制仓库
```
deb URI section1 section2
# URI:库所在的地址。dists目录包含了所有软件包的索引其下的子目录名即为sections1,其中security代表重要的安全更新、updates代表建议的更新、proposed代表预释放的更新、backports代表不支持的更新。打开任意一个子目录其下的子目录名即为section2其中main代表完全的自由软件restricted代表不完全的自由软件universe代表ubuntu官方不支持仅靠社区支持的软件multiverse代表非自由软件完全不提供支持和补丁。
```
- 以deb-src开头源码仓库

View File

@ -25,3 +25,42 @@ diff [options] <files>
diff -ruN lab1/kern lab2/kern > lab2.patch # 递归比较lab2/kern文件夹与lab1/kern文件夹中所有文件不同之处结果输出到lab2.patch文件中。注生成的.patch文件是与patch命令配合使用的
```
#### 输出格式
由于历史原因,一共有三种输出格式:
- 普通格式
c改变
a增加
d删除
<:前一个文件中某行的内容
<:后一个文件中某行的内容
- 上下文格式:使用了-c选项
***:第一个文件
---:第二个文件
-:第一个文件中的此行在第二个文件中已被删除
+:此行在第一个文件中没有,但在第二个文件中有
!:两个文件都有此行,且内容有差别
- 合并格式:使用了-u选项
---:第一个文件
+++:第二个文件
-:同上下文格式
+:同上下文格式
@@:标记两个文件的行号、要显示的行数

View File

@ -27,6 +27,8 @@ build [options] # 编译一个包。
## 属性选项
## 编译选项
--traget <triple> # 指定编译的架构(默认是主机的架构)。triple的格式为<arch><sub>-<vendor>-<sys>-<abi>
# 也可以在配置文件里通过设置build.target实现同样的功能。
# 注:编译结果会放在不同的目录中。
## 输出选项
## 显示选项
## Manifest选项
@ -77,6 +79,7 @@ test # 对包执行单元和集成测试。用`--`分隔传给cargo的放前
##### manifest命令
```
update [options] # 把Cargo.lock里的依赖更新到最新的版本。Cargo.lock如不存在则创建。
```
@ -84,6 +87,7 @@ test # 对包执行单元和集成测试。用`--`分隔传给cargo的放前
##### 包命令
```
init [options] [path] # 创建Cargo包
install # 构建和安装一个rust库。
new # 创建一个cargo包
--bin # 默认选项。包里会有src/main.rs(二进制目标)。
@ -227,3 +231,4 @@ registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
- [cargo](https://doc.rust-lang.org/cargo/commands/cargo.html)
- `rustup doc --cargo`
- `cargo help <cmd>`
-

View File

@ -1,31 +1,81 @@
#### 简介
`cmake`的核心功能就是生成一个构建系统。构建系统描述了如何使用构建工具自动从源码构建可执行文件和库。比如Makefile就是一个构建系统它的构建工具就是`make`命令。`cmake`使用CMake语言通过一个叫生成器的后端来生成这个构建系统。
要生成一个构建系统,必须要指定的是:源码树、构建树、生成器。源码树在`CMakeLists.txt`里指定,构建树在`CmakeCache.txt`里指定,生成器通过`-G`选项指定,可以通过`cmake --help`查看当前都支持哪些生成器。
#### 用法
```bash
# 生成一个项目的构建系统
cmake [options] <path-to-source>
cmake [options] <path-to-existing-build>
cmake [options] -S <path-to-source> -B <path-to-build>
# 构建一个项目
cmake --build <dir> [<options>] [-- <build-tool-options>]
# 安装一个项目
cmake --install <dir> [<options>]
# 打开一个项目
cmake --open <dir>
# 运行一个脚本
cmake [{-D <var>=<value>}...] -P <cmake-script-file>
# 运行命令行工具cmd
cmake -E <cmd> [options]
# 运行find-package工具
cmake --find-package [options]
# 帮助信息
cmake --help [-topic]
```
#### 选项
##### 生成构建系统
```bash
-S <path-to-source> # 指定源码目录
-B <path-to-build> # 指定构建目录
-G <generator-name> # 指定生成器
-E # cmake命令模式
```
##### 构建项目
```
```
##### 安装项目
```
```
##### 运行命令行工具
```
```
##### 帮助信息
```
--help # 打印帮助信息
--help-command <cmd> # 打印命令<cmd>的帮助信息。
```
#### 生成器
- Unix Makefiles - 生成标准的UNIX makefiles。
#### cmake命令
#### 参考信息
```
man cmake
man 7 cmake-language
man 7 cmake-buildsystem
man 7 cmake-generators
https://cmake.org
```

View File

@ -8,6 +8,12 @@ gdb [选项] prog core # 调试程序prog并指定core文件(core文件是异
#### 选项
```
-ex <cmd> # 执行GDB命令<cmd>
```
#### 命令
##### 别名类

View File

@ -33,7 +33,7 @@
-j [jobs], --jobs[=jobs] # 指定并行的任务数量为[jobs]。如不写[jobs],则尽最大可能并行。
--jobserver-fds [R,W]
-k, --keep-going
-l [load], --load-average[=load]
-l [load], --load-average[=load] # 如果有其它任务在运行,且平均负载至少为[load](一个浮点数),则不启动新任务(命令)。如不带参数,则删除以前的负载限制。
-L, --check-symlink-times
-n, --just-print, --dry-run, --recon # 只打印命令而不执行它们
-o file