Linux
钱国正
做了10多年的嵌入式Linux开发,熟悉linux网络等
展开
-
Linux Kernel存储udp server的socket信息跟踪
前言工作中遇到一个内核的bug,同事给内核增加了socket绑定设备接口id的功能,主要用在绑定VRF的时候,绑定特定的设备。最近测试发现了,加了这个补丁后,导致不同vlan的dhcp server不能同时工作,为了解决这个问题,我对linux kernel如何存储socket的相关功能进行了跟踪,记录如下。应用层UDP Server创建应用层调用socket, bind创建udp server socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); bind(sock原创 2020-09-07 16:46:44 · 524 阅读 · 1 评论 -
Intel Eval Board L2TP/IPSec客户端搭建Ubuntu系统
L2TP over IPSec on Ubuntu由于Windows自带的L2TP/IPSec无法与Intel Eval Board建立连接, 这个是Intel的bug.从头搭建L2TP/IPsec 隧道。服务器端配置准备 环境: Intel Eval Board 系统:sdk 基于openwrt 主要构成软件: xl2tpd-1.3.1, strongswan, iperf3(可选,测试性能)配置/etc/xl2tpd/xl2tpd.conf[global]listen-add原创 2020-07-08 16:55:28 · 631 阅读 · 0 评论 -
Linux VRF 移植遇到的无法绑定VRF interface发送单播数据包问题
起因系统内核版本3.10.104, 然而VRF的multicast支持在4.4版本才开始,而且版本之间很多问题也不一样,后续导致了一些问题。理解错误?在我的理解中,如果要绑定VRF interface,在发送数据包的时候需要提供ifindex, 也就是真实的接口的ifindex,而不是VRF接口的ifindex.VRF 作者的pdfVRF 作者在论坛中回复问题之前的移植,发送广播的时候没什么问题,发送IPv6单播的时候就出现问题了。无法绑定vlan interface,或者VRF interf原创 2020-06-15 14:12:25 · 550 阅读 · 2 评论 -
linux内核模块间通信办法
这里仅仅涉及到共享全局变量。方法1: 内核中新增头文件声明内核中本身就存在全局变量, 比如jiffies。 类似的在内核的模块中include/linux/xxx.h新建这个头文件。将你向共享的变量的声明放在这个地方。方法2:模块间导出符号表并引用采用函数来操作全局变量也可以,直接导出全局变量也可以。 宏: EXPORT_SYMBOL() 这种方式引用的时候需要在引用此变量的模块中修改Make原创 2015-10-12 11:55:11 · 1493 阅读 · 0 评论 -
字符设备驱动函数
ret = alloc_chrdev_region(&led_dev.dev, 0, 1, "led"); cdev_init(&led_dev.dev_c, &led_ops); cdev_add(&led_dev.dev_c, led_dev.dev, 1); led_dev.cdev_class = class_create(THIS_MODULE, "led"); device_c原创 2015-10-09 10:34:32 · 466 阅读 · 0 评论 -
Linux kernel过滤网络数据包
原理剖析内核过滤数据包,第一个想到的是iptables,这个东西是用户层的, 深入点就是netfilter了。 netfilter的5个钩子点可以实现这个。 对内核熟悉点的人会知道layer7, 有的使用框架snort,layer7已经不更新,继承者是ipp2p, 这些都可以。还有Libpcap不知道怎么做,目前没有去深入研究过。方案选定我的本意是针对含有特殊字符串的数据包重定向端口,其他的数据包原创 2015-09-16 22:36:28 · 4487 阅读 · 0 评论 -
Linux kernel (without create_proc_entry func) Proc文件系统的实例
proc文件系统/proc 目录就是Linux的proc文件系统了, 这里面存放内核的配置信息, 网络配置系统, 以及进程的状态都是以pid明明的目录。总之, 关于内核的基本配置你就可以找到。内核更新在内核的迭代过程中,总有一些接口被废弃, create_proc_entry就是其中之一。 依稀记得,去年的时候一直想写个proc文件系统测试下, 直到上个月才有时间来做这个事情。当初让我试了就不测试原创 2015-09-16 22:11:04 · 1448 阅读 · 0 评论 -
PHP与Linux进程间的通信
进程间通信估计是公司考察应届毕业生的必考点(嵌入式行业),当然很多公司考的是算法。不查阅资料,我脑子里能想到的 [1] 管道, (有名,无名) [2] 父子进程 [3] System V (消息队列, 共享内存,信号量) [4] Socket(本地,网络) [5] 信号 内核与应用程序 [1] 共享内存 [2] /proc/文件原创 2015-08-21 23:29:51 · 1943 阅读 · 0 评论 -
个人独立网站
个人独立网站地址 http://hiweeds.net 个人独立博客地址 http://blog.hiweeds.net敬请关注原创 2015-08-05 18:20:37 · 836 阅读 · 1 评论 -
阿里云Ubuntu系统+Apache2+PHP搭建gitblog
阿里云Ubuntu系统+Apache2+PHP搭建gitblogApache2以及PHP的安装这里就不介绍了,网上一大堆。唯一需要总结的就是gitblog安装过程中的问题需要解决。我遇到的问题是无法生成404 Not Found需要apache支持rewrite, 改动有三处修改内容apache2.conf, 在末尾加上LoadModule rewrite_module /usr/lib/apac原创 2015-08-03 10:54:05 · 1505 阅读 · 0 评论 -
polipo代理服务器简介
polipo代理服务器采用的是事件循环机制。 提供缓存功能,不支持透明代理。最近的一个产品需要缓存用以减少流量的作用,于是我们就采用了此款缓存服务器,实现了其透明代理的功能。polipo, 主题架构采用poll监控fd, 针对超时,客户端连接,服务器端的idle,以及缓存的数据分成不同模块,注册了几个回调函数。印象比较深的是polipo中的内存管理,CHUNK_SIZE根据系统不同,分配不同大小也原创 2015-07-20 21:18:59 · 6879 阅读 · 3 评论 -
查看程序符号表的几个命令
objdump -t xxx.oweeds@weeds-ThinkPad-T440p:~/Documents/encrypchip$ objdump -t main.omain.o: file format elf32-littleSYMBOL TABLE:00000000 l df *ABS* 00000000 main.c00000000 l d .te原创 2015-07-20 21:35:50 · 7447 阅读 · 0 评论 -
utf8转为gb2312的函数
一、利用iconv函数族进行编码转换在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。iconv函数族的头文件是iconv.h,使用前需包含之。#include iconv函数族有三个函数,原型如下:(1) iconv_t iconv_open(const char *toc转载 2015-06-09 17:14:34 · 4290 阅读 · 2 评论 -
iperf测试吞吐量
iperf 测试吞吐量TCP 服务器 iperf -sTCP客户端 iperf -c 192.168.1.1 -P 30 -t 60原创 2015-10-14 16:49:18 · 2263 阅读 · 0 评论 -
Linux 段错误调试Segment Fault
Linux下调试方式, 我个人用的主要是两种:1. printf2. coredump3. review代码 (在线程过多或是错误信息不明显时)printf 这个大家都懂, 直接打印,一行一行的。coredump 生成#前提条件程序使用 -g 编译增加调试信息。#允许系统生成coredump文件ulimit -c unlimitedulimit unlimited#查看coredump原创 2016-01-04 23:44:36 · 623 阅读 · 0 评论 -
工作记录- 移植BGP md5支持到linux 2.6.16
需求客户需要BGP协议支持MD5加密这种安全性,所以需要实现IPv6两种协议的支持,然而标准内核在2.6.20才支持这个功能,所以,我们的活儿来了。移植参考Linux-2.6.20 将这个setsocketopt的操作抽象为回调函数,这样方便同时支持两种协议。然后就参照实现,自己添加喽,计算md5的方式参考IPv4实现,其他的参考新的内核实现。问题由于对IPv6 md5使用的不熟悉,测...原创 2019-08-16 15:45:11 · 281 阅读 · 0 评论 -
工作记录 - Linux 的socket TCP keep-alive功能在特定情况下失效的原因
问题TCP socket keep-alive 失败,导致正在进行的业务失败。分析根据数据报文发现,每次tcp ack keep-alive数据报文请求发送后如果发送别的数据,就会出现socket超时, 判断是内核处理tcp keepalive出现问题导致的。问题重现我根据这种情况,实现了一个类似的socket,发送keep-alive然后在程序中sleep特定时间,然后发送数据,模拟紧...原创 2019-08-16 15:36:42 · 989 阅读 · 0 评论 -
Linux网络中的桥 (Bridge)
桥简介桥,从字面来讲就是在一条河流上面建造一条路,对,就是这样,甭管是多大多长跨江还是跨海,它都是起到连接两岸的作用。在计算机的网络世界中也存在这种连接的两个网络的设备,这也是一种桥,虚拟的桥。网络中的桥OK, 回归主题,什么是网络中的桥?我们在90年用的Repeater(一个比特一个比特的转发数据),后来的网桥(一帧一帧的转发),再到后来的交换机(多个端口的桥)。这些都是桥的不同形态的设...原创 2019-08-16 15:15:52 · 1090 阅读 · 0 评论 -
Qemu 使用记录
简介一直想研究qemu很久了,都是浅尝辄止,看一半的文档就不搞了,要下载那么多的镜像很讨厌的。最近觉得这两年实在是没什么长进确实应该深入看看了。命令行先了解这个命令怎么用吧,首先下载个TinyCore-current.iso 官网上下载才16MBqemu-system-i386 -m 2G -smp 2 -vga vmware TinyCore-current.iso -enable-k...原创 2019-07-31 19:10:46 · 383 阅读 · 0 评论 -
Linux中的虚拟路由转发VRF
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点 这里可以跳转到教程。VRF 简单概念虚拟路由转发(Virtual Routing and Forwarding)顾明思义,虚拟的路由转发,讲路由分成不同的分组,然后根据请求的接口,目的地址进行路由的转发,这个是工作在单台设备内的,出了这个设备就...原创 2019-07-22 21:48:16 · 2013 阅读 · 0 评论 -
吐槽下dnsmasq源码
吐槽下dnsmasq源码首先表示下感谢,作者提供简单的设计,丰富的功能,充分降低了我们这些普通程序员的工作,但是要理解起来还是不那么称心如意,主要有那么几点。1. 无关设计, 代码缩进问题。无处不再的空格,偶尔有几行tab,真的不好看阿,阅读起来很麻烦2. 整体设计的感想程序主要架构是select侦听socket的状态进行操作 -- 【决定其只能在小网络架构中使用】采用struct dnsmasq原创 2017-09-01 11:25:56 · 5489 阅读 · 0 评论 -
Ubuntu更新出现 The system is running in low-graphics mode解决
一第一步: 出现上面的界面的时候 : 按ctrl +alt+f1 第二步: 按照相应的显卡输入以下命令1.对于最新的Nvidia二进制驱动:sudo add-apt-repository ppa:ubuntu-x-swat/x-updates sudo apt-get update sudo apt-get install nvidia-current nvidia-current-mo转载 2016-09-28 17:45:10 · 488 阅读 · 0 评论 -
我会如何从头搭建嵌入式系统
让我从头搭建一个类似openwrt的系统,我才不干,我也干不出那么好。 虽然心里一直说这个系统那么烂,但是不得不为其设计思想感到折服。openwrt的自动下载这个块,设计的思路非常简单,就是按照规则写Makefile由解析程序去下载,解压编译安装。 这套对于普通用户来说很爽,但是如果经常需要编译或者修改就不是很友好。几个字概况就是,不适合产品化。openwrt的内核更新较快,相关软件也有相应升级,原创 2016-07-02 21:28:24 · 886 阅读 · 0 评论 -
iptables connections state 简介
Linux Packet Filtering and iptables Prev Chapter 10. Iptables matches Next 10.3. Explicit matches Explicit matches are those that have to be specifically loaded with the -m or –match原创 2016-05-23 22:36:31 · 372 阅读 · 0 评论 -
Linux C语言strlcpy,strlcat函数
常用字符串操作函数strcat, 连接字符串strcpy, 拷贝字符串以上两个函数经常会出现stack overflow问题,长度问题导致的等。以下两个是相对安全一点的。strncatstrncpy但是,我个人常用的是snprintf函数,这个函数保证以NUL结尾的。所以从来不参考以上的函数。发现新大陆重温privoxy源码,发现了下面的函数strlcpys原创 2016-05-24 09:58:53 · 17934 阅读 · 0 评论 -
转移git仓库
原来的仓库地址如https://git.hiweeds.net/test.git 新的仓库地址为 https://git.hiweeds.net/real.gitgit clone https://git.hiweeds.net/test.gitcd testgit remote set-url https://git.hiweeds.net/real.gitgit push --all原创 2016-02-19 13:36:16 · 554 阅读 · 0 评论 -
Qt在xxx.pro文件中执行shell命令
Qt中在*.pro文件中执行命令可以通过system(touch a)来执行。生成的a文件在×.pro文件所在目录正在写这篇文章的时候, 我发现了一个更好的方法,就是post hook. 在.git/hooks/post-commit中添加命令即可。system()参考链接 采用commit hook来生成版本文件原创 2015-06-26 19:18:10 · 6077 阅读 · 0 评论 -
OpenWrt配置nfs服务器
PC机Ubuntu #sudo apt-get install nfs-kernel-server #/etc/init.d/nfs-kernel-server start #cat /etc/exports # /etc/exports: the access control list for filesystems which may be exported原创 2015-06-24 16:34:30 · 18087 阅读 · 0 评论 -
iPhone作为热点为PC提供网络
iPhone中的”个人热点” 在设置里面, 打开. PC (OS: Ubuntu) 安装libimobiledevice, ipheth-utils, usbmuxd等软件.即可在网络选择Apple iPhone提供网络.参考连接原创 2015-06-25 17:06:39 · 2331 阅读 · 0 评论 -
了解 TCP 系统调用序列
TCP/IP 编程接口提供各种系统调用,以帮助您有效地使用该协议。TCP 堆栈代码数量繁多,深入到内核级别的完整调用序列可以帮助您了解 TCP 堆栈。在本文中,将回顾和学习关于 TCP 调用序列的详细信息,其中包括对 FreeBSD 的引用,以及在用户级进行系统调用后在 TCP 堆栈中发生的重要函数调用。引言典型的 TCP 客户机和服务器应用程序通过发布 TCP 系统调用序列来获取转载 2014-09-25 22:34:47 · 2007 阅读 · 0 评论 -
三个网站让你成为Linux命令行高手
[转载自http://www.linuxeden.com/html/news/20091119/69183.html]Linux的命令行是通向Linux高级应用的必经之路,Linux系统管理员、开发者都是学习对象。Susan Linton向我们推荐了三个学习Linux命令行的网站,现在介绍给大家:1. LinuxCommand LinuxCommand是一个学习Linux命令转载 2014-09-11 23:00:52 · 3441 阅读 · 0 评论 -
Linux Signal 调用时,系统的处理
最近同事的程序设计过程中用到了Linux的signal机制,从而引发了我对Linux中signal机制的思考。Signal机制在Linux中是一个非常常用的进程间通信机制,很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断,因此,在实时性方面还是相对比较高的。Linux中signal机制的模型可以采用下图进行描述。 每个进转载 2012-04-20 18:35:01 · 1284 阅读 · 0 评论 -
Linux文件结构FILE,与普通open,read,write对比
做毕设的过程中想实现数据的保存,但是遇到的问题一大堆,本来打算用sqlite的,但是由于存储速度及复杂性,还是用file实现。1. linux 中 open ,read, write 这些都是用来写文件描述符的,但是对于文件操作还是不是很清楚!!!!!!!!!!!!先MARK一下。!!!!!!!!2.读取的时候总是只能读一行, fread, fwrite, fclose。3原创 2012-04-15 21:21:43 · 2294 阅读 · 0 评论 -
解析Linux中多线程编程并传递多个参数
Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容。今天上午实验了Linux下的多线程编程,并将多个参数传递给线程要执行的函数。在Linux环境下编译通过后,还将它移到了Android的模拟器中。 以下是实验程序的源代码: pthread.c #include #include #include #incl转载 2012-04-26 18:33:20 · 2710 阅读 · 0 评论 -
Makefile Notes (1)
1. shell 语句必须在一行中执行完毕。2. $加变量时 Makefile的变量, 在Makefile中 shell的变量是以 $$开头的。3.Makefile中的 执行shell 命令时 “;” 分号后的命令式基于分号前的命令执行的,所以,如果想建立一个大型项目时,自己写Makefile,你想进入子目录,编译并执行命令@for $$i in `echo $(SUBD原创 2012-04-12 20:45:48 · 972 阅读 · 0 评论 -
linux下的so、o、lo、a、la文件有什么区别
o: 编译的目标文件a: 静态库,其实就是把若干o文件打了个包so: 动态链接库(共享库)lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息la: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息 1 libtool的工作原理libtool 是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中转载 2011-11-06 11:47:08 · 1123 阅读 · 0 评论 -
Linux网络编程常用结构体
struct in_addr { unsigned long s_addr; // that’s a 32-bit long, or 4 bytes }; struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_dat原创 2011-11-16 20:53:45 · 826 阅读 · 0 评论 -
可重入函数和线程安全函数是两个既相关又不完全等同的概念
1. reentrant函数一个函数是reentrant的,如果它可以被安全地递归或并行调用。要想成为reentrant式的函数,该函数不能含有(或使用)静态(或全局)数据 (来存储函数调用过程中的状态信息),也不能返回指向静态数据的指针,它只能使用由调用者提供的数据,当然也不能调用non-reentrant函数.比较典型的non-reentrant函数有getpwnam, strto转载 2011-11-16 17:56:38 · 729 阅读 · 0 评论 -
Linux动态链接库的制作
类似与 win下的dll文件,linux下动态链接库采用 lib+program_name+.so的形式命名动态链接库动态链接库的作用是实现资源共享,各个进程可以同时使用这一段代码而不必在乎其是否正在被使用。下面介绍动态链接库的生成方法。头文件 socklib.h原创 2011-09-18 09:06:29 · 1874 阅读 · 2 评论 -
Linux C获取网页title
1. http 的知识,你需要使用 HTTP GET/POST 请网页2. 把网页请求下来,会得到一个 html,然后解析它3. 解析网页之后找到用户名与密码字段,最后打包出一个 HTTP POST 请求,完成用户名和密码提交4. 服务器会返回一个 HTTP 回应,你原创 2011-09-17 11:27:48 · 4031 阅读 · 0 评论