1.剖析Linux内核源码解读之《实现fork研究(一)》
2.Linux Centos7.8.2003系统离线GCC源码编译升级
3.linux wget 命令用法详解
4.Linux系统中,码断源码编译安装软件包编译过程有问题可以继续安装步骤吗?
5.Linux 中断( IRQ / softirq )基础:原理及内核实现
6.linux编程之《GDB调试技术详解》
剖析Linux内核源码解读之《实现fork研究(一)》
Linux内核源码解析:深入探讨fork函数的实现机制(一)
首先,我们关注的码断焦点是fork函数,它是码断Linux系统创建新进程的核心手段。本文将深入剖析从用户空间应用程序调用glibc库,码断直至内核层面的码断具体过程。这里假设硬件平台为ARM,码断django电商源码使用Linux内核3..3和glibc库2.版本。码断这些版本的码断库和内核代码可以从ftp.gnu.org获取。
在glibc层面,码断针对不同CPU架构,码断进入内核的码断步骤有所不同。当glibc准备调用kernel时,码断它会将参数放入寄存器,码断通过软中断(SWI) 0x0指令进入保护模式,码断最终转至系统调用表。码断在arm平台上,系统调用表的结构如下:
系统调用表中的CALL(sys_clone)宏被展开后,会将sys_clone函数的地址放入pc寄存器,这个函数实际由SYSCALL_DEFINEx定义。在do_fork函数中,关键步骤包括了对父进程和子进程的跟踪,以及对子进程进行初始化,包括内存分配和vfork处理等。
总的来说,调用流程是这样的:应用程序通过软中断触发内核处理,通过系统调用表选择并执行sys_clone,然后调用do_fork函数进行具体的进程创建操作。do_fork后续会涉及到copy_process函数,这个函数是理解fork核心逻辑的重要入口,包含了丰富的内核知识。在后续的内容中,我将深入剖析copy_process函数的工作原理。
Linux Centos7.8.系统离线GCC源码编译升级
要进行Linux Centos7.8.的GCC离线源码编译升级,首先需要准备一个干净的Centos7.8.虚拟机,并可以使用本地镜像源,具体步骤可在相关文章中找到。
在GCC的ftp站点下载所需版本,例如gcc-.1.0。新安装的机器可能缺少编译依赖,但镜像源内通常包含这些,无需在线下载。
编译依赖库一般包括gcc-c++、autoconf、automake、libtools和m4,代挂网源码分站但具体可能因机器环境而异。简便的方法是使用yum group install Development Tools,这个组合包含了大部分开发所需的依赖。
离线编译时,先解压gcc源码,然后进入目录,由于是离线,需要手动下载所有依赖,如gmp-6.1.0、isl、mpfr和mpc。确保按依赖顺序编译,例如先gmp-6.1.0,然后mpc-1.0.3。
创建编译目录,设置编译参数后,开始编译过程。可能遇到找不到库的错误,此时需要将库添加到环境变量。编译时间根据机器性能不同,通常十几分钟内完成。
编译成功后,升级GCC的过程是删除或备份原有GCC软链接,然后指向新编译的GCC目录。升级脚本可以简化这一过程,但如有问题,务必及时调整。
linux wget 命令用法详解
Linux wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟主机,处理这样的事务我们只能先从远程服务器下载到我们电脑磁盘,然后再用ftp工具上传到服务器。这样既浪费时间又浪费精力,那不没办法的事。而到了Linux VPS,它则可以直接下载到服务器而不用经过上传这一步。wget工具体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来方便简单。下面我们以实例的窗口标题更改源码形式说明怎么使用wget。1、使用wget下载单个文件
以下的例子是从网络下载一个文件并保存在当前目录
wget .wordpress.org/wordpress-3.1-zh_CN.zip
在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。
2、使用wget -O下载并以不同的文件名保存
wget默认会以最后一个符合”/”的后面的字符来命令,对于动态链接的下载通常文件名会不正确。
错误:下面的例子会下载一个文件并以名称download.php?id=保存
wget .wordpress.org/wordpress-3.1-zh_CN.zip
4、使用wget -c断点续传
使用wget -c重新启动下载中断的文件:
wget -c .wordpress.org/wordpress-3.1-zh_CN.zip
对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。
5、使用wget -b后台下载
对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载。
wget -b .wordpress.org/wordpress-3.1-zh_CN.zip
Continuing in background, pid .
Output will be written to `wget-log’.
你可以使用以下命令来察看下载进度
tail -f wget-log
6、伪装代理名称下载
有些网站能通过根据判断代理名称不是浏览器而拒绝你的下载请求。不过你可以通过–user-agent参数伪装。
wget –user-agent=”Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/. (KHTML, like Gecko) Chrome/.0.. Safari/.″ 下载链接
7、使用wget –spider测试下载链接
当你打算进行定时下载,你应该在预定时间测试下载链接是否有效。我们可以增加–spider参数进行检查。
wget –spider URL
如果下载链接正确,将会显示
wget –spider URL
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response… OK
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled — not retrieving.
这保证了下载能在预定的时间进行,但当你给错了一个链接,将会显示如下错误
wget –spider url
Spider mode enabled. Check if remote file exists.
HTTP request sent, awaiting response… Not Found
Remote file does not exist — broken link!!!
你可以在以下几种情况下使用spider参数:
定时下载之前进行检查
间隔检测网站是否可用
检查网站页面的死链接
8、使用wget –tries增加重试次数
如果网络有问题或下载一个大文件也有可能失败。wget默认重试次连接下载文件。如果需要,你可以使用–tries增加重试次数。
wget –tries= URL
9、使用wget -i下载多个文件
首先,保存一份下载链接文件
cat filelist.txt
url1
url2
url3
url4
接着使用这个文件和参数-i下载
wget -i filelist.txt
、使用wget –mirror镜像网站
下面的例子是下载整个网站到本地。
wget –mirror -p –convert-links -P ./LOCAL URL
–miror:开户镜像下载
-p:下载所有为了html页面显示正常的文件
–convert-links:下载后,转换成本地的链接
-P ./LOCAL:保存所有文件和目录到本地指定目录
、使用wget –reject过滤指定格式下载
你想下载一个网站,但你不希望下载,你可以使用以下命令。
wget –reject=gif url
、使用wget -o把下载信息存入日志文件
你不希望下载信息直接显示在终端而是在一个日志文件,可以使用以下命令:
wget -o download.log URL
、使用wget -Q限制总下载文件大小
当你想要下载的无线订餐系统源码文件超过5M而退出下载,你可以使用以下命令:
wget -Q5m -i filelist.txt
注意:这个参数对单个文件下载不起作用,只能递归下载时才有效。
、使用wget -r -A下载指定格式文件
可以在以下情况使用该功能
下载一个网站的所有
下载一个网站的所有视频
下载一个网站的所有PDF文件
wget -r -A.pdf url
、使用wget FTP下载
你可以使用wget来完成ftp链接的下载。
使用wget匿名ftp下载
wget ftp-url
使用wget用户名和密码认证的ftp下载
wget –ftp-user=USERNAME –ftp-password=PASSWORD url
wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上。它有以下功能和特点:
(1)支持断点下传功能;这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;
(2)同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;
(3)支持代理服务器;对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
(4)设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
(5)程序小,完全免费;程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的;
wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget [参数列表] URL。下面就结合具体的例子来说明一下wget的用法。
1、下载整个plete/file
使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试次,那么就写-t ,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T ,表示等待秒连接不上就算超时。即时足球比分源码
3、批量下载。
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:wget -i download.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)
4、选择性的下载。
可以指定让wget只下载一类文件,或者不下载什么文件。例如:
wget -m –reject=gif /bases/ -o wget.log
Linux系统中,源码编译安装软件包编译过程有问题可以继续安装步骤吗?
在Linux系统中,如果在源码编译安装软件包的过程中出现问题,可以根据具体情况决定是否继续安装步骤。以下是一些常见的情况和建议:编译错误:如果编译过程中遇到错误消息,请首先检查错误消息以获取有关问题的详细信息。有时候错误可能是由于缺少依赖项、版本不匹配、环境配置问题等引起的。根据错误消息,尝试解决问题并重新编译软件包。如果你能够找到解决方案并成功修复错误,那么你可以继续进行安装步骤。
缺少依赖项:某些软件包可能需要依赖其他库或工具。如果编译过程中出现了缺少依赖项的错误,请确保已经安装了所需的依赖项。使用包管理器来安装缺少的软件包或库,并再次尝试编译和安装。
警告消息:除了错误消息外,编译过程中还可能出现警告消息。有些警告可以被忽略,但其他警告可能表明潜在的问题。在这种情况下,建议仔细检查警告消息,确定是否需要采取进一步的行动。如果你确定警告不会导致严重的问题,可以继续安装步骤。
Linux 中断( IRQ / softirq )基础:原理及内核实现
中断(IRQ),尤其是软中断(softirq)的广泛用途之一是网络数据包的接收与发送,但其应用场景并非单一。本文将全面整理中断(IRQ)与软中断(softirq)的基础知识,这些内容与网络数据包处理虽无直接联系,但整理本文旨在更深入地理解网络数据包处理机制。
什么是中断?
CPU 通过时分复用处理多任务,其中包括硬件任务,如磁盘读写、键盘输入,以及软件任务,如网络数据包处理。CPU 在任何时刻只能执行一个任务。当某个硬件或软件任务当前未被执行,但希望CPU立即处理时,会向CPU发送中断请求——希望CPU暂停手头工作,优先服务“我”。中断以事件形式通知CPU,因此常看到“在XX条件下会触发XX中断事件”的表述。
中断分为两类:
管理中断的设备:Advanced Programmable Interrupt Controller(APIC)。
硬中断的中断处理流程
中断随时发生,处理流程如下:
Maskable and non-maskable
Maskable interrupts 在x_上可以通过sti/cli指令来屏蔽(关闭)和恢复:
在屏蔽期间,这种类型的中断不会触发新的中断事件。大部分IRQ都属于这种类型。例如,网卡的收发包硬件中断。
Non-maskable interrupts 不可屏蔽,因此属于更高优先级的类型。
问题:执行速度与逻辑复杂性之间的矛盾
IRQ处理器的两个特点如下:
存在内在矛盾。
解决方式:中断的推迟处理(deferred interrupt handling)
传统解决方式是将中断处理分为两部分:
这种方式称为中断的推迟处理或延后处理。现在已是一个通用术语,涵盖各种推迟执行中断处理的方式。中断分为两部分处理:
在Linux中,有三种推迟中断(deferred interrupts):
具体细节将在后续介绍。
软中断与软中断子系统
软中断是内核子系统的一部分:
每个CPU上会初始化一个ksoftirqd内核线程,负责处理各种类型的softirq中断事件;
使用cgroup ls或ps -ef都能看到:
软中断事件的handler提前注册到softirq子系统,注册方式为open_softirq(softirq_id, handler)
例如,注册网卡收发包(RX/TX)软中断处理函数:
软中断占用了CPU的总开销:可以使用top查看,第三行倒数第二个指标是系统的软中断开销(si字段):
Linux内核源码分析学习地址:ke.qq.com/course/...
文章福利小编推荐自己的Linux内核源码分析交流群:点击加入整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!
主处理
smpboot.c类似于事件驱动的循环,会调度ksoftirqd线程执行pending的软中断。ksoftirqd内部会进一步调用到__do_softirq,
避免软中断占用过多CPU
软中断的潜在影响:推迟执行的部分(如softirq)可能会占用较长时间,在这段时间内,用户空间线程只能等待。反映在top中,si占比。
不过softirq调度循环对此有所改进,通过budget机制来避免softirq占用过多CPU时间。
硬中断-软中断调用栈
softirq是一种推迟中断处理机制,将IRQ的大部分处理逻辑推迟在这里执行。有两条路径都会执行到softirq主处理逻辑__do_softirq():
1、CPU调度到ksoftirqd线程时,会执行到__do_softirq();
2、每次IRQ handler退出时:do_IRQ()->...
do_IRQ是内核中主要的IRQ处理方式。它执行结束时,会调用exiting_irq(),这会展开成irq_exit()。后者会检查是否pending有softirq,如果有,则唤醒:
进而会使CPU执行到__do_softirq。
软中断触发执行的步骤
总结,每个软中断会经过以下阶段:
以收包软中断为例,IRQ handler并不执行NAPI,只是触发它,在内部会执行到raiseNET_RX_SOFTIRQ;真正的执行在softirq,会调用网卡的poll()方法收包。IRQ handler中会调用napi_schedule(),然后启动NAPI poll()。
需要注意的是,虽然IRQ handler所做的工作很少,但处理这个包的softirq和IRQ在同一CPU上运行。这意味着,如果大量的包都放在同一个RX队列,虽然IRQ开销可能不多,但该CPU仍然会非常繁忙,都花费在softirq上。解决方式:RPS。它不会降低延迟,只是将包重新分配:RXQ->CPU。
三种推迟执行方式(softirq/tasklet/workqueue)
提到,Linux中的三种推迟中断执行方式:
其中:
前面已经看到,Linux在每个CPU上创建了一个ksoftirqd内核线程。
softirqs是在Linux内核编译时确定的,例如网络收包对应的NET_RX_SOFTIRQ软中断。因此是一种静态机制。如果想添加一种新softirq类型,需要修改并重新编译内核。
内部组织
内部由一个数组(或称为向量)管理,每个软中断号对应一个softirq handler。数组与注册:
在5.中所有类型的softirq:
也就是在cat /proc/softirqs看到的哪些。
触发(唤醒)softirq
以收包软中断为例,IRQ handler并不执行NAPI,只是触发它,在内部会执行到raiseNET_RX_SOFTIRQ;真正的执行在softirq,会调用网卡的poll()方法收包。IRQ handler中会调用napi_schedule(),然后启动NAPI poll()。
如果对内核源码有一定了解,会发现softirq使用非常有限,原因之一是它是静态编译的,依赖内置的ksoftirqd线程来调度内置的9种softirq。如果想添加一种新功能,就得修改并重新编译内核,开发成本很高。
实际上,实现推迟执行的更常用方式是tasklet。它构建在softirq机制之上,具体来说就是使用了两种softirq:
换句话说,tasklet是在运行时(runtime)创建和初始化的softirq,
内核软中断子系统初始化了两个per-cpu变量:
tasklet再执行针对list的循环:
tasklet在内核中的使用非常广泛。不过,后面又出现了第三种方式:workqueue。
这也是一种推迟执行机制,与tasklet有些相似,但有显著不同。
使用场景
简而言之,workqueue子系统提供了一个接口,通过该接口可以创建内核线程来处理从其他地方enqueue过来的任务。这些内核线程称为worker threads,内置的per-cpu worker threads:
结构体
kworker线程调度workqueues,原理与ksoftirqd线程调度softirqs类似。然而,我们可以为workqueue创建新的线程,而softirq则不行。
参考资料引用链接
[1]
中断与中断处理:0xax.gitbooks.io/linux-...
作者:赵亚楠 原文:arthurchiao.art/blog/li...来源:云原生实验室
linux编程之《GDB调试技术详解》
在Linux编程中,GDB是一个强大的调试工具,用于查找和修复程序中的逻辑错误。它不仅能让代码逐步执行,查看变量值、内存数据和函数调用,还能设置断点、改变执行顺序,帮助开发者深入理解程序的运行过程。 GDB,全称GNU Symbolic Debugger,是GNU计划的一部分,适用于多种编程语言如C、C++、Go等。它在Linux环境下广泛应用,特别适用于C/C++程序的调试。通过GDB,开发者可以实现如下功能:自定义启动程序,设置参数和环境变量
在指定位置暂停程序,检查当前状态,包括变量值和执行结果
在运行时修改变量值和代码执行路径
安装GDB可以通过包管理器或者源码编译,查看版本则使用gdb -v命令。使用GDB时,确保源代码编译时包含了调试信息,以便GDB跟踪执行流程。 GDB支持的调试命令丰富多样,如设置断点(break, tbreak, rbreak)、删除或禁用断点、观察变量变化(watch, rwatch, awatch),以及单步执行(next, step, until)和查看变量值(print, display)。在程序异常崩溃时,GDB能解析core dump文件,帮助分析问题。 要开始调试,首先确保正确连接到目标程序,然后设置断点,逐步执行,观察变量状态,直至发现问题并修复。在调试完毕后,记得使用detach指令和quit命令解除GDB对程序的影响。Linux内核中断处理流程分析--MIPS体系结构
在Linux内核中,处理器遇到的异常情况主要包括硬复位、软复位、非屏蔽中断(NMI)等。当这些异常发生时,处理器的PC地址会被设置为0xBFC,通常这是系统启动的默认寻址地址。对于复位相关的异常,BIOS会执行重启流程;对于NMI异常,处理器参与异常处理过程。
处理这些异常时,关键在于状态寄存器(Status)的检查。当异常发生时,状态寄存器会记录下具体的异常类型,如复位或NMI。根据异常类型的不同,系统会调用相应的处理函数,比如在发生NMI时调用nmi_exception_handler。这个函数的核心任务是调用通知链进行关机或重启操作。nmi_exception_handler函数使用__noreturn标识,表示函数执行完毕后不会返回。
对于硬件错误异常,如缓存错误或TLB/XTLB错误,软件通常无法处理,最终系统会进入崩溃状态。当缓存发生错误时,系统会报告Panic,并调用cache_parity_error函数处理错误,该函数向用户报告错误,并进入panic()函数。同样,对于TLB/XTLB错误,内核微汇编器会动态生成重填入口向量,以适应平台兼容性需求。关于微汇编器的原理,可以通过查看asm_x_中的定义来了解。
Linux内核还提供了通用异常处理机制,处理诸如中断等通用异常。内核在内存中预先分配了个地址的exception_handlers数组,用于存储各种异常事件的处理函数。当CPU执行到异常处理代码时,会从Cause寄存器的ExCode中读取索引值,通过该索引值跳转到对应的处理函数进行异常处理。例如,使用PTR_L指令进行跳转操作,目标地址中的代码将执行相应的异常处理逻辑。
此外,Linux内核源码中提供了丰富的学习资料和代码,包括视频教程、电子书、实战项目等。对于希望深入学习Linux内核技术的读者,可以加入相关技术交流群,获取这些宝贵资源。