Linux那些事---我是U盘读书pdf笔记(1)

《Python Linux 系统管理和自动化运维》读书笔记 《Python Linux 系统管理和自动化运维》读书笔记 第一章 Python语言与Linux系统管理 第二章 Python生态工具 1. Python内置小工具 1.1 通过1秒启动一个下载服务器 使用场景:同事需要你传文件给他。 本地文件目录下,打开linux终端执行:python -m SimpleHTTPServer 或:python -m http.server (python3环境下) 同事在浏览器中打开网页:本地ip:8000 即可在线查看所需文件。 1.2 命令行解析json字 阅读详情

@TOC

Makefile

总体看一下makefile

.drivers/usb/storage/

EXTRA_CFLAGS := -Idrivers/scsi
obj-$(CONFIG_USB_STORAGE) += usb-storage.o
usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG) += debug.o
usb-storage-obj-$(CONFIG_USB_STORAGE_HP8200e) += shuttle_usbat.o
usb-storage-obj-$(CONFIG_USB_STORAGE_SDDR09) += sddr09.o
''''''
usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \
initializers.o $(usb-storage-obj-y)

Kconfig关键选项
CONFIG_USB_STORAGE它所对应的模块叫 usb-storage,Makefile 中最后一行也说了,

usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \
initializers.o $(usb-storage-obj-y)

只需要关注的文件scsiglue.c,protocol.c,transport.c,usb.c,initializers.c 以及它们同名的.h 头文件
学习方法!!!!!

模块机制

  • LK 2.6要求你编译模块之前,必须先在内核源代码目录下执行make,换言
    之,你必须先配置过内核,执行过 make,然后才能 make 你自己的模块.
  • drivers/usb/storage/usb.c 入口函数usb_stor_init,出口函数usb_stor_exit
    • /core/host/
  • 常见的 host controller有三种,分别叫做 EHCI,UHCI,OHCI,
    *注册: usb_register
    调用这个函数来向 usb core 注册,从而让usb core知道有这么一个设备
    卸载:usb_deregister()

总线结构

include/linux/device.h
** struct bus_type,struct device,struct device_driver**
pci总线,scsi 总线,usb 总线
pci_bus_type,scsi_bus_type,usb_bus_type

  • struct bus_type:重要的成员struct kset drivers 和 struct kset devices.kset和另一个叫做 kobject

总线, 设备, 和驱动( 上)

struct device
{
	struct bus_type *bus;
	strutct device_driver *drvier;
}
struct driver
{
	struct bus_type *bus ;
	 struct list_head devices;
}

**devices 记录的是这个驱动支持的那些设备(复数)
因为一个驱动程序可以支持一个或多个设备
**

device

usb core 的代码会进行整个 usb 系统的初始化,比如申请 struct bus_type
usb_bus_type,然后会扫描 usb 总线,看线上连接了哪些 usb 设备
连了一个 usb 键盘,那么就为它准备一个 struct device

drivers

drivers 链表呢?这个就不用 bus 方面主动了,而该由每一个 driver 本身去 bus 上面登记usb_register

总线, 设备, 和驱动( 下)

老设备:先查设备,后加载驱动
设备开启,总线扫描设备,struct device,完善devices 链表
然后驱动程序注册struct device_drvier,去devices链表上遍历,如果支持这个devices设备, 调用device_bind_driver
现在:热插拔

U盘驱动注册:
retval = usb_register(&usb_storage_driver);
drivers/usb/storage/usb.c

232 struct usb_driver usb_storage_driver = {
233 .owner = THIS_MODULE,
234 .name = "usb-storage",
235 .probe = storage_probe,
236 .disconnect = storage_disconnect,
237 .id_table = storage_usb_ids,
238 };

owner 用来给模块计数的,每个模块都这么用,赋值总是THIS_MODULE???到底是什么用搞清楚
一个模块可以被多个设备共用,才会有模块计数这么一个说法

idtable

const struct usb_device_id *id_table;

97 struct usb_device_id {
98 /* which fields to match against? */
99 __u16 match_flags;
100
101 /* Used for product specific matches; range is inclusive */
102 __u16 idVendor;
103 __u16 idProduct;
104 __u16 bcdDevice_lo;
105 __u16 bcdDevice_hi;
106
107 /* Used for device class matches */
108 __u8 bDeviceClass;
109 __u8 bDeviceSubClass;
110 __u8 bDeviceProtocol;
111
112 /* Used for interface class matches */
113 __u8 bInterfaceClass;
114 __u8 bInterfaceSubClass;
115 __u8 bInterfaceProtocol;
116
117 /* not matched against */
118 kernel_ulong_t driver_info;
119 };

连接probe

int (*probe) (struct usb_interface *intf,const struct usb_device_id *id);
void (*disconnect) (struct usb_interface *intf);

struct usb_device

struct usb_interface
struct usb_device

每一个 device 对应一个 struct device,针对 usb 设备,开发者们设计了一个叫做
struct usb_device
include/linux/usb.h

struct usb_device {
 struct device dev
}

struct device dev前面说的那个属于每个设备的 struct device 结构体变量
U 盘驱动里边并不会直接去处理这个结构体,因为对于一个 U 盘来说,她就是对应这么一个 struct
usb_device 的变量,这个变量由 usb core 负责申请和赋值
记住 struct device dev结构体变量,因为调用 usb core 提供的函数的时候,会把这个变量作为参数传递上去,因为很简单,要和 usb core 交流,
总得让人家知道我们是谁吧,比如后来要调用的一个函数,usb_buffer_alloc,它就需要这个参数.

???这里对于struct device dev和usb_device的关系。。。还是不太懂

struct usb_interface usb协议

usb 协议规定了,每个 usb 设备都得有些基本的元素,称为描述符,有四类描述符是任何一种 usb 设备都得
有的
device descriptor,configuration descriptor,interface descriptor,endpoint
descriptor

当我插入U盘,用cat /proc/scsi/scsi命令看一下的话,"Vendor"那一项显
示的肯定是 Intel
注意使用的命令!!!!why???

  • 关于这几种描述符,usb core 在总线扫描那会就会去读取,会去获得里边的信息
  • device 描述符描述的是整个 device
  • 这个 device 和咱们一直讲的 device 和 driver 那里的
    device 是不一样的.因为一个 usb device 实际上指的是一种宏观上的概念,它可以是一种多功能的设备
    一个键盘,上边带一个扬声器,它们用两个usb接口接到usb hub上去,而device描述符描述的就是这整个
    设备的特点.(???不是一个usb????)
  • configuration 描述符
    一个设备可以有一种或者几种配置
  • 一个interface对应一个usb设备驱动程序
    一个usb设备,两种功能,一个键盘,
    上面带一个扬声器,两个接口,那这样肯定得要两个驱动程序,一个是键盘驱动程序,一个是音频流驱动程序.
    道上的兄弟喜欢把这样两个整合在一起的东西叫做一个设备
    include/linux/usb.h:
115 struct usb_interface {
116 /* array of alternate settings for this interface,
117 * stored in no particular order */
118 struct usb_host_interface *altsetting;
119
120 struct usb_host_interface *cur_altsetting; /* the currently
121 * active alternate setting */
122 unsigned num_altsetting; /* number of alternate settings */
123
124 int minor; /* minor number this interface is bound to */
125 enum usb_interface_condition condition; /* state of binding */
126 struct device dev; /* interface specific device info */
127 struct class_device *class_dev;
128 };
129 #define to_usb_interface(d) container_of(d, struct usb_interface, dev)
130 #define interface_to_usbdev(intf) \
131 container_of(intf->dev.parent, struct usb_device, dev)

整个 U 盘驱动程序在后面任何一处提到的 struct usb_interface 都是同一个变量,这个
变量是在 usb core 总线扫描的时候就申请好了的.直接用
比如前面说过的 storage_probe(struct usb_interface *intf,const struct usb_device_id
*id),storage_disconnect(struct usb_interface *intf)这两个函数中的那个参数 intf

?什么时候申请的?要注意一下?如何用?我定义变量,它申请好带出来???

  • interface_to_usbdev
    struct usb_interface to struct usb_device
endpoint

usb 协议里规定了,usb 设备有四种通信方式,分别是控制传输,中断传输,批量传输,等时传输.
,等时传输显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流

虽然说 usb mass storage 的协议里边有一个叫做CBI的传输协议,
CBI就是Control/Bulk/Interrupt,即控制/批量/中断,这三种传输都会
用到,但这种传输协议并不适用于 U 盘

U 盘使用的是一个叫做 Bulk-Only 的传输协议.使用这种
协议的设备只有两种传输方式,一种是批量传输,另一种是控制传输,
ps:控制传输是任何一种 usb 设
备都必须支持的,它专门用于传输一些控制信息.

U盘有两个bulk端点,是因为端点也是有方向的,一个叫
做 Bulk in,一个叫做 Bulk out,

usb 里边所有的数据传输都是有主机发起的

storage_probe()

get_device_info,get_protocol,get_transport,get_pipes. usb_stor_Bulk_man_lun().
drivers/usb/storage/usb.c

926 /* Probe to see if we can drive a newly-connected USB device */
927 static int storage_probe(struct usb_interface *intf,
928 const struct usb_device_id *id)
929 {
930 struct us_data *us;//us 者,usb storage 
931 const int id_index = id - storage_usb_ids;
932 int result;
933
934 US_DEBUGP("USB Mass Storage device detected\n");
935
936 /* Allocate the us_data structure and initialize the mutexes */
937 us = (struct us_data *) kmalloc(sizeof(*us), GFP_KERNEL);
25
938 if (!us) {
939 printk(KERN_WARNING USB_STORAGE "Out of memory\n");
940 return -ENOMEM;
941 }
942 memset(us, 0, sizeof(struct us_data));

注意参数struct usb_interface和struct usb_device_id
这里虽然知道struct usb_interface和struct usb_device_id两个指针来自usb core那一层???

us_data

usb-storage模块里边自己定义的数据结构 us_data
drivers/usb/storage/usb.h:


每一个 device 都有的,换句话说,我们会为每一个 device 申请一个 us_data

debug
54 #ifdef CONFIG_USB_STORAGE_DEBUG
55 void usb_stor_show_command(struct scsi_cmnd *srb);
56 void usb_stor_show_sense( unsigned char key,
57 unsigned char asc, unsigned char ascq );
58 #define US_DEBUGP(x...) printk( KERN_DEBUG USB_STORAGE x )
59 #define US_DEBUGPX(x...) printk( x )
60 #define US_DEBUG(x) x
61 #else
62 #define US_DEBUGP(x...)
63 #define US_DEBUGPX(x...)
64 #define US_DEBUG(x)
65 #endif
66
67 #endif

934 行这个 US_DEBUGP,是一个宏,来自 drivers/usb/storage/debug.h
这些调试信息得是我们打开了编译选项 CONFIG_USB_STORAGE_DEBUG
??如果我不是打开配置项,而是define呢????

设备花名册

继续贴 storage_probe

943 init_MUTEX(&(us->dev_semaphore));
944 init_MUTEX_LOCKED(&(us->sema));
945 init_completion(&(us->notify));
946 init_waitqueue_head(&us->dev_reset_wait);
947 init_waitqueue_head(&us->scsi_scan_wait);
948 init_completion(&us->scsi_scan_done);
949
950 /* Associate the us_data structure with the USB device */
951 result = associate_dev(us, intf);
952 if (result)
953 goto BadDevice;
954
955 /*
956 * Get the unusual_devs entries and the descriptors
957 *
958 * id_index is calculated in the declaration to be the index number
959 * of the match from the usb_device_id table, so we can find the
960 * corresponding entry in the private table.
961 */
962 get_device_info(us, id_index);
id_index

id_index=id-storage_usb_ids,经赋给 usb_storage_driver 的成员 id_table 的值.
storage_usb_ids 同样来自 drivers/usb/storage/usb.c

119 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax) }
120
121 static struct usb_device_id storage_usb_ids [] = {
122
123 # include "unusual_devs.h"
124 #undef UNUSUAL_DEV
125 /* Control/Bulk transport for all SubClass values */
126 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC,
US_PR_CB) },
127 { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_8020,
US_PR_CB) },

USB_INTERFACE_INFO

include/linux/usb.h

473 /**
474 * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces
475 * @cl: bInterfaceClass value
476 * @sc: bInterfaceSubClass value
477 * @pr: bInterfaceProtocol value
478 *
479 * This macro is used to create a struct usb_device_id that matches a
480 * specific class of interfaces.
481 */
482 #define USB_INTERFACE_INFO(cl,sc,pr) \
483 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO, .bInterfaceClass =
(cl), .bInterfaceSubClass = (sc), .bInterfaceProtocol = (pr)

每一个 USB_INTERFACE_INFO 就是构造一个 struct usb_device_id 的结构体变量

struct usb_device_id 的定义,这里实际上就是为其中的四个元素赋了值,它们是
match_flags,bInterfaceClass,bInterfaceSubClass,bInterfaceProtocol.

这里几个id??搞得有点晕

首先每个 Interface 属于一个 Class
,(为什么是把 Interface 分类,而不把 Device 分类?前面讲过了,
在 usb 设备驱动中,不用再提 Device,因为每个设备驱动对应的是一种 Interface,而不是一种 Device)

然
后Class下面又分了SubClass,完了SubClass下面又按各种设备所遵循的不同的通信协议继续细分

usb协议里边为每一种 Class,每一种 SubClass,每一种 Protocol 定义一个数值
比如 mass storage 的 Class就是0x08,而这里USB_CLASS_MASS_STORAGE这个宏在include/linux/usb_ch9.h中定义,其值正是 8
例子:

{ USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, US_SC_RBC, US_PR_CB) },

宏展开,定义了这么一个 usb_device_id 结构体变量
match_flags=USB_DEVICE_ID_MATCH_INT_INFO
bInterfaceClass=USB_CLASS_MASS_STORAGE,
bInterfaceSubClass=US_SC_RBC
bInterfaceProtocol=US_PR_CB.
USB_CLASS_MASS_STORAGE这个驱动程序所支持的每一种设备都是属于这个类,或者说这个 Class.但是这个 Class 里边包含不同的 SubClass,
subclass 02 为 CD-ROM 设备,04 为软盘驱动器,06 为通用 SCSI 类设备.而通信协议则主要有 CBI 协议和 Bulk-Only 协议.

像 US_SC_RBC 这些关于 sub class 的宏的定义是在文件 drivers/usb/storage/protocol.h

47 /* Sub Classes */
48
49 #define US_SC_RBC 0x01 /* Typically, flash devices */
50 #define US_SC_8020 0x02 /* CD-ROM */
51 #define US_SC_QIC 0x03 /* QIC-157 Tapes */
52 #define US_SC_UFI 0x04 /* Floppy */
53 #define US_SC_8070 0x05 /* Removable media */
54 #define US_SC_SCSI 0x06 /* Transparent */
55 #define US_SC_ISD200 0x07 /* ISD200 ATA */

US_PR_CB 这些关于传输协议的宏drivers/usb/storage/transport.h

#define US_PR_CBI 0x00 /* Control/Bulk/Interrupt */
#define US_PR_CB 0x01 /* Control/Bulk w/o interrupt */
#define US_PR_BULK 0x50 /* bulk only *

这个文件中还定义了更多的协议,不过我们暂时只需要知道这三种,因为其她协议都是专门针对一些特殊设
备的
storage_usb_ids 数组中使用宏 USB_INTERFACE_INFO 定义的 usb_device_id 都只是用的
这三种协议.(US_PR_CBI 和 US_PR_CB 这两种协议在 usb 协议中都唤作 CBI,不过之间有点差别.)

usb协议中规定,U盘的Subclass是属于US_SC_SCSI的.而其通信协议使用的是 Bulk-Only

match_flag:USB_INTERFACE_INFO
USB_DEVICE_ID_MATCH_INT_INFO
include/linux/usb.h

435 #define USB_DEVICE_ID_MATCH_INT_INFO \
436 (USB_DEVICE_ID_MATCH_INT_CLASS |
USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)

pag31
总共200页,需要

linux那些事儿之我是USB(包括第一版和第二版完整文字) 本文件包括第一第二完成版,第二版基于2.6.22内核,对USB子系统的大部分源代码逐行进行分析,系统地阐释了Linux内核中USB子系统是如何运转的,子系统内部的各个模块之间是如何互相协作、配合的。本次改版修改了第1版中出现的错误,增加了一个附录,主要内容是关于Linux内核的学习方法,是作者的经验总结,值得一读。 本书使用幽默诙谐的笔调对Linux内核中的USB子系统源代码进行了分析。 立即下载

相关推荐

Linux那些事之我是USB

linux那些事之我是USB全部四章的资料

linux那些事儿之我是u盘 pdf,Linux那些事儿之我是U盘.PDF

Linux 那些事儿之我是U 盘摘要2005 年6 月,复旦大学微电子系本科毕业答辩上,老师问我:请你用一句话介绍一下usb 技术.我回了一句:老师,你有病吧,要能用一句话介绍我还费这么大劲写这么长的文章干嘛?关键词:Linux, Kernel, 2.6, bus, usb, device driver, mass storage, scsi,urb, bulk, control, host, p...

weixin_34736362的博客 227

linux那些事儿之我是USB.zip

里面包含Linux那些事的九个文档,Block层,ECHI主机控制,HUB,PCI,SCSI硬盘,Sysfs,UHCI,USB+core,U盘等九个文档,内容详细,而且全面都有书签,适合系统学习!

linux那些事儿之我是u盘.pdf,《Linux那些事儿之我是USB》我是U盘(31)SCSI命令之我型我秀...

usb_stor_control_thread()基本讲完了,但是其中下面这几行,正是高潮中的高潮。所谓的批量传输,所谓的Bulk-Only协议。正是在这里体现出来的。371 /* we've got a command, let's do it! */372 else {373 US_DEBUG(usb_stor_show_co...

weixin_42588555的博客 372

linux那些事儿我是USB.pdf

关键词:Linux, Kernel, 2.6, bus, usb, device driver, mass storage, scsi, urb, bulk, control, host, pipe, command, 林志玲 ...... 作者用很诙谐的语言讲述了linux下USB驱动。

Mumax3高效模拟技巧:如何利用代码模板快速完成磁性材料特性分析

本文介绍了利用Mumax3代码模板库提升磁性材料微磁学模拟效率的核心方法。通过构建模块化的环境配置、材料库和特征长度计算模板,研究者可以快速组装模拟方案,自动化参数扫描与结果分析,从而将精力聚焦于物理问题本身,实现工作效率的指数级提升。

zz67890的博客 550

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.6讲 GPIO中断实验-GPIO驱动添加中断处理函数

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。本章实验的功能和之前按键控制蜂鸣器的实验一样,只是按键采用中断的方式来处理。当按下KEY0以后就打开蜂鸣器,再次按下蜂鸣器KEY0就关闭蜂鸣器。

小狗爱吃黄桃罐头的博客 925

用C#和MQTTnet在WinForm里做个简易物联网监控后台(附完整源码)

本文详细介绍了如何使用C#和MQTTnet库在WinForm中构建一个简易物联网监控后台。通过实战案例,包括环境配置、MQTT服务端实现、客户端监控功能及高级优化技巧,帮助开发者快速搭建高效的物联网监控系统,适用于工业自动化和智能家居场景。

weixin_29540599的博客 392

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-5 I.MX6U SoC介绍

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 1347

S4 codingblock增加客户化字段的一些小问题

今天使用codingblock增加了两个客户化字段后(S4版本),查看常用的几个表 ACDOCA BSEG 等等两个客户化字段安静的出现在表内,以为没有问题了 。结果后来MM那边查看物料凭证时程序直接dump,后来开发查明原因居然是因为财务增加的这两个增强字段的原因。 报错如下图所示: 主要是因为增加了字段后,更新了后台表,但是没有自动更新到视图。就是MSEG表增加了这两个字段,但是呢他对应的视图NSDM_V_MSEG没有增加,导致两边的结构不一致。 所以要解决这个问题,只能在视图NSDM_V_MSEG增

m0_46145967的博客 3917

论文阅读--射频电源在半导体领域的应用

射频电源(RF Power Supply)是能够输出300kHz~300GHz正弦波电压的高频交流电源,在半导体制造领域,射频电源的典型工作频率范围为400kHz∼60 MHz,主要由射频发生器(功率源)、匹配器及配套控制电路组件构成,其关键组件包括变压器与电抗器、晶闸管、绝缘栅双极型晶体管(IGBT)、钣金件、铜材及各种电子元器件。射频电源是刻蚀和薄膜沉积工艺的核心,主要用于产生等离子体,以增强气体反应活性,其性能直接影响反应腔体内等离子体的浓度、均匀性和稳定性。

伊丽莎白的学习之路 2337

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-21讲 LCD(RGB)液晶屏驱动开发

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 606

lumerical中DEVICE和MODE模块的交互使用(真的很干货!!可以自信的说网上绝对找不到比我更详细的步骤了)

几个脚本文件很重要! Lumerical仿真流程: 一、DEVICE: (1).建模并且运行完之后,在脚本提示符下键入以下脚本行以运行plotDopingProfile.lsf如图1(文件名如果索引不到的话就可以把文件直接用notepad++打开,然后把代码直接输入到device中script脚本中 如图2)脚本文件并生成下图 如图3: (图2) (图1) (图3) (2).仿真...

1万+

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5, 汇编 led.s,第一次点亮LED灯

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 1450

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南

本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。

weixin_29229055的博客 550

AUTOSAR R20-11标准下载!

这是公众号的第2篇推文,粉丝数49 Document Search Classic Platform Adaptive Platform Foundation 文档截图 以为会在明天的发布会之后才上线,没想到官网现在就悄悄放出来了。 中国由于网络问题,下载速度比较慢或者会中断。 “阅读原文”提供多种下载方式,可以在线浏览,可以集中下载也可单个文档下载。 如有增减我也会及时在公众号里通知大家,不过我觉得不会变动了。 整理不宜,好东西要分...

Adaptive_AUTOSAR的博客 1890

lpi linux认证权威指南 pdf,LPI Linux认证指南读书笔记

所有的计算机系统都需要一个人机界面。对于Linux系统管理员来说,最常用的莫过于字符界面了。系统提供一个字符例如''$''或者是''#''作为提示符,等待操作人员键入命令。这种界面通常也被称为‘命令行’界面。通常是由一个被称为shell的程序来提供命令提示符并完成与操作人员的交互。shell在linux内核与用户之间提供了一个交互层,这也是Shell这个名称的由来。最初的shell运行于Unix系...

weixin_31691749的博客 257

Y-Branch and a closed y-branch loop

双臂后面的区域,我们将它的双臂使用一个波导进行了连接,使得它本身形成了一个闭合回路,因此,该结构被称作。它们均是用来对经过它们的光束能量进行分割的一种器件。首先,我们知道一点,在光波导层面,今天给大家介绍一下,什么是。

u011699626的博客 627

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.2-链接脚本

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 814

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 744

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19.1讲 串口格式化输出printf

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 547

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-21.7讲 LCDIF控制接口初始化编写

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 530

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.4讲--ARM异常中断返回

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 405

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 659

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.1--C语言LED驱动程序

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

小狗爱吃黄桃罐头的博客 691

《给安全工程师讲透Linux》读书笔记

《给安全工程师讲透 Linux》读书笔记

Ays.Ie的博客 828
上一篇: 【Linux内核设计与实现】Linux内核简介
下一篇: 某个应用的CPU使用率居然达到100%
data_sheet
博客等级 码龄10年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值