首页
chatGPT
关于
友链
其它
统计
更多
壁纸
留言
Search
1
cgroup--(4)cgroup v1和cgroup v2的详细介绍
6,537 阅读
2
修改Linux Kernel defconfig的标准方法
6,452 阅读
3
Android系统之VINTF(1)manifests&compatibility matrices
6,057 阅读
4
使用git生成patch和应用patch
3,572 阅读
5
c语言的__attribute__
3,184 阅读
默认分类
文章收集
学习总结
算法
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
Rust
工具
软件工具
Bug
COMPANY
登录
Search
标签搜索
Rust
shell
Linux
c
uboot
Vim
vintf
Linux驱动
Android
device_tree
git
DEBUG
arm64
链表
数据结构
IDR
内核
ELF
gcc
ARM
adtxl
累计撰写
380
篇文章
累计收到
16
条评论
首页
栏目
默认分类
文章收集
学习总结
算法
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
Rust
工具
软件工具
Bug
COMPANY
页面
chatGPT
关于
友链
其它
统计
壁纸
留言
搜索到
126
篇与
的结果
2022-10-22
[正点原子]Linux驱动学习笔记--1.第一个Linux驱动(字符设备驱动)
暂无简介
2022年10月22日
508 阅读
0 评论
0 点赞
2022-10-22
[正点原子]Linux驱动学习笔记--0.基本环境准备
1. 代码准备为了使用、学习方便,在github上新建了两个仓库,将正点原子提供的linux和uboot code放到了上面。https://github.com/ADTXL/imx_uboothttps://github.com/ADTXL/imx_linux2. uboot编译编译命令如下// 安装ncurses库 sudo apt-get install libncurses5-dev // 512MB+8GB 的 EMMC 核心板 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig make V=0 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16或者直接运行正点原子提供的脚本./mx6ull_alientek_emmc.sh编译完成后如下所示:其中,u-boot.bin就是编译出来的uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行。u-boot.imx文件就是添加头部以后的u-boot.bin,u-boot.imx就是我们最终要烧写到开发板中的uboot镜像文件。3. linux编译直接运行脚本./mx6ull_alientek_emmc.sh编译完成后,有两个以后烧写需要用到的文件,即kernel image(arch/arm/boot)和dtb(arch/arm/boot/dts目录)文件.4. 烧写image4.1 使用tftp烧写uboot是支持网络的,在使用uboot的网络功能之前先用网线将开发板的的ENET2接口(ALPHA开发板靠近vga线的那个)和电脑或者路由器连接起来。然后设置下面几个环境变量环境变量描述ipaddr开发板ip地址,可以不设置,使用dhcp命令来从路由器获取ip地址ethaddr开发板的mac地址,一定要设置gatewayip网关地址netmask子网掩码serverip服务器ip地址,也就是ubuntu主机地址,用于调试代码我的开发板是直连windows的,没有使用路由器,使用了这个博客里的方法超全详细,解决校园网没有路由器实现开发板和虚拟机直连,亲测可用.setenv ipaddr 192.168.10.101 setenv ethaddr 00:04:9f:04:d2:35 setenv gatewayip 192.168.10.1 setenv netmask 255.255.255.0 setenv serverip 192.168.10.100 saveenv使用ping命令测试下,是ok的=> ping 192.168.10.100 Using FEC1 device host 192.168.10.100 is alive tftp使用tftp协议,将ubuntu主机作为tftp服务器,通过网络把镜像烧写到dram中。因此,需要在ubuntu上搭建TFTP服务器,需要安装tftp-hpa和tftpd-hpa,命令如下:sudo apt-get install tftp-hpa tftpd-hpa sudo apt-get install xinetd然后,需要创建一个目录存放镜像文件/home/user/linux/tftpboot,需要注意,需要给此目录读写权限,否则的话uboot不能从tftpboot文件夹里下载文件。最后配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:server tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/user/linux/tftpboot 9 disable = no per_source = 11 cps = 100 2 flags = IPv4 }完了以后启动 tftp 服务,命令如下:sudo service tftpd-hpa start打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/user/linux/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-l -c -s" 最后输入如下命令, 重启 tftp 服务器:sudo service tftpd-hpa restart最后,我们测试下能否烧写成功,tftp命令格式如下tftpboot [loadAddress] [[hostIPaddr:]bootfilename]例如下面的命令,我们通过tftp命令把kernel镜像Image文件,烧写到dram中的80800000地址。=> tftp 80800000 Image Using FEC1 device TFTP from server 192.168.10.100; our IP address is 192.168.10.101 Filename 'Image'. Load address: 0x80800000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ####################################################### 2.2 MiB/s done Bytes transferred = 11302188 (ac752c hex)除了tftp,还有其他的烧写方法,这里就先不研究了~5. 搭建NFS环境NFS(Network File System),网络文件系统,是由SUN公司研制的UNIX表示层协议,能使使用者访问网络上别处的文件就像在使用自己的计算机一样。我们可以使用NFS加载文件系统到开发板上,方便开发。5.1 配置NFS服务安装NFS服务在 Ubuntu 终端执行以下指令安装 NFS。sudo apt-get install nfs-kernel-serverNFS共享目录新建NFS共享目录,并给予rwx权限,本地新建目录为/home/user/linux/nfs配置NFS服务执行以下指令打开 etc/exports 文件sudo vi /etc/exports进入 etc/exports 文件,在最后添加如下内容/home/user/linux/nfs *(rw,sync,no_root_squash)/home/user/linux/nfs 表示 NFS 共享的目录*表示允许所有的网络段访问rw 表示访问者具有可读写权限sync 表示将缓存写入设备中,可以说是同步缓存的意思no_root_squash 表示访问者具有 root 权限。修改完如下图所示。# /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /home/user/linux/nfs *(rw,sync,no_root_squash) 修改完以后保存退出。执行以下指令重启 NFS 服务器。sudo /etc/init.d/nfs-kernel-server restart执行以下指令查看 NFS 共享目录。showmount -e,如下所示user@ubuntu:~/linux/nfs$ showmount -e Export list for ubuntu: /home/user/linux/nfs *5.2 开发板测试确保网络环境正常,Ubuntu、Windows 和开发板能相互 ping 通。这里结合 4.1 小节的配置来验证,即:setenv ipaddr 192.168.10.101 setenv ethaddr 00:04:9f:04:d2:35 setenv gatewayip 192.168.10.1 setenv netmask 255.255.255.0 setenv serverip 192.168.10.100 saveenv开发板 IP:192.168.10.101windows 有线IP: 192.168.10.99虚拟机 IP:192.168.10.100开发板开机后,需要手动设置ip,ifconfig eth0 up ifconfig eth0 192.168.10.101 ifconfig查看设置结果,root@ATK-IMX6U:~# ifconfig eth0 Link encap:Ethernet HWaddr 88:36:fd:16:f1:cc inet addr:192.168.10.101 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::8a36:fdff:fe16:f1cc/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:152 errors:0 dropped:0 overruns:0 frame:0 TX packets:56 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:12135 (11.8 KiB) TX bytes:15504 (15.1 KiB) eth1 Link encap:Ethernet HWaddr 88:af:c1:a1:1c:7d UP BROADCAST MULTICAST DYNAMIC MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:158 errors:0 dropped:0 overruns:0 frame:0 TX packets:158 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:10652 (10.4 KiB) TX bytes:10652 (10.4 KiB) 在/home/user/linux/nfs 目录下创建一个 mytest.c 文件,在里面写入 hello world!执行以下指令设置开发板 IP,创建一个 get 目录,将虚拟机(192.168.10.100)NFS 共享目录挂载到到开发板的 get 目录中。mkdir get mount -t nfs -o nolock,nfsvers=3 192.168.10.100:/home/user/linux/nfs get/使用df命令查看挂载的 NFS 目录:root@ATK-IMX6U:~/get# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 7342568 645076 6301460 10% / devtmpfs 187632 120 187512 1% /dev tmpfs 40 0 40 0% /mnt/.psplash tmpfs 253432 192 253240 1% /run tmpfs 253432 144 253288 1% /var/volatile /dev/mmcblk1p1 32248 6902 25347 22% /run/media/mmcblk1p1 192.168.10.100:/home/user/linux/nfs 205312000 24284160 170525696 13% /home/root/get root@ATK-IMX6U:~# mount -t nfs -o nolock,nfsvers=3 192.168.10.100:/home/user/linux/nfs get/ root@ATK-IMX6U:~# cd get/ root@ATK-IMX6U:~/get# ls -al total 11M drwxrwxr-x 2 1000 tracing 4.0K Nov 12 2022 . drwx------ 5 root root 4.0K Jul 21 15:12 .. -rwxrwxr-x 1 1000 tracing 11M Nov 12 2022 Image -rw-rw-r-- 1 1000 tracing 13 Nov 12 2022 mytest.c root@ATK-IMX6U:~/get# cat mytest.c hello world! 卸载 NFS 目录:umount getroot@ATK-IMX6U:~# umount get root@ATK-IMX6U:~# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 7342568 645076 6301460 10% / devtmpfs 187632 120 187512 1% /dev tmpfs 40 0 40 0% /mnt/.psplash tmpfs 253432 188 253244 1% /run tmpfs 253432 144 253288 1% /var/volatile /dev/mmcblk1p1 32248 6902 25347 22% /run/media/mmcblk1p1 可以看到 192.168.10.100:/home/user/linux/nfs 已经卸载了。6. 使用NFS挂载rootfs6.1 网络环境准备如前所述,搭建好tftf和nfs网络环境,6.2 内核文件准备将光盘中提供的内核镜像和dtb文件服务到tftp工作目录,并给予rwx权限。6.3 文件系统准备在nfs共享目录创建一个rootfs目录用于存放文件系统。将光盘里的busybox文件系统拷贝、解压缩到上面创建的rootfs文件夹中6.4 tftp烧写内核、设备树进入到uboot命令行,设置开发板ip信息setenv ipaddr 192.168.10.101 setenv ethaddr 00:04:9f:04:d2:35 setenv gatewayip 192.168.10.1 setenv netmask 255.255.255.0 setenv serverip 192.168.10.100 saveenv可以ping下开发机地址,看能否ping通设置环境变量 bootcmd 来烧写 tftp 目录下的内核、设备树文件到开发板内存中,setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000' saveenv这样每次开机时将自动烧写kernel镜像和dtb。一般没必要每次都重烧,所以上面的命令也可以手动执行6.5 NFS挂载文件系统设置环境变量bootargs来挂载nfs目录下的rootfs,setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/user/linux/nfs/rootfs,proto=tcp rw ip=192.168.10.101:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off' saveenv如果使用的时ubuntu18或更高的版本,uboot无法通过nfs启动ubuntu系统内的共享目录。需要在/etc/default/nfs-kernel-server 文件进行修改,改好了保存退出,然后重启一下 nfs 就可以了,或者报错 Loading:*ww ERROR:File lookup fail 的也是按照下面的方法来解决。按照上面截图改完后保存退出,再执行以下指令重启 nfs 服务。sudo service nfs-kernel-server restart(这里遇到个问题,不知道是不是我上传zIamge的时候有问题,换了个出厂系统自带的zImage才可以)经测试OK,
2022年10月22日
731 阅读
0 评论
0 点赞
2022-09-01
Arm64体系结构-- 指令集
暂无简介
2022年09月01日
983 阅读
0 评论
0 点赞
2022-08-30
crash工具的常用命令
暂无简介
2022年08月30日
2,234 阅读
0 评论
0 点赞
2022-08-29
在Android中使用kdump
1. 简介内核核心转储又成为 core dump,在 Unix/Linux 中,将主内存 “Main Memory” 称为核心 core, 这是因为在半导体作为内存材料前,便使用核心 “core” 表示内存。另外核心镜像 “core image” 就是内核作为一个内核线程执行时在内存中的内容。当内核线程发生错误或者收到特定信号而终止执行时,系统在借助某些工具的情况下,可以将核心镜像写入一个文件,以便后期调试问题之用,这个过程就是所谓的核心转储 “core dump”.目前主流的方法获得 core dump 是通过 kexec 工具,该工具当内核核心转储时,其他 CPU 夯住,kexec 工具会在一个预留 CPU 上重启一个精简的内核。当精简内核启动之后,可以通过一定的命令将 core 写入到指定的文件,该文件就是核心转储文件。当获得核心转储文件之后,可以使用 CRASH 等工具进行问题分析。1.当第一内核(生产内核)启动时预留一定大小的内存空间(reserved memory),第一内核启动完成后使用kexec工具将第二内核(捕获内核)和一个简易的initrd rootfs加载到预留的内存中,如下图。2.当生产内核发生crash时,会自动引导捕获内核启动,捕获内核只占用预留的内存,并且在捕获内核中可以通过/proc/vmcore文件获取到发生crash之前的所有内存数据,此时只需要拷贝vmcore到磁盘,便可完成内存转储工作。目前已知Kdump可以覆盖到的情况:系统发生crash系统发生Soft lockup注:由硬件导致的系统hang住,kdump目前没法覆盖到。2. 实现步骤下面主要记录一些流程,不会写的很细2.1 下载并编译kexec-tools在调试过程中,经常需要重启内核以还原现场,进而复现某些问题予以追踪解决. 由于每一次的内核启动,都会伴随着一次的 boot 自检. 但是,对于已经启动过的同一内核,重复的 boot 自检完全没有必要,且造成了资源浪费. 此外,有时候需要使用一个小内核来启动一个大内核. 在这两种需求下,kexec 应运而生,kexec 是一款可以让您重新启动到一个新 Linux 内核的快速重新引导功能部件,不再必须通过固件和引导装载程序阶段,从而跳过序列中最长的部分,大大减少了重启时间. 对企业级系统而言,Kexec 大大减少了重启引起的系统宕机时间. 对内核和系统软件开发者而言,Kexec 帮助您在开发和测试成果时可以迅速重新启动系统,而不必每次都要再经历耗时的固件阶段. 通用 linux 系统中可用通过源码编译的方式安装 kexec-tools 工具,开发者可以参考如下步骤:源码下载wget http://kernel.org/pub/linux/utils/kernel/kexec/kexec-tools.tar.gz编译(以ARM64为例)cd kexec-tools-VERSION ./configure ARCH=arm64 --build=x86_64-unknown-linux-gnu --host=aarch64-linux LDFLAGS=-static make make install2.2 修改当前内核配置正常运行的kernel,需要下面的config配置CONFIG_KEXEC=y CONFIG_SYSFS=y CONFIG_DEBUG_INFO=Y2.3 制作捕获内核和initramfs2.3.1 编译最小文件系统编译busybox,注意编译的时候进入menuconfig配置成静态编译,如何下载编译从网上找个就好了。编译完成后,在busybox根目录下会有一个_install的目录,该目录是编译好的文件系统需要的一些命令的集合。进入_install目录,先创建etc、dev等目录。#mkdir etc #mkdir dev #mkdir mnt #mkdir -p etc/init.d在_install/etc/init.d目录下新创建一个rcS文件,并写入如下内容:#! /bin/sh mkdir -p /proc mkdir -p /tmp mkdir -p /sys mkdir -p /mnt /bin/mount -a echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s将rcS文件的权限改为可执行权限,比如:chmod +x _install/etc/init.d/rcS在_install/etc目录新创建一个fstab文件,并写入以下内容:proc /proc proc defaults 0 0 tmpfs /tmp tmpfs nodev,nosuid 0 0 sysfs /sys sysfs defaults 0 0 debugfs /sys/kernel/debug debugfs defaults 0 0 在_install/etc目录新创建一个inittab文件,并写入以下内容:::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r在_install/dev目录下创建如下设备节点,需要root权限:$cd _install/dev $sudo mknod console c 5 1 $sudo mknod null c 1 32.3.2 编译kernel将上面的_install目录复制到kernel源码目录下面。通过menuconfig,配置initramfs,在initramfs source file中填入_install。制作捕获kernel可以裁掉一些不必要的配置,以减少内存的占用,但最好保留usb driver,以方便拷贝vmcore文件。必须包含下面两个配置:CONFIG_CRASH_DUMP=y CONFIG_PROC_VMCORE=y注意:1.关闭这两个configCONFIG_DMA_CMA=y CONFIG_CMA_SIZE_MBYTES=32 2.确保usb driver是编译进kernel的2.4 在uboot中添加bootargs使用下面的命令或者修改kernel command line,在kernel启动时为捕获内核预留内存,预留太少可能导致捕获内核启动有问题,根据自己的实际情况预留即可。可以通过开机log来判断预留内存是否成功。setenv bootargs $bootargs 'crashkernel=128M' saveenv2.5 加载捕获内核到预留内存使用kexec工具,首先要通过adb push,将编译好的kexec,Image,dtb文件push 到开发板中,然后使用下面的命令 kexec -p /vendor/etc/Image --dtb="/vendor/etc/xxx8421.dtb" --append="console=ttyS0,115200n8 earlycon init=/init rootfstype=ramfs rootwait 1 maxcpus=1 reset_devices"2.6 验证与测试使用 echo c > /proc/sysrq-trigger 命令触发kernel panic,打印完Call trace信息之后会引导捕获kernel启动.如果启动没成功,就根据log来解决就好了。ps:本人遇到的一个问题是,当时捕获内核有个默认的CMA配置,会reserve 32M内存,导致的启动失败。解决办法:在config把这个配置去掉就好了启动后,生成的vmcore文件在/proc/vmcore,将/proc/vmcore拷贝保存到其他地方以供后期分析,也可压缩后再进行拷贝。例如,拷贝到u盘/ # fdisk -l Disk /dev/mmcblk0: 7456 MB, 7818182656 bytes, 15269888 sectors 946 cylinders, 256 heads, 63 sectors/track Units: sectors of 1 * 512 = 512 bytes Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type /dev/mmcblk0p1 0,0,2 1023,255,63 1 4294967295 4294967295 2047G ee EFI GPT Partition 1 has different physical/logical end: phys=(1023,255,63) logical=(266305,4,4) Disk /dev/sda: 29 GB, 30943995904 bytes, 60437492 sectors 3762 cylinders, 255 heads, 63 sectors/track Units: sectors of 1 * 512 = 512 bytes Device Boot StartCHS EndCHS StartLBA EndLBA Sectors Size Id Type /dev/sda1 * 0,32,33 1023,254,63 2048 60436479 60434432 28.8G c Win95 FAT32 (LBA) / # mount /dev/sda1 /mnt/ / # cp /proc/vmcore /mnt/ / # umount /mnt/关于分析该文件可以使用crash工具,这个后面还需要继续研究。参考:内核核心转储: Kdump with kexec and crash
2022年08月29日
1,005 阅读
0 评论
0 点赞
2022-08-16
关于cma_alloc分配提示PFNs busy问题
暂无简介
2022年08月16日
2,504 阅读
3 评论
2 点赞
2022-08-16
[转载]linux 复合页( Compound Page )的介绍
转载自https://www.cnblogs.com/penglcool/p/13293558.html
2022年08月16日
577 阅读
0 评论
0 点赞
2022-08-03
kernel exception时打印的ESR相关信息解读
暂无简介
2022年08月03日
143 阅读
0 评论
0 点赞
2022-07-28
关于CMA内存利用率问题
暂无简介
2022年07月28日
1,347 阅读
0 评论
0 点赞
2022-07-27
关于GFP_ATOMIC内存
暂无简介
2022年07月27日
815 阅读
0 评论
0 点赞
1
...
5
6
7
...
13