- 博客(182)
- 资源 (34)
- 问答 (1)
- 收藏
- 关注
原创 linux内核启动过程3:内核初始化阶段
上一篇<<linux内核启动过程2:保护模式执行流程>>分析了保护模式启动过程以及bzImage的解压入口函数,本篇继续分析内核启动过程,从保护模式到C代码初始化。startup_64 进入arch/x86/kernel/head_64.S,分析startup_64函数: .text __HEAD .code64SYM_CODE_START_NOALIGN(startup_64) UNWIND_HIN.
2022-02-22 01:12:09 1289
原创 linux内核启动过程2:保护模式执行流程
上一篇<<linux内核压缩制作bzImage>>分析了bzImage制作流程,本篇继续分析内核启动过程,从实模式跳转到保护模式及后续执行流程。protected_mode_jump 进入arch/x86/boot/pmjump.S:/* * void protected_mode_jump(u32 entrypoint, u32 bootparams); */SYM_FUNC_START_NOALIGN(protected_mode_jump)...
2022-02-19 00:11:02 1282
原创 linux内核压缩制作bzImage
接着上一篇<<linux内核启动过程>>继续分析setup.bin和vmlinux.bin执行过程。setup.binOBJCOPYFLAGS_setup.bin := -O binary$(obj)/setup.bin: $(obj)/setup.elf FORCE $(call if_changed,objcopy) call if_changed,objcopy这里找到arch/x86/boot/.setup.elf.cmd文件:c.
2022-02-17 01:30:33 1152
原创 linux内核启动过程
上一篇<<linux内核make执行过程>>分析到setup.bin和vmlinux.bin分支,本篇继续往下分析。setup.binOBJCOPYFLAGS_setup.bin := -O binary$(obj)/setup.bin: $(obj)/setup.elf FORCE $(call if_changed,objcopy) setup.bin依赖于setup.elf,先看下setup.elf分支:LDFLAGS_setup..
2022-02-16 01:30:39 745
原创 linux内核make执行过程
本篇基于上一篇<<linux内核make menuconfig执行过程>>基础上,追溯make执行过程。make1. 与make menuconfig相同的部分 这部分内容与make menuconfig执行条件相同,并且变量值相同,可以忽略。 打开Makefile文件:# SPDX-License-Identifier: GPL-2.0VERSION = 5PATCHLEVEL = 9SUBLEVEL = 0EXTRAVERSION =.
2022-02-13 23:46:32 2733
原创 linux内核make menuconfig执行过程
近两年一直有着写linux内核相关的想法,比如从Makefile执行 make menuconfig、make,到x86架构的引导启动过程。由于网上有较多相关的文章,便有些羞涩于自己动手写。现在想着无论自己水平如何,用自己的思路去追溯代码并记录代码,应该强于融入别人的思想。 本次采用5.9版本内核,通过代码分析、strace跟踪等形式按照自己的理解来写,写的不对的地方请跳过。make menuconfig 示例在x86_64架构的Centos8.2虚拟机中进行.
2022-02-12 17:57:46 3353
原创 多站点高可用部署
当集群跨越多个站点时,站点之间的网络连接问题可能会导致脑裂情况。当连接断开时,一个站点上的节点无法确定另一个站点上的节点是否发生故障或仍在使用发生故障的站点互连运行。此外,在两个相距太远而无法保持同步的站点之间提供高可用性服务可能会出现问题。为了解决这些问题,Pacemaker通过使用Booth集群票证管理器,全面支持配置跨多个站点的高可用性集群的能力。Booth 集群票务管理器概述Booth票证管理器是一种分布式服务,旨在运行在与连接特定站点的集群节点的网络不同的物理网络上。它产生了另一个松散的.
2022-01-30 18:11:00 3083
原创 11月24号,我们为“满月”庆祝
不知何时,10月24号这天成为了程序员们的节日,或者说是“程序”们的节日。今年有幸参加“满月”庆生,收获还是蛮多的。 这次的活动地点在微软亚洲研究院,我与多位博主专家及CSDN工作人员参观了完整活动环节。 首先进入第一个场景,四周由等比例屏幕构成,类似科幻风格,更像是进入“魔方世界”,向脚下望去,微眩晕,有种悬浮的感觉。 这里的设计颇为惊艳,微秀技术的同时,不忘宣传自家的产品! 在我之前的印象里,微软由操作系统出身,业务层面应该是中规中矩的那.
2021-11-25 23:14:20 3021
原创 install.img制作方式
install.img(在部分系统使用)由grub2引导启动,并完成系统磁盘挂载,服务加载等工作,如系统安装程序、备份还原程序在这个文件中修改即可。install.img制作mount install.img (从已有的iso文件中找到install.img);拷贝出LiveOS/rootfs.img,放置目录为build/LiveOS/roofs.img;mount rootfs.img文件并进行修改,如替换系统安装程序;umount rootfs.img;mksquashfs buil.
2021-10-24 11:39:32 1292
原创 Debian、Ubuntu源码编译制作安装包(二)
在<Debian、Ubuntu源码编译制作安装包(一)>文章中描述了dpkg基本制作安装包过程,本篇文章描述如何增加patch及解决出错问题。章节预览:5. 增加patch6. 修改/跳过编译项7. 错误解决8. rpm源码包在Debian系列系统编译目录预览章节内容:5. 增加patch Debian系列系统制作或增加patch较为简单,即可以通过diff -Naur等指令制作patch,也可以直接修改源码,执行dpkg-buildpackage指定patc.
2021-10-06 14:09:17 1874
原创 分布式块设备复制:客户端
分布式块设备复制,英文名称 Distributed Replicated Block Device,简称为 DRBD,它是一种由应用引导内核驱动工作、基于网络的块复制存储解决方案,主要用于服务器之间的磁盘分区、逻辑卷等进行数据镜像。当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样本地主机(主节点)与远程主机(同位节点)的数据就可以保证实时同步,当本地主机出现问题,远程主机上保留着一份相同的数据可以继续使用,保证了数据的安全。 DRBD的核心功能就是数.
2021-09-04 15:17:19 314
原创 Linux内核驱动如何编写?我们先从字符驱动入门开始
几年前正式转到linux开发岗位的时候,由于项目急需编写linux驱动来控制项目采集设备(板卡),我便被安排做这一部分工作。那时候挺慌的…,在之前的一年多时间里基本都是window应用开发,对于linux理解也相对较少。还好那时候认识一些别的公司的大佬,给指点了一二,便开始“模仿造车之路”… 记得那时候领导给了一个月调研时间,希望在一个月内能搞明白板卡的驱动采用哪种方式实现,需要购买什么书籍。 那时候心里虽没有底…,但我也想完成这次挑战,就随便购买了一本《Linux设备驱动程.
2021-06-13 16:55:17 544
原创 掌握spec只需读这一篇文章,CentOS、RedHat、SUSE粉的福利来了
什么是 spec(配置规范文件)?RPM 编译过程的核心是处理 .spec 文件。它说明了软件包怎样被配置,补缀哪些补丁,安装哪些文件,被安装到哪里,在安装该包之前或之后需要运行哪些系统级别的活动。它必须手写,但更简单的办法是拿来他人写好的,在此基础上修改。RPM 自身对于你能在 spec 文件中做什么没有太多限制,所以你可以搞的很复杂。章节预览:1. spec文件的编码2. spec文件的授权3. 编写spec文件3.1 编译一个空文件的安装包4 常用宏5 常用宏章节内容:.
2021-06-06 15:30:03 6290 4
原创 厉害了!VMware ESXi安装记录,附下载
VMware ESXi 是什么?它是直接安装在您的物理服务器上的强大的裸机管理程序。通过直接访问和控制底层资源,VMware ESXi 有效地对硬件进行分区以整合应用程序并降低成本。它是高效架构的行业领导者,树立了可靠性、性能和支持的标准。章节预览:1. 安装ESXi2. 设置ESXi3. 启动ESXi下载ESXi章节内容:1. 安装ESXi 首先打开VMware虚拟机(参考<搭建Linux虚拟机并编写简单程序>),点击左上角“文件” -> “新.
2021-05-31 00:18:50 2588 15
原创 Debian、Ubuntu源码编译制作安装包(一)
Debian、Ubuntu系列linux操作系统制作安装包相较于CentOS更简便一些,如“dpkg -b”指令即可重新打包。如果需要源码级制作安装包则更困难一些,接下来,我们逐步分析Debian、Ubuntu源码编译制作安装包的步骤。章节预览:1. 生成源码文件夹2. 修改control文件3. 修改rules文件4. 生成安装包章节内容:1. 生成源码文件夹 首先我们准备一个可以编译通过的源码包,如openssl-1.1.1k.tar.gz,可从https://ww.
2021-05-09 01:03:56 2750 3
原创 7z用法
7z工具用法解压7za x install.7z -r -o./installx 解压缩文件,并且是按原始目录解压-r 递归所有的子文件夹-o 指定解压到的目录,-o直接接目录压缩7z a -t7z -r manager.7z /home/manager/*a 添加文件/文件夹到压缩包-t 指定压缩类型-r 递归所有的子文件夹,manager.7z 是压缩好后的压缩包名,/home/manager/* 是要压缩的目录,*是表示该目录下所有的文件...
2021-04-02 23:10:06 766
原创 ubuntu中的tftp用法
查看几年前的移动硬盘,发现做过的一些东西现在都快忘了,简单记录一下安装工具sudo apt-get install xinetd tftpd tftp编写配置文件sudo vi /etc/xinetd.d/tftp创建tftp文件并把下列信息写入文件service tftp{protocol = udpport = 69socket_type = dgramwait = yesuser =.
2021-04-02 22:54:30 2318 1
原创 kgdb调试内核无法执行断点及kdb-22:Permisson denied
之前在Centos8操作系统中,通过kgdb调试内核遇到无法执行断点及kdb-22:Permisson denied的问题。接下来,通过本篇文章用来讲述修改的配置参数。章节预览:章节内容:1. 选择内核配置内核参数在linux相关系统中调试内核本是一件较为简单的事情,但某个参数未配置或配置不正确可能会遇到一些小问题:比如无法通过串口连接到目标机器,无法调试目标内核代码等等。首先,我们先从选择内核版本开始入手,通过 uname -r 查看内核版本:图1 查看内核版本参考图1,内核版本为.
2021-02-10 23:48:31 971 1
原创 一起学习C语言:结构体(二)
上一篇<一起学习C语言:结构体(一)> 中,我们了解了结构体的概念与定义形式,以及结构体变量初始化赋值。本章节,我们分析结构体成员访问形式,以及结构数组使用的场景。章节预览:4. 结构成员访问5. 结构数组目录预览章节内容:4. 结构成员访问 通常情况下,结构体内的每个成员都代表着不同的含义,一般需要单独赋值或输出。如游泳比赛中选手的名称、选手的成绩,它们所定义的类型不同,赋值方式也不同。 结构成员访问形式:
2020-12-12 18:56:15 513
原创 Centos系列 Curl error (37): Couldn‘t read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-XXXX
最近在Centos8系统安装gcc时提示“Curl error (37): Couldn’t read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial [Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial]”,经过摸索找到了方法,接下来记录一下修复方法。 先贴一张提示内容: 然后使用:wget https:.
2020-11-03 00:15:32 10719 3
原创 一起学习C语言:结构体(一)
上一章<一起学习C语言:函数> 中,我们了解了函数的声明形式和程序的编译过程,以及函数的递归调用和函数的指针调用。本章节,我们分析结构体。章节预览:结构体1. 结构体的定义形式2. 结构变量的定义形式3. 结构变量初始化赋值目录预览章节内容:结构体 实际编程中,一些函数采用数据按组传入使用,比如整形数组对象(512位成员)作为参数传入。如果一组数据中包含不同类型的数据时,数组已不再适用,我们需要考虑其它保存方式。首先,我们了解一组数据中包含不同类
2020-10-24 12:07:13 438
原创 tensorflow离线安装指南
tensorflow离线安装是一件麻烦的事情,首先需要确定tensorflow安装包兼容当前环境,其次是依赖库较多且库版本需适配。接下来,我们在一台有网络的centos服务器系统内下载依赖库并完成适配。目录1. 下载tensorflow安装包1.1 确认python版本1.2 配置venv1.3 自动获取(安装)tensorflow指定版本2. 离线适配依赖库2.1 网络配置2.2 适配依赖库内容1. 下载tensorflow安装包 首先,我们需要确定安装ten.
2020-10-06 14:22:23 8262 3
原创 一起学习C语言:函数(四)
上一篇<一起学习C语言:函数(三)> 中,我们了解了变量的储存类别与声明方式,以及函数的递归调用原理。本章节,我们分析函数的指针调用,以及函数指针作函数参数使用的场景。章节预览:8. 函数的指针调用8.1 函数指针作函数参数使用9. 本章总结目录预览章节内容:8. 函数的指针调用 前面小节中我们了解到全局变量和静态变量在程序编译期间确定逻辑内存地址和内存空间大小,并在程序执行期间分配实际内存地址和对应的内存空间大小。当然,函数也是采用类似的形式
2020-09-20 22:13:01 2203 6
原创 一起学习C语言:函数(三)
上一篇<一起学习C语言:函数(二)> 中,我们了解了内部函数和外部函数,以及变量的声明周期与作用域。本章节,我们分析函数的存储类别与声明方式,以及函数的递归调用原理。章节预览:6. 变量的存储类别与声明方式7. 函数的递归调用目录预览章节内容:6. 变量的存储类别与声明方式 在C语言中,全局变量可以如全局函数那般在别的文件内使用,局部变量也可以具有全局变量相同的生命周期。 在前面的内容中,我们了解到内存分为动态内存和静态内存。其中动态
2020-09-06 22:28:01 1900 2
原创 linux动态库修改名称(修改库文件内容)
在linux系统下,当系统中存在多个相同命名的动态库(.so)时,ldconfig只为执行程序链接最后找到的库,而之后找到的库虽然通过“ifconfig -p”可以看到库路径信息,但不会被链接到执行程序。 在实际编程中,如果多个项目都用到某个动态库(比如libteaa.so,存在有多个并且在不同路径下),而且libteaa.so内的某个函数实现不同,部分程序编译或执行时将会出现异常情况。举两个简单例子:a程序需要调用libteaa.so内的add函数为int add(i
2020-08-13 00:40:29 6118 7
原创 一起学习C语言:函数(二)
上一篇<一起学习C语言:函数(一)> 中,我们了解了函数的概念,以及函数实现与程序编译过程。本章节,我们分析内部函数和外部函数,以及变量的生命周期。章节预览:4. 外部函数与内部函数4.1 外部函数4.2 内部函数5. 变量的生命周期与作用域目录预览章节内容:4. 外部函数与内部函数 默认情况下,我们定义或声明的函数属于“外部”函数,又称为“全局”函数。全局函数即可以被本文件中的其他函数调用,也可以被其他文件中的函数调用。
2020-08-01 21:51:07 1587
原创 一起学习C语言:函数(一)
上一章<一起学习C语言:初谈指针> 中,我们了解了指针和进程中的内存区域,以及动态管理内存空间方式。本章节,我们分析函数的用法,以及编写不同形式的函数。章节预览:函数1. 函数的概念2. 函数定义3. 函数声明与程序编译过程目录预览章节内容:函数 在“1.6.4 main函数用法”小节中,我们了解到“C语言大部分程序由main函数主导着程序正常执行”,也可以理解为“C语言大部分程序由main函数作为程序执行入口(出口)”。但是到目前为止,我们
2020-07-04 22:55:29 2620 3
原创 CMake实战技巧
CMake是一个开放源代码,跨平台的工具系列,旨在构建,测试和打包软件。CMake用于使用简单平台和独立于编译器的配置文件控制软件编译过程,并生成可在您选择的编译器环境中使用的本机makefile和工作区。CMake工具套件是由Kitware创建的,旨在满足ITK和VTK等开源项目对功能强大的跨平台构建环境的需求。简单来说,CMake是一款非常强大的编译工具,配合buildroot可以做到自动从下GitHub下载源码、自动选择架构并编译到指定目录。听起来是不是很强大?当然,部分编译工具也能做到这一点,.
2020-06-23 00:59:45 1860
原创 自从用了这几个网站后,linux下的开发(使用)更加简单化
在linux相关平台下开发与调试程序经常会遇到各种耗时的问题:比如目标机器不能联网安装依赖包,内核相关定义和函数不方便查找等。接下来,先从下载包开始,为大家推荐几个网站提高编程效率。章节预览:BelnetDebian系列包下载ubuntu系列包下载bootlin内核信息查找mirrors内核下载章节内容:BelnetBelnet公共FTP服务器,该服务器位于比利时布鲁塞尔,由比利时教育和研究网络Belnet运营。主要用于linux相关系统、依赖包下载,其中Debian、.
2020-06-13 17:07:44 3390
原创 一起学习C语言:初谈指针(三)
上一篇<一起学习C语言:初谈指针(二)> 中,我们了解了进程中的内存区域,以及动态管理内存空间方式。本篇文章中,我们分析更多的动态分配函数,并通过示例来了解不同场景中的动态内存的分配、使用和释放方式。章节预览:7. 常见的动态分配函数8. 本章总结目录预览章节内容:7. 常见的动态分配函数 在一些场景中,由于malloc函数分配方式较为局限性,而不能满足使用要求。接下来,我们了解更多关于内存分配的函数。realloc函数函数原型:void *
2020-06-07 18:22:52 427
原创 windows:QtCreator调用库的方式
在windows相关系统中,使用QtCreator无法像linux相关系统那样调用静态或动态库,需要修改添加方式才能正确执行程序接下来需要5分钟阅读时间,来了解windows相关系统中QtCreator添加库的方式 在QtCreator中,一般使用MinGW32或MinGW64编译工程,直接使用LIBS += -lXXXX,会产生错误提示,参考图1:图1 linux方式加载出错 针对这种情况,我们首先确定MinGW属于32位还是64位,参考图2:图2 在项目中查看.
2020-05-28 01:03:34 2150
原创 一起学习C语言:初谈指针(二)
上一篇<一起学习C语言:初谈指针(一)> 中,我们了解了指针变量的声明和初始化方式,以及指针变量的引用赋值方式。本篇文章中,我们初步分析不同的内存空间 ,并通过示例来了解动态内存的分配、使用和释放方式。章节预览:4. 首谈进程中的内存区域5. 指针变量存储字符串常量6. 如何动态分配内存空间目录预览章节内容:4. 首谈进程中的内存区域 当程序执行时,程序将会以进程的形式存在虚拟内存中,系统会为我们的进程分配不同的内存空间。我们的进程就像一个大箱子,
2020-05-19 01:32:00 402
原创 一起学习C语言:初谈指针(一)
上一章<一起学习C语言:数组> 中,我们了解了数组的用法和适用场景,以及不同维度数组的下标计算方式。本章节,我们初步了解指针,并通过示例分析指针、指针变量的性质。章节预览:初谈指针1. 指针的概念2. 指针变量的声明与空指针3. 指针变量的引用赋值方式目录预览章节内容:初谈指针 在前面的章节中,我们简单了解了内存空间的概念和内存地址的获取方法。在实际编程中,需要理解更多关于内存方面的知识。 本章节通过了解指针,来分析程序中不同的内存
2020-05-11 00:20:05 564
原创 一起学习C语言:数组(三)
上一篇 <一起学习C语言:数组(二)> 中,我们了解了二维数组语法和二维数组的应用场景。本篇文章中,我们分析更多维度数组语法,并通过三维数组示例来了解更多维数组的初始化赋值、存储方式。章节预览:7. 多维数组的用法8. 本章总结目录预览章节内容:7. 多维数组的用法 当二维数组不能表达实际需求时,可以构建更多维数的数组使用。比如三维数组...
2020-05-04 15:36:21 573
原创 高级语言中的关键字:const用法分析
const是constant的缩写,本意是“不变的、不易改变的”,它属于c、c++、Java等高级语言中的关键字,通常用来修饰变量对象、函数参数、c或c++指针对象使用。 const在实际编程中起着至关重要的作用,本文主要讲解它在编程中的不同含义。章节预览:1. 变量修饰2. 指针修饰章节内容:1. 变量修饰 【例1】 int const...
2020-05-01 14:48:32 515
原创 一起学习C语言:数组(二)
上一篇 <一起学习C语言:数组(一)> 中,我们了解了一维数组语法和一维字符数组的应用场景。本篇文章中,我们分析二维数组语法,并通过二维数组示例来了解二维数组的初始化赋值、存储方式。章节预览:4. 二维数组的声明5. 二维数组的初始化赋值6. 二维整数类型数组使用目录预览章节内容:4. 二维数组的声明 二维数组属于一个具有固定大小,...
2020-04-18 21:14:19 449
原创 【十万个编程篇】Linux—Debian系列,deb包首次分析
deb格式属于Debian系列专属安装包格式,它广泛应用在Debian、Ubuntu等Linux发行版本中。deb包的制作过程也比较简单,它由包文件信息以及包内容,经过tar打包而成。实际制作或使用时,只需dpkg相关指令即可完成这些工作。 大部分发行版中,deb包的安装信息记录在“/var/lib/dpkg”文件夹内,参考图1: 图1-deb包安装信息 ...
2020-04-08 23:13:15 1038 1
原创 一起学习C语言:数组(一)
上一章 <一起学习C语言:C语言循环结构> 系列内容中,我们了解了循环结构的用法和适用场景,以及循环结构结合continue语句、break语句的处理方式。本章节,我们学习数组用法。章节预览:数组1. 一维数组的声明2. 一维数组的初始化赋值与使用3. 一维字符类型数组使用目录预览章节内容:数组 在C语言中,某一数据类型拥有多个必...
2020-04-05 18:29:45 524
原创 一起学习C语言:C语言循环结构(三)
上一篇 <一起学习C语言:C语言循环结构(二)> 中,我们了解了while、do…while语法和continue语句的应用场景。本篇文章中,我们分析循环结构嵌套使用,并通过几个示例分析continue和break语句的结合用法。章节预览:3. continue和break应用场景4. 循环结构嵌套4.1 循环结构嵌套用法5. 本章总结目录预览章节内容:...
2020-03-22 18:00:23 751
原创 【十万个编程篇】写文章与“写项目”的差别
自古暨今,世间陆续诞生出“现象级”的文学作品,如《左传》、《桃花源记》、《背影》等文章,又如《咏鹅》、《将进酒》、《一剪梅》等诗词。 编程世界也同样续写着新的辉煌,如Unix、Windows、Linux等内核系统,又如Apache、Tengine、ECharts等开源项目。 它们无一例外,都标志着历史的发展与演变过程。它们也拥有着独特的风格,只有“现...
2020-03-21 16:31:18 1097
tensorflow_install.zip
2020-10-06
DataOperation_20200304.zip
2020-03-04
MFC内部调用matlab函数(32位/64位)
2018-08-18
MFC按USB插口顺序显示所有USB设备(包括安卓)
2018-03-18
thinking c++
2017-03-21
linux 汇编完整语法介绍
2017-03-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人