Kernel

【译】Linux Conntrack:为什么它会崩溃,如何避免这个问题

#kernel

连接跟踪(“conntrack”)是 Linux 内核网络栈的核心特性。它允许内核跟踪所有的逻辑网络连接或数据包流,从而识别组成每个流的所有数据包,以便能够统一的处理它们。

阅读更多

November 1, 2022

【译】使用 SO_REUSEPORT 套接字选项提升服务性能

#kernel

原文地址:https://blog.flipkart.tech/linux-tcp-so-reuseport-usage-and-implementation-6bfbf642885a 前言 Linux 网络栈中有一个相对较新的特性——SO_REUSEPORT 套接字选项,可以使用它来提升你的服务性能。 图 1: 上面的服务是使用并行监听器来避免请求连接瓶颈,而下面的服务只使用一个监听器来接收连接

阅读更多

October 29, 2022

使用 eBPF 和 XDP 高速处理数据包

#ebpf#kernel

前言 本文是一篇学习翻译文章,原文在这里。 XDP 是一种特殊的 eBPF 程序,在数据包处理上因为在协议栈之前就可以处理数据,所以有非常高的性能。

阅读更多

November 20, 2021

linux5.3.0编译运行LINUX内核源码中的BPF示例代码

#kernel#ebpf

前言 环境:ubuntu 18.04,内核版本 5.3.0。 安装内核: apt-get install linux-image-5.3.0-70-generic apt-get install linux-headers-5.3.0-70-generic apt-get install linux-source-5.3.0 ebpf-tools编译 下面简单记录编译 bpf-tools 时的一些过程。 源码解压到/data/linux-source-5.3.0/目录下,进行工具编译。直接进入工具目录进行编译:

阅读更多

March 31, 2021

来玩 TencentOS tiny 物联网终端操作系统

#life#kernel#生活

前言 公司前段时间发起了一个活动,免费给大家提供开发板,让大家基于 TencentOS tiny 采集数据,通过wifi、以太网、LoRaWAN、NB-IoT、2G、4G、BLE、或者网关设备、调用腾讯云SDK组件、实现数据快速上传到 IoT explorer 开放平台,然后基于腾讯云 IoT 微信小程序框架搭建小程序应用或者其他web应用,从而实现端到端的IoT解决方案。

阅读更多

September 20, 2020

内核通信之 Netlink 源码分析和实例分析

#netlink#kernel#netfilter

前言 这几天在看 ipvs 相关代码的时候又遇到了 netlink 的事情,所以这两天花了点时间重新把 netlink 的事情梳理了一下。 什么是 netlink linux 内核一直存在的一个严重问题就是内核态和用户态的交互的问题,对于这个问题内核大佬们一直在研究各种方法,想让内核和用户态交互能够安全高效的进行。如系统调用,proc,sysfs等内存文件系统,但是这些方式一般都比较简单,只能在用户空间轮询访问内核的变化,内核的变化无法主动的推送出来。

阅读更多

July 25, 2020

【译】基于 eBPF 的 Linux 可观测性

#kernel#ebpf

基于 eBPF 的 Linux 可观测性

阅读更多

March 30, 2020

ebpf 学习梳理和测试使用

#kernel#ebpf

在 ubuntu 系统中测试 ebpf 程序。

阅读更多

March 21, 2020

【转载】从Hadoop到Spark的架构实践

#Spark#kernel

当下,Spark已经在国内得到了广泛的认可和支持:2014年,Spark Summit China在北京召开,场面火爆;同年,Spark Meetup在北京、上海、深圳和杭州四个城市举办,其中仅北京就成功举办了5次,内容更涵盖Spark Core、Spark Streaming、Spark MLlib、Spark SQL等众多领域。而作为较早关注和引入Spark的移动互联网大数据综合服务公司,TalkingData也积极地参与到国内Spark社区的各种活动,并多次在Meetup中分享公司的Spark使用经验。本文则主要介绍TalkingData在大数据平台建设过程中,逐渐引入Spark,并且以Hadoop YARN和Spark为基础来构建移动大数据平台的过程。

阅读更多

September 29, 2015

linux的io栈图

#kernel

G+上看到有人画的一个图,非常不错

阅读更多

May 6, 2014

liunx系统分析图解

#kernel

看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务

阅读更多

April 11, 2014

内核补丁制作与提交

#kernel

作者:许振文 内核源码下载 内核代码的管理是采用的git来管理的,所以要下载内核最新的代码的话就得使用git工具来下载了。git工具的使用我在上一篇文章中已经写了个大概,所以具体可以参考其中的使用说明。 一般测试可以下载部分或是全部的源代码,我们一般会下载Linus Torvalds的git树下的源码。URL如下:

阅读更多

April 6, 2014

线程种的gettid和pthread_self区别

#kernel

这几天写程序老是使用thread来做,所以自己封装了一个threadbase的类来做简单的测试使用,但是在写的过程种发现又两个获取线程id的函数:pthread_self和gettid,那这两个函数有什么区别呢? 看gettid的man,这样写道:

阅读更多

April 22, 2013

内核又拒绝挂载fat32的磁盘了,报codepage cp437 not found

#kernel

前几天从新编译了内核,是应为升级了内核后vbox不能用了,所以又从新编译了内核,并且安装编译了vbox的内核模块,但是也出了问题,在每次shutdown的时候机器总是无法断点,磁盘灯不再亮,说明磁盘也不写了,只是一个锁灯在不断的闪,看了messages总的日志看到这样两句:

阅读更多

August 11, 2011

再编译内核

#kernel

昨天下了内2.6.36的内核,今晚没事,想编译看看,顺便做个记录! 首先要安装必要的包。 包有:libncurses5-dev(menuconfig需要的)和essential

阅读更多

December 28, 2010

内核学习

#kernel

来公司之后就没有怎么好好学习内核方面的东西了,也就是是在师妹们问起的时候查查源码或是搜索一下解答一下。本以为我会在内核这条路上越走越远。。。 在公司的一个交流会上,由于发言太过积极被奖励了一张当当的购书卡,回来之后直接上当当就买了本ULK,再此捧起内核的书来看,来学习,现在每天晚上回来看上半小时到一小时,让后睡觉,呵呵,有种踏实的感觉。

阅读更多

December 25, 2010

内核补丁制作与提交

#git#kernel#开源

内核补丁制作与提交

阅读更多

July 18, 2010

软件的灰度发布

#kernel

最近一段时间都是在搞我负责的部门数据接口的转换,所以最近一段时间连续升级了自己管理的几个小系统的数据接口。部门服务器的端口是要严格控制的,所以首先也要在我们自己的服务器上去做监控,一旦发现立杀无赦。在端口监控这个项目上是一个C/S的结构,服务器保存规则,客户断请求,但是这些都是线上服务一旦切换错了,那问题可就。。。。

阅读更多

June 22, 2010

在内核模块中直接发送数据到网卡

#kernel

前几天去了一个公司再做什么音频会议系统,他们买了一个音频处理芯片,但是这个芯片和cpu的接口比较奇怪!atm的接口,但是却没有遵循atm的协议,atm的协议一包是53个字节,但它确实56个字节,而且不是简单的在53之上再加3个字节,是打乱的字节序列!这下没办法了,本来先使用atm的驱动模型来做就可以了!但是最终发现以我现有的技术行不通!而且他们需要在接收处理之后直接通过网络接口再发送出去。

阅读更多

April 8, 2010

OOM-killer

#kernel

Out-of-Memory (OOM) Killer是一种保护机制,用于当内存严重不足时,为了系统的继续运转,内核迫不得已挑选一个进程,将其杀死,以释放内存,缓解内存不足的问题。可以看出这种方式对进程的保护是有限的,不能完全的保护进程的运行。 OOM Killer的关闭与激活方式:

阅读更多

March 23, 2010

整理了两张linux网络分析的图

#kernel

整理了两张linux网络分析的图 这里看大图 这里看大图 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务

阅读更多

November 24, 2009

内核中ipv4分析---协议族的初始化

#kernel

在内核中ipv4的初始化工作是由这个函数来做的。

阅读更多

November 11, 2009

ipv4内核初始化相关

#kernel

所在文件: net/ipv4/af_inet.c 初始化函数定义:

阅读更多

November 3, 2009

网卡数据流分析图

#kernel

以前做网卡程序时的一个数据流图,拿出来晒晒。

阅读更多

October 31, 2009

以ipv4来分析Linux网络的基本运行机制(2)

#kernel

ipv4协议分析框架图:整理了一个网络接口的大致原理图!

阅读更多

October 17, 2009

以ipv4来分析Linux网络的基本运行机制(1)

#kernel

在Linux中的网络接口主要的有这么几种:

阅读更多

October 16, 2009

Linux发布版的时间图

#kernel

之前一直对都对Linux的发布版有错误的理解。今天看了这个图才清楚了。以后给别人讲课也就有依据了!汗那!!!

阅读更多

October 16, 2009

socket内核部分分析

#kernel

socketcall是所有网络函数请求的系统调用接口函数,所有的网络函数的请求最终都会有这个函数要处理。下面就是这个函数的分析:

阅读更多

October 12, 2009

glibc中socket实现分析

#kernel

glibc-2.9, linux-2.6.32-rc1 在查看系统调用的时候发现: 关于网络的系统调用只有一个socketcall:

阅读更多

October 11, 2009

让firefox也像vim一样简单高效

#kernel

学校来了两个德国留学生,来的第一天就见他们了,聊了一下!吆!这两个家伙也是使用linux的,当然他们是使用的ubuntu,而我使用的是debian。有一天一个胖胖的来到我们实验室给我说了一堆!说什么他的vbox共享有问题了,看我有什么好的办法,我就去他哪里看了,果然是使用的ubuntu9.04,还设置的非常个性漂亮。就在解决问题的过程中我要上网查资料,但是我发现他的firefox长的比较奇怪,但是整个浏览器很是简洁清爽,这正是我想要的风格阿!但是我却发现我怎么都用不了—没有url的输入框,没有刷新,没有后退,没有前进和停止。

阅读更多

October 10, 2009

icc与gcc测试比较

#kernel

编译使用结果: 程序:

阅读更多

September 29, 2009

使用git来管理googlecode

#kernel

在代码管理工具上我还是比较喜欢一点,但是googlecode是使用的svn来管理的,一开始我也是使用svn来管理的,但是总感觉不是很爽。 今天试了一下用git来管理googlecode,还是不错的,又有了以前的那种感觉。

阅读更多

September 1, 2009

中断号和芯片中断引脚的关系

#kernel

一直以来搞不懂这个中断号的来历,总以为是中断控制器自己规定的一个号,但是最近在看了s3c2440的中断控制后才发现不是这么一回事.2440的中断处理只能处理32个中断,但是其在内核中出现的中断号却有51,58等.而且它的外部中断INT47共享一个中断控制寄存器的一位,INT823也是共享控制寄存器的一位.我就好奇了,它怎么区分这些中断呢?而且在内核代码中它又很清楚的区分了这些中断.如下面的代码(2.6.13).

阅读更多

August 17, 2009

编写的dm9000ep驱动(2.6.13)

#kernel

最近手头刚好有个开发板,也还有点时间,就试着写了一下它上面的网卡驱动,当然也是参考了其现有的驱动再写的,程序如下:

阅读更多

August 14, 2009

关于函数调用的参数传递

#kernel

前几天和王老师在调式一个程序,调试结果怎么都不正确。其实形式很简单: printf("%d; %d", sum(), m); m是一个静态变量,在sum中改变,但是打印结果还是没有变化。 当然在后来我又作了一个测试发现在gcc编译的程序中他是以左优先的,也就是先打印计算m的结果,让后在计算sum的结果,再打印。

阅读更多

May 26, 2009

内核和用户态异步通信实例(netlink)

#kernel

内核版本:2.6.26 内核态程序:knetlink.c

阅读更多

May 16, 2009

一条audit日志信息的分析

#kernel

内核版本:2.6.30-rc5 以下是用”demsg|tail“命令抓取的一段信息:

阅读更多

May 15, 2009

2.6.26下添加系统调用

#kernel

内核版本:2.6.26 以下是要修改的内核文件:

阅读更多

May 13, 2009

对audit_context结构的注释

#kernel

/* The per-task audit context. */ struct audit_context { int dummy; /* must be the first element */ int in_syscall; /* 1 if task is in a syscall 该值是:1 则表示任务在系统调用中 */ enum audit_state state, current_state; //审计级别 有AUDIT_DIABLED:不实用审计 //AUDIT_BUILD_CONTEXT:创建审计数据结构并做填充 //AUDIT_RECORD_CONTEXT:创建审计数据结构并作填充,在系统调用开始和结束时都做记录。 unsigned int serial; /* serial number for record */ struct timespec ctime; /* time of syscall entry */ int major; /* syscall number :系统调用号*/ unsigned long argv[4]; /* syscall arguments :系统调用传递的参数*/ int return_valid; /* return code is valid */ long return_code;/* syscall return code */ u64 prio; int name_count; //记录了多少个文件对象,即下面这个names的实际个数 struct audit_names names[AUDIT_NAMES]; //记录所审计的文件系统对象的名字 char * filterkey; /* key for rule that triggered record */ struct path pwd; struct audit_context *previous; /* For nested syscalls */ struct audit_aux_data *aux; //保存附加的审计数据 struct audit_aux_data *aux_pids;//保存在审计时所收到系统信号的进程的进程号 struct sockaddr_storage *sockaddr;//网络部分审计数据保存 size_t sockaddr_len; /* Save things to print about task_struct */ //以下这些都和task_struct中相应的数据项基本一致 pid_t pid, ppid; uid_t uid, euid, suid, fsuid; gid_t gid, egid, sgid, fsgid; unsigned long personality; int arch; pid_t target_pid; uid_t target_auid; uid_t target_uid; unsigned int target_sessionid; u32 target_sid; char target_comm[TASK_COMM_LEN]; struct audit_tree_refs *trees, *first_trees; int tree_count; int type; //一下所记录的pid,gid等和task_struct中记录的一样 union { struct { int nargs; long args[6]; } socketcall; struct { uid_t uid; gid_t gid; mode_t mode; u32 osid; int has_perm; uid_t perm_uid; gid_t perm_gid; mode_t perm_mode; unsigned long qbytes; } ipc; struct { mqd_t mqdes; struct mq_attr mqstat; } mq_getsetattr; struct { mqd_t mqdes; int sigev_signo; } mq_notify; struct { mqd_t mqdes; size_t msg_len; unsigned int msg_prio; struct timespec abs_timeout; } mq_sendrecv; struct { int oflag; mode_t mode; struct mq_attr attr; } mq_open; struct { pid_t pid; struct audit_cap_data cap; } capset; }; int fds[2]; #if AUDIT_DEBUG int put_count; int ino_count; #endif }; 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务

阅读更多

May 10, 2009

自定义ELF文件中的section

#kernel

在看内核代码的时候发现,原来ELF文件的section是完全可以自己定义的。当然这只是作新的增加。 今天请教了王老师,并做了一个简单的测试。但是具体的用意还有点不是很清楚,还有待继续分析ELF文件。

阅读更多

April 30, 2009

内核审计系统初步分析(1)

#kernel

最近一段时间在看内核关于审计的东西,今天作一点最近看的整理,内核的审计系统也算是比较新的东西了,还有内核跟踪一类的动西,也是在2。6。30中才看到有独立的目录了。 其实内核的审计还是没有跳出对进程的管理,也主要是是对每个进程的活动情况进行记录。在struct thread_info结构中的flags项中有增加了许多的内容,其中就有几个标志就是关于是否启用内核审计的。如下面的几项:

阅读更多

April 27, 2009

系统调用简单分析

#kernel

#define CFI_STARTPROC .cfi_startproc //用在每个函数的开始,用于初始化一些内部数据结构 #define CFI_ENDPROC .cfi_endproc //在函数结束的时候使用与.cfi_startproc相配套使用 #define CFI_DEF_CFA .cfi_def_cfa //定义计算CFA的规则 #define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register //xx reg ,offset reg中的值保存在offset中,offset是CFA的 #define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset //xx offset 修改计算CFA的规则,reg中的值不发生变化,之改变offset #define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset //与上面相似但是修改前面一个offset #define CFI_OFFSET .cfi_offset //xx reg ,offset reg中的值保存在offset中,offset是CFA的 #define CFI_REL_OFFSET .cfi_rel_offset #define CFI_REGISTER .cfi_register #define CFI_RESTORE .cfi_restore #define CFI_REMEMBER_STATE .cfi_remember_state #define CFI_RESTORE_STATE .cfi_restore_state #define CFI_UNDEFINED .cfi_undefined .macro RING0_INT_FRAME CFI_STARTPROC simple CFI_SIGNAL_FRAME CFI_DEF_CFA esp, 3*4 /*CFI_OFFSET cs, -2*4;*/ CFI_OFFSET eip, -3*4 .endm # system call handler stub ENTRY(system_call) RING0_INT_FRAME # can't unwind into user space anyway pushl %eax # save orig_eax //保存原来的eax中的值 CFI_ADJUST_CFA_OFFSET 4 SAVE_ALL //保存系统寄存器信息 GET_THREAD_INFO(%ebp) //获取thread_info结构的地址 # system call tracing in operation / emulation testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) //检测thread_info中的相关标志看是否有系统跟踪 jnz syscall_trace_entry //有系统跟踪则先执行系统跟踪的代码,然后转跳回来(这在syscall_trace_entry中有写的) cmpl $(nr_syscalls), %eax //比较请求的系统调用号和最大系统调用号(验证系统调用号是否有效) jae syscall_badsys //如果请求系统调用号无效则退出 syscall_call: call *sys_call_table(,%eax,4) //跳转到系统调用表中,系统调用表是4字节对齐。 movl %eax,PT_EAX(%esp) # store the return value syscall_exit: LOCKDEP_SYS_EXIT //用于调试使用,只有在开启调试的时候才会去检测系统调用深度 DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret //#define ENABLE_INTERRUPTS(x) sti //#define DISABLE_INTERRUPTS(x) cli TRACE_IRQS_OFF //关闭中断跟踪 movl TI_flags(%ebp), %ecx // testl $_TIF_ALLWORK_MASK, %ecx # current->work //检测是否可以返回用户空间 jne syscall_exit_work syscall_exit_work: testl $_TIF_WORK_SYSCALL_EXIT, %ecx jz work_pending TRACE_IRQS_ON //开启系统中断跟踪 ENABLE_INTERRUPTS(CLBR_ANY) # could let syscall_trace_leave() call # schedule() instead //允许中断 movl %esp, %eax call syscall_trace_leave jmp resume_userspace END(syscall_exit_work) 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务

阅读更多

April 25, 2009

内核的同步和互斥实例学习

#kernel

#include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/mutex.h> #include <linux/semaphore.h> #include <linux/sched.h> static DEFINE_MUTEX(mut1); struct semaphore sem1,sem2; int test1(void *p) { down(&sem2); mutex_lock(&mut1); printk("get out test1\n"); mutex_unlock(&mut1); up(&sem1); return 0; } int test2(void *p) { down(&sem1); mutex_lock(&mut1); printk("get out test2\n"); mutex_unlock(&mut1); up(&sem2); return 0; } static int __init mutex_init_test() { init_MUTEX(&sem1); init_MUTEX_LOCKED(&sem2); printk("get out \n"); kernel_thread(test1, test1, CLONE_KERNEL); kernel_thread(test2, test2, CLONE_KERNEL); return 0; } static void __exit mutex_exit_test() { printk("get out \n"); return; } module_init(mutex_init_test); module_exit(mutex_exit_test); MODULE_AUTHOR("Helight.Xu"); MODULE_LICENSE("Dual BDS/GPL"); 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务

阅读更多

April 21, 2009

使用proc来写GPIO驱动

#linux#开源#kernel

这是写的一个gpio的驱动,测试完,提好的。

阅读更多

March 31, 2009

截获Linux系统调用

#kernel

#include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/unistd.h> #include <linux/init.h> #include <asm/ptrace.h> #define NRB 2 typedef asmlinkage int (*__routine)(struct pt_regs); __routine old, new; unsigned long *sys_call_table = 0; static int counts = 0; unsigned long* find_sys_call_table(void) { struct { unsigned short limit; unsigned int base; } __attribute__ ( ( packed ) ) idtr; struct { unsigned short offset_low; unsigned short segment_select; unsigned char reserved, flags; unsigned short offset_high; } __attribute__ ( ( packed ) ) * idt; unsigned long system_call = 0; // x80中断处理程序system_call 地址 char *call_hex = "\xff\x14\x85"; // call 指令 char *code_ptr = NULL; char *p = NULL; unsigned long sct = 0x0; int i = 0; __asm__ ( "sidt %0": "=m" ( idtr ) ); idt = ( void * ) ( idtr.base + 8 * 0x80 ); system_call = ( idt->offset_high << 16 ) | idt->offset_low; code_ptr = (char *)system_call; for(i = 0;i < ( 100 - 2 ); i++) { if(code_ptr[i] == call_hex[0] && code_ptr[i+1] == call_hex[1] && code_ptr[i+2] == call_hex[2] ) { p = &code_ptr[i] + 3; break; } } if ( p ){ sct = *(unsigned long*)p; } return (unsigned long*)sct; } asmlinkage int audit_sys_call(struct pt_regs regs) { int ret = 0; counts++; printk("audit_sys_call!\n"); printk("call %ld sys_call! times: %d\n", regs.ax, counts); ret = ((__routine)old)(regs); return ret; } int mysys_init ( void ) { if (( sys_call_table = find_sys_call_table())) { printk( "sys_call_table = %p\n", sys_call_table ); old = (__routine)sys_call_table[NRB]; new = &audit_sys_call; sys_call_table[NRB] = (unsigned long)new; } return 0; } void mysys_exit ( void ) { printk("keep back the sys_call_table \n"); sys_call_table[NRB] = (unsigned long)old; } module_init(mysys_init); module_exit(mysys_exit); MODULE_LICENSE("GPL2.0"); MODULE_AUTHOR("Helight.Xu"); 看完本文有收获?请分享给更多人 关注「黑光技术」,关注大数据+微服务

阅读更多

March 31, 2009

Linux内核中的P,V操作之V

#linux#开源#kernel

最近作辅导讲到了P,V操作,我就在内核中看了一下Linux中的P,V操作的实现。很真是,理解比本科学习的时候深多了。操作系统中的P操作在Linux内核中对应的是down函数,V操作对用up函数。

阅读更多

November 29, 2008

Linux内核中的P,V操作之P

#linux#开源#kernel

最近作辅导讲到了P,V操作,我就在内核中看了一下Linux中的P,V操作的实现。很真是,理解比本科学习的时候深多了。操作系统中的P操作在Linux内核中对应的是down函数,V操作对用up函数。

阅读更多

November 29, 2008

源代码中的中断分析(一)

#linux#开源#kernel

(代码版本2.6.26) 中断描述符数组:irq_desc[]

阅读更多

November 13, 2008

2.6.22下基于Netfilter的网络监听程序

#linux#开源#kernel

在2.6.22中skbuff发生了变化,使得我以前的防火墙程序在新内核中无法使用了,主要是可以当作一个网络数据监视,当然还是不完善的。目前只能监听数据报的源ip和目的ip,还有tcp报的原端口和目的端口。

阅读更多

September 27, 2008