自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 网卡状态检测函数

内核中网卡的开启状态通过__LINK_STATE_START进行标识。网卡开启或关闭时,通过该标识会被置位。打开网卡,netif_running函数返回状态1,关闭网卡则返回0。编写内核模块,通过开启和关闭网卡,观察该函数是否符合预期。内核专门提供了一个函数用于检测该标志位。编译,并加载到内核。

2023-10-22 11:19:25 210

原创 程序被加载到进程的哪个位置?

程序被加载器加载到内存后,通过/proc/$pid/maps文件,我们可以观测到程序被加载的内存位置。那么,通过打印进程内存的方式,让我们确认程序是不是真的加载到内存,以及加载到内存的程序和硬盘中的文件有没有区别。通过上述截图对比可知,程序的16进制被严格的加载到进程的内存空间,并且从进程的第一个vm_area_struct结构表达的内存处开始保存。此处只打印了进程第一个vm_area_struct表达的内存。这里只展示部分16进制,用于与内存中的16进制进行对比。编译启动,然后打印程序的16进制。

2023-10-20 17:29:51 170

原创 最简网卡驱动

通过对比内核打印的skb->data内容和tcpdump抓取的报文可知,skb->data的前12个字节是mac地址,接着的0806是arp协议。在内核注册自定义的网卡驱动,并通过打印用户空间和内核的交互数据,可以更深层次的理解网络协议。因为192.168.90.12地址的mac不在arp缓存,所以内核会发送arp广播请求。安装系统头文件,即可进行编译,然后加载到内核。其中,需要配置ip地址。使用tcpdump抓包。使用该网卡发送数据包。

2023-10-20 09:56:10 131

原创 如何确认栈中申请的变量地址

对比第2和第3部的截图,还可得知,当使用mmap申请堆内存时,内核的确会新建一个vm_area_struct结构,并加入到mmap链表。进程在内存中是分区域加载的,分别是代码段、数据段、bss段等等。函数中定义的变量一般存在于栈中。现在我们通过实验验证一下,函数中定义的变量,到底存在与进程哪个位置。对比可知,变量s的地址是0x7ffdcab8de70,该地址的确在stack范围内。使用mmap在堆上申请一块4096字节的内存,并把返回的地址赋值给变量s。2. 执行程序后,查看/proc/pid/maps。

2023-10-19 21:01:56 151

原创 实现最简的内核模块

实现最简单的内核模块,可从中窥探内核模块的编写流程。同时,也可用在其上进行扩展,对内核函数和全局变量进行调用和打印,熟悉内核接口。在实现最简内核模块之前,在本地安装配置开发环境。可用选择使用vagrant工具快速构建虚拟机。进入/home/vagrant/simple目录,使用make命令编译内核模块。打开虚拟机,创建工作目录,并编写Makefile文件和内核模块文件。

2023-10-19 17:06:02 83

原创 自定义内核模块读取进程的线性地址

自定义内核模块读取进程的线性地址

2023-10-19 15:04:10 145

原创 详解EventBus实现原理

搞Java开发,阅读源码是家常便饭。唯有如此,才能不断吸收先进的设计思想,提高个人技术水平。下面以EventBus核心实现为引子来分析google大神是怎么优化观察者模式的。前文已有EventBus用法相关示例,此处不再多言。EventBus核心类主要有四个:EventBusSubscriberRegistryDispatcherSubscriber没有看错,以上4个类完成了EventBus的主要功能。下面依次分析这些类的关键实现方法。EventBus类属于资源管理类,大..

2021-03-15 09:32:29 2120

原创 一文看懂neutron-server中Pecan的用法

前文有对neutron-server源码中的WSGI进行分析,总结出neutron-server的最简初始化过程。本文在此基础上对neutron-server中的Pecan继续进行深入介绍。Pecan是一个基本对象分发风格路由的轻量级Python Web框架,所以相比PPRW框架(Paste,PastDeploy,Routes,WebOb),使用Pecan实现路由分发的neutron-server逻辑更加简洁易懂。一个V2Controller类,就完全表达了neutron-server中用于路由分发的功

2021-01-18 00:30:38 723

原创 线程和协程之间的区别

线程和协程之间的区别很大,甚至大过进程和线程之间的区别。线程建立在进程之上,协程建立在线程之上。那么协程是什么呢?协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复。协程非常适合实现熟知的程序,例如协作任务,异常,事件循环,迭代器,无限列表和管道。协程与我们熟知的函数不同(函数也是一段计算机程序)。函数总是一个入口,一次返回,调用顺序明确,但是协程的调用可以中断,然后执行其它程序,在适当的时候再返回来继续执行,可以实现多次返回。以异常为例。在操作系统中或者其它语言实现中,例

2021-01-13 17:58:05 1128

原创 线程到底能不能利用多核?

最近在讲解Python多线程过程中,遇到一个被人提过多次的问题:Python多线程到底有没有应用价值?回答这个问题,需要区分应用的特点。如果该应用是IO密集型的,则多线程很有必要,而且的的确确能够提升应用的性能;如果该应用是计算密集型的,那么多线程就显得多余,甚至会拖慢效率。众所周知,Python解释器存在GIL,它的存在直接导致Python应用最多只能用到单核。单核时代,多线程编程也是很常见的编程方式。所以可以得出这样的结论:在IO密集型应用中,Python多线程有很大价值。由此,我又想到到另外一

2021-01-10 18:28:38 2133

原创 Python多线程

在对称多处理器SMP时代,Python多线程技术显得有些弱鸡。因为GIL的存在,Python多线程只能实现单核多线程功能,无法实现多核多线程。虽然GIL显得有些自费武功,但是多线程技术在IO密集型应用中仍然能够提升一部分系统性能。所以还是有必要学习一些Python多线程编程。 线程是什么? 在Linux系统中,线程又名轻量级进程(LWP),是操作系统最小调度单位。这个命题,咋看起来没问题,细细评味总觉得有点不准确,会给人产生一种错觉,认为Linux中最小调度单位是线程。在Linux2.6版本之

2021-01-08 22:29:51 119

原创 自己动手实现arping

只要接触过网络的人,相信对ping命令并不陌生 。该命令可以用来检测本机到目标机的网络是否连通,是一种很常见的网络监测手段。对网络熟悉一点的人可能还知道ping命令的工作原理。让我们看看ping命令的介绍:DESCRIPTION ping uses the ICMP protocol's mandatory ECHO_REQUEST datagram to elicit an ICMP ECHO_RESPONSE from a host or gateway. ...

2021-01-07 22:53:30 609

原创 深入理解WSGI

WSGI(Web Server Gateway Interface)是Web服务器与Python Web应用或框架之间的建议标准接口,用于促进跨Web服务器的Web应用的可移植性。根据PEP 3333提案说明,WSGI只是一种协议,而不是一个框架。WSGI力求简洁和通用,所以共规范了三种组件:Application,Server和Middleware。 组件Application Application可以是一个函数、方法、类或者实现了call方法的示例。 如果是一个函数

2021-01-07 22:34:02 309

原创 网络协议从入门到上瘾--模拟三次握手

在学习网络协议的三次握手理论过程中,作者通常会使用Wireshark抓包TCP的三次握手包来进行说明。本文通过使用Scapy和Wireshark对三次握手过程进行握手包级的模拟,以此消除大家对三次握手的神秘感。 第一次握手 使用Scapy发送SYN包:>>> ans = sr1(IP(dst='180.101.49.11')/TCP(dport=80,sport=9527,seq=110,flags='S'),verbose=False)其中,sr1表示发送三层数据包并

2021-01-07 12:25:35 791

原创 neutron-server源码分析总纲

背景:本文以neutron的12.0.0版本为例进行源码分析。neutron-server作为Neutron的控制中心,主要对Neutron四大类资源进行管理。从实现架构上可以粗略分为两大模块:neutron-api和RPC。这么分类的依据来自于neutron-server的启动方法,其资源的初始化基本都是在start_api_and_rpc_workers这个方法中完成的。该方法的源码如下所示:def start_api_and_rpc_workers(neutron_api): t.

2021-01-06 22:51:40 841 2

原创 内存克星--生成器

Python内置了很多非常有用的数据结构,比如列表(list)、集合(set)以及字典(dictionary)。这些数据结构方便了开发人员,特别是通过列表生成式,可以很方便的创建一个列表。但是,毕竟内存有限,列表的容量肯定会受到限制。当列表数据量大到我们开始担心系统内存空间时,就应该考虑使用生成器进行迭代了。在Python中,生成器实际上是一个存在于堆上的函数。这个函数可以在循环过程中不断推算出后续的元素,直到产生特殊异常StopIteration结束。如何创建一个生成器? 把列表生成式[]修

2021-01-06 14:16:08 111

原创 管理进程生命周期的好帮手-systemd

做系统服务开发的工程师,通常需要把自己开发的服务部署到Linux服务器,同时还要保证服务器在宕机重启后,服务进程需要随机启动。Systemctl是systemd工具集中的一款,主要负责控制systemd系统和服务管理器(在Linux系统中,经常看到这种工具设计方式,比如iptables、docker、openvswitch等,全部基于c/s模式实现)。Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类Unix系统。在

2021-01-06 14:10:42 216

原创 Neutron分析--oslo.config

在分析Neutron源码的过程中,会遇到很多阻碍,oslo.config就是其中之一。启动Neutron的标准方式是systemctl start neutron-server.service。那么该命令具体做了哪些事情,neutron-server的配置参数又是怎么被加载的呢?下面让我们具体分析。 找到neutron-server.service的具体文件 文件路径是/usr/lib/systemd/system/neutron-server.service。如果不清楚怎么确定systemd

2021-01-05 16:15:02 339

原创 Neutron模块oslo.messaging

前面简单介绍过Neutron消息中间件RabbitMQ的用法。学习过的人,相信对RabbitMQ不会再有陌生感。接下来将会继续介绍Neutron中消息通信模块oslo.messaging。它是OpenStack公共库oslo中的一个组件,封装了RPC调用,为RPC和事件通知提供了一套统一的接口。使用过OpenStack的人都知道,目前原生OpenStack底层MQ驱动默认是kombu。那么为什么OpenStack又在此基础上做了一层封装?在编程领域,一个显而易见的原因是减少模板代码和对底层驱动提供更加灵

2021-01-05 09:09:59 371 1

原创 网络协议从入门到上瘾--Scapy初探

什么是Scapy?没有人能比Scapy的作者更好的介绍Scapy。Scapy is a powerful interactive packet manipulation program. It is able to forge or decode packets of a wide number of protocols, send them on the wire, capture them, match requests and replies, and much more. It can e

2021-01-04 14:12:43 222

原创 网络协议从入门到上瘾--初识Scapy

互联网的核心是一系列协议,总称为“互联网协议”。它们对电脑如何连接和组网,做出来详尽的规定。理解了这些协议,就是理解了互联网的原理。在面试或者工作过程中,我们对我们知道的网络协议侃侃而谈,五层模型,osi七层模型,三次握手,四次挥手,TCP/IP协议族,ICMP,ARP,HTTP,SNMP,广播,多播,组播,单播等等概念信手拈来。但是当遇到无法解决的网络问题时,我们可能开始怀疑自己是否真的理解了这些协议。毕竟大部分时候,我们只是记忆了这些概念,并在工作中利用前人发明的网络工具和经验解决工作中遇到的问题。

2021-01-04 09:13:05 307

原创 RabbitMQ入门

Neutron各组件之间的通信主要是通过RabbitMQ实现的,所以为了更好的学习Neutron,首先需要先熟悉RabbitMQ的常规用法。学习过Java或者写过Web应用的开发人员相信对MQ耳熟能详。在Web应用的世界中,MQ的使用实在太普遍了。常见的MQ系统有ActiveMQ,Kafka,Qpid,redis,ZeroMQ,RabbitMQ等等。在这些MQ实现中,有些严格遵守了AMQP标准,有些则自成一派。接下来让我们认识一下RabbitMQ的特点。 除了Qpid之外,RabbitMQ是唯一实

2021-01-03 22:41:21 144

原创 黑入neutron-l3-agent消息系统

​在进行云计算网络功能开发时,经常需要在现有网络基础上进行网络功能定制或者开发新的插件。此时,就需要我们对Neutron的设计和功能有足够的认识。下面以Neutorn的l3-agent插件为例,讲解第三方服务如何实现对l3-agent服务状态的监控。l3-agent是Neutron家族众多Agent中的一员。从名称就可以推知,该Agent肯定与三层路由有着密不可分的关系。实际情况也的确如此。l3-agent是一个进程,同时它也是一个RPC Consumer,接收来自neutron-server的RPC消

2021-01-02 12:08:42 531

原创 Cassandra安装

Cassandra InstallationIntruductionThe Apache Cassandra database is the right choice when you need scalability and high availability without compromising performance. Linear scalability and proven ...

2018-12-07 17:43:45 185

原创 java进程在经过压力测试后,系统内存占用比居高不下

JVM内存诊断问题:后台omc系统,经过压力测试之后,进程占用的操作系统内存比例一直居高不下。怀疑系统可能存在内存泄漏。排查思路:确定问题范围收集问题相关情报根据具体情况,猜测原因猜测原因,并验证得出结论 问题解决步骤:使用top命令查看问题进程top - 17:27:42 up 6 days, 6:29, 17 users, load average: 0.18, 0.06, 0...

2018-06-26 19:51:09 3003

原创 c语言实现希尔排序

#include <stdio.h>void shell(int* a,int len) {        int step = 1;        while(step<len) step = step*3 + 1;//1 4 13 40 ...        while(step >= 1) {                int j;                ...

2018-04-10 19:21:23 525

原创 c语言实现插入排序

插入排序算法(备忘)#include <stdio.h>void insert(int* a,int len) {        int i,j;        for(i=1;i<len;i++) {                for(j=i;j>0 && a[j]<a[j-1];j--) {                        int...

2018-04-09 21:10:29 312

原创 nodejs调用动态库so

系统环境:Centos7,python2.7nodejs可以通过ffi调用c接口。安装ffi:1、npm install -g node-gyp,如果安装前提示ssl相关错误,则需先安装ssl,使用命令yum install openssll2、npm install ffi bindings --save 安装模块到项目目录下生成动态库:1、编写测试文件//////add.cint add(in...

2018-03-02 23:30:54 8359 3

原创 Tomcat8支持Apr运行模式

Tomcat共有三中运行模式,分别是bio,nio和apr。其中,bio是阻塞是io操作,效率最低;nio是基于java中非阻塞io操作的api实现,比传统io处理方式有着跟高的并发运行性能;apr是从操作系统基础上解决异步io问题,可大幅提升服务器的并发处理性能,同时也是tomcat生产环境运行时的首选方式。apr本质是使用jni技术调用操作系统底层的io接口,所以需要提前安装所依赖的库文件,包...

2018-02-25 14:10:32 1290

原创 hadoop安装配置过程中出现的问题

配置方法参考网址:http://www.micmiu.com/bigdata/hadoop/hadoop2x-cluster-setup/配置过程中出现的问题:1、Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is... 解决方法:配置yarn-site

2016-07-01 09:28:45 881

原创 Tomcat+Spring web不能引入jquery

问题描述:jquery文件路径正确(多次验证),浏览器访问jsp总是不能能加载jquery;如果使用cdn则可以正常引入jquery。多次尝试后,发现是web.xml配置问题。因使用spring,web被配置成所有的页面请求都经过DispatcherServlet转发,所以js等静态文件不能被访问。spring配置如下:restorg.springframework.web.ser

2016-02-28 14:23:44 2031

原创 Archlinux编译安装mysql5.6

从网址http://www.mysql.com/downloads/下载mysql压缩包mysql-5.6.4-m7.tar.gz1、解压:tar zxvf mysql-5.6.4-m7.tar.gz2、创建BUILD目录:mkdir BUILD3、进入目录:cd BUILD4、配置:cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-D

2015-10-02 21:28:51 1502

原创 systemctl开机启动wpa_supplicant

各种开机启动搜索,最后才发现系统自带到systemctl也很好使。Archlinux安装完wpa_supplicant,然后到/etc/wpa_supplicant目录下填写配置文件,随便自定义一个,例如test.confap_scan=1network={ssid="2601"#psk="HANHONG2601"proto=WPAkey_mgmt=WPA-PSKp

2015-09-27 12:02:42 8294

原创 Archlinux4.1安装alsa

在Archlinux3.1版本的时候安装alsa没有遇到任何障碍,这次在4.1版本安装时,系统总是没有声音。首先,安装alsa:sudo pacman -S alsa-lib alsa-utils接着,使用alsamixer调剂音量然后,测试声卡驱动安装情况:speaker-test -c 2如果能够听到嘶嘶声,则安装成功;如果报错,则继续安装pulseaudi

2015-09-26 19:30:13 810

原创 安装plsql developer 11

1、下载plsql developer安装包plsql1104.exe,并安装,下载地址http://www.allroundautomations.com2、安装oracle client 客户端instantclient-basic-nt-12.1.0.2.0.zip,下载地址http://www.oracle.com/technetwork/database/features/ins

2015-09-07 15:23:32 4358

原创 ORA-29275: partial multibyte character

安装plsql dev 11后,访问数据库过程中,只要表中出现中文,则plsql dev报错:ORA-29275: partial multibyte character问题原因:服务器和客户端字符集不一致查看方式:select userevn('language') from dual;echo '%nls_lang%'解决方法:配置环境变量NLS

2015-09-06 15:39:28 15770 1

原创 ORA-14400: 插入的分区关键字未映射到任何分区

使用hibernate操作数据库出现以下错误:19:40:45,743 WARN  [JDBCExceptionReporter] SQL Error: 14400, SQLState: 7200019:40:45,743 ERROR [JDBCExceptionReporter] ORA-14400: 插入的分区关键字未映射到任何分区19:40:45,743 WARN  [J

2015-05-21 19:40:39 6229

原创 Java实现一个简单的线程池

最近研究nio,顺便实现一个线程池。package test;import java.io.IOException;import java.text.ParseException;import java.util.LinkedList;import java.util.List;public class Main { public static void main(Stri

2015-05-21 13:14:29 562

原创 wait和notify实例

三个线程顺序打印ABCpublic class WaitAndNotify { public static void main(String[] args) throws InterruptedException { A a = new A(); C c = new C(); B b = new B(); b.setC(c); c.setA(a); a.setB(b

2015-05-18 23:46:48 519

原创 Spring连接mysql

最近学习Spring,所以不可避免的要使用Spring连接数据库(mysql),在连接过程中,遇到一些问题,特记录下来。ClassNotFoundExcption:org.apache.commons.dbcp.BasicDataSource解决方法:从http://www.apache.org/dist下载三个包,commons-dbcp-1.4-bin.tar.gz,commo

2015-04-16 23:46:02 598

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除