使用nandsim模拟超过64G的大容量MTD设备

最近做毕设项目需要模拟mtd设备,并对yaffs进行相关测试。而由于要求模拟1TB容量的mtd设备,而若使用block2mtd,由于它的page size为1B大小,无法进行yaffs的挂载。 后来同学发现了Linux Kernel自带了nandsim模块,我们可以模拟一个块设备。且这个模块启动的时候可以通过overridesize参数设置整个mtd的大小为所选模拟设备的erase_size为2的整数幂。 但我们实测发现,如果overridesize设置过大,会报出以下错误: ➜ sudo modprobe nandsim first_id_byte=0x98 second_id_byte=0xd7 third_id_byte=0x94 fourth_id_byte=0x32 overridesize=20 insmod: ERROR: could not…

解决Clang+LLVM编译的Kernel多余.LBB符号导致Call Trace不方便查阅的问题

最近因为科研需求需要在全志D1开发板做性能的Evaluation,但是这个开发板的驱动用GCC编译是正常,而使用Clang+LLVM编译时存在许多问题,SD卡、网卡、USB全都有问题,因此考虑自己做一些修复。 但是由于硬件不方便在QEMU模拟,开发板的调试全靠串口输出,因此比较困难,但是一个大问题是LLVM编译的内核多了许多.LBB符号,导致Call Trace大概会长这样: [ 2.666348] [<ffffffff80004ecc>] .LBB2_1+0x20/0x2c [ 2.671152] [<ffffffff808f2c64>] dump_stack_lvl+0x4a/0x66 [ 2.676562] [<ffffffff808f2c98>] .LBB4_1+0x10/0x18 [ 2.681360] [<ffffffff808f27ce>]…

使用Debian Preseeding在无VNC控制台的虚拟机上安装Debian

起源 找学长要了一台学校的高配置虚拟机方便运行自动调参内卷机,但由于不提供VNC控制台也不提供Debian镜像,只提供Ubuntu和CentOS,且安装虚拟机内系统还得找服务器厂家的人来进行,我也不知道是啥Hypervisor,因此非常难受,就想自己折腾一下安装。 后来经过Soha指点,可以采用Debian Preseeding来进行,现在汇报研究成果。 前置技能 由于涉及到修改bootloader的配置,需要对当前虚拟机内的Linux发行版使用的bootloader有一定的了解,本文将以grub2为例。 且为了防止遇到一些问题,建议在开始之前先进行切换至root用户。 准备文件 下载当前Debian的安装内核与initrd wget http://mirrors.cqu.edu.cn/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz wget http://mirrors.cqu.edu.cn/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux 注:如果服务器并非amd64架构,例如arm64,换成对应的架构也是可以的,曾经在华为云的ARM机器上亲测成功 修改initrd 解压initrd mkdir initrd…

使用CONNMARK解决Linux上源进源出问题

FWMARK是啥? FWMARK是Linux在处理网络数据包的时候给数据包加上的一个标识,我们可以根据fwmark配置不同的转发规则。 作用域 FWMARK作用于单个数据包。 比如我们可以采用ip rule add fwmark 0x1234 lookup 456这样,让被mark为0x1234的数据包查询路由表456出去。 由于FWMARK是针对单个PACKET而言的,因此在下文中我们所指的Packet Mark与这里的FWMARK相同。 如何给出去/进来的数据包设置FWMARK? 如果要对服务器外出连接设置fwmark,可以使用socket,可以通过setsockopt来设置数据包的MARK,详见这里。 如果要对于某个Wireguard网卡的流入数据包设置fwmark,可以使用wg set $WG_IFACE…

GDB Watchpoint在x86、MIPS、ARM上的实验与MIPS Illegal instruction

MIPS上遇到的glibc的坑 最近突发奇想可以用硬件提供的Debug功能来做一些简单的安全防护,于是进行了一个小实验测试在不支持硬件Debug的平台上设置GDB的Watchpoint带来的性能影响。但是在MIPS平台上测试的时候遇到了一个小问题。 首先将测试程序通过mipsel-linux-gnu-gcc在其它平台上交叉编译,只添加-static -g用于使用静态编译以及开启调试,并在x86上使用qemu-user-static测试通过,然后通过sftp传到MIPS平台上(手边除了FPGA的软核只有一台使用mt7621CPU的路由器为MIPS架构硬件,因此选择了我的路由器作为实验环境),结果发生了以下一幕。 root@OpenWrt:/tmp/gdb-perf# file a.out a.out: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1 (SYSV),…

基于块设备的Linux内核内存监视模块

就在完成了支持Linux 5.10的ramdisk驱动模块后不久,突发奇想,既然之前提到Linux内核模块之间地址空间是完全共享的,那么可以编写一个模块,通过块设备驱动的方式来直接对内存进行读写。 因此,我便对之前块设备驱动的代码做了些许改动,编写了一个新的模块,名为spy。 于是我便尝试从新的模块对之前的ramdisk模块进行一个数据盗取。 获取数据的地址 Linux内核本身提供了一个查看内核符号的接口,位于/proc/kallsyms,我们只需要将它cat出来然后用grep选择我们所需的数据即可。 $ sudo cat /proc/kallsyms | grep myramdisk ffffffffc0bd8024 r _note_7 [myramdisk] ffffffffc0bd7000…

Linux内核调试环境的搭建 QEMU+GDB

最近在折腾Linux内核,但是折腾调试环境以及修改内核的编译选项就折腾了我一晚上的时间。 我使用的调试环境包括: QEMU(用于软件模拟系统执行环境,方便对硬件各寄存器等状态进行调试,为了方便起见,这里使用x86_64环境) GDB 以下是我的折腾步骤: Step 0. 安装必要工具 需要确保你已经有以下软件包(对于Debian/Ubuntu): build-essential gdb qemu-system-x86 rsync(用于带权限的文件复制) 如果你采用其他发行版,可以参考对应发行版的相关Wiki,以及使用软件包管理器的搜索功能。 Step 1. 准备内核 Substep…

Back to Top