- 博客(23)
- 资源 (3)
- 收藏
- 关注
原创 shell umask 内建命令的原理及其背后的内核态行为
umask(022) = 022umask(022) = 022write(1, "0022\n", 5) = 5int current_umask(void){ return current->fs->umask;}EXPORT_SYMBOL(current_umask);cscope 查看调用此函数的过程,在 namei.
2020-10-29 08:12:51 621
原创 /tmp 分区满的一个问题:cc1: error: code model kernel does not support PIC mode
突然间出现的问题怀疑 gcc 有问题,编译了一个 xxx.c 后报了如下错误:tunpong.c:79:1: fatal error: error writing to /tmp/ccyQFpRG.s: 设备上没有空间执行如下命令挂载 tmpfs 到 /tmp 中:sudo mount -t tmpfs tmpfs /tmp重新执行后正常!longyu@virt-debian10:~/kprobes$ df -h /tmp文件系统 容量 已用 可用 已用% 挂载点/dev/
2020-10-28 22:12:54 1542
原创 mount qemu qcow2、img
https://gist.github.com/shamil/62935d9b456a6f9877b5sudo qemu-nbd -f raw --connect=/dev/nbd0 ./debian10.img[longyu@debian-10:23:48:19] storge-pool $ sudo qemu-nbd --connect=/dev/nbd0 ./debian10.qcom2WARNING: Image format was not specified for ‘./debian10
2020-10-28 21:48:14 2170
原创 chroot 命令帮助信息与几个相关问题
chroot . /root/OSMSAgent_1/OSMSAgentinfo coreutils ‘chroot invocation’23.1 `chroot’: Run a command with a different root directory`chroot’ runs a command with a specified root directory. On manysystems, only the super-user can do this.(1) Synopses: c
2020-10-24 13:44:41 451
原创 linux 内核情景分析之 chroot 命令背后的内核态行为
基础知识如下内容摘自《Linux 内核源代码情景分析》 第 5 章。要访问一个文件就得先访问一个目录,才能根据文件名从目录中找到该文件的目录项,进而找到其 inode 节点:可是目录本身也是文件,它本身的目录项又在另一个目录项中,这一来不是成了"先有鸡还是先有蛋的问题",或者说递归了吗?这个圈子的出口在哪儿呢?我们不妨换一个方式来问这个问题,那就是:是否有这样一个目录,它本身的“目录项”不在其它目录中,而可以在一个固定的位置上或者通过一个固定的算法找到,并且从这个目录出发可以找到系统中的任何一个
2020-10-24 11:58:22 1261
原创 linux 命令分析之 chroot 的原理
chroot 的功能chroot 可以用来切换当前进程的【根目录】,它能够将当前进程能够访问的目录树结构限制在某个子目录中,同时由于当前进程创建的子进程将会继承父进程的根目录结构,所以子进程也随之被限定。chroot 命令的原理通过 strace 来跟踪一次 chroot 命令执行过程来研究其代码执行过程。这里我删除了与这个问题没有太大关系的一些输出,重要的系统调用信息如下:[root@localhost new_test]# strace chroot . shexecve("/usr/sbi
2020-10-24 07:37:22 3146
原创 阿里云服务器 yum install 命令一直超时,导致命令无法安装
问题描述如下图所示,使用 yum install 安装一些开发工具包的时候,使用阿里云自己的镜像仓库会超时,导致安装失败。排查过程根据过去的经验进行排查是否某个包的问题单独执行,安装一条命令如 yum install gcc,发现仍旧有相同的问题。修改 /etc/resolv.conf修改为自动生成的域名后发现镜像仓库域名解析失败,改回去后,ping 域名能够 ping 通,延时也在正常范围内(1ms),排除这个影响。关闭 selinux运行 enforce 0 关闭 s
2020-10-23 08:30:12 4264 2
原创 内核情景分析:强制杀死一个进程的执行过程
我们常常需要强制杀死一个进程,这种情况不同于正常退出的方式,一些退出流程将不会被执行,但实际操作中我发现内核中的一些退出流程还是能够执行的,这让我思考当一个进程接收到 SIGKILL 时内核中有怎样的处理流程。...
2020-10-20 12:37:02 2895
原创 什么是 unix environment?
unix 环境的概述环境是一个相对大范围的概念,unix 环境对该概念的作用范围进行了限定,尽管如此这个概念涉及的东西仍然十分庞大。从内核到系统调用到 shell 与系统库,这些都是环境的一部分。应用程序依赖于这些环境来完成创建、执行、销毁的全过程。这一过程的每一部分都相当复杂,具体的细节可以根据个人兴趣进行深入研究,但总体的架构却需要尽早的建立。登入 unix 系统后的控制环境登入 unix 系统时,系统通过读取系统数据文件 /etc/passwd (密码文件)来为我们准备登入的环境。通过校验
2020-10-17 10:01:23 657
原创 用两个例子诠释《APUE》中高级编程含义
字符串拷贝问题上一周,我无意中发现一本书—— 《Writing Bug-Free C Code》。在这本书的某一章中提到了 strncpy 函数存在的两个问题 ,看到这里的时候我比较惊讶。在很多书中都一直在强调 strcpy 中存在的问题,鼓励 c 语言开发者使用更安全的 strncpy 来代替 strcpy,确实没看到哪本书说 strncpy 函数存在的问题。心里面有点不以为然,就自己写代码去验证该书中提及的第一个问题——目标字符串没有足够空间时字符串的结尾 ‘\0’ 缺失的问题,结果发现确实如此,颇
2020-10-17 09:47:39 196
原创 cn_proc demo 中创建一个 netlink socket 背后的内核行为
前言本文中对 netlink socket 建立过程中的 socket 系统调用对应内核中的行为进行了分析,它围绕用户态程序中的如下代码展开: nl_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);NETLINK socket上述代码旨在创建一个 NETLINK socket,从字面意义上其实可以看出来是对 socket 的一种限定,可以将 netlink socket 看做是 socket 的一种子类。socket 系统调
2020-10-17 09:31:16 499
原创 linux 内核 connector 框架重要的数据结构及其联系
connector 中重要的数据结构connector 中有几个重要的数据结构:cn_queue_devcn_callback_idcn_callback_entrycn_devcn_queue_dev 与 cn_devcn_queue_dev 与 cn_dev 结构体中都有一个指向 struct sock 的指针,使用这个指针与网络模块关联起来。cn_callback_entry 与 cn_callback_idcn_callback_entry 是 connector 内部提供的注
2020-10-17 09:10:25 610
原创 STT_GNU_IFUNC 与 libc.so 的 GNU 扩展类型 ABI 问题
前言在 ELF file OS ABI invalid 与 chroot 大法 这篇文章中,我描述了 libc.so ABI 的特别之处,它的 ABI 为 GNU 扩展格式而非 System V 格式。在本文中研究下它如此特别的原因。elf.h 中的相关定义系统头文件路径中,与这个 ABI 相关的宏在 /usr/include/elf.h 文件中定义,相关代码摘录如下: 138 #define EI_OSABI 7 /* OS ABI identification */ 139
2020-10-17 08:46:19 1128
原创 gcc x64 环境中默认链接脚本分析之链接器基础命令功能介绍
本文中描述了默认链接脚本中使用的一些链接脚本关键词的功能。PROVIDE 相关命令与 . 标号PROVIDE 命令首先我们需要关注 PROVIDE 这个命令,其含义如下:在一些情况中,链接脚本需要定义一个只被引用且没有在链接时使用的任何对象文件中被定义的符号。例如,传统的链接器定义了 etext 符号。然而,ANSI C需要用户能够不遇到任何错误就能将 etext 作为一个函数的名称。PROVIDE 关键字可以被用来定义一个符号,例如 etext,相当于当它被引用且没有定义的时候提供一个默认
2020-10-17 08:34:06 1149
原创 gcc x64 环境中默认链接脚本分析之 preinit_array、constructor、destructor 相关分析
preinit_array 段脚本 .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); }preinit_array section 与 init_array section 功能类似,不过此 section 中的函数地址对应的函数在 init_array
2020-10-17 08:24:37 2368
原创 gcc x64 环境中默认链接脚本分析之 ENTRY 标号与 _start 函数
ENTRY 标号ENTRY(_start)ENTRY 标号指定可执行程序的入口。对应这里便是 _start 函数,这个函数为 main 函数执行做了一些准备工作。需要说明的是对用户程序代码而言 main 函数是执行入口,但对整个 elf 可执行文件而言,_start 文件才是执行入口。我在 嵌入式中指定程序执行入口 中有对 ENTRY 标号与程序执行入口更具体的描述,这里就不赘述了。_start 函数从哪里来?我们在编码时并没有实现任何名为 _start 函数,那这个函数是从哪里来的呢?实
2020-10-17 08:19:18 3549 1
原创 ELF file OS ABI invalid 问题与 chroot 解决方案
libc.so 的 elf 头部中,Magic 与大多数 so 文件、可执行文件不同。/usr/include/elf.h 138 #define EI_OSABI 7 /* OS ABI identification */ 139 #define ELFOSABI_NONE 0 /* UNIX System V ABI */ 140 #define ELFOSABI_SYSV 0 /* Alias. */ 141 #define ELFOSAB
2020-10-16 08:40:56 4483 1
原创 以 ixgbe pmd 驱动为例研究 dpdk pmd 驱动中注册中断回调函数并使能中断的过程
dpdk pmd 中注册中断回调函数并使能中断这里以 ixgbe pmd 驱动为例,进行研究。eth_ixgbe_dev_init 是 ixgbe 网卡的初始化函数,在这个函数的最后注册中断回调并使能中断。在配置了收发队列等等步骤后,注册中断回调函数,调用如下代码注册:rte_intr_callback_register(&pci_dev->intr_handle, ixgbe_dev_interrupt_handler, (void *)eth_dev);
2020-10-12 21:54:17 668
原创 分析 gcc 默认链接脚本
这里有如下两个地方需要注意:ENTRY(_start)ENTRY 标号指定可执行程序的入口为 __start 函数,这个函数为 main 函数执行做了一些准备工作,对用户程序代码而言 main 函数是执行入口,但对整个 elf 可执行文件而言,__start 文件才是执行入口。__start 函数在链接时[longyu@debian-10:07:42:57] x86_64-linux-gnu $ nm -o *.o | grep _startnm: crtn.o:无符号crt1.o:0000
2020-10-11 22:54:54 3314
原创 获取 gcc 默认链接脚本
elf 格式研究专栏文章前几个月研究了下内核模块的加载过程,发现在这一过程中有很多针对 elf 可执行文件的操作代码,如 elf 头的校验,elf 代码段与数据段的加载与内存中重新布局等等过程,最近在研究 exec 系统调用的实现时也看到了类似的过程,诸如 load_binary、load_shlib 等函数指针的实现代码。以上两个例子足以说明 elf 格式的重要性,基于这样的情况,我开一个新的专栏,着重研究下 elf 格式文件,同时也将内核中与 elf 解析等操作相关的代码进行分析,以期清除程序的加载
2020-10-11 07:49:31 3217
原创 nlmon 驱动只能抓取部分 netlink 报文的原因
static bool netlink_filter_tap(const struct sk_buff *skb){ struct sock *sk = skb->sk; /* We take the more conservative approach and * whitelist socket protocols that may pass. */ switch (sk->sk_protocol) { case NETLINK_ROUTE: case NETLINK_
2020-10-06 16:18:23 488
原创 connector 框架与 cn_proc 使用 demo 的深入分析
前言我在 替代传统 ps、top 等进程监控程序的方案 这篇文章中描述了目前现有的两种替代 ps、top 等进程监控程序的方案,在本篇文章中重点研究下第二种方案中 connector 框架的实现原理,以及上面提到的那篇博文中 cn_proc 使用 demo 的原理。connector 中重要的数据结构connector 中有几个重要的数据结构:cn_queue_devcn_callback_idcn_callback_entrycn_devcn_queue_dev 与 cn_dev 结构
2020-10-06 16:02:35 1707
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人