
linux
文章平均质量分 60
oushaojun2
关注我的都是有品位的人,大家一起进步
展开
-
Tutk P2P的原理和常见的实现方式(转)
例如,当A发送一个UDP数据包给B的公网地址时,数据包最初有源IP地址和端口地址10.0.0.1:1234和目的地址155.99.25.11:62001,NAT收到包后,将其转换为源155.99.25.11:62000(A的公网地址)和目的10.1.1.3:1234,然后再转发给B。在中间件为常见的NAPT的情况下(也是本文主要讨论的),内网中的客户端没有单独的公网IP地址,而是通过NAPT转换,和其他同一内网用户共享一个公网IP。假设客户端A和客户端B的地址都是内网地址,且在不同的NAT后面。原创 2025-03-07 16:34:20 · 888 阅读 · 0 评论 -
使用vscode+clangd远程精准浏览linux kernel源码(原创)
vscode是一个编辑器,可以调用各种插件来完成更多高级功能,clangd是一个代码解析工具,是clang的一个子项目。vscode中集成clangd以后,就可以精准的查看代码的调用情况,因为clangd对整个编译过程进行了跟踪(使用compile_commands.json文件实现),对于linux kernel这种复杂的项目非常适合,放弃source insight吧,那玩意儿没啥用,一个宏定义你能找出来几百个定义,鬼知道哪个是实际的定义来源。原创 2023-03-31 13:27:59 · 8688 阅读 · 8 评论 -
linux应用中的时间处理
【代码】linux应用中的时间处理。原创 2023-03-09 15:10:47 · 233 阅读 · 0 评论 -
TCP协议的滑动窗口和流量控制算法(转)
另外,Nagle 算法默认是打开的,如果对于一些需要小数据包交互的场景的程序,比如,telnet 或 ssh 这样的交互性比较强的程序,则需要关闭 Nagle 算法。那么,当发生窗口关闭时,接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失了,那麻烦就大了。接着,就重新开始慢启动,慢启动是会突然减少数据流的。这会导致发送方一直等待接收方的非 0 窗口通知,接收方也一直等待发送方的数据,如不采取措施,这种相互等待的过程,会造成了死锁的现象。原创 2022-12-19 14:15:35 · 673 阅读 · 0 评论 -
vscode远程调试Linux CUDA程序
2 使用remote-ssh登陆到远程的linux服务器,登陆以后看看安装的插件,需要在远程linux服务器也同时安装插件。确保提到的三个插件在远程端是可以用的。3 确保在远程linux服务器已经安装了cuda编译器,没有装的话点下面的链接,输入命令 nvcc -V查看安装情况。4 新建一个目录用来测试,例如~/my_cuda,用vscode打开此目录。1 本地安装插件:remote-ssh,Microsoft。点击CUDA调试按钮就可以运行了。把窗口切换到test.cu,原创 2022-09-13 17:04:52 · 3578 阅读 · 5 评论 -
linux 字符驱动完整框架(poll,async,waitqueue,nonblock等)
一个linux内核驱动的完整框架,包含了能遇到的大部分内容,例如timer, poll, async, waitqueue, nonblock等等,不过基本上没啥大用,就是用来熟悉基础的,正常的驱动不太会这么简单。后面还包含了makefile,直接在ubuntu上都可以编译运行。......原创 2022-08-31 15:36:01 · 414 阅读 · 0 评论 -
linux ubuntu下带GUI的网络和串口调试助手
mNetAssist这个工具在ubuntu下可以运行,是个带界面的tcp调试工具。更具体的使用参考:Ubuntu网络调试助手mNetAssist的安装以及解决无法打开运行的问题_GritYearner的博客-优快云博客_ubuntu网络调试助手原创 2022-07-13 18:48:22 · 12687 阅读 · 0 评论 -
arm linux游戏手柄(joystick)驱动移植
参考了如下经验:Linux系统中使用Xbox360手柄 - 知*行 - 博客园 (cnblogs.com)使用BlueZ连接蓝牙手柄_Dokin丶的博客-优快云博客_蓝牙手柄驱动编译内核后可以在/dev/input中生成js0设备od /dev/input/js0有数据原创 2022-07-08 14:41:18 · 2339 阅读 · 0 评论 -
linux 开机运行应用程序
在linux系统中设置开机启动应用原创 2022-07-07 16:03:05 · 709 阅读 · 0 评论 -
GitLab 使用Tortoisegit询问“git@192.168.1.18‘s password“问题解决
现象如下:使用TortoiseGit去拉本地GitLab上建立的项目时,一直提示输入密码(如下图),这个密码又没有指定用户名,就算你输入你用户名的密码也是失败。但是很诡异的是,你使用git bash又是能正常操作的,证明跟服务器的通信时ok的,例如如下的bash命令是正常运行的(将网址换成自己的项目网址):ssh -vT git@192.168.0.108解决方法:https://stackoverflow.com/questions/8846972/tortoisegit-askin原创 2021-04-01 17:33:35 · 13076 阅读 · 0 评论 -
cannot stat '/var/cache/sublime-text-2/Sublime Text 2/*'解决
最近linux安装sublime-text失败,遇到这个问题,同时安装gcc也遇到这个问题,没法绕开,那就解决他。其实很好解决:原网址在这里 https://askubuntu.com/questions/613044/install-sublime-text-3-on-digitalocean-droplet-running-ubuntu-os大神的步骤是:cd to /var/cache/su...原创 2018-05-25 17:37:24 · 336 阅读 · 0 评论 -
linux驱动程序设计5
带参数的驱动设计我们可以用“module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数,例如下列代码定义了1个整型参数和1个字符指针参数:static char *book_name = "dissecting Linux Device Driver";module_param(book_name, charp, S_IRUGO);static int book_num = ...原创 2018-05-29 14:46:24 · 1001 阅读 · 0 评论 -
用 GDB 调试可加载模块ko
用 GDB 调试可加载模块 在调试发生于模块中的 panic, 或者使用远程 GDB 调试使用动态模块的机器时, 需要告诉 GDB 如何获取这些模块的符号信息。 首先, 需要在编译模块时加入调试信息:# cd /sys/modules/linux# make clean; make COPTS=-g 如果使用远程 GDB, 您可以在目标机上执行 kldstat 来了解模块的加载位置:# k...转载 2018-05-30 14:32:33 · 6699 阅读 · 1 评论 -
linux驱动程序设计6 字符驱动globalmem
第6章 字符设备驱动本章导读在整个Linux设备驱动的学习中,字符设备驱动较为基础。本章将讲解Linux字符设备驱动程序的结构,并解释其主要组成部分的编程方法。6.1节讲解了Linux字符设备驱动的关键数据结构cdev及file_operations结构体的操作方法,并分析了Linux字符设备的整体结构,给出了简单的设计模板。6.2节描述了本章及后续各章节所基于的globalmem虚拟字符设备,第...原创 2018-05-30 18:26:47 · 538 阅读 · 0 评论 -
linux驱动程序设计7 Linux设备驱动中的并发控制
在Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也会常常设计出包含并发问题bug的驱动程序。Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。7.1节讲解了并发和竞态的概念及发生场合。7.2节则讲解了编译乱序、执行乱序的问题,以及内存屏障。7.3~7.8节分别讲解了中断屏蔽、原子操作、自旋锁、信号量和互斥体等...原创 2018-07-09 15:24:12 · 1080 阅读 · 0 评论 -
linux驱动程序设计8 Linux设备驱动中的阻塞与非阻塞I/O
本章导读阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活地支持这两种用户空间对设备的访问方式。8.1节讲述了阻塞和非阻塞I/O的区别,并讲解了实现阻塞I/O的等待队列机制,以及在globalfifo设备驱动中增加对阻塞I/O支持的方法,并进行了用户空间的验证。8.2节讲述了设备驱动轮询(Poll)操作的概念和编程方法,轮询可以帮助用户了解是否能对设备进行无阻塞访问。8.3节讲解在glo...原创 2018-07-09 15:27:19 · 397 阅读 · 2 评论 -
linux 下的gcc应用,编译和调试方法
原网址:https://blog.youkuaiyun.com/dawn_cx/article/details/6993623此文主要简单的介绍了gcc编译链接的过程的简单描述和调试方法的简单描述,写的很不错。gcc通常用来编译.c结尾的c文件,g++用来编译.cpp结尾的c++文件。因为gcc可以编译c++源文件,但不能完成c++使用的库的连接。GCC起步 在学习使用GCC之前,下面的这个例子能够帮助用户...转载 2018-07-09 15:57:36 · 2503 阅读 · 1 评论 -
linux驱动程序设计21 Linux设备驱动的调试
本章导读“工欲善其事,必先利其器”,为了方便进行Linux设备驱动的开发和调试,建立良好的开发环境很重要,还要使用必要的工具软件以及掌握常用的调试技巧等。21.1节讲解了Linux下调试器GDB的基本用法和技巧。21.2节讲解了Linux内核的调试方法。21.3~21.10节对21.3节的概述展开了讲解,内容有:Linux内核调试用的printk()、BUG_ON()、WARN_ON(...原创 2018-08-09 16:50:21 · 1226 阅读 · 0 评论 -
linux驱动程序设计10 中断与时钟
本章主要讲解Linux设备驱动编程中的中断与定时器处理。由于中断服务程序的执行并不存在于进程上下文中,所以要求中断服务程序的时间要尽量短。因此,Linux在中断处理中引入了顶半部和底半部分离的机制。另外,内核对时钟的处理也采用中断方式,而内核软件定时器最终依赖于时钟中断。10.1节讲解中断和定时器的概念及处理流程。10.2节讲解Linux中断处理程序的架构,以及顶半部、底半部之间的关系。...原创 2018-08-01 19:57:55 · 748 阅读 · 0 评论 -
linux Kconfig语法
内核配置脚本文件的语法也比较简单,主要包括如下几个方面。(1)配置选项大多数内核配置选项都对应Kconfig中的一个配置选项(config):config MODVERSIONSbool "Module versioning support"helpUsually, you have to use modules compiled with your kernel.Saying Y here ma...转载 2018-04-21 20:26:04 · 830 阅读 · 0 评论 -
linux shell编程
linux shell编程很有意思,可以做很多有意思的事情,用熟了可以随心所欲的控制电脑做自动化的操作,很有意思。如下列举一下自己遇到的有意思的操作。1 查询目录中所有的文件[python] view plaincopyfor file in `ls ./`; do echo $file原创 2018-04-20 10:28:21 · 165 阅读 · 0 评论 -
linux驱动编程注意事项
1 license问题,Linux驱动必须有license,使用MODULE_LICENSE("GPL");解决2 避免“名字空间污染”,模块动态链接进内核里,最好不要输出内核中的全局变量灯,解决方法:EXPORT_NO_SYMBOLS,使用此宏后的文件内容不能输出任何符号,EXPORT_SYMBOLS,强制输出某符号,可以输出static的符号,需要在EXPORT_NO_SYMBOLS使用之原创 2017-03-08 15:57:23 · 477 阅读 · 0 评论 -
linux驱动程序开发2
驱动程序设备号1 驱动程序有主设备号,次设备号之分,主设备号是区分设备属于哪个驱动的标志,次设备号是驱动程序用来区别多个设备的。2 设备号的内部表示: typedef unsigned long dev_t;其中搞12位为主设备号,低20位为次设备号。 已知dev_t类型的变量,要想获取主设备号或者次设备号,使用宏:MAJOR(dev_t dev) MINOR(dev_t原创 2017-03-17 20:26:23 · 335 阅读 · 0 评论 -
linux操作系统修改环境变量PATH的正确方式
一般搜索linux下修改PATH,都是说要修改.bashrc或者/etc/profile,我一直很好奇PATH变量真的存在哪个文件里面,上述的修改方式只是在原有基础上增加地址而已。后来看书的时候发现,其实PATH变量是存在/etc/environment里面的,直接修改就行了原创 2017-01-06 09:15:19 · 536 阅读 · 0 评论 -
编译错误"/usr/bin/ld: cannot find -lz"
今天在编译libid3tag的时候死活编译不过去,zlib-1.2.3编译成功了,但是libid3tag make的时候死活报有问题,发现了有个提示是:/usr/bin/ld: cannot find -lzcollect2: error: ld returned 1 exit status后来在网上查找,有人给出了原因:编译的时候出现"/usr/bin/ld: canno转载 2017-01-09 17:46:47 · 13561 阅读 · 1 评论 -
linux tar 解压命令总结 (转)
把常用的tar解压命令总结下,当作备忘:tar-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。-z:有gzip属性的-j:有bz2属性的-Z:有compress属性的转载 2017-01-06 15:03:38 · 346 阅读 · 0 评论 -
linux Samba 服务器配置
下面所述为CentOS 6的Samba服务器设置,设置Samba服务器是为了在虚拟机中的或者服务器中的linux和本地windows之间共享文件。现在是叙述在虚拟机中的linux与windows之间的samba服务器架设。安装VMware虚拟机后下载CentOS6的镜像,然后用虚拟机安装镜像。为了能让虚拟机中的CentOS能上网,虚拟机设置时开启NAT模式,如下图:原创 2015-10-22 14:17:17 · 770 阅读 · 0 评论 -
linux驱动程序开发3
驱动程序中的并发控制方法:一个硬件可能会被多个进程并发使用,例如scull_read的时候被另外一个进程调用的scull_write打断,那么读到的数据就不是以前应该读到的数据,这就需要并发控制并发控制其实多数是使用信号量来完成,包括如下5种方式:1 信号量,2自旋锁,3读写信号量,4读写自旋锁,5completion机制信号量操作方法:1 定义及初始化struct s原创 2017-03-20 16:20:31 · 298 阅读 · 0 评论 -
linux驱动程序开发4
驱动程序中的阻塞与非阻塞编程一个驱动当它无法立刻满足请求的时候,驱动应当阻塞进程,使它进入休眠,直到请求可以继续时再将它唤醒。操作系统实现的原理是,当驱动发现无法满足进程的请求时,会调用内核api将该进程挂入等待队列后主动放弃cpu,从而进程睡眠,当驱动发现已睡眠进程被唤醒的条件已经满足时,将会唤醒睡眠进程,其实质是调用内核api将挂入等待队列的进程从等待队列中摘除,然后调用该进程运行。原创 2017-03-21 14:33:08 · 415 阅读 · 0 评论 -
linux下的c语言风格
3.5 Linux下的C编程特点3.5.1 Linux编码风格Linux有独特的编码风格,在内核源代码下存在一个文件Documentation/CodingStyle,进行了比较详细的描述。Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的不同。在Windows程序中,习惯以如下方式命名宏、变量和函数:#define PI 3.1415926 /* 用大写字母代表宏...原创 2018-04-22 21:45:02 · 1303 阅读 · 0 评论 -
linux编译单独一个模块makefile写法(转)
单个文件编译一个模块:[html] view plain copy ifneq ($(KERNELRELEASE),) obj-m := mini2440_leds.o else KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2/ all: make -C $(KDIR) M=$(PWD) modules ARCH=ar...转载 2018-04-21 23:32:03 · 2607 阅读 · 0 评论 -
linux常用命令
1 清理kernel的编译结果,Please check your kernel and try to clean the directory by runningmake distclean原创 2018-01-19 15:59:04 · 177 阅读 · 0 评论 -
Linux系统下安装rz/sz命令交叉编译和使用方法
rz/sz可以通过串口在windows桌面和linux开发板、windows桌面和linux虚拟机之间传输文件,不需要配置各种烦人的ip地址实现ftp、nfs之类的操作,很实用。在编译使用过程中自己遇到了很多坑,终于还是编译成功了,记录下来惠及更多人和作为笔记。1 登陆linux桌面,例如ubuntu虚拟机,su打开命令行,输入如下命令:cd /tmpwget http://www.ohse....原创 2017-09-12 20:24:57 · 2569 阅读 · 0 评论 -
交叉编译GDB工具
GDB是Linux下用来调试驱动的利器,可以单步、设置端点、查看变量等等,简直跟一个硬件调试器一样,很方便。现在要在Linux虚拟机中编译一个GDB,然后下载到Linux开发板中运行,好方便调试开发板的驱动。如下步骤:1 下载资源,共需要两个资源,一个是termcap,一个是gdb,前一个是gdb要编译所依赖的库。地址如下:(需要注意的是,下载的时候不要贪图最新版本,因为很有可能你装的编译原创 2017-09-30 00:20:49 · 2572 阅读 · 0 评论 -
linux驱动程序开发 1
linux驱动程序分成三类:字符设备,块设备,网络设备。字符设备:能像字节流一样访问的设备,通过/dev下的字符设备文件来访问。块设备:按照块为单位来访问数据,比如一块为512KB,是通过/dev下的文件系统节点来访问的。与字符设备的区别是接口不同,除了提供同字符设备一样的接口外,还提供专门面向块设备的接口,块设备必须支持挂装文件系统,应用程序一般通过文件系统来访问块设备上的内容,而不是直原创 2017-03-17 14:41:57 · 542 阅读 · 0 评论 -
arm-linux-gcc 编译器的安装
下载arm-linux-gcc-4.3.2.tgz以root用户登录(切换为root账号)解压文件#tar xvzf arm-linux-gcc-4.3.2.tgz -C /添加环境变量:#gedit /root/.bashrc在最后一行加上:export PATH=/usr/local/arm/4.3.2/bin:$PATH使.bashrc文件转载 2015-10-23 16:01:55 · 2102 阅读 · 0 评论