QNX开发总结

1 QNX启动流程
1.1 buildfile
xxx.build
xxx.qvmconf

on -R0x7 pipe &
-R:表示CPU掩码,亲和性;0x7 = 0111,CPU0、CPU1、CPU2,不包含CPU3

1.2 Configuring vdevs
http://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.hypervisor.user/topic/config/vdevs.html

2 console
2.1 命令
To attach to an existing session:
dtach -a

Detach from a session
In an attached session, type Ctrl+\

-r winch
其中winch表示windows change
https://linux.die.net/man/1/dtach

QVM <-> dtach server <-> dtach client <-> QNX shell
ptsname slave (QNX QVM) <-> /dev/ptmx master (QNX dtach, other node by QNX) <-> /tmp/console (QNX dtach, unix-domain socket server) <-> dtach client (dtach -a /tmp/console) <-> QNX shell

2.2 URLs
crigler/dtach
https://github.com/crigler/dtach

3 pass-through
3.1 Adress
Guest中的地址:
物理地址 - GPA
虚拟地址 - GVA

Hypervisor中的地址:
物理地址 - HPA
虚拟地址 - HVA

Guest OS调用hypervisor API时,传递的是GPA,hypervisor会将该地址转换为HPA,然后再转换为HVA(gpa2hva()),这样hypervisor代码中可以使用HVA了。实际上hypervisor也提供内部API实现GVA到GPA的转换,同时hypervisor也可以接入GVA。

hcall_setup_sbuf()
@ hypervisor/debug/hypercall.c

3.2 QNX pci-tool
pci-tool -D 0xabcd -vvvvv
pci-tool -D 0xabcd -vvvvv --full
pci-tool -D 0x5ada -vvvvv
pci-tool -d0:19:2 --read=CFG:0x328

3.3 x86 P2SB
PCH(
Platform Controller Hub上大部分设备可以通过PCIe或IO方式访问,但PCH上部分设备需要访问PCH的私有空间,这部分空间通过P2SB的SBREG_BAR寄存器映射到内存空间这段空间被称为PCRPCH Private Configuration Space Register。每个设备对应一个PortID,PortID表示设备在PCR空间的偏移量,再加上寄存器偏移可以获取寄存器的地址。

3.4 x86 P2SB GPIO
x86下GPIO配置位于PCH的私有空间。GPIO被分组,每组对应一个PCR的PortID。

每个bank的每个GPIO有2个寄存器,分别是PADCFG0(偏移0)和PADCFG1(偏移4),2个寄存器占用8个字节的地址,所以计算某个GPIO 2个寄存器的绝对地址方法如下,其中Target_Port_ID是每个GPIO community在PCR空间的偏移量。
基地址pad_regs = 0xf8000000(P2SB bar0) + (Target_Port_ID << 16) + 0x500(read from PADBAR);
某个GPIO padcfg0的绝对地址 = pad_regs + PADCFG0 + 在bank内的GPIO编号 x 8;
某个GPIO padcfg1的绝对地址 = pad_regs + PADCFG1 + 在bank内的GPIO编号 x 8;

每个bank的32个GPIO公用2个寄存器,分别是GPI_IS(GPI Interrupt Status)和GPI_IE(GPI Interrupt Enable),2个中断相关寄存器的绝对地址计算方法如下,其中Target_Port_ID是每个GPIO community在PCR空间的偏移量。
基地址regs = 0xf8000000(P2SB bar0) + (Target_Port_ID << 16);
某个GPIO GPI_IS的绝对地址 = regs + 0x100(GPI_IS)+ 在bank内的GPIO编号 / 32;
某个GPIO GPI_IE的绝对地址 = regs + 0x110(GPI_IE)+ 在bank内的GPIO编号 / 32;


/sys/class/gpio/gpiochip434/label
跟dts或者ACPI dsl文件对应上,是哪一组

gpiochip434 - North
gpiochip357 - Northwest
gpiochip310 - West
gpiochip267 - Southwest

3.5 QNX Interrupt Command
pidin -v irqs
pidin irqs

4 trace commands
4.1 slog2info

4.2 qvm trace
tracelogger
traceprinter |grep -i qvm

5 android和QNX共享数据
QNX ->
ls /dev/hd0.*
mkdosfs /dev/hd0.xxx
mount -t dos /dev/hd0.xxx /mnt

Android ->
ls -al /dev/block/by-name/
mount -t vfat -o sync,rw /dev/block/vda17 /mnt/share

6 USB
6.1 命令
io-usb
devb-umass
usb

kill进程devb-umass
slay devb-umass

6.2 Block设备
/dev/hd1t6 - t表示type,6表示文件系统类型FAT
/fs/usb0
dinit:disk initialization

7 Abbreviations
APIC:读作ei pic
APS:adaptive partitioning
CAM:Common Access Methods
dtach:detach
hogs:List the processes that are hogging the CPU
IFS:Image File System,QNX系统镜像
IPL:Image Program Loader,bootloader程序
OCP:Open Core Protocol
P2SB:Primary to SideBand
pidin:类似于Linux ps,也可以执行pidin arg
slay :kill进程
slm: System Launch and Monitor
smmuman:IOMMU/SMMU Manager

你可能感兴趣的:(hypervisor)