Linux篇-driver设备模型
1 概念123456789101112131415161718192021222324252627struct device_driver { const char *name; const struct bus_type *bus; // 必须指定 bus_type struct module *owner; const char *mod_name; /* used for built-in modules */ bool suppress_bind_attrs; /* disables bind/unbind via sysfs */ enum probe_type probe_type; const struct of_device_id *of_match_table; const struct acpi_device_id *acpi_match_table; int (*probe) (struct device *dev); void (*sync_state)(struct device *dev); int (*remove) (struct...
Linux篇-device设备模型
1 概念123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110struct device { struct kobject kobj; struct device *parent; struct device_private *p; const char *init_name; /* initial name of the device */ const struct device_type *type; const struct bus_type *bus; /* type of bus device is on */ struct device_driver...
Linux篇-bus设备模型
1 概念总线是设备模型当中的基础组件,简化了驱动的编写和维护,总线可以是物理总线(如PCI,USB)或虚拟总线. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455struct bus_type { const char *name; // 总线类型名称 const char *dev_name; // 老版本内核这里可能不一样 const struct attribute_group **bus_groups; // 总线属性 const struct attribute_group **dev_groups; // 设备属性 const struct attribute_group **drv_groups; // 驱动属性 int (*match)(struct device *dev, const struct device_driver *drv); // 匹配检查 int...
Linux篇-sysfs
概念sysfs 是 Linux 提供的一种虚拟文件系统,他以一种层次的方式组织数据,向用户空间提供内核中的信息,让用户可以通过文件系统接口访问和操作内核对象的属性. 他提供了一种统一管理的接口,通常在 /sys 目录下挂载. /sys/class: 包含了设备类别的子目录. 123456789jvle@jvle-ThinkPad-X1-Carbon-Gen-8:~/Desktop/works/temp/linux_files/modules/kobjs$ ls /sys/class/accel bsg drm hwmon lirc nd platform-profile pwm scsi_device tpm vcata_device devcoredump drm_dp_aux_dev i2c-dev mdio_bus net ...
Linux篇-kobj
1 概念kobj 是内核抽象出来的通用对象模型,用于表示内核中的实体. 结构体: https://elixir.bootlin.com/linux/v6.17.1/source/include/linux/kobject.h#L64. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// kobjstruct kobject { const char *name; // kobj 对象的名称, 跟 sys/<父 name>/<name> 一致 struct list_head entry; // 与父 kobj 建立链接的链表, 是父 kobj 的子链表 struct kobject *parent; // 指向父 kobj struct kset *kset; // 指向包含该 kobj 的 set 集合 const struct kobj_type *ktype;...
Grub篇(调试grub2)
1 调试grub21.1 编译 grub2首先从 https://cgit.git.savannah.gnu.org/cgit/grub.git 拉下压缩包. 1234# 在grub2安装目录下# --with-platform=efi 可以编译 UEFI 版本../configure --with-platform=pc --target=i386 --disable-werrormake -j$(nproc) 编译完成后,grub-core/ 下会有很多文件. 各种 *.mod 模块 kernel.exec(GRUB 核心可执行) 若干 .image / .img 文件 gdb_grub, 调试用脚本. 1.2 构建 img12# 创建一个空的磁盘镜像dd if=/dev/zero of=disk.img bs=1M count=256 建立分区并格式化. 123456789101112131415161718192021222324# 建立分区parted disk.img --script mklabel msdosparted...
Linux篇-open接口
1 过程全调试filp_open() 这里以 filp_open(“/dev/console”); 为例. file_open_name() AT_FDCWD 表示当前的工作目录. do_filp_open() path_openat() do_open() vfs_open() do_dentry_open() 取得f_op,这里为 def_chr_fops. f_op->open为 chrdev_open. chrdev_open 2 总结2.1 全过程调用 open 接口,通过 path walking 拿到 last component 的 inode,之后进入vfs_open,填充file结构体,如果file->f_op->open被填充就继续执行该设备层的open函数,否则返回。 随后在driver层继续通过 i_rdev 获取设备的信息,如果设备层的f_fop有open,函数,则继续执行驱动层的open. 2.2 基本概念 path walking: 内核要把这个 路径字符串 转换成一个 实际的对象...
Linux篇-调试linux
1 Linux篇(调试linux) 内核各个版本: https://www.kernel.org/pub/linux/kernel/ 最新主线版本: https://kernel.org/ 2 initrd制作此处我用的6.6.109版本. 1dracut -q --force -i ./package /my --add "busybox kernel-modules-extra kernel-modules rootfs-block" /tmp/bar.img 6.6.109 initrd/initramfs 本质上是一个压缩的rootfs镜像(通常是cpio格式),QEMU启动时用 -initrd 传给内核,内核会把它解压到内存里(ramfs/tmpfs),并把它临时挂载为根文件系统 /. 当内核完成自身初始化后,它必须进入用户态,去运行第一个用户进程(PID 1)。这个进程就从根文件系统里找。查找顺序大概是. 如果内核启动参数里写了 rdinit=,它会在 initrd...
virtio
1 概述VirtIO 是一个让”虚拟设备像真设备一样”工作的标准, 来宾系统里的驱动并不需要知道自己在虚拟机里, 它像给物理网卡/磁盘写驱动那样去用中断, DMA 等”常规手段”. 规范把每个 virtio 设备都拆成四个基本部件: 设备状态字段(Device Status) 特性位(feature bits) 设备配置空间(Device-specific Configuration Space) 一个或多个 virtqueue(队列) 1.1 设备状态位一组位标志, 描述”驱动与设备的握手/生命周期状态”. 驱动按顺序置这些位, 设备据此进入下一阶段. 12345678910111213ACKNOWLEDGE: 驱动已发现设备, 准备驱动它.DRIVER: 驱动已加载并能处理这个设备.FEATURES_OK: 特性协商完成.DRIVER_OK: 驱动已完成队列初始化, 设备可开始工作.NEEDS_RESET(设备置位): 设备出错, 需要驱动复位.FAILED: 驱动宣告失败(通常用于致命错误后停止).写 0...
behavior tree
1 概述安装. 12sudo apt updatesudo apt install ros-$ROS_DISTRO-behaviortree-cpp -y 行为树类似于有限状态机, 都是用来控制任务流程的. 不同的是, 行为树(BT)是由一串分层节点组成. 每次执行循环, 会向根节点发一个 tick, tick 会一路传到叶子节点. 任何被 tick 的节点都会运行自己的回调, 并返回三个状态之一, SUCCESS/FAILURE/RUNNING. 叶子节点是真正执行动作或做判断的地方, 最常见的叶子是 Action 节点. 1.1 节点的类型 ControlNode(控制节点): 有 1..N 个孩子, 按自己的规则把 tick 分发给孩子. ecoratorNode(装饰器节点):只能有 1 个孩子, 可以改变孩子的结果、重复执行孩子、或在条件不满足时阻止孩子被 tick. ConditionNode(条件)节点:不能返回 RUNNING, 只做判断,不改变系统状态. ActionNode(动作节点):真正“干活”, 可以是同步(一次 tick...