- 博客(61)
- 收藏
- 关注
原创 网卡状态检测函数
内核中网卡的开启状态通过__LINK_STATE_START进行标识。网卡开启或关闭时,通过该标识会被置位。打开网卡,netif_running函数返回状态1,关闭网卡则返回0。编写内核模块,通过开启和关闭网卡,观察该函数是否符合预期。内核专门提供了一个函数用于检测该标志位。编译,并加载到内核。
2023-10-22 11:19:25
414
原创 程序被加载到进程的哪个位置?
程序被加载器加载到内存后,通过/proc/$pid/maps文件,我们可以观测到程序被加载的内存位置。那么,通过打印进程内存的方式,让我们确认程序是不是真的加载到内存,以及加载到内存的程序和硬盘中的文件有没有区别。通过上述截图对比可知,程序的16进制被严格的加载到进程的内存空间,并且从进程的第一个vm_area_struct结构表达的内存处开始保存。此处只打印了进程第一个vm_area_struct表达的内存。这里只展示部分16进制,用于与内存中的16进制进行对比。编译启动,然后打印程序的16进制。
2023-10-20 17:29:51
318
原创 最简网卡驱动
通过对比内核打印的skb->data内容和tcpdump抓取的报文可知,skb->data的前12个字节是mac地址,接着的0806是arp协议。在内核注册自定义的网卡驱动,并通过打印用户空间和内核的交互数据,可以更深层次的理解网络协议。因为192.168.90.12地址的mac不在arp缓存,所以内核会发送arp广播请求。安装系统头文件,即可进行编译,然后加载到内核。其中,需要配置ip地址。使用tcpdump抓包。使用该网卡发送数据包。
2023-10-20 09:56:10
261
原创 如何确认栈中申请的变量地址
对比第2和第3部的截图,还可得知,当使用mmap申请堆内存时,内核的确会新建一个vm_area_struct结构,并加入到mmap链表。进程在内存中是分区域加载的,分别是代码段、数据段、bss段等等。函数中定义的变量一般存在于栈中。现在我们通过实验验证一下,函数中定义的变量,到底存在与进程哪个位置。对比可知,变量s的地址是0x7ffdcab8de70,该地址的确在stack范围内。使用mmap在堆上申请一块4096字节的内存,并把返回的地址赋值给变量s。2. 执行程序后,查看/proc/pid/maps。
2023-10-19 21:01:56
230
原创 实现最简的内核模块
实现最简单的内核模块,可从中窥探内核模块的编写流程。同时,也可用在其上进行扩展,对内核函数和全局变量进行调用和打印,熟悉内核接口。在实现最简内核模块之前,在本地安装配置开发环境。可用选择使用vagrant工具快速构建虚拟机。进入/home/vagrant/simple目录,使用make命令编译内核模块。打开虚拟机,创建工作目录,并编写Makefile文件和内核模块文件。
2023-10-19 17:06:02
124
原创 详解EventBus实现原理
搞Java开发,阅读源码是家常便饭。唯有如此,才能不断吸收先进的设计思想,提高个人技术水平。下面以EventBus核心实现为引子来分析google大神是怎么优化观察者模式的。前文已有EventBus用法相关示例,此处不再多言。EventBus核心类主要有四个:EventBusSubscriberRegistryDispatcherSubscriber没有看错,以上4个类完成了EventBus的主要功能。下面依次分析这些类的关键实现方法。EventBus类属于资源管理类,大..
2021-03-15 09:32:29
2250
原创 一文看懂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
810
原创 线程和协程之间的区别
线程和协程之间的区别很大,甚至大过进程和线程之间的区别。线程建立在进程之上,协程建立在线程之上。那么协程是什么呢?协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复。协程非常适合实现熟知的程序,例如协作任务,异常,事件循环,迭代器,无限列表和管道。协程与我们熟知的函数不同(函数也是一段计算机程序)。函数总是一个入口,一次返回,调用顺序明确,但是协程的调用可以中断,然后执行其它程序,在适当的时候再返回来继续执行,可以实现多次返回。以异常为例。在操作系统中或者其它语言实现中,例
2021-01-13 17:58:05
1228
原创 线程到底能不能利用多核?
最近在讲解Python多线程过程中,遇到一个被人提过多次的问题:Python多线程到底有没有应用价值?回答这个问题,需要区分应用的特点。如果该应用是IO密集型的,则多线程很有必要,而且的的确确能够提升应用的性能;如果该应用是计算密集型的,那么多线程就显得多余,甚至会拖慢效率。众所周知,Python解释器存在GIL,它的存在直接导致Python应用最多只能用到单核。单核时代,多线程编程也是很常见的编程方式。所以可以得出这样的结论:在IO密集型应用中,Python多线程有很大价值。由此,我又想到到另外一
2021-01-10 18:28:38
2300
原创 Python多线程
在对称多处理器SMP时代,Python多线程技术显得有些弱鸡。因为GIL的存在,Python多线程只能实现单核多线程功能,无法实现多核多线程。虽然GIL显得有些自费武功,但是多线程技术在IO密集型应用中仍然能够提升一部分系统性能。所以还是有必要学习一些Python多线程编程。 线程是什么? 在Linux系统中,线程又名轻量级进程(LWP),是操作系统最小调度单位。这个命题,咋看起来没问题,细细评味总觉得有点不准确,会给人产生一种错觉,认为Linux中最小调度单位是线程。在Linux2.6版本之
2021-01-08 22:29:51
154
原创 自己动手实现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
751
原创 深入理解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
416
原创 网络协议从入门到上瘾--模拟三次握手
在学习网络协议的三次握手理论过程中,作者通常会使用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
1215
原创 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
955
2
原创 内存克星--生成器
Python内置了很多非常有用的数据结构,比如列表(list)、集合(set)以及字典(dictionary)。这些数据结构方便了开发人员,特别是通过列表生成式,可以很方便的创建一个列表。但是,毕竟内存有限,列表的容量肯定会受到限制。当列表数据量大到我们开始担心系统内存空间时,就应该考虑使用生成器进行迭代了。在Python中,生成器实际上是一个存在于堆上的函数。这个函数可以在循环过程中不断推算出后续的元素,直到产生特殊异常StopIteration结束。如何创建一个生成器? 把列表生成式[]修
2021-01-06 14:16:08
154
原创 管理进程生命周期的好帮手-systemd
做系统服务开发的工程师,通常需要把自己开发的服务部署到Linux服务器,同时还要保证服务器在宕机重启后,服务进程需要随机启动。Systemctl是systemd工具集中的一款,主要负责控制systemd系统和服务管理器(在Linux系统中,经常看到这种工具设计方式,比如iptables、docker、openvswitch等,全部基于c/s模式实现)。Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类Unix系统。在
2021-01-06 14:10:42
297
原创 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
446
原创 Neutron模块oslo.messaging
前面简单介绍过Neutron消息中间件RabbitMQ的用法。学习过的人,相信对RabbitMQ不会再有陌生感。接下来将会继续介绍Neutron中消息通信模块oslo.messaging。它是OpenStack公共库oslo中的一个组件,封装了RPC调用,为RPC和事件通知提供了一套统一的接口。使用过OpenStack的人都知道,目前原生OpenStack底层MQ驱动默认是kombu。那么为什么OpenStack又在此基础上做了一层封装?在编程领域,一个显而易见的原因是减少模板代码和对底层驱动提供更加灵
2021-01-05 09:09:59
462
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
298
原创 网络协议从入门到上瘾--初识Scapy
互联网的核心是一系列协议,总称为“互联网协议”。它们对电脑如何连接和组网,做出来详尽的规定。理解了这些协议,就是理解了互联网的原理。在面试或者工作过程中,我们对我们知道的网络协议侃侃而谈,五层模型,osi七层模型,三次握手,四次挥手,TCP/IP协议族,ICMP,ARP,HTTP,SNMP,广播,多播,组播,单播等等概念信手拈来。但是当遇到无法解决的网络问题时,我们可能开始怀疑自己是否真的理解了这些协议。毕竟大部分时候,我们只是记忆了这些概念,并在工作中利用前人发明的网络工具和经验解决工作中遇到的问题。
2021-01-04 09:13:05
410
原创 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
176
原创 黑入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
670
原创 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
222
原创 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
3199
原创 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
562
原创 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
352
原创 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
8935
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
1358
原创 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
1029
原创 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
2079
原创 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
1538
原创 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
8943
原创 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
873
原创 安装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
4493
原创 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
15975
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
6395
原创 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
608
原创 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
571
原创 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
634
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人