![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 54
lylhw13_
喜欢探究Linux源码,喜欢从本质分析问题
展开
-
linux中 list_entry 设计背景及原理解析
linux 源码中 list 数据结构应用广泛,设计巧妙。list_entry 的实现是一般初学者经常会感到疑惑的地方,这篇文章对这一问题做一阐释。原创 2023-05-22 22:30:15 · 904 阅读 · 0 评论 -
linux 环境变量中常见 path 说明及常见问题解决
linux 环境变量常见 path 说明原创 2022-08-28 17:00:49 · 593 阅读 · 0 评论 -
linux 一些知识点汇总
进程间通信的8种方式匿名管道popen有名管道FIFO信号信号量消息队列共享内存套接字5种 I/O 模型阻塞非阻塞异步信号驱动多路复用原创 2021-12-15 20:58:07 · 2481 阅读 · 0 评论 -
解析 linux 进程 pid 0, pid 1, pid 2 关系及启动过程
Linux 中有 pid 0, pid 1 和 pid 2 三个特殊的进程。本文以 Linux v2.6.39 为例,说明 Linux中这三个进程的关系及启动过程原创 2021-12-15 20:52:47 · 10118 阅读 · 0 评论 -
编译安装 libdwarf 记录
从 https://www.prevanders.net/dwarf.html#releases 下载最新的压缩包,本文下载的是libdwarf-0.3.1.tar.xztar xavf libdwarf-0.3.1.tar.xzcd libdwarf-0.3.1./configure --enable-shared --disable-static --disable-libelf --enable-wallmakemake checksudo make installcp ./src/li原创 2021-11-30 20:01:17 · 2201 阅读 · 0 评论 -
linux 内核编译安装记录 (验证可行)
https://www.kernel.org/cd Downloads$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.5.tar.xz$ tar xavf linux-5.15.5.tar.xz$ cd linux-5.15.5$ cp /boot/config-$(uname -r) .config$ make原创 2021-11-27 17:56:06 · 1411 阅读 · 1 评论 -
编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
Ubuntu 编译 Linux 内核经常会遇到如下错误:如果报错 canonical-certs.pem:如下:make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.make: *** [Makefile:1868: certs] Error 2在命令行中执行:scripts/config --disable SYSTEM_原创 2021-11-27 11:51:06 · 16328 阅读 · 5 评论 -
杂项命令的记录
$ read -s PASSWORD$ echo $PASSWORD原创 2021-11-20 21:17:24 · 289 阅读 · 0 评论 -
Linux 下一些调试工具汇总
常用工具trace-cmd - interacts with Ftrace Linux kernel internal tracerkernelshark - graphical reader for trace-cmd(1) outputstrace - trace system calls and signalsgcore - Generate a core file of a running programgdb - The GNU Debuggergprof - display call graph原创 2021-11-19 22:22:03 · 1624 阅读 · 0 评论 -
探究 sleep(0) 和 sched_yield()
#include <unistd.h>#include <stdio.h>int main(void) { int i; for (i = 0; i < 1000; ++i) { // while(1) { sleep(0); // printf("hello\n"); } return 0;}sudo trace-cmd record -P 12424 -p function_graphs原创 2021-11-16 22:22:01 · 1788 阅读 · 0 评论 -
人人都可以写协程:一个基于汇编的协程实现
本文以有栈非对称协程的实现为例。项目源码在 https://github.com/lylhw13/Coroutine-in-C。准备基本概念编写协程前需要明白几个概念:有栈协程和无栈协程有栈协程:通过保存运行时的堆栈及运行时的上下文来保存运行状态,需要改变调用栈。无栈协程:通过闭包或者状态机的方法记录程序的运行状态,不改变调用栈。对称协程和非对称协程对称协程:各协程之间可以进行执行权的切换。非对称协程:有一个中心化的调度器,所有协程都只和调度器进行执行权的切换。已有的实现案例原创 2021-11-13 23:16:37 · 970 阅读 · 0 评论 -
常用 tar 命令总结
常用格式tar 命令一般用来将文件归档并压缩,常用的文件格式如下:*.tar 仅将文件归档,不压缩*.tar.gz 将文件归档并压缩成 gz 格式*.tgz 上述格式的简写*.tar.bz2 将文件归档并压缩成 bz2 格式常用参数tar 的参数分为以下四类:主要操作模式: -A, --catenate, --concatenate append tar files to an archive -c, --create creat原创 2021-09-27 21:06:51 · 510 阅读 · 0 评论 -
windows, macos 和 linux 各平台的哈希校验方法汇总
macos 和 windows平台的哈希校验原创 2020-05-16 10:30:07 · 1998 阅读 · 0 评论 -
Linux 反汇编查看二进制文件的方法汇总
方法总共有三种od - dump files in octal and other formatsxxd - make a hexdump or do the reverse.hexdump, hd — ASCII, decimal, hexadecimal, octal dump这三种方法都是用来以指定格式查看文件,没有本质区别。其中只有 od 是 POSIX 标准,原因参考 Single UNIX rationale。以上面三种方式分别实现 hex + ASCII 显示:od$ od原创 2021-08-28 17:22:14 · 5887 阅读 · 0 评论 -
Linux 通过 log 日志检查服务器是否被暴力破解
log 日志位置不同的linux发行版,关于 ssh 的 log 信息存储的地方不同:Debian 和 Ubuntu 存储在 /var/log/auth.logRedHat 和 CentOS 存储在 /var/log/secure以 CentOS 为例查看 root 用户登录成功的IP及次数看看是否有不熟悉的 IP 地址grep "Accepted password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c原创 2021-08-25 23:19:39 · 5214 阅读 · 0 评论 -
通过 iptables 禁止 ping
ping 实现原理是,ICMP包分为 echo-request 和 echo-reply。使主机不被 ping方法1 直接拒绝icmp 的请求包sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT这时候尝试ping这台主机的话会出现Reply from 192.168.50.131: Destination port unreachable.方法2 直接丢弃 icmp 的请求包sudo iptables -A原创 2021-08-25 23:10:02 · 8718 阅读 · 0 评论 -
Linux 使用 dpkg 查询包名时遇到 no path found matching pattern 的解决方法
一般包名时会出现如下错误:$ dpkg -S <file_name>dpkg-query: no path found matching pattern <file_name>可能原因是:文件名是一个符号链接比如需要查询 nc 的包名称:$ which nc/usr/bin/nc$ dpkg -S /usr/bin/ncdpkg-query: no path found matching pattern /usr/bin/nc其中 which nc 查询出来的是原创 2021-08-17 00:01:03 · 1993 阅读 · 0 评论 -
Linux 查找具有相同 inode 号的文件
$ apt source iputils-pingReading package lists... DoneE: You must put some 'deb-src' URIs in your sources.list原创 2021-08-16 19:19:00 · 809 阅读 · 0 评论 -
解决 find 命令输出太多 Permission denied 等信息的问题
有时使用 find 命令输出太多 Permission denied, Operation not permitted 等无关信息,这些信息是错误信息,输出到标准错误输出。屏蔽所有错误信息:find ~ -name [file_name] 2>/dev/null屏蔽指定类型的信息find ~ -name [file_name] 2>&1 | grep -v "Operation not permitted"参考:How can I exclude all “permiss原创 2021-08-15 23:02:36 · 3966 阅读 · 0 评论 -
apt 与 dpkg 区别
apt 与 dpkg 均为 ubuntu 下面的包管理工具。dpkg 侧重于本地软件的管理。apt 基于dpkg,侧重于远程包的下载和依赖管理,相当于 dpkg 的前端。主要区别dpkg 仅用于安装本地的软件包,安装时不会安装依赖包,不解决依赖问题。sudo dpkg -i <package_name>.debapt 默认会从远程仓库搜索包的名字,下载并安装,安装时会自动安装依赖包,并解决依赖问题。sudo apt install <package_name>如果原创 2021-08-14 22:51:33 · 3946 阅读 · 0 评论 -
ftp 卡在 150 Opening data channel for directory listing of “/“
问题在 Ubuntu 使用命令行 ftp 时,使用 ls 命令会出现卡在 150 Opening data channel for directory listing of "/" 的情况。如下$ ftp 192.168.0.100Connected to 192.168.0.100.220-FileZilla Server 0.9.58 beta230 Logged onRemote system type is UNIX.ftp> pwd257 "/" is current dir原创 2021-08-11 23:27:55 · 6850 阅读 · 0 评论 -
sudo 和 su 的区别
sudoexecute a command as another user使用户能以超级用户身份或其他用户身份执行一条指令。不新启shell,不更改环境变量。需要的是当前用户的密码默认用法:sudo commands列出用户可以通过sudo执行的命令列表sudo -l通过 sudo,启动一个交互的 root shell,效果等同于su -sudo -isusubstitute user identity切换 user ID 和 group ID,使用户能以新的 user原创 2021-08-10 21:12:55 · 99 阅读 · 0 评论 -
一些 shell 命令的C语言简要实现
uname 打印系统信息$ uname Linuxc 语言实现原创 2021-08-08 23:10:05 · 406 阅读 · 0 评论 -
Linux 下 shell 命令源码下载方法
man 源码https://salsa.debian.org/debian/man-dbgit 克隆命令为:git clone https://salsa.debian.org/debian/man-db.gitGNU core utilitiesGNU 核心工具集,包含各操作系统通用的一套工具集。The GNU Core Utilities are the basic file, shell and text manipulation utilities of the GNU operat原创 2021-08-08 23:06:03 · 1003 阅读 · 0 评论 -
C 语言执行 shell 命令的三种方式总结
Linux 为执行 shell 命令,提供了三个函数接口,分别是 exec, system, popen。他们的区别简单总结如下:exec # 在当前进程中执行命令,其后所有的代码将被清空,不能执行system = fork + exec # 在子进程中执行 shell 指令popen = fork + exec + pipe # 根据执行的模式重定向子进程的标准输入或输出execexec 有一族相关函数,其作用是替换当前执行的程序为新程序(replaces the原创 2021-08-05 23:03:06 · 7001 阅读 · 0 评论 -
sha1 函数 C 语言使用示例及总结
库的安装及使用安装相应库sudo apt install libssl-dev代码中需要引入头文件#include <openssl/sha.h>编译时需要指定库 -lcryptogcc sha1_test.c -lcrypto使用方法如果数据可以一次性获得size_t len = strlen(data);unsigned char sha1[SHA_DIGEST_LENGTH];SHA1(data, len, sha1);如果数据分批获得SHA_CTX c原创 2021-07-30 23:06:13 · 1897 阅读 · 0 评论 -
zlib 库 Linux 平台使用示例及总结
库的安装及使用安装库,注意其中名称中是 1g 不是 lg。sudo apt install zlib1g-dev代码中需要引入头文件#include <zlib.h>编译时需要指定库 -lzgcc zlib_test.c -lz程序示例本程序基于官网源程序zpipe.c的修改而来。#include <zlib.h>#include <fcntl.h>#include <stdio.h>#include <string.h&g原创 2021-08-01 11:31:56 · 2082 阅读 · 0 评论 -
Linux CFS 完全公平调度算法 简明分析
CFS 完全公平调度策略简述调度器认为每个进程都应该运行同样的时间(公平可能就指此)总是选择时间运行的最少的进程nice 值高的进程时间增长的快,nice值低的进程时间增长的慢这里的时间是虚拟时间,即 vruntime,是经过权重加权过的时间,每个进程都会记录。具体实现每个进程都包含一个调度实体,调度实体内有 vruntime 变量。struct sched_entity { struct load_weight load; /* for load-balancing */ stru原创 2021-07-27 00:01:45 · 400 阅读 · 0 评论 -
Linux 进程调度简明总结
进程的优先级关系从下图可以看出:系统主要包括实时进程和普通进程。实时进程优先级高于普通进程,实时进程会比普通进程更优先得到调度。nice 值可以转换为对应的优先级值,即nice 值 (-20,19) 对应于优先级值 (100,139)。实时进程调度(Realtime Process Scheduling)实时进程调度具有两种策略:SCHED_FIFO (first-in, first-out) 先入先出策略SCHED_RR (round-robin) 时间片轮转策略相同点:会原创 2021-07-25 21:36:03 · 336 阅读 · 0 评论 -
操作系统进程调度算法总结
进程类型划分根据进程占用CPU 时间,可以将其划分为计算密集型和 I/O 密集型。计算密集型 (compute-bound): 具有较长的CPU运算时间,具有较少的 I/O 操作。I/O 密集型 (I/O-bound): 在 I/O 请求之间需要较少的CPU运算时间。调度算法分类根据如何处理时钟中断,可以把调度算法分为非抢占式调度算法和抢占式调度算法。非抢占式调度算法 (non-preemptive scheduling algorithm): 这种算法挑选一个进程运行,并一直运行到阻塞或原创 2021-07-24 17:36:27 · 2880 阅读 · 0 评论 -
Linux 系统调用之 epoll 优点源码解析
ep_poll 等待 文件就绪int epoll_create(int size);int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);几条主线:创建一个基于匿名文件的 epoll 描述符,并利用红黑树,保存感兴趣的 epoll_event 列表。因此感兴趣的原创 2021-07-22 23:56:15 · 181 阅读 · 1 评论 -
Linux 中系统调用 select,poll,epoll 优缺点总结
select示例函数原型typedef struct { unsigned long fds_bits [__FDSET_LONGS];} fd_set;int select(int ndfs, fd_set *readfds, fd_set *writefds, fd_set *exceptefds, struct timeval *timeout);使用示例:fd_set readfds,allfds;FD_ZERO(&allfds);FD_SET(1, &all原创 2021-07-18 22:01:01 · 296 阅读 · 1 评论 -
Linux 中进程上下文和中断上下文辨析
进程上下文和中断上下文没有本质区别,进程上下文的产生也是通过中断 int 0x80 来实现的。只不过进程上下文调用的是系统函数,中断上下文调用的是中断服务例程。进程上下文是一种内核所处的操作模式,此时内核代表进程执行。在进程上下文中,可以通过current 宏关联当前进程。此外进程是以进程上下文的形式连接到内核中的,因此,进程上下文可以睡眠,也可以调用调度程序。中断上下文和进程上下文的区别来自以下几点:也有current 指针,current 也是指向被中断的线程,但是中断上下文和进程没有关联,所以原创 2021-07-16 22:02:21 · 492 阅读 · 0 评论 -
内核访问用户空间的限制和方法
用户函数不能访问内核空间,而且用户函数进行系统调用的参数也是经过寄存器进行传递,那么内核能不能访问用户空间呢?内核函数是有访问用户空间的要求:如果一个系统调用需要超过6个参数,它们就只能借助进程内存空间中的C结构实例进行传递。系统调用将借助寄存器,将指向该结构实例的一个指针传递给内核。由系统调用的副效应产生的大量数据,必须通过指定的内存区交换数据。当然,该内存区必须在用户空间中,使得用户应用程序能够访问。但是内核函数却不能直接解引用用户空间的指针,基于以下原因:用户空间的指针指向的地址可能在原创 2021-07-15 22:51:31 · 1628 阅读 · 0 评论 -
常用中断控制方法解析
中断控制主要包含两部分内容:禁止和激活中断查询中断系统的状态禁止和激活中断简单的禁止和激活中断这种方法存在风险,比如,在执行 local_irq_enable() 时,会无条件的激活中断,但是可能在开始时原中断就是关闭的。local_irq_disable();/* 中断禁止区 */local_irq_enable();对于 x86 体系,这两个函数的具体实现如下,也就是汇编指令的直接使用:arch/x86/include/asm/irqflags.hstatic inline原创 2021-07-14 21:55:06 · 962 阅读 · 0 评论 -
Linux typecheck 宏解析
/* * 检查编译时类型 * 表达式为结果恒定为1,方便比较 */#define typecheck(type,x) \({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__dummy2); \ 1; \})/* * 编译时检查函数类型或者是该类型的指针 */#define typecheck_fn(type,function) \({ typeof(type) __tmp = functi原创 2021-07-13 00:20:09 · 453 阅读 · 0 评论 -
Linux 系统调用之 poll 源码剖析
核心逻辑对 Linux 2.6.36 中 poll 的代码简化如下,只列出了关键步骤以展示核心逻辑。static int do_poll(unsigned int nfds, struct poll_list *list, struct poll_wqueues *wait, struct timespec *end_time){ for (;;) { for (walk = list; walk != NULL; walk = walk->next) { /* 遍历每一个原创 2021-07-11 18:05:40 · 271 阅读 · 0 评论 -
Linux 内核驱动 poll 函数解析
内核驱动 poll 函数是支撑 poll,epoll 和 select 内核函数的底层机制。它可以查询一个或多个文件描述符的读写状态。poll 函数可以返回一个基于位的mask 值,用来表示是否可以无阻塞的读或写,并且能够在可读或写的时候唤醒相关休眠进程。如果将poll 函数置为 NULL,表示该设备可以无阻塞的读和写。文件对象的操作结构体Linux 中文件对象的操作由 file_operations 结构体表示:include/linux/fs.hstruct file_operations {原创 2021-07-11 15:57:38 · 2018 阅读 · 0 评论 -
Linux 系统调用之 select 源码剖析
Linux 中 select 实现的核心逻辑对 Linux 2.6.36 中 select 的代码简化如下,只列出了关键步骤以展示核心逻辑。SYSCALL_DEFINE5(select, int, n, fd_set *, inp, fd_set *, outp, fd_set *, exp, struct timeval *, tvp){ if (tvp) { /* 判断是否设置超时时间 */ if (copy_from_user(&tv, tvp, sizeof(tv)))原创 2021-07-11 12:09:03 · 512 阅读 · 0 评论 -
硬链接和符号链接解析
链接分为符号链接和硬链接创建方法为:/* 创建硬链接 */ln ori_file hard_link_name/* 创建符号链接 */ln -s ori_file symbolic_link_name硬链接创建的硬链接和原来文件共享一个 inode 节点。inode 节点含有一个 i_nlink 计数器,记录使用该 inode 的硬链接的总数。Linux 中文件内容实际与 inode 一一对应,原来的文件就相当于一个硬链接。所以硬链接和原来文件不存在质的区别。删除一个硬链接是只会使 i_原创 2021-07-09 00:15:43 · 246 阅读 · 0 评论