首页
关于
友链
其它
统计
壁纸
Search
1
修改Linux Kernel defconfig的标准方法
5,477 阅读
2
cgroup--(4)cgroup v1和cgroup v2的详细介绍
4,958 阅读
3
Android系统之VINTF(1)manifests&compatibility matrices
4,956 阅读
4
c语言的__attribute__
2,970 阅读
5
Android系统之VINTF(3)Matching Rules
2,366 阅读
默认分类
文章收集
学习总结
每天一刷
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
工具
软件工具
Bug
登录
Search
标签搜索
shell
Linux
c
uboot
Vim
vintf
Linux驱动
Android
device_tree
git
DEBUG
链表
数据结构
IDR
内核
ELF
gcc
网址
内存管理
进程管理
adtxl
累计撰写
342
篇文章
累计收到
8
条评论
首页
栏目
默认分类
文章收集
学习总结
每天一刷
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
工具
软件工具
Bug
页面
关于
友链
其它
统计
壁纸
搜索到
342
篇与
的结果
2022-10-22
[正点原子]Linux驱动学习笔记--2.LED驱动实验(直接操作寄存器)
暂无简介
2022年10月22日
357 阅读
0 评论
0 点赞
2022-10-22
[正点原子]Linux驱动学习笔记--1.第一个Linux驱动(字符设备驱动)
暂无简介
2022年10月22日
435 阅读
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日
523 阅读
0 评论
0 点赞
2022-09-01
Arm64体系结构-- 指令集
暂无简介
2022年09月01日
599 阅读
0 评论
0 点赞
2022-08-30
crash工具的常用命令
暂无简介
2022年08月30日
1,696 阅读
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日
810 阅读
0 评论
0 点赞
2022-08-18
[转载]Bluetooth initialization - enable in Settings & System_server process
作者:MelanDawn链接:https://www.jianshu.com/p/010c37d5743d来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2022年08月18日
668 阅读
0 评论
0 点赞
2022-08-16
关于cma_alloc分配提示PFNs busy问题
暂无简介
2022年08月16日
2,018 阅读
2 评论
1 点赞
2022-08-16
[转载]linux 复合页( Compound Page )的介绍
转载自https://www.cnblogs.com/penglcool/p/13293558.html
2022年08月16日
483 阅读
0 评论
0 点赞
2022-07-28
关于CMA内存利用率问题
暂无简介
2022年07月28日
1,114 阅读
0 评论
0 点赞
1
...
8
9
10
...
35