首页
游戏
影视
直播
广播
听书
音乐
图片
更多
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
Search
1
在IC617中进行xa+vcs数模混仿
81 阅读
2
科普:Memory Compiler生成的Register file和SRAM有何区别?
73 阅读
3
virtuoso和empyrean alps模拟仿真和混仿教程
73 阅读
4
后仿中$setup,$hold与$setuphold
44 阅读
5
文档内容搜索哪家强? 15款文件搜索软件横向评测
35 阅读
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
登录
Search
标签搜索
python
Docker
vscode
linux
systemverilog
vcs
STM32
PyQT
EDA
FPGA
gvim
cadence
Alist
xilinx
UVM
uos
macos
package
MCU
risc-v
bennyhe
累计撰写
378
篇文章
累计收到
31
条评论
首页
栏目
默认分类
芯片市场
数字电路
芯片后端
模拟电路
芯片验证
原型与样片验证
算法与架构
DFX与量产封装
PC&Server OS设置
移动OS设置
软件方案
新浪备份
有道备份
页面
游戏
影视
直播
广播
听书
音乐
图片
看书
微视
主播
统计
友链
留言
关于
论坛
邮件
推荐
我的硬盘
我的搜索
我的记录
我的文件
我的图书
我的笔记
我的书签
我的微博
搜索到
5
篇与
的结果
2026-01-07
怎么搭建学习Linux内核的运行、调试环境?
作者:Tools boy链接:https://www.zhihu.com/question/66594120/answer/355840304来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一步一步教你搭建linux内核调试环境,因为毕设跟os有关,最近在学习ulk3(深入理解linux内核第三版),感觉光看书不动手实践是很容易遗忘知识,于是开始动手调试书上对应版本的linux2.6内核环境: ubuntu-14.04.1 32位桌面版 内核版本:3.13.0-32-generic 调试的内核为:linux-2.6.26版本调试工具:qemu,gdb,busybox 1.编译x86下的linux2.6内核首先下载linux-2.6.26版本内核Index of /pub/linux/kernel/v2.6/. ubuntu安装qemusudo apt-get install qemutar -zvxf linux-2.6.26.tar.gzsudo apt-get install libncurses5-dev (执行linux+busybox菜单式的配置,需要的库)进入linux2.6-26根目录,执行以下命令make menuconfig,选择 kernel hacking—>[*] compile the kernel with debug info 让其携带调试信息make defconfig 生成配置文件make 编译kernel接着make时,会出现 undefined reference to __mutex_lockslowpath解决方法:需要去kernel/目录找到mutex.c修改,在static跟void之间加上__used,同样__mutex_unlockslowpath也要加上__usedstatic __used void fastcall noinline __sched __mutex_lock_slowpath继续make,会出现以下错误gcc: error: elf_i386: No such file or directorymake[1]: * [arch/x86/vdso/vdso32-int80.so.dbg] Error 1make: * [arch/x86/vdso] Error 2原因在于我的宿主机是gcc 4.8.2,编译器版本过高,不再支持 linker-style 架构.需要修改arch/x86/vdso/Makefile,大约在28,29行 找到 VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -Wl,-soname=linux-vdso.so.1 \ -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 把"-m elf_x86_64" 替换为 "-m64"2然后再继续找,大约在72行左右,找到VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -Wl,-soname=linux-gate.so.1中的 "-m elf_i386" 替换为 "-m32"接着继续执行make,就可以继续编译内核,出现以下字样就表示内核编译ok了Root device is (8, 1)Setup is 12160 bytes (padded to 12288 bytes).System is 2653 kBCRC ae462731Kernel: arch/x86/boot/bzImage is ready (#4) Building modules, stage 2. MODPOST 1 modules2.接着使用busybox制作文件镜像建立目标根目录映像dd if=/dev/zero of=myinitrd4M.img bs=4096 count=1024mke2fs myinitrd4M.imgmkdir rootfssudo mount -o loop myinitrd4M.img rootfs准备dev目录sudo mkdir rootfs/devlinux启动过程中会启用 console设备sudo mknod rootfs/dev/console c 5 1另外需要提供一个linux根设备,我们使用 ramsudo mknod rootfs/dev/ram b 1 0接着下载busyboxhttps://www.busybox.net/downloads/busybox-1.20.1.tar.bz2 执行以下命令make defconfigmake menuconfig修改如下配置:busybox settings –> build options –> build busyboxas a static binary( no share libs)执行make在busybox目录下sudo make CONFIG_PREFIX=(path to rootfs)/ installsudo umount rootfs完成根文件系统的制作接着执行qemu-system-i386 -kernel ../linux-2.6.26/arch/x86/boot/bzImage -initrd myinitrd4M.img -append "root=/dev/ram init=/bin/ash"看是否可以顺利的进入到busybox提供的shell环境作者:Tools boy链接:https://www.zhihu.com/question/66594120/answer/355840304来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。3.qemu+gdb调试内核首先执行以下指令(就上条指令后面+ -s -S)qemu-system-i386 -kernel ../linux-2.6.26/arch/x86/boot/bzImage -initrd myinitrd4M.img -append "root=/dev/ram init=/bin/ash" -s -S可以看到在新打开的qemu虚拟机上,整个是一个黑屏,此时qemu在等待gdb的链接接着开启另外一个终端,执行gdb接着在gdb界面中 targe remote之前加载符号表file ../linux-2.6.26/vmlinux target remote: 1234 则可以建立gdb和gdbserver之间的连接.很多教程说接下来直接b startkernel,然后就可以调试内核了,然而我一直没有成功,这个bug卡了我两天,一直无法断点,后来查了英文资料得知(gdbserver inside qemu does not stop on breakpoints),一开始必须使用硬件断点hk startkernel才可以断点接着在start_kernel下硬件断点 hk startkernel(,普通的break断点无法使得gdb在断点处运行,这是一个gdb的bug(),接下来就可以愉快的调试内核了
2026年01月07日
2 阅读
0 评论
0 点赞
2025-12-30
解决dpkg/apt-get error : 子进程 post-installation script 返回了错误号 1
1 问题发现前段时间安装screen的时候, 直接Ctrl+C终止了, 导致后来安装软件都报错, 错误信息如下有 1 个软件包没有被完全安装或卸载解压缩后会消耗掉 0B 的额外空间您希望继续执行吗?[Y/n] y......dpkg: error processing screen (--configure): 子进程 已安装 post-installation 脚本 返回了错误号 1在处理时有错误发生: screen一键获取完整项目代码2 问题解析一般来说是由于我们在安装的过程中突然中止, 所以导致的环境变量异常, 软件已经可能安装了, 但是系统的信息却没有更新软件的状态信息有误, 状态信息在/var/lib/dpkg/status查看软件的配置信息不全, 位于/var/lib/dpkg/info/.*3 问题解决在解决问题之前, 请先删除出问题的软件包, 等待问题解决后, 再重新安装3.1 方法1 清除状态信息对于dpkg安装的软件包, 我们可以从/var/lib/dpkg/status查看到其安装状态如果希望查看screen的安装状态, 可以使用如下命令查看其在哪一行sudo cat -n /var/lib/dpkg/status | grep "Package: screen" # 查看在某一行一键获取完整项目代码查看到位于第31103行, 然后查看此处的信息sudo cat /var/lib/dpkg/status | tail -n +31103 | head -n 28一键获取完整项目代码由于我们的往问题已经解决, 可以看到我们的状态时安装成功的, 否则的话, 修改文件的内容将状态的信息删除sudo vim /var/lib/dpkg/status一键获取完整项目代码找到Package: ,比如Package: screen删除这部分的描述, 删到下个Package: XXX前就好. 存档后, 再进行操作就OK了。3.2 方法2 清除info文件如果安装成功的软件, info目录下会存储着其安装和配置的脚本信息, 用于在安装和卸载的过程中触发执行, 我们可以检查主要检查文件是否有缺失, 如果有缺失, 那么就删除他们, 然后重装该软件即可sudo rm /var/lib/dpkg/info/.*一键获取完整项目代码比如sudo rm /var/lib/dpkg/info/scerrn.*, 存档后,再进行重新安装就OK了3.3 方法3 重新生成info列表一般来说, 前面两种方法之一即可解决该问题, 如果还是没觉得, 可以重建info列表首先将info文件夹更名备份sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old一键获取完整项目代码cpp1再新建一个新的info文件夹sudo mkdir /var/lib/dpkg/info一键获取完整项目代码更新缓存信息sudo apt-get update, apt-get -f install一键获取完整项目代码恢复info文件夹的内容, 执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old一键获取完整项目代码把自己新建的info文件夹删掉sudo rm -rf /var/lib/dpkg/info一键获取完整项目代码把以前的info文件夹重新改回名字sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info————————————————版权声明:本文为CSDN博主「CHENG Jian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/gatieme/article/details/52839814
2025年12月30日
2 阅读
0 评论
0 点赞
2025-06-20
Linux手工编译新版GLIBC库,解决低版本GLIBC库软件运行出错的问题
strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_首先吐槽一下论坛发帖子的功能,以下原文无法直接发出,带图片的都显示图片格式不正确,无奈之下只能使用这种方式发帖 运行软件的错误信息: Error: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found 由于专业版1070自带的GLIBC库为2.28,而软件需要的版本是2.29,所以导致某些软件无法正常使用,可以使用以下方法处理: 1:下载所需版本的glic库源码: wget https://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.bz2 2:安装源码编译所需要的环境: sudo apt install build-essential bison3:编译,安装glibc库: tar xvf glibc-2.29.tar.bz2 cd glibc-2.29 mkdir buildcd build ../configure --prefix=/opt/glibc-2.29 make -j4 sudo make install 4:使用LD_PRELOAD技术运行软件(使用这种方式可以单独指定软件使用指定的库) LD_PRELOAD=/opt/glibc-2.29/lib/libc.so.6 软件全路径 运行一切正常 5:如果需要在桌面或系统菜单中使用这种方法运行软件,需要修改desktop文件的内容,找到Exec一行修改为Exec=env LD_PRELOAD=/opt/glibc-2.29/lib/libm.so.6 软件全路径 运行一切正常编译其他项目时,发现需要更高版本的 glibc,所以尝试编译 glibc-2.40UOS版本:$ uname -aLinux athena-PC 4.19.0-amd64-desktop #7112 SMP Thu Jul 18 18:35:56 CST 2024 x86_64 GNU/Linux glibc版本:https://ftp.gnu.org/gnu/glibc/glibc-2.40.tar.gz 编译过程:$ tar xzvf glibc-2.40.tar.gz$ cd glibc-2.40/$ mkdir build$ cd build/$ ../configure --prefix=/usr/$ make 错误信息:gcc -nostdlib -nostartfiles -r -o /home/athena/glibc-2.40/build/elf/librtld.os '-Wl,-(' /home/athena/glibc-2.40/build/elf/dl-allobjs.os /home/athena/glibc-2.40/build/elf/rtld-libc.a -lgcc '-Wl,-)' \ -Wl,-Map,/home/athena/glibc-2.40/build/elf/librtld.os.mapgcc -nostdlib -nostartfiles -shared -o /home/athena/glibc-2.40/build/elf/ld.so.new \ -Wl,-z,relro -Wl,-z,defs \ \ /home/athena/glibc-2.40/build/elf/librtld.os -Wl,--version-script=/home/athena/glibc-2.40/build/ld.map \ -Wl,-soname=ld-linux-x86-64.so.2/usr/bin/ld: /home/athena/glibc-2.40/build/elf/librtld.os: relocation R_X86_64_PC32 against undefined hidden symbol `__ehdr_start' can not be used when making a shared object/usr/bin/ld: final link failed: nonrepresentable section on outputcollect2: error: ld returned 1 exit statusmake[2]: * [Makefile:1380: /home/athena/glibc-2.40/build/elf/ld.so] Error 1make[2]: Leaving directory '/home/athena/glibc-2.40/elf'make[1]: * [Makefile:484: elf/subdir_lib] Error 2make[1]: Leaving directory '/home/athena/glibc-2.40'make: * [Makefile:9: all] Error 2 错误信息显示 ld 链接器有问题,__ehdr_start不能用于编译共享项目。 原因分析:通过查看GUN Binutils的版本发现,UOS系统默认安装的GUN Binutils版本为2.31.1,与glibc-2.40不匹配,是造成glib-2.40编译安装失败的主要原因。$ ld --version GNU ld (GNU Binutils for Uos) 2.31.1 Copyright (C) 2018 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. 解决方法:编译安装合适的GUN Binutils 1.获取GUN Binutils$ git clone git://sourceware.org/git/binutils-gdb.git或$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.43.1.tar.gz 2.编译安装GUN Binutils$ tar xzvf binutils-2.43.1.tar.gz$ cd binutils-2.43.1/$ ../configure --prefix=/usr/$ make$ make install 注意:如果出现binutils-2.43.1源码中定义的'lseek'与UOS系统/usr/include/unistd.h中定义的'lseek'冲突造成编译错误 libtool: compile: gcc -DHAVE_CONFIG_H -I. -U_ASM -I.. -I. -I./../common -I./../src -I./../../include -Wall -Wno-nonnull-compare -g -O2 -MT iotrace.lo -MD -MP -MF .deps/iotrace.Tpo -c iotrace.c -fPIC -DPIC -o .libs/iotrace.oIn file included from ./../src/collector_module.h:27, from collector.h:29, from iotrace.c:38:iotrace.c:2473:1: error: conflicting types for ‘lseek’ llseek (int fildes, offset_t offset, int whence) ^~/usr/include/unistd.h:338:16: note: previous definition of ‘lseek’ was here extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW; ^~~~~make[5]: * [Makefile:624: iotrace.lo] Error 1make[5]: Leaving directory '/home/athena/binutils-2.43.1/gprofng/libcollector'make[4]: * [Makefile:478: all] Error 2make[4]: Leaving directory '/home/athena/binutils-2.43.1/gprofng/libcollector'make[3]: * [Makefile:472: all-recursive] Error 1make[3]: Leaving directory '/home/athena/binutils-2.43.1/gprofng'make[2]: * [Makefile:404: all] Error 2make[2]: Leaving directory '/home/athena/binutils-2.43.1/gprofng'make[1]: * [Makefile:7318: all-gprofng] Error 2make[1]: Leaving directory '/home/athena/binutils-2.43.1'make: * [Makefile:1028: all] Error 2 可将/usr/include/unistd.h中335行16列的'lseek'暂时修改为'llseek'以规避编译错误修改时注意及时备份原文件# cp /usr/include/unistd.h /usr/include/unistd.h.bak修改完的unistd.h的335行应为define llseek llseek 3.编译安装完成后确认GNU Binutils版本信息$ ld --versionGNU ld (GNU Binutils) 2.43.1Copyright (C) 2024 Free Software Foundation, Inc.This program is free software; you may redistribute it under the terms ofthe GNU General Public License version 3 or (at your option) a later version.This program has absolutely no warranty. 至此,glibc-2.40可正常完成编译,编译后在glibc-2.40/build/elf目录下看到编译好的ldd,查看版本信息如下:$ ./ldd --versionldd (GNU libc) 2.40Copyright (C) 2024 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Written by Roland McGrath and Ulrich Drepper. 但继续安装时发现如下错误:Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion 'sym != NULL' failed! 目前还在继续研究中......
2025年06月20日
6 阅读
0 评论
0 点赞
2025-06-16
UOS 知识汇总/Linux 知识汇总
UOS创建开机自启程序或脚本通过创建桌面启动程序实现开机自启创建可执行程序或脚本启动文件xx.desktop,文件格式如下[Desktop Entry]Type=ApplicationEncoding=UTF-8Exec=/usr/bin/xx.sh #可执行程序路径Name=xx #程序名称拷贝脚本到/usr/bin目录sudo cp -f xx.sh /usr/bin/chmod a+x /usr/bin/xx.sh设置开机自启动,启动时间为开机输入密码进入桌面的瞬间执行sudo cp -f xx.desktop /etc/xdg/autostart/sudo chmod 644 /etc/xdg/autostart/xx.desktop通过配置rc-local服务实现开机自启uos默认没有开启rc-local服务,所以在创建/etc/rc.local文件,并且向该文件写入开机需要执行的命令是不会生效的,需要先开启并配置rc-local.service服务,以下为配置相关步骤:编辑/lib/systemd/system/rc-local.service文件,在文件结尾添加以下两行代码[Install] WantedBy=multi-user.target lzc@lzc-PC:~$ cat /lib/systemd/system/rc-local.service # SPDX-License-Identifier: LGPL-2.1+ # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # This unit gets pulled automatically into multi-user.target by # systemd-rc-local-generator if /etc/rc.local is executable. [Unit] Description=/etc/rc.local Compatibility Documentation=man:systemd-rc-local-generator(8) ConditionFileIsExecutable=/etc/rc.local After=network.target [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes GuessMainPID=no [Install] WantedBy=multi-user.target 启动rc-local.service服务并设置开机自启systemctl start rc-local.servicesystemctl enable rc-local.service创建rc.local文件并赋予755的权限,往/etc/rc.local文件中写入开机需要执行的命令即可touch /etc/rc.localchmod 755 /etc/rc.local原文链接:https://blog.csdn.net/zZzZzZ__/article/details/120054678软连接复制在Linux中,使用cp命令复制软链接时,会根据命令行参数的不同而产生不同的结果:如果使用cp -L命令,cp会复制软链接指向的文件,而不是软链接本身。这个选项强制cp遵循软链接指向的路径,而不是复制软链接。如果使用cp -P命令,cp会复制软链接本身,而不是软链接指向的文件。这个选项使cp复制软链接,而不是软链接指向的文件。如果未使用任何选项,cp默认会复制软链接本身,而不是软链接指向的文件。这意味着在复制文件树时,软链接只是简单地被复制到目标目录中,而不会创建新的软链接或复制软链接所指向的文件。总之,如果您要复制软链接指向的文件,使用cp -L命令;如果您要复制软链接本身,请使用cp -P命令。如果您只需要将软链接复制到目标目录中,而不是复制软链接指向的文件,那么默认的cp行为就可以满足您的需求。删除打开的文件比如删除打开的.Makefile_back.swp会产生一个临时文件 .nfs000000007c3595c8000129a0再删除临时文件会提示rm: cannot remove ‘.nfs000000007c3595c8000129a0’: Device or resource busy/usr/sbin/lsof D .nfs000000007c3595c8000129a0lsof: status error on D: No such file or directoryCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEgvim 98377 bennyhe 12u REG 0,46 12288 2083886536 .nfs000000007c3595c8000129a0查询储打开工具的PID, kill -9 98377 强制关闭关工具就可以了。删除当前路径所以空文件夹find ./ -type d -empty -deletefind ./ -type d -empty 查找所有空文件夹根据进程搜索PID同样地,你可以执行命令 ps 附带额外选项来获取某个指定的进程的 PID。例如,你可以使用以下命令来获得 firefox 的 PID。ps -el | grep -i firefox还有 ps -ef | grep gvim | grep bennyhe通过进程ID查询端口占用以上一步骤的sshd进程为例,进程PID为522(如果没有netstat命令,使用 sudo apt-get install net-tools 进行安装)netstat -nap | grep 522运行项目并下载源码1如果是查看root用户进程需要加sudo 指令应该为 :sudo netstat -nap|grep 522————————————————版权声明:本文为CSDN博主「玩转智能机器人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/u011198687/article/details/120825794
2025年06月16日
2 阅读
0 评论
0 点赞
2025-05-27
sed 工具使用汇总
Linux sed精确匹配和替换1,问题:现有一text.txt文本内容如下:ni hao ma n yin gn ~~n~~ nin 现要用 'en' 将单个单词 n( 删除线 )替换掉尝试的方法一:sed -i 's/n/en/g' text.txt结果:eni hao ma en yien gen en enien 也就是所有的n字符都被替换,而我希望的是仅仅是单词n(下划线所指)被替换尝试方法二:sed -i 's/ n / en /g' text.txt 在n 和en两边加了两个空格结果: ni hao ma n yin gn en nin 出现的问题是第一行最后一个单词n未被替换网上找了好久,终于找到精准匹配和替换的方法:sed -i 's/\<n\>/en/g' text.txt 结果如下:ni hao ma en yin gn en nin ————————————————版权声明:本文为CSDN博主「yychenxie21」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/chenxieyy/article/details/52919009
2025年05月27日
1 阅读
0 评论
0 点赞