当前位置:   article > 正文

USB学习_xhci代码

xhci代码

系统USB设备拓扑: 

 当前系统中的usb 3.0控制器是pcie设备:

  1. [root@localhost devices]# lspci |grep USB
  2. 04:00.0 USB controller: Device 1db7:dc27
  3. 04:00.1 USB controller: Device 1db7:dc27
  4. 04:00.2 USB controller: Device 1db7:dc27
  5. 04:00.3 USB controller: Device 1db7:dc27
  6. 04:00.4 USB controller: Device 1db7:dc27
  7. 04:00.5 USB controller: Device 1db7:dc27
  8. 04:00.6 USB controller: Device 1db7:dc27
  9. 04:00.7 USB controller: Device 1db7:dc27

lsusb列举当前的usb设备: root_hub是当前控制器上的hub。hub也是一个特殊的usb设备。 下面才是常规的usb设备。

  1. lsusb -tv:
  2. /: Bus 16.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M //3.0 ?
  3. /: Bus 15.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M //2.0 ?
  4. |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  5. |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
  6. /: Bus 14.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  7. /: Bus 13.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  8. /: Bus 12.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  9. /: Bus 11.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  10. /: Bus 10.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  11. /: Bus 09.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  12. |__ Port 1: Dev 2, If 0, Class=Audio, Driver=snd-usb-audio, 12M
  13. |__ Port 1: Dev 2, If 1, Class=Audio, Driver=snd-usb-audio, 12M
  14. |__ Port 1: Dev 2, If 2, Class=Audio, Driver=snd-usb-audio, 12M
  15. |__ Port 1: Dev 2, If 3, Class=Human Interface Device, Driver=, 12M
  16. /: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  17. /: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  18. /: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  19. /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  20. /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  21. /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  22. |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  23. /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  24. /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M

根据上面的lspci和lsusb。应该是一个控制器带了两个root_hub。一个高速的一个低速的。lsusb -v 可以看到iSerial信息。其中有具体的pcie设备。 

  1. [root@localhost devices]# lsusb -s 16:1 -v
  2. Bus 016 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
  3. Device Descriptor:
  4. bLength 18
  5. bDescriptorType 1
  6. bcdUSB 3.10
  7. bDeviceClass 9 Hub
  8. bDeviceSubClass 0
  9. bDeviceProtocol 3
  10. bMaxPacketSize0 9
  11. idVendor 0x1d6b Linux Foundation
  12. idProduct 0x0003 3.0 root hub
  13. bcdDevice 4.19
  14. iManufacturer 3 Linux 4.19.152+ xhci-hcd
  15. iProduct 2 xHCI Host Controller
  16. iSerial 1 0000:04:00.7 //pcie usb控制器
  17. bNumConfigurations 1
  18. Configuration Descriptor:
  19. bLength 9
  20. 。。。。省略
  21. [root@localhost devices]# lsusb -s 15:1 -v
  22. Bus 015 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  23. Device Descriptor:
  24. bLength 18
  25. bDescriptorType 1
  26. bcdUSB 2.00
  27. bDeviceClass 9 Hub
  28. bDeviceSubClass 0
  29. bDeviceProtocol 1 Single TT
  30. bMaxPacketSize0 64
  31. idVendor 0x1d6b Linux Foundation
  32. idProduct 0x0002 2.0 root hub
  33. bcdDevice 4.19
  34. iManufacturer 3 Linux 4.19.152+ xhci-hcd
  35. iProduct 2 xHCI Host Controller
  36. iSerial 1 0000:04:00.7 //pcie usb控制器
  37. bNumConfigurations 1
  38. Configuration Descriptor:
  39. 。。。。省略

如果我插入一个绿联usb2.0的 集线器,上面接了鼠标键盘后lsusb查看:

  1. [root@localhost devices]# lsusb -tv
  2. /: Bus 16.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  3. /: Bus 15.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  4. |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  5. |__ Port 1: Dev 2, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
  6. /: Bus 14.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  7. /: Bus 13.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  8. /: Bus 12.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  9. /: Bus 11.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  10. /: Bus 10.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  11. /: Bus 09.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  12. |__ Port 1: Dev 2, If 0, Class=Audio, Driver=snd-usb-audio, 12M
  13. |__ Port 1: Dev 2, If 1, Class=Audio, Driver=snd-usb-audio, 12M
  14. |__ Port 1: Dev 2, If 2, Class=Audio, Driver=snd-usb-audio, 12M
  15. |__ Port 1: Dev 2, If 3, Class=Human Interface Device, Driver=, 12M
  16. /: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  17. /: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  18. /: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  19. /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  20. |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M //多了一个hub,下面挂了结构设备。
  21. |__ Port 2: Dev 3, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
  22. |__ Port 3: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  23. |__ Port 4: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
  24. |__ Port 4: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
  25. /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  26. /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
  27. |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  28. /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 10000M
  29. /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M

可以发现,新加入的hub已经出现了,并且是接在Bus 05,Port 1:Dev1 下面。这是一个普通的hub。

linux内核USB驱动匹配框架:

1:xhci控制器通过usb_alloc_dev创建usb_device,其总线是usb_type_bus,type是usb_device_type。 参考usb_alloc_dev。

2:usb_register_devie_driver在drivers./usb/core/usb.c的usb_init中。注册一个usb_deviec_driver(drivers/usb/core/generic.c)。其bus也是usb_type_bus。

3:任何usb_device都将第一步匹配到usb_device_driver。

4:generic_probe创建创建device(usb_interface),其总线是usb_type_bus, type是usb_interface_type,参考usb_set_configuration。

5:usb_type_bus的match函数usb_device_match,根据type来匹配。

总结:一个usb的设备会经过两层的匹配,第一次匹配usb_device_type。第二次匹配usb_interface_type。第一次的驱动是usb_device_driver,内核中就是generic.c中定义的。第二次是usb_driver,具体到不同的驱动,包括hub.c中的hub驱动。

USB各种描述的层次结构:

  1. Device Descriptor: //设备描述
  2. Configuration Descriptor: //配置描述0,一个设备可能有多个配置,当前激活的。
  3. Interface Descriptor: //接口描述0
  4. HID Device Descriptor:
  5. Endpoint Descriptor: //端点描述
  6. Interface Descriptor: //接口描述1
  7. HID Device Descriptor:
  8. Endpoint Descriptor: //端点描述
  9. ......
  10. 相关结构体:
  11. struct usb_device {
  12. struct usb_device_descriptor descriptor;
  13. struct usb_host_bos *bos;
  14. struct usb_host_endpoint ep0; //0端口,用来作为控制使用指向ep_in[0]/ep_out[0]
  15. struct usb_host_config *config; //一个usb_device 可以有多个configuration
  16. struct usb_host_config *actconfig; //当前激活的configuration
  17. struct usb_host_endpoint *ep_in[16]; //IN ENDPOINT 总共16
  18. struct usb_host_endpoint *ep_out[16];
  19. }
  20. struct usb_host_config {
  21. struct usb_config_descriptor desc;
  22. char *string; /* iConfiguration string, if present */
  23. struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS];
  24. struct usb_interface *interface[USB_MAXINTERFACES]; //32个。
  25. struct usb_interface_cache *intf_cache[USB_MAXINTERFACES];
  26. unsigned char *extra; /* Extra descriptors */
  27. int extralen;
  28. };
  29. struct usb_interface {
  30. struct usb_host_interface *altsetting;
  31. struct usb_host_interface *cur_altsetting; /* the currently
  32. * active alternate setting */
  33. unsigned num_altsetting; /* number of alternate settings */
  34. struct usb_interface_assoc_descriptor *intf_assoc;
  35. };
  36. struct usb_host_interface {
  37. struct usb_interface_descriptor desc; //接口描述符,其中会描述该接口有多少个端口
  38. int extralen;
  39. unsigned char *extra; /* Extra descriptors */
  40. struct usb_host_endpoint *endpoint; //端口数组。IN/OUT
  41. char *string; /* iInterface string, if present */
  42. };
  43. struct usb_host_endpoint {
  44. struct usb_endpoint_descriptor desc; //bEndpointAddress这个字段描述的信息挺多的,比如这个端点是输入端点还是输出端点,这个端点的地址等
  45. struct usb_ss_ep_comp_descriptor ss_ep_comp;
  46. struct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp;
  47. struct list_head urb_list;
  48. void *hcpriv;
  49. struct ep_device *ep_dev; /* For sysfs info */
  50. unsigned char *extra; /* Extra descriptors */
  51. int extralen;
  52. int enabled;
  53. int streams;
  54. };

设备创建之获取描述符、创建interface的流程:

  1. 创建usb_device的过程中解析描述符:
  2. hub_port_connect
  3. hub_port_init
  4. usb_get_device_descriptor
  5. usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size);
  6. usb_new_device //hub.c
  7. usb_enumerate_device //hub.c
  8. usb_get_configuration //config.c 为N个config循环处理,一次性获取配置描述符,接口描述符,端口描述符。
  9. usb_get_descriptor //usb_get_descriptor(dev, USB_DT_CONFIG, cfgno,desc, USB_DT_CONFIG_SIZE);
  10. usb_parse_configuration
  11. usb_parse_interface
  12. usb_parse_endpoint //解析当前interface下面所有的endpoint。
  13. usb_device匹配generic_probe后的初始化interface
  14. usb_set_configuration //循环为N个interface,创建usb_interface ....
  15. usb_enable_interface
  16. usb_enable_endpoint
  17. //根据endpoint的bEndpointAddress,计算第N个endpoint,并设置dev->ep_in/ep_out
  18. device_add
  19. create_intf_ep_devs
  20. 插入usb网卡到endpoint解析:
  21. ==================================================
  22. [ 322.032676] usbnet_get_endpoints+0x3c/0x1d0 [usbnet]
  23. [ 322.032681] ax88179_bind+0x3c/0x354 [ax88179_178a]
  24. [ 322.032686] usbnet_probe+0x2d0/0x830 [usbnet]
  25. [ 322.032689] usb_probe_interface+0xe8/0x300
  26. [ 322.032694] really_probe+0xfc/0x560
  27. [ 322.032697] driver_probe_device+0x108/0x190
  28. [ 322.032700] __device_attach_driver+0xe0/0x180
  29. [ 322.032703] bus_for_each_drv+0x7c/0xdc
  30. [ 322.032705] __device_attach+0xe4/0x1e0
  31. [ 322.032708] device_initial_probe+0x20/0x30
  32. [ 322.032711] bus_probe_device+0xa4/0xb0
  33. [ 322.032713] device_add+0x354/0x770
  34. [ 322.032717] usb_set_configuration+0x508/0xaa0
  35. [ 322.032720] usb_generic_driver_probe+0x70/0xb0
  36. [ 322.032723] usb_probe_device+0x4c/0x12c
  37. [ 322.032726] really_probe+0xfc/0x560
  38. [ 322.032728] driver_probe_device+0x108/0x190
  39. [ 322.032731] __device_attach_driver+0xe0/0x180
  40. [ 322.032734] bus_for_each_drv+0x7c/0xdc
  41. [ 322.032736] __device_attach+0xe4/0x1e0
  42. [ 322.032739] device_initial_probe+0x20/0x30
  43. [ 322.032742] bus_probe_device+0xa4/0xb0
  44. [ 322.032744] device_add+0x354/0x770
  45. [ 322.032747] usb_new_device+0x1e0/0x520
  46. [ 322.032749] hub_event+0x144c/0x182c

比如一个usbhid键盘设备:

drivers/hid/usbhid/hid-core.c 中注册了usb_deriver:hid_driver:

  1. static const struct usb_device_id hid_usb_ids[] = {
  2. { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
  3. .bInterfaceClass = USB_INTERFACE_CLASS_HID },
  4. { } /* Terminating entry */
  5. };
  6. MODULE_DEVICE_TABLE (usb, hid_usb_ids);
  7. static struct usb_driver hid_driver = {
  8. .name = "usbhid",
  9. .probe = usbhid_probe,
  10. .disconnect = usbhid_disconnect,
  11. #ifdef CONFIG_PM
  12. .suspend = hid_suspend,
  13. .resume = hid_resume,
  14. .reset_resume = hid_reset_resume,
  15. #endif
  16. .pre_reset = hid_pre_reset,
  17. .post_reset = hid_post_reset,
  18. .id_table = hid_usb_ids,
  19. .supports_autosuspend = 1,
  20. };
  21. //然后在usbhid_probe中创建usbhid设备:
  22. static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
  23. {
  24. struct usb_host_interface *interface = intf->cur_altsetting;
  25. struct usb_device *dev = interface_to_usbdev(intf);
  26. struct usbhid_device *usbhid;
  27. struct hid_device *hid;
  28. unsigned int n, has_in = 0;
  29. size_t len;
  30. int ret;
  31. dbg_hid("HID probe called for ifnum %d\n",
  32. intf->altsetting->desc.bInterfaceNumber);
  33. for (n = 0; n < interface->desc.bNumEndpoints; n++)
  34. if (usb_endpoint_is_int_in(&interface->endpoint[n].desc))
  35. has_in++;
  36. if (!has_in) {
  37. hid_err(intf, "couldn't find an input interrupt endpoint\n");
  38. return -ENODEV;
  39. }
  40. hid = hid_allocate_device(); //drivers/hid/hid-core.c
  41. ....
  42. }
  43. drivers/hid/hid-core.c 中注册了bus_register(&hid_bus_type); 总线
  44. drivers/his/hid-generic.c 中注册了hid_driver:hid_generic 。
  45. 因此将完成hid总线的匹配流程;
  46. hid最终通过input_register_device 创建input设备。。。。。
  47. 具体按键触发中断,怎么从xhci接口到input 可以查看"当我们切换linux终端时,背后发生了什么?" 那篇https://mp.csdn.net/mp_blog/creation/editor/129945303

(139条消息) USB驱动框架_WuYuJun's blog的博客-CSDN博客

usb中断和hub创建:

(139条消息) Kernel-USB 驱动架构_kernel usb驱动_未来的全栈工程师的博客-CSDN博客

hub创建usb_device:

  1. hub_probe
  2. INIT_WORK(&hub->events, hub_event); //初始化工作队列 ,hub_event为处理函数
  3. hub_irq
  4. kick_hub_wq
  5. queue_work(hub_wq, &hub->events); //激活工作队列
  6. hub_event
  7. hub_port_connect_change
  8. hub_port_connect
  9. usb_alloc_dev
  10. hub_port_init
  11. usb_new_device
  12. 如何才能激活tasklet? 调用hub_irq
  13. usb_hcd_giveback_urb
  14. __usb_hcd_giveback_urb //完成urb的complete回调hub_irq
  15. hub_irq
  16. tasklet_hi_schedule/tasklet_schedule //激活tasklet usb_add_hcd的时候init_giveback_urb_bh初始化。
  17. usb_giveback_urb_bh
  18. __usb_hcd_giveback_urb
  19. hub_irq
  20. 插入:
  21. [ 445.397729] ===usb_hcd_giveback_urb
  22. [ 445.401297] CPU: 0 PID: 13 Comm: kworker/0:1 Not tainted 4.19.152+ #38
  23. [ 445.407808] Hardware name: PHYTIUM LTD D2000/D2000, BIOS
  24. [ 445.413286] Workqueue: pm hcd_resume_work
  25. [ 445.417282] Call trace:
  26. [ 445.419718] dump_backtrace+0x0/0x198
  27. [ 445.423366] show_stack+0x24/0x30
  28. [ 445.426668] dump_stack+0x9c/0xd0
  29. [ 445.429970] usb_hcd_giveback_urb+0x108/0x198 //tasklet
  30. [ 445.434312] rh_call_control+0x1ec/0x820
  31. [ 445.438221] usb_hcd_submit_urb+0x104/0x310
  32. [ 445.442389] usb_submit_urb+0x1e8/0x558
  33. [ 445.446211] usb_start_wait_urb+0x70/0x160
  34. [ 445.450293] usb_control_msg+0xc4/0x138
  35. [ 445.454115] hub_ext_port_status+0xac/0x188
  36. [ 445.458284] hub_activate+0x120/0x6d0
  37. [ 445.461932] hub_resume+0x4c/0x140
  38. [ 445.465320] usb_resume_interface.isra.1+0xbc/0x138
  39. [ 445.470183] usb_resume_both+0xdc/0x138
  40. [ 445.474004] usb_runtime_resume+0x24/0x30
  41. [ 445.478001] __rpm_callback+0x150/0x258
  42. [ 445.481823] rpm_callback+0x34/0x98
  43. [ 445.485297] rpm_resume+0x65c/0x840
  44. [ 445.488772] __pm_runtime_resume+0x70/0xb0
  45. [ 445.492854] usb_autoresume_device+0x28/0x60
  46. [ 445.497109] usb_remote_wakeup+0x60/0xb8
  47. [ 445.501017] hcd_resume_work+0x20/0x30
  48. [ 445.504753] process_one_work+0x1ac/0x3e0
  49. [ 445.508748] worker_thread+0x44/0x448
  50. [ 445.512397] kthread+0x130/0x138
  51. [ 445.515612] ret_from_fork+0x10/0x18
  52. 。。。。。。。。
  53. [ 446.576330] usb_submit_urb+0x1e8/0x558
  54. [ 446.580152] usb_start_wait_urb+0x70/0x160
  55. [ 446.584234] usb_control_msg+0xc4/0x138
  56. [ 446.588055] usb_clear_port_feature+0x5c/0x70
  57. [ 446.592397] hub_port_reset+0x1e8/0x630
  58. [ 446.596218] hub_port_init+0x28c/0xb20
  59. [ 446.599952] hub_port_connect+0x26c/0xa10
  60. [ 446.603947] port_event+0x37c/0x700
  61. [ 446.607421] hub_event+0x138/0x3d0

USB网卡驱动usbnet
(143条消息) usbnet驱动深入分析-usb虚拟网卡host端_ldd的博客-CSDN博客

触发了软中断 tasklet_schedule后在硬件中断后irq_exit会执行SOFTIRQ中的TASKLET:

  1. asix:网卡接收数据
  2. ================================================
  3. [ 122.536037] ===rx_submit
  4. [ 122.536275] CPU: 4 PID: 0 Comm: swapper/4 Not tainted 5.10.0 #2
  5. [ 122.536511] Hardware name: PHYTIUM LTD D2000/D2000, BIOS
  6. [ 122.536746] Call trace:
  7. [ 122.536980] dump_backtrace+0x0/0x1dc
  8. [ 122.537216] show_stack+0x24/0x70
  9. [ 122.537453] dump_stack+0xd0/0x12c
  10. [ 122.537690] rx_submit+0x188/0x2c4 [usbnet]
  11. [ 122.538001] rx_complete+0x2a8/0x310 [usbnet]
  12. [ 122.538233] __usb_hcd_giveback_urb+0xa4/0x154
  13. [ 122.538465] usb_giveback_urb_bh+0xf8/0x200
  14. [ 122.538697] tasklet_action_common.constprop.0+0x154/0x1dc
  15. [ 122.538930] tasklet_action+0x34/0x40
  16. [ 122.539161] __do_softirq+0x160/0x594
  17. [ 122.539394] irq_exit+0xbc/0x104
  18. [ 122.539627] __handle_domain_irq+0x8c/0xf0
  19. [ 122.539859] gic_handle_irq+0xd8/0x384
  20. [ 122.540091] el1_irq+0xd0/0x180
  21. [ 122.540324] arch_cpu_idle+0x18/0x40
  22. [ 122.540556] default_idle_call+0x4c/0x220
  23. [ 122.540711] do_idle+0x264/0x330
  24. [ 122.540714] cpu_startup_entry+0x34/0xa0
  25. [ 122.540717] secondary_start_kernel+0x16c/0x220
  26. 网卡发送数据:
  27. ====================================================
  28. [ 337.134965] usbnet_start_xmit+0x44/0xb74 [usbnet]
  29. [ 337.134969] dev_hard_start_xmit+0xe4/0x2d0
  30. [ 337.134973] sch_direct_xmit+0x154/0x54c
  31. [ 337.134975] __dev_queue_xmit+0x8ec/0xa90
  32. [ 337.134978] dev_queue_xmit+0x20/0x30
  33. [ 337.134983] packet_sendmsg+0xa00/0x12b0
  34. [ 337.134987] sock_sendmsg+0x60/0x7c
  35. [ 337.134990] sock_write_iter+0xa4/0x104 //socket_file_ops->sock_write_iter
  36. [ 337.134994] new_sync_write+0x17c/0x1a0
  37. [ 337.134997] vfs_write+0x224/0x2bc
  38. [ 337.134999] ksys_write+0xe8/0x100
  39. [ 337.135002] __arm64_sys_write+0x28/0x3c
  40. [ 337.135006] el0_svc_common.constprop.0+0x88/0x220
  41. [ 337.135009] do_el0_svc+0x34/0xa0
  42. [ 337.135012] el0_svc+0x28/0x70

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/613913
推荐阅读
相关标签
  

闽ICP备14008679号