Linux
文章平均质量分 92
-飞鹤-
喜欢音乐,喜欢文学,喜欢跑步,喜欢编程!
展开
-
Shell脚本简明教程
Shell脚本是一种简单的脚本语言,运行在Unix-like的操作系统上,像Linux,mac, unix等。Shell脚本的解析器是shell,Unix-like系统很多,所以出现了很多不同的shell,像tcsh, csh, ash, bash, dash等。像Ubuntu默认使用的Shell是dash,其特点是解析执行速度快,缺点是支持的语法特性少。bash使用更为便捷,此文主要以bash解释器为基础来进行讲解。Shell有一些老的语法形式,不推荐使用,此文不讲解。原创 2022-09-09 17:18:56 · 3459 阅读 · 0 评论 -
Shell编程之代码规范
代码编写规范,主要包括两部分,代码风格和最佳工程实践。在代码风格上,没有一种代码编写风格是最好的,更重要的是与已有项目代码风格保持一致,以提高项目团队整体对代码的可读性。在工程实践上,统一一些开发流程,提升团队的协作效率,另外就是最佳工程实践规范,以提高代码的性能、可靠性以及可读性。1.2. 基本原则参考主流Shell编程命名代码风格。代码规范借鉴工具ShellCheck。在性能足够的情况下,可读性优先考虑。原创 2022-08-23 14:32:22 · 2459 阅读 · 0 评论 -
Linux内核开发——新添内核用户接口
用户态的程序如果想访问内核态的程序,并不能直接访问,而是通过中断处理机制来完成的。CPU提供一个陷入指令(Traps),亦称访管指令。用户态程序通过syscall附加系统调用号以及参数来完成对内核接口的调用。syscall是glibc封装的接口,其底层实现主要是发起一个陷入指令中断int $0x80,然后内核处理处理此中断函数。系统调用号,是一系列从0开始递增的数字,其实质是一组数组的下标,而这个数组存放一内核接口函数的地址。这样在内核响应陷入指令后,就可以通过系统调用号找到相应的函数地址,然后来调用相原创 2022-06-24 07:00:00 · 905 阅读 · 1 评论 -
Linux内核开发——编译Ubuntu 20.04内核代码
可以使用下列可以直接下载一个比当前内核版本新的代码,也可以去https://mirrors.edge.kernel.org/pub/linux/kernel下载自己内核使用的版本。此文下载的是更新的版本 5.17.15,去官网https://www.kernel.org/,下载linux-5.17.12.tar.xz。不同版本的Ubuntu,需要对应不同版本的源。可以通过。https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/上可以选择不同版本的Ubuntu对应的源原创 2022-06-23 13:39:05 · 8206 阅读 · 0 评论 -
Linux内核开发——内核镜像文件及启动过程
vmlinux是elf(Excutable And Linkable),即可执行文件。里面含有调试信息,可用于调试,所以占有空间较大。gcc编译连接之后直接生成vmlinux文件。efl文件含有调试信息,太占空间了,gcc提供了objcopy工具,可以将elf文件中的调试信息去除,只留下可执行指令的二进制指令。Image文件依然比较大,此时可以使用gzip来压缩Image文件得到zImage文件。引导文件在加载zImage文件之后,会利用gzip进行解压,然后执行相关指令。gzip的压缩率不太优秀,bzIm原创 2022-06-23 12:35:07 · 2157 阅读 · 0 评论 -
使用Stace排除故障的5种简单方法
我一直很惊讶很少有人意识到他们能够使用Strace做的所有事情。它一直是我最先推出的调试工具之一,因为它通常在我使用的Lunux系统上是可用的,并且它能够被用来解决如此广泛的问题。Strace是一个追踪可执行程序系统调用的简单工具。在它最简单的形式中,它可以从头到尾追踪一个二进制可执行文件,并且输出一行文本,其包含系统调用,参数和每个进程生命周期内的每个系统调用的返回值。而且它能够做更多:如果你用过其他Unix系统,这是类似于“truss"。另一个(更全面)是Sun的Dtrace。此处只做浅显的研究,重要性翻译 2022-06-21 09:57:04 · 825 阅读 · 0 评论 -
Linux开发之libaio源码分析及应用
Linux的POSIX API由glibc提供,2000年年之前,glibc一直没有提供异步I/O的调用API。Red Hat公司基于Linux内核的符号表封装了一套异步I/O(简称aio)的接口,并提供了一些新的接口用来简化上下文配置,开成一个库,命名为libaio。glibc后来有实现一套异步I/O,其实现是用多线程来封装同步的I/O以达到异步的效果,但是因为存在线程的切换,性能并不好。Linux Kernel 2.6引入了libaio的几个接口定义,但glibc并没有提供相应的API接口,如果要使原创 2022-06-16 18:03:21 · 6971 阅读 · 0 评论 -
Linux开发之Makefile简明教程及示例
前言Linux下的开发,一般都是基于开源的编译器,很多时候并没有太好的IDE,此时非常有必要掌握一门通用的编译构建方法。Makefile应运而生,成功了最流行的Linux下的编译构建方法。Makefile主要是面向代码的编译构建,但是其目标依赖执行的基本原理,也可以用到其他有类似的场景。1. 概念...原创 2020-12-22 11:52:56 · 5731 阅读 · 0 评论 -
Linux开发之C++操作文件及文件夹
1. 文件读写1.1. open● 函数头文件:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>● 函数原型:int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);flags常用的有3种,O_RDONLY, O_WRONLY, O_RD原创 2020-12-07 16:22:44 · 1110 阅读 · 0 评论 -
Linux开发之C++存储设备通信
1. 简介早期的存储设备是SCSI接口,与计算通信也是基于SCSI协议。后来USB接口存储设备、SATA接口、PCIe接口的存储设备,也都是兼容SCSI协议的。所以利用SCSI传输协议可以与所有的存储设备通信。2. 开源软件● sg_raw,可以设置任何SCSI命令。// 写,从文件data.bin读取数据写入设备(SG1581)sg_raw -s 1k -i data.bin /dev/sde a2 00 00 00 00 00 00 02// 读sg_raw -r 1k /dev/dse原创 2020-11-27 19:20:52 · 1855 阅读 · 0 评论 -
Linux开发之C++静态库和动态库详解
1. 简介根据编译和运行的机制,链接库也静态库和动态库两种。gcc/g++的静态库文件默认以.a后缀标识,动态库默认以.so文件标识(Windows下和Linux下相同)。1.1. 静态库gcc编译源文件之后会生成.o二进制的目标文件,我们可以直接连接.o文件生成可执行文件。.o文件在某种程度上也算是一种库,只是如果.o太多,发布就太麻烦。静态库就相当一个将所.o文件打包成一个文件,是所有二进制目标文件的集合,并没有链接过程。所以一些链接的问题,在编译静态库期间不会出现。1.2. 动态库动态库,动原创 2020-11-24 21:08:15 · 1193 阅读 · 0 评论 -
Linux开发之gcc/g++基本用法
1. 主要组成部分1.1. 预处理器预处理器(Preprocessor),主要完成头文件展开,宏替换,消除注释等,生成C代码文件.i。在.i文件中,我们可以看到展开后的头文件是怎么样的,可以看到替换后的宏是什么样的。gcc -E main.c -o main.ig++ -e main.cpp -o main.ii1.2. 编译器编译器(Compiler),主要是将标准C/CPP文件编译成汇编文件。在.s文件中,我们可以看到生成的汇编指令。gcc/g++ -S main.i -o main原创 2020-11-24 20:59:12 · 613 阅读 · 0 评论