<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[隔窗听雨]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://www.listera.top/</link><image><url>https://www.listera.top/favicon.png</url><title>隔窗听雨</title><link>https://www.listera.top/</link></image><generator>Ghost 5.28</generator><lastBuildDate>Wed, 15 Apr 2026 21:19:13 GMT</lastBuildDate><atom:link href="https://www.listera.top/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[61850专用语（转）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><strong>1.&#x529F;&#x80FD;&#x7EA6;&#x675F;&#x7C7B;&#x578B;,&#x5373;DA&#x7C7B;&#x7684;FC&#x6210;&#x5458;</strong></p>
<p>ST (Status) &#x72B6;&#x6001;&#x4FE1;&#x606F;<br>
MX (MesuredExtensed) &#x6D4B;&#x91CF;&#x503C;<br>
CO (Control) &#x63A7;&#x5236;<br>
SP (StaticParam) &#x53C2;&#x6570;<br>
SV (SubstitueValue) &#x53D6;&#x4EE3;<br>
CF (Config) &#x914D;&#x7F6E;<br>
DC (Describe) &#x63CF;&#x8FF0;<br>
SG (StaticGrop) &#x5B9A;&#x503C;&#x7EC4;</p>]]></description><link>https://www.listera.top/61850zhuan-yong-yu-zhuan/</link><guid isPermaLink="false">6895ba7f16cc8d004793b4c2</guid><category><![CDATA[61850]]></category><category><![CDATA[电力]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Fri, 08 Aug 2025 08:54:46 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><strong>1.&#x529F;&#x80FD;&#x7EA6;&#x675F;&#x7C7B;&#x578B;,&#x5373;DA&#x7C7B;&#x7684;FC&#x6210;&#x5458;</strong></p>
<p>ST (Status) &#x72B6;&#x6001;&#x4FE1;&#x606F;<br>
MX (MesuredExtensed) &#x6D4B;&#x91CF;&#x503C;<br>
CO (Control) &#x63A7;&#x5236;<br>
SP (StaticParam) &#x53C2;&#x6570;<br>
SV (SubstitueValue) &#x53D6;&#x4EE3;<br>
CF (Config) &#x914D;&#x7F6E;<br>
DC (Describe) &#x63CF;&#x8FF0;<br>
SG (StaticGrop) &#x5B9A;&#x503C;&#x7EC4;<br>
SE (StaticEdit) &#x53EF;&#x7F16;&#x8F91;&#x5B9A;&#x503C;&#x7EC4;<br>
EX (Extra) &#x6269;&#x5145;&#x5B9A;&#x4E49;<br>
BR (BufferReport)&#x7F13;&#x5B58;&#x62A5;&#x544A;<br>
RP (Report)&#x975E;&#x7F13;&#x5B58;&#x62A5;&#x544A;<br>
LG (Log)&#x65E5;&#x5FD7;<br>
GO(Goose)Goose&#x63A7;&#x5236;<br>
GS(Gsse)gsse&#x63A7;&#x5236;<br>
MS &#xFF08;MutiSample&#xFF09;&#x591A;&#x8DEF;&#x5E7F;&#x64AD;&#x91C7;&#x6837;&#x503C;&#x63A7;&#x5236;<br>
US &#xFF08;UniqueSample&#xFF09;&#x5355;&#x8DEF;&#x521B;&#x535A;&#x91C7;&#x6837;&#x503C;&#x63A7;&#x5236;<br>
XX &#x4F5C;&#x4E3A;&#x6240;&#x6709;DA&#x670D;&#x52A1;&#x53C2;&#x6570;</p>
<p><strong>2.&#x901A;&#x7528;&#x6570;&#x636E;&#x7C7B;&#x578B;,&#x5373;DA&#x7C7B;&#x7684;CDC&#x6210;&#x5458;</strong></p>
<p>Quality(&#x54C1;&#x8D28;)<br>
Analogue value(&#x6A21;&#x62DF;&#x503C;)<br>
Configration of analoge value(&#x6A21;&#x62DF;&#x503C;&#x7684;&#x914D;&#x7F6E;)<br>
Range configration(&#x8303;&#x56F4;&#x914D;&#x7F6E;)<br>
Pulse configration(&#x8109;&#x51B2;&#x914D;&#x7F6E;)<br>
Originator(&#x539F;&#x53D1;&#x8005;)<br>
Unit(&#x5355;&#x4F4D;&#x5B9A;&#x4E49;)<br>
Vector(&#x5411;&#x91CF;&#x5B9A;&#x4E49;)<br>
Point(&#x70B9;&#x5B9A;&#x4E49;)<br>
CtlModels(&#x63A7;&#x5236;&#x6A21;&#x5F0F;&#x5B9A;&#x4E49;)<br>
sboClass(&#x64CD;&#x4F5C;&#x524D;&#x9009;&#x62E9;&#x5B9A;&#x4E49;)</p>
<p><strong>3.&#x6570;&#x636E;&#x5BF9;&#x8C61;&#x7C7B;,&#x5373;DO&#x7C7B;&#x7684;name&#x6210;&#x5458;</strong></p>
<p>SPC(&#x5355;&#x70B9;&#x72B6;&#x6001;&#x4FE1;&#x606F;)<br>
DPS(&#x53CC;&#x70B9;&#x72B6;&#x6001;&#x4FE1;&#x606F;)<br>
INS(&#x6574;&#x6570;&#x72B6;&#x6001;&#x4FE1;&#x606F;)<br>
ACT(&#x4FDD;&#x62A4;&#x6FC0;&#x6D3B;&#x4FE1;&#x606F;)<br>
ACD(&#x65B9;&#x5411;&#x4FDD;&#x62A4;&#x6FC0;&#x6D3B;&#x4FE1;&#x606F;)<br>
SEC(&#x5B89;&#x5168;&#x8FDD;&#x4F8B;&#x8BA1;&#x6570;)<br>
BCR(&#x4E8C;&#x8FDB;&#x5236;&#x8BA1;&#x6570;&#x5668;&#x8BFB;&#x6570;)<br>
MV(&#x6D4B;&#x91CF;&#x503C;)<br>
CMV(&#x590D;&#x6570;&#x6D4B;&#x91CF;&#x503C;)<br>
SAV(&#x91C7;&#x6837;&#x503C;)<br>
WYE(&#x4E09;&#x76F8;&#x7CFB;&#x7EDF;&#x4E2D;&#x76F8;&#x5BF9;&#x5730;&#x76F8;&#x5173;&#x6D4B;&#x91CF;&#x503C;)<br>
SEQ(&#x987A;&#x5E8F;&#x503C;)<br>
HMV(&#x8C10;&#x6CE2;&#x503C;)<br>
WYE/HWYE(&#x8C10;&#x6CE2;&#x503C;)<br>
SPC(&#x53EF;&#x63A7;&#x7684;&#x5355;&#x70B9;)<br>
DPC(&#x53EF;&#x63A7;&#x7684;&#x53CC;&#x70B9;)<br>
INC(&#x53EF;&#x63A7;&#x7684;&#x6574;&#x6570;&#x72B6;&#x6001;)<br>
BSC(&#x4E8C;&#x8FDB;&#x5236;&#x53D7;&#x63A7;&#x6B65;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F;)<br>
ISC(&#x6574;&#x6570;&#x53D7;&#x63A7;&#x6B65;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F;)<br>
APC(&#x53EF;&#x63A7;&#x6A21;&#x62DF;&#x8BBE;&#x70B9;&#x4FE1;&#x606F;)<br>
SPG(&#x5355;&#x70B9;&#x5B9A;&#x503C;)<br>
ING(&#x6574;&#x6570;&#x72B6;&#x6001;&#x5B9A;&#x503C;)<br>
ASG(&#x6A21;&#x62DF;&#x5B9A;&#x503C;)<br>
CURVE(&#x5B9A;&#x503C;&#x66F2;&#x7EBF;)<br>
DPL(&#x8BBE;&#x5907;&#x94ED;&#x724C;)<br>
LPL(&#x903B;&#x8F91;&#x8282;&#x70B9;&#x94ED;&#x724C;)<br>
CSD(&#x66F2;&#x7EBF;&#x5F62;&#x72B6;&#x63CF;&#x8FF0;)</p>
<p><strong>4.&#x903B;&#x8F91;&#x8282;&#x70B9;&#x7C7B;,&#x5373;LN&#x7C7B;&#x7684;name&#x6210;&#x5458;</strong></p>
<p>LPHD(&#x7269;&#x7406;&#x88C5;&#x7F6E;&#x4FE1;&#x606F;)<br>
LLN0&#xFF08;&#x903B;&#x8F91;&#x8282;&#x70B9;&#x96F6;&#xFF09;<br>
PDIF(&#x5DEE;&#x52A8;)<br>
PDIR(&#x65B9;&#x5411;&#x6BD4;&#x8F83;)<br>
PDIS(&#x8DDD;&#x79BB;&#x4FDD;&#x62A4;)<br>
PDOP(&#x8FC7;&#x529F;&#x7387;&#x65B9;&#x5411;)<br>
PDUP(&#x6B20;&#x529F;&#x7387;&#x65B9;&#x5411;)<br>
PFRC(&#x9891;&#x7387;&#x53D8;&#x5316;&#x7387;)<br>
PHAR(&#x8C10;&#x6CE2;&#x5236;&#x52A8;)<br>
PHIZ(&#x63A5;&#x5730;&#x68C0;&#x6D4B;)<br>
PIOC(&#x77AC;&#x65F6;&#x8FC7;&#x6D41;)<br>
PMRI(&#x7981;&#x6B62;&#x7535;&#x52A8;&#x673A;&#x91CD;&#x65B0;&#x542F;&#x52A8;)<br>
PMSS(&#x7535;&#x52A8;&#x673A;&#x542F;&#x52A8;&#x65F6;&#x95F4;&#x76D1;&#x89C6;)<br>
POPF(&#x8FC7;&#x529F;&#x7387;&#x56E0;&#x7D20;)<br>
PPAM&#xFF08;&#x76F8;&#x89D2;&#x6D4B;&#x91CF;&#xFF09;<br>
PSCH(&#x4FDD;&#x62A4;&#x914D;&#x7F6E;)<br>
PSDE(&#x7075;&#x654F;&#x65B9;&#x5411;&#x63A5;&#x5730;&#x6545;&#x969C;)<br>
PIEF(&#x77AC;&#x65F6;&#x63A5;&#x5730;&#x6545;&#x969C;)<br>
PTOC(&#x5E26;&#x65F6;&#x9650;&#x8FC7;&#x7535;&#x6D41;)<br>
PTOF(&#x9AD8;&#x5468;&#x9891;&#x7387;)<br>
PTOV(&#x8FC7;&#x538B;&#x7535;)<br>
PTRC(&#x4FDD;&#x62A4;&#x8DF3;&#x95F8;&#x6761;&#x4EF6;)<br>
PTTR(&#x8FC7;&#x70ED;)<br>
PTUC(&#x6B20;&#x7535;&#x6D41;)<br>
PTUV(&#x6B20;&#x7535;&#x538B;)<br>
PTPF(&#x6B20;&#x529F;&#x7387;&#x56E0;&#x6570;)<br>
PTUF(&#x4F4E;&#x5468;)<br>
PVOC(&#x7535;&#x538B;&#x63A7;&#x5236;&#x9650;&#x65F6;&#x8FC7;&#x6D41;&#x7535;)<br>
PVPH(&#x7535;&#x538B;&#x9891;&#x7387;)<br>
PZSU(&#x96F6;&#x901F;&#x6216;&#x6B20;&#x901F;&#x4FDD;&#x62A4;)<br>
RDRE(&#x6270;&#x52A8;&#x8BB0;&#x5F55;&#x529F;&#x80FD;)<br>
RADR(&#x6270;&#x52A8;&#x8BB0;&#x5F55;&#x6A21;&#x62DF;&#x901A;&#x9053;)<br>
RBDR(&#x6270;&#x52A8;&#x8BB0;&#x5F55;&#x72B6;&#x6001;&#x91CF;&#x901A;&#x9053;)<br>
RDRS(&#x6270;&#x52A8;&#x8BB0;&#x5F55;&#x5904;&#x7406;)<br>
RBRF(&#x65AD;&#x8DEF;&#x5668;&#x5931;&#x7075;)<br>
RDIR(&#x65B9;&#x5411;&#x5143;&#x4EF6;)<br>
RFLO(&#x6545;&#x969C;&#x5B9A;&#x4F4D;)<br>
RPSB(&#x7535;&#x7F51;&#x632F;&#x8361;&#x68C0;&#x6D4B;/&#x95ED;&#x9501;)<br>
RREC(&#x81EA;&#x52A8;&#x91CD;&#x5408;&#x95F8;)<br>
RSYN(&#x540C;&#x671F;&#x68C0;&#x6D4B;&#x6216;&#x540C;&#x671F;)<br>
CALH(&#x544A;&#x8B66;&#x5904;&#x7406;)<br>
CCGR(&#x51B7;&#x5374;&#x6210;&#x7EC4;&#x63A7;&#x5236;)<br>
CILO(&#x8054;&#x9501;)<br>
CPOW(&#x5B9A;&#x70B9;&#x5206;&#x5408;)<br>
CSWI(&#x5F00;&#x5173;&#x63A7;&#x5236;&#x5668;)<br>
GAPC(&#x901A;&#x7528;&#x81EA;&#x52A8;&#x52FE;&#x8FC7;&#x7A0B;&#x63A7;&#x5236;)<br>
GGIO(&#x901A;&#x7528;&#x8FC7;&#x7A0B;I/O)<br>
GSAL(&#x901A;&#x7528;&#x5B89;&#x5168;&#x5E94;&#x7528;)<br>
IARC(&#x5B58;&#x6863;)<br>
IHMI(&#x4EBA;&#x673A;&#x63A5;&#x53E3;)<br>
ITCI(&#x9065;&#x63A7;&#x63A5;&#x53E3;)<br>
ITMI(&#x8FDC;&#x65B9;&#x76D1;&#x89C6;&#x63A5;&#x53E3;)<br>
ANCR(&#x4E2D;&#x6027;&#x70B9;&#x7535;&#x6D41;&#x8C03;&#x8282;)<br>
ARCO(&#x65E0;&#x529F;&#x63A7;&#x5236;)<br>
ATCC(&#x81EA;&#x52A8;&#x8C03;&#x5206;&#x63A5;&#x5934;&#x63A7;&#x5236;)<br>
AVCO(&#x7535;&#x538B;&#x63A7;&#x5236;)<br>
MDIF(&#x5DEE;&#x52A8;&#x6D4B;&#x91CF;)<br>
MHAI(&#x8C10;&#x6CE2;&#x548C;&#x95F4;&#x8C10;&#x6CE2;)<br>
MHAN(&#x76F8;&#x522B;&#x65E0;&#x5173;&#x8C10;&#x6CE2;&#x548C;&#x95F4;&#x8C10;&#x6CE2;)<br>
MMTR(&#x8BA1;&#x91CF;)<br>
MMXN(&#x76F8;&#x522B;&#x65E0;&#x5173;&#x6D4B;&#x91CF;)<br>
MMXU(&#x6D4B;&#x91CF;)<br>
MSQI(&#x76F8;&#x5E8F;&#x548C;&#x4E0D;&#x5E73;&#x8861;)<br>
MSTA(&#x8BA1;&#x91CF;&#x7EDF;&#x8BA1;)<br>
SARC(&#x7535;&#x5F27;&#x76D1;&#x89C6;&#x548C;&#x8BCA;&#x65AD;)<br>
SIMG(&#x7EDD;&#x7F18;&#x4ECB;&#x8D28;&#x76D1;&#x89C6;&#x6C14;&#x4F53;)<br>
SIML(&#x7EDD;&#x7F18;&#x4ECB;&#x8D28;&#x76D1;&#x89C6;&#x6DB2;&#x4F53;)<br>
SPDC(&#x5C40;&#x90E8;&#x653E;&#x7535;&#x76D1;&#x89C6;&#x548C;&#x8BCA;&#x65AD;)<br>
XCBR(&#x65AD;&#x8DEF;&#x5668;)<br>
XSWI(&#x9694;&#x79BB;&#x5F00;&#x5173;)<br>
TCTR(&#x7535;&#x6D41;&#x4E92;&#x611F;&#x5668;)<br>
TVTR(&#x7535;&#x538B;&#x4E92;&#x611F;&#x5668;)<br>
YEFN(&#x63A5;&#x5730;&#x6545;&#x969C;&#x4E2D;&#x6027;&#x70B9;&#x8865;&#x507F;&#x6D88;&#x5F27;&#x7EBF;&#x5708;)<br>
YLTC(&#x5206;&#x63A5;&#x5934;)<br>
YPSH(&#x529F;&#x7387;&#x5206;&#x6D41;)<br>
YPTR(&#x7535;&#x529B;&#x53D8;&#x538B;&#x5668;)<br>
ZAXN(&#x8F85;&#x52A9;&#x7F51;&#x7EDC;)<br>
ZBAT(&#x7535;&#x6C60;)<br>
ZBSH(&#x5957;&#x7BA1;)<br>
ZCAB(&#x7535;&#x529B;&#x7535;&#x7F06;)<br>
ZCAP(&#x7535;&#x5BB9;&#x5668;&#x7EC4;)<br>
ZCON(&#x8F6C;&#x6362;&#x5668;)<br>
ZGEN(&#x53D1;&#x7535;&#x673A;)<br>
ZGIL(&#x6C14;&#x4F53;&#x7EDD;&#x7F18;&#x7EBF;&#x8DEF;)<br>
ZLIN(&#x7535;&#x529B;&#x67B6;&#x7A7A;&#x7EBF;)<br>
ZMOT(&#x7535;&#x52A8;&#x673A;)<br>
ZREA(&#x7535;&#x6297;&#x5668;)<br>
ZRRC(&#x65CB;&#x8F6C;&#x65E0;&#x529F;&#x5143;&#x4EF6;)<br>
ZSAR(&#x6D6A;&#x6D8C;&#x6291;&#x5236;&#x5668;)<br>
ZTCF(&#x6676;&#x95F8;&#x7BA1;&#x63A7;&#x5236;&#x9891;&#x7387;&#x8F6C;&#x6362;&#x5668;)<br>
ZTCR(&#x6676;&#x95F8;&#x7BA1;&#x63A7;&#x5236;&#x65E0;&#x529F;&#x5143;&#x4EF6;)</p>
<p><strong>5.&#x5176;&#x4ED6;&#x7684;&#x5E38;&#x7528;&#x8BED;</strong></p>
<p>MMS&#xFF1A;Manufacturing Message Specification &#x5236;&#x9020;&#x62A5;&#x6587;&#x89C4;&#x8303;<br>
GOOSE:Generic Object Oriented Substation Event &#x9762;&#x5411;&#x901A;&#x7528;&#x5BF9;&#x8C61;&#x53D8;&#x7535;&#x7AD9;&#x4E8B;&#x4EF6;<br>
LD:Logical Device &#x903B;&#x8F91;&#x8BBE;&#x5907;,&#x4EE3;&#x8868;&#x5178;&#x578B;&#x53D8;&#x7535;&#x7AD9;&#x529F;&#x80FD;&#x96C6;&#x7684;&#x5B9E;&#x4F53;<br>
LN:Logical Node &#x903B;&#x8F91;&#x8282;&#x70B9;,&#x4EE3;&#x8868;&#x5178;&#x578B;&#x53D8;&#x7535;&#x7AD9;&#x529F;&#x80FD;&#x7684;&#x5B9E;&#x4F53;<br>
DO:Data Object class or instance &#x6570;&#x636E;&#x5BF9;&#x8C61;&#x7C7B;&#x578B;<br>
DA:Data Attribute &#x6570;&#x636E;&#x5C5E;&#x6027;<br>
FC:Functional Constraint &#x529F;&#x80FD;&#x7EA6;&#x675F;<br>
FCDA:Functionall Constrained Data Attribute &#x529F;&#x80FD;&#x7EA6;&#x675F;&#x6570;&#x636E;&#x5C5E;&#x6027;<br>
BDA:Basic Data Attribute,that is not structre &#x975E;&#x7ED3;&#x6784;&#x5316;&#x7684;&#x57FA;&#x672C;&#x6570;&#x636E;&#x5C5E;&#x6027;<br>
DOI:Data Object Instantiated &#x5B9E;&#x4F8B;&#x5316;&#x6570;&#x636E;&#x5BF9;&#x8C61;<br>
DAI:Data Attribute Instantiated &#x5B9E;&#x4F8B;&#x5316;&#x6570;&#x636E;&#x5C5E;&#x6027;<br>
ICD:IED Capability Description &#x667A;&#x80FD;&#x7535;&#x5B50;&#x8BBE;&#x5907;&#x80FD;&#x529B;&#x63CF;&#x8FF0;&#x6587;&#x4EF6;<br>
SSD:System Specification Description &#x7CFB;&#x7EDF;&#x89C4;&#x8303;&#x63CF;&#x8FF0;&#x6587;&#x4EF6;<br>
SCD:Sustation Configuration Description &#x53D8;&#x7535;&#x7AD9;&#x914D;&#x7F6E;&#x63CF;&#x8FF0;&#x6587;&#x4EF6;<br>
CID:Configured IED Description &#x914D;&#x7F6E;&#x8FC7;&#x7684;&#x667A;&#x80FD;&#x7535;&#x5B50;&#x8BBE;&#x5907;&#x63CF;&#x8FF0;<br>
IID:Instantiated IED Description &#x5B9E;&#x4F8B;&#x5316;&#x7684;&#x667A;&#x80FD;&#x7535;&#x5B50;&#x8BBE;&#x5907;&#x63CF;&#x8FF0;&#x6587;&#x4EF6;<br>
SED:System Exchange Description &#x7CFB;&#x7EDF;&#x4EA4;&#x6362;&#x63CF;&#x8FF0;&#x6587;&#x4EF6;<br>
CDC:Commmon Data Class(DL/T860.73)&#x516C;&#x7528;&#x6570;&#x636E;&#x7C7B;<br>
XML:Extensible Markup Language &#x62D3;&#x5C55;&#x6807;&#x5FD7;&#x8BED;&#x8A00;<br>
SCL:Substation Configuration description Language &#x53D8;&#x7535;&#x7AD9;&#x914D;&#x7F6E;&#x63CF;&#x8FF0;&#x8BED;&#x8A00;<br>
RCB:Report Control Block &#x62A5;&#x544A;&#x63A7;&#x5236;&#x5757;<br>
IED:Intelligent Electronic Device &#x667A;&#x80FD;&#x7535;&#x5B50;&#x8BBE;&#x5907;<br>
XSD:XML Schema Definition xml&#x8BED;&#x6CD5;&#x5B9A;&#x4E49;</p>
<hr>
<p>&#x539F;&#x6587;&#xFF1A;<a href="https://blog.csdn.net/yuan1164345228/article/details/134669201">https://blog.csdn.net/yuan1164345228/article/details/134669201</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Linux 异步 I/O 框架 io_uring：基本原理、程序示例与性能压测（2020）（转）]]></title><description><![CDATA[<h3 id="%E8%AF%91%E8%80%85%E5%BA%8F">&#x8BD1;&#x8005;&#x5E8F;</h3><p>&#x672C;&#x6587;&#x7EC4;&#x5408;&#x7FFB;&#x8BD1;&#x4E86;&#x4EE5;&#x4E0B;&#x4E24;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x5E72;&#x8D27;&#x90E8;&#x5206;&#xFF0C;&#x4F5C;&#x4E3A; <code>io_uring</code> &#x76F8;&#x5173;&#x7684;&#x5165;&#x95E8;&#x53C2;&#x8003;&#xFF1A;</p><ul><li><a href="https://thenewstack.io/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux">How io_uring and eBPF Will Revolutionize Programming in Linux</a>, ScyllaDB, 2020</li><li><a href="https://medium.com/oracledevs/an-introduction-to-the-io-uring-asynchronous-i-o-framework-fad002d7dfc1">An Introduction to the</a></li></ul>]]></description><link>https://www.listera.top/linux-yi-bu-i-o-kuang-jia-io_uring-ji-ben-yuan-li-cheng-xu-shi-li-yu-xing-neng-ya-ce-2020-zhuan/</link><guid isPermaLink="false">67f75e06265c8c0693893830</guid><category><![CDATA[Linux]]></category><category><![CDATA[io_uring]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Thu, 10 Apr 2025 06:02:16 GMT</pubDate><content:encoded><![CDATA[<h3 id="%E8%AF%91%E8%80%85%E5%BA%8F">&#x8BD1;&#x8005;&#x5E8F;</h3><p>&#x672C;&#x6587;&#x7EC4;&#x5408;&#x7FFB;&#x8BD1;&#x4E86;&#x4EE5;&#x4E0B;&#x4E24;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x5E72;&#x8D27;&#x90E8;&#x5206;&#xFF0C;&#x4F5C;&#x4E3A; <code>io_uring</code> &#x76F8;&#x5173;&#x7684;&#x5165;&#x95E8;&#x53C2;&#x8003;&#xFF1A;</p><ul><li><a href="https://thenewstack.io/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux">How io_uring and eBPF Will Revolutionize Programming in Linux</a>, ScyllaDB, 2020</li><li><a href="https://medium.com/oracledevs/an-introduction-to-the-io-uring-asynchronous-i-o-framework-fad002d7dfc1">An Introduction to the io_uring Asynchronous I/O Framework</a>, Oracle, 2020</li></ul><p><code>io_uring</code> &#x662F; 2019 &#x5E74; <strong>Linux 5.1</strong> &#x5185;&#x6838;&#x9996;&#x6B21;&#x5F15;&#x5165;&#x7684;&#x9AD8;&#x6027;&#x80FD; <strong>&#x5F02;&#x6B65; I/O &#x6846;&#x67B6;</strong>&#xFF0C;&#x80FD;&#x663E;&#x8457;&#x52A0;&#x901F; I/O &#x5BC6;&#x96C6;&#x578B;&#x5E94;&#x7528;&#x7684;&#x6027;&#x80FD;&#x3002; &#x4F46;&#x5982;&#x679C;&#x4F60;&#x7684;&#x5E94;&#x7528;<strong>&#x5DF2;&#x7ECF;&#x5728;&#x4F7F;&#x7528;</strong> &#x4F20;&#x7EDF; Linux AIO &#x4E86;&#xFF0C;<strong>&#x5E76;&#x4E14;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x6070;&#x5F53;</strong>&#xFF0C; &#x90A3; <code>io_uring</code> <strong>&#x5E76;&#x4E0D;&#x4F1A;&#x5E26;&#x6765;&#x592A;&#x5927;&#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;</strong> &#x2014;&#x2014; &#x6839;&#x636E;&#x539F;&#x6587;&#x6D4B;&#x8BD5;&#xFF08;&#x4EE5;&#x53CA;&#x6211;&#x4EEC; &#x81EA;&#x5DF1;&#x7684;&#x590D;&#x73B0;&#xFF09;&#xFF0C;&#x5373;&#x4FBF;&#x6253;&#x5F00;&#x9AD8;&#x7EA7;&#x7279;&#x6027;&#xFF0C;&#x4E5F;&#x53EA;&#x6709; 5%&#x3002;&#x9664;&#x975E;&#x4F60;&#x771F;&#x7684;&#x9700;&#x8981;&#x8FD9; 5% &#x7684;&#x989D;&#x5916;&#x6027;&#x80FD;&#xFF0C;&#x5426;&#x5219; <strong>&#x5207;&#x6362;</strong>&#x6210; <code>io_uring</code> <strong>&#x4EE3;&#x4EF7;&#x53EF;&#x80FD;&#x4E5F;&#x633A;&#x5927;</strong>&#xFF0C;&#x56E0;&#x4E3A;&#x8981; <strong>&#x91CD;&#x5199;&#x5E94;&#x7528;</strong>&#x6765;&#x9002;&#x914D; <code>io_uring</code>&#xFF08;&#x6216;&#x8005;&#x8BA9;&#x4F9D;&#x8D56;&#x7684;&#x5E73;&#x53F0;&#x6216;&#x6846;&#x67B6;&#x53BB;&#x9002;&#x914D;&#xFF0C;&#x603B;&#x4E4B;&#x9700;&#x8981;&#x6539;&#x4EE3;&#x7801;&#xFF09;&#x3002;</p><p>&#x65E2;&#x7136;&#x6027;&#x80FD;&#x8DDF;&#x4F20;&#x7EDF; AIO &#x5DEE;&#x4E0D;&#x591A;&#xFF0C;&#x90A3;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD8;&#x79F0; <code>io_uring</code> &#x4E3A;&#x9769;&#x547D;&#x6027;&#x6280;&#x672F;&#x5462;&#xFF1F;</p><p>&#x5B83;&#x9996;&#x5148;&#x548C;&#x6700;&#x5927;&#x7684;&#x8D21;&#x732E;&#x5728;&#x4E8E;&#xFF1A;<strong>&#x7EDF;&#x4E00;&#x4E86; Linux &#x5F02;&#x6B65; I/O &#x6846;&#x67B6;</strong>&#xFF0C;</p><ul><li>Linux AIO <strong>&#x53EA;&#x652F;&#x6301; direct I/O</strong> &#x6A21;&#x5F0F;&#x7684;<strong>&#x5B58;&#x50A8;&#x6587;&#x4EF6;</strong> &#xFF08;storage file&#xFF09;&#xFF0C;&#x800C;&#x4E14;&#x4E3B;&#x8981;&#x7528;&#x5728;<strong>&#x6570;&#x636E;&#x5E93;&#x8FD9;&#x4E00;&#x7EC6;&#x5206;&#x9886;&#x57DF;</strong>&#xFF1B;</li><li><code>io_uring</code> &#x652F;&#x6301;&#x5B58;&#x50A8;&#x6587;&#x4EF6;&#x548C;&#x7F51;&#x7EDC;&#x6587;&#x4EF6;&#xFF08;network sockets&#xFF09;&#xFF0C;&#x4E5F;&#x652F;&#x6301;&#x66F4;&#x591A;&#x7684;&#x5F02;&#x6B65;&#x7CFB;&#x7EDF;&#x8C03;&#x7528; &#xFF08;<code>accept/openat/stat/...</code>&#xFF09;&#xFF0C;&#x800C;&#x975E;&#x4EC5;&#x9650;&#x4E8E; <code>read/write</code> &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x3002;</li></ul><p>&#x5728;<strong>&#x8BBE;&#x8BA1;&#x4E0A;&#x662F;&#x771F;&#x6B63;&#x7684;&#x5F02;&#x6B65; I/O</strong>&#xFF0C;&#x4F5C;&#x4E3A;&#x5BF9;&#x6BD4;&#xFF0C;Linux AIO &#x867D;&#x7136;&#x4E5F; &#x662F;&#x5F02;&#x6B65;&#x7684;&#xFF0C;&#x4F46;&#x4ECD;&#x7136;&#x53EF;&#x80FD;&#x4F1A;&#x963B;&#x585E;&#xFF0C;&#x67D0;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#x7684;&#x884C;&#x4E3A;&#x4E5F;&#x65E0;&#x6CD5;&#x9884;&#x6D4B;&#xFF1B;</p><p>&#x4F3C;&#x4E4E;&#x4E4B;&#x524D; Windows &#x5728;&#x8FD9;&#x5757;&#x53CD;&#x800C;&#x662F;&#x9886;&#x5148;&#x7684;&#xFF0C;&#x66F4;&#x591A;&#x53C2;&#x8003;&#xFF1A;</p><ul><li><a href="https://zhuanlan.zhihu.com/p/361955546">&#x6D45;&#x6790;&#x5F00;&#x6E90;&#x9879;&#x76EE;&#x4E4B; io_uring</a>&#xFF0C;&#x201C;&#x5206;&#x6B65;&#x8BD5;&#x5B58;&#x50A8;&#x201D;&#x4E13;&#x680F;&#xFF0C;&#x77E5;&#x4E4E;</li><li><a href="https://stackoverflow.com/questions/13407542/is-there-really-no-asynchronous-block-i-o-on-linux">Is there really no asynchronous block I/O on Linux?</a>&#xFF0C;stackoverflow</li></ul><ol><li><strong>&#x7075;&#x6D3B;&#x6027;&#x548C;&#x53EF;&#x6269;&#x5C55;&#x6027;</strong>&#x975E;&#x5E38;&#x597D;&#xFF0C;&#x751A;&#x81F3;&#x80FD;&#x57FA;&#x4E8E; <code>io_uring</code> &#x91CD;&#x5199;&#x6240;&#x6709;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF0C;&#x800C; Linux AIO &#x8BBE;&#x8BA1;&#x65F6;&#x5C31;&#x6CA1;&#x8003;&#x8651;&#x6269;&#x5C55;&#x6027;&#x3002;</li></ol><p>eBPF &#x4E5F;&#x7B97;&#x662F;&#x5F02;&#x6B65;&#x6846;&#x67B6;&#xFF08;&#x4E8B;&#x4EF6;&#x9A71;&#x52A8;&#xFF09;&#xFF0C;&#x4F46;&#x4E0E; <code>io_uring</code> &#x6CA1;&#x6709;&#x672C;&#x8D28;&#x8054;&#x7CFB;&#xFF0C;&#x4E8C;&#x8005;&#x5C5E;&#x4E8E;&#x4E0D;&#x540C;&#x5B50;&#x7CFB;&#x7EDF;&#xFF0C; &#x5E76;&#x4E14;&#x5728;&#x6A21;&#x578B;&#x4E0A;&#x6709;&#x4E00;&#x4E2A;&#x672C;&#x8D28;&#x533A;&#x522B;&#xFF1A;</p><ol><li><strong>eBPF &#x5BF9;&#x7528;&#x6237;&#x662F;&#x900F;&#x660E;&#x7684;</strong>&#xFF0C;&#x53EA;&#x9700;&#x5347;&#x7EA7;&#x5185;&#x6838;&#xFF08;&#x5230;&#x5408;&#x9002;&#x7684;&#x7248;&#x672C;&#xFF09;&#xFF0C;<strong>&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x6539;&#x9020;</strong>&#xFF1B;</li><li><code>io_uring</code> &#x63D0;&#x4F9B;&#x4E86;<strong>&#x65B0;&#x7684;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x548C;&#x7528;&#x6237;&#x7A7A;&#x95F4; API</strong>&#xFF0C;&#x56E0;&#x6B64;<strong>&#x9700;&#x8981;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x505A;&#x6539;&#x9020;</strong>&#x3002;</li></ol><p>eBPF &#x4F5C;&#x4E3A;&#x52A8;&#x6001;&#x8DDF;&#x8E2A;&#x5DE5;&#x5177;&#xFF0C;&#x80FD;&#x591F;&#x66F4;&#x65B9;&#x4FBF;&#x5730;&#x6392;&#x67E5;&#x548C;&#x89C2;&#x6D4B; <code>io_uring</code> &#x7B49;&#x6A21;&#x5757;&#x5728;&#x6267;&#x884C;&#x5C42;&#x9762;&#x7684;&#x5177;&#x4F53;&#x95EE;&#x9898;&#x3002;</p><p>&#x672C;&#x6587;&#x4ECB;&#x7ECD; Linux &#x5F02;&#x6B65; I/O &#x7684;&#x53D1;&#x5C55;&#x5386;&#x53F2;&#xFF0C;<code>io_uring</code> &#x7684;&#x539F;&#x7406;&#x548C;&#x529F;&#x80FD;&#xFF0C; &#x5E76;&#x7ED9;&#x51FA;&#x4E86;&#x4E00;&#x4E9B;<strong>&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;</strong>&#x548C;<strong>&#x6027;&#x80FD;&#x538B;&#x6D4B;</strong>&#x7ED3;&#x679C;&#xFF08;&#x6211;&#x4EEC;&#x5728; 5.10 &#x5185;&#x6838;&#x505A;&#x4E86;&#x7C7B;&#x4F3C;&#x6D4B;&#x8BD5;&#xFF0C;&#x7ED3;&#x8BBA;&#x4E0E;&#x539F;&#x6587;&#x5DEE;&#x4E0D;&#x591A;&#xFF09;&#x3002;</p><blockquote>Ceph &#x4EE3;&#x7801;&#x4E0A;&#x5DF2;&#x7ECF;&#x652F;&#x6301;&#x4E86; <code>io_uring</code>&#xFF0C;&#x4F46;&#x53D1;&#x884C;&#x7248;&#x5728;&#x7F16;&#x8BD1;&#x65F6;&#x6CA1;&#x6709;&#x6253;&#x5F00;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x652F;&#x6301; io_uring <a href="https://github.com/ceph/ceph/blob/a67d1cf2a7a4031609a5d37baa01ffdfef80e993/src/blk/kernel/io_uring.cc#L256">&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x7684; <code>false</code></a>&#xFF0C; &#x56E0;&#x6B64;&#x60F3;&#x6D4B;&#x8BD5;&#x5F97;&#x81EA;&#x5DF1;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x3002;&#x6D4B;&#x8BD5;&#x65F6;&#x7684;&#x53C2;&#x8003;&#x914D;&#x7F6E;&#xFF1A;</blockquote><pre><code>$ cat /etc/ceph/ceph.conf
[osd]
bluestore_ioring = true
...
</code></pre><blockquote>&#x786E;&#x8BA4;&#x914D;&#x7F6E;&#x751F;&#x6548;&#xFF08;&#x8FD9;&#x662F;&#x53EA;&#x662F;&#x968F;&#x4FBF;&#x6311;&#x4E00;&#x4E2A; OSD&#xFF09;&#xFF1A;</blockquote><pre><code>$ ceph config show osd.16 | grep ioring
bluestore_ioring                       true                                            file
</code></pre><blockquote>&#x8FD8;&#x8981;&#x53BB;&#x770B;&#x4E0B;&#x65E5;&#x5FD7;&#xFF0C;&#x662F;&#x5426;&#x56E0;&#x4E3A;&#x68C0;&#x6D4B; io_uring &#x5931;&#x8D25;&#x800C; fallback &#x56DE;&#x4E86; libaio&#x3002;</blockquote><p><strong>&#x7531;&#x4E8E;&#x8BD1;&#x8005;&#x6C34;&#x5E73;&#x6709;&#x9650;&#xFF0C;&#x672C;&#x6587;&#x4E0D;&#x514D;&#x5B58;&#x5728;&#x9057;&#x6F0F;&#x6216;&#x9519;&#x8BEF;&#x4E4B;&#x5904;&#x3002;&#x5982;&#x6709;&#x7591;&#x95EE;&#xFF0C;&#x8BF7;&#x67E5;&#x9605;&#x539F;&#x6587;&#x3002;</strong></p><p>&#x4EE5;&#x4E0B;&#x662F;&#x8BD1;&#x6587;&#x3002;</p><hr><ul><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E8%AF%91%E8%80%85%E5%BA%8F">&#x8BD1;&#x8005;&#x5E8F;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#1-linux-io-%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E6%BC%94%E8%BF%9B">1 Linux I/O &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x6F14;&#x8FDB;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#11-%E5%9F%BA%E4%BA%8E-fd-%E7%9A%84%E9%98%BB%E5%A1%9E%E5%BC%8F-ioreadwrite">1.1 &#x57FA;&#x4E8E; fd &#x7684;&#x963B;&#x585E;&#x5F0F; I/O&#xFF1A;<code>read()/write()</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#12-%E9%9D%9E%E9%98%BB%E5%A1%9E%E5%BC%8F-ioselectpollepoll">1.2 &#x975E;&#x963B;&#x585E;&#x5F0F; I/O&#xFF1A;<code>select()/poll()/epoll()</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#13-%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%96%B9%E5%BC%8F">1.3 &#x7EBF;&#x7A0B;&#x6C60;&#x65B9;&#x5F0F;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#14-direct-io%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BD%AF%E4%BB%B6%E7%BB%95%E8%BF%87-page-cache">1.4 Direct I/O&#xFF08;&#x6570;&#x636E;&#x5E93;&#x8F6F;&#x4EF6;&#xFF09;&#xFF1A;&#x7ED5;&#x8FC7; page cache</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#15-%E5%BC%82%E6%AD%A5-ioaio">1.5 &#x5F02;&#x6B65; IO&#xFF08;AIO&#xFF09;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#16-%E5%B0%8F%E7%BB%93">1.6 &#x5C0F;&#x7ED3;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#2-io_uring">2 <code>io_uring</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#21-%E4%B8%8E-linux-aio-%E7%9A%84%E4%B8%8D%E5%90%8C">2.1 &#x4E0E; Linux AIO &#x7684;&#x4E0D;&#x540C;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#22-%E5%8E%9F%E7%90%86%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84sqcqsqecqe">2.2 &#x539F;&#x7406;&#x53CA;&#x6838;&#x5FC3;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF1A;SQ/CQ/SQE/CQE</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#23-%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%A5%BD%E5%A4%84">2.3 &#x5E26;&#x6765;&#x7684;&#x597D;&#x5904;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#24-%E4%B8%89%E7%A7%8D%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F">2.4 &#x4E09;&#x79CD;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#25-io_uring-%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8-api">2.5 <code>io_uring</code> &#x7CFB;&#x7EDF;&#x8C03;&#x7528; API</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#251-io_uring_setup">2.5.1 <code>io_uring_setup()</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#252-io_uring_register">2.5.2 <code>io_uring_register()</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E6%B3%A8%E5%86%8C%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BAbuffer%E6%80%A7%E8%B4%A8">&#x6CE8;&#x518C;&#x7684;&#x7F13;&#x51B2;&#x533A;&#xFF08;buffer&#xFF09;&#x6027;&#x8D28;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E9%80%9A%E8%BF%87-eventfd-%E8%AE%A2%E9%98%85-completion-%E4%BA%8B%E4%BB%B6">&#x901A;&#x8FC7; <code>eventfd()</code> &#x8BA2;&#x9605; completion &#x4E8B;&#x4EF6;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#253-io_uring_enter">2.5.3 <code>io_uring_enter()</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#26-%E9%AB%98%E7%BA%A7%E7%89%B9%E6%80%A7">2.6 &#x9AD8;&#x7EA7;&#x7279;&#x6027;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#27-%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E5%BA%93-liburing">2.7 &#x7528;&#x6237;&#x7A7A;&#x95F4;&#x5E93; <code>liburing</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#3-%E5%9F%BA%E4%BA%8E-liburing-%E7%9A%84%E7%A4%BA%E4%BE%8B%E5%BA%94%E7%94%A8">3 &#x57FA;&#x4E8E; liburing &#x7684;&#x793A;&#x4F8B;&#x5E94;&#x7528;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#31-io_uring-test">3.1 <code>io_uring-test</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E6%BA%90%E7%A0%81%E5%8F%8A%E6%B3%A8%E9%87%8A">&#x6E90;&#x7801;&#x53CA;&#x6CE8;&#x91CA;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E">&#x5176;&#x4ED6;&#x8BF4;&#x660E;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#32-link-cp">3.2 <code>link-cp</code></a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#io-chain">I/O chain</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E6%BA%90%E7%A0%81%E5%8F%8A%E6%B3%A8%E9%87%8A-1">&#x6E90;&#x7801;&#x53CA;&#x6CE8;&#x91CA;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E-1">&#x5176;&#x4ED6;&#x8BF4;&#x660E;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#4-io_uring-%E6%80%A7%E8%83%BD%E5%8E%8B%E6%B5%8B%E5%9F%BA%E4%BA%8E-fio">4 <code>io_uring</code> &#x6027;&#x80FD;&#x538B;&#x6D4B;&#xFF08;&#x57FA;&#x4E8E; <code>fio</code>&#xFF09;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#41-%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83">4.1 &#x6D4B;&#x8BD5;&#x73AF;&#x5883;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#42-%E5%9C%BA%E6%99%AF%E4%B8%80direct-io-1kb-%E9%9A%8F%E6%9C%BA%E8%AF%BB%E7%BB%95%E8%BF%87-page-cache">4.2 &#x573A;&#x666F;&#x4E00;&#xFF1A;direct I/O <code>1KB</code> &#x968F;&#x673A;&#x8BFB;&#xFF08;&#x7ED5;&#x8FC7; page cache&#xFF09;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#42-%E5%9C%BA%E6%99%AF%E4%BA%8Cbuffered-io-1kb-%E9%9A%8F%E6%9C%BA%E8%AF%BB%E6%95%B0%E6%8D%AE%E6%8F%90%E5%89%8D%E5%8A%A0%E8%BD%BD%E5%88%B0%E5%86%85%E5%AD%98100-hot-cache">4.2 &#x573A;&#x666F;&#x4E8C;&#xFF1A;buffered I/O <code>1KB</code> &#x968F;&#x673A;&#x8BFB;&#xFF08;&#x6570;&#x636E;&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x5230;&#x5185;&#x5B58;&#xFF0C;100% hot cache&#xFF09;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#43-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B0%8F%E7%BB%93">4.3 &#x6027;&#x80FD;&#x6D4B;&#x8BD5;&#x5C0F;&#x7ED3;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#44-scylladb-%E4%B8%8E-io_uring">4.4 ScyllaDB &#x4E0E; io_uring</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#5-ebpf">5 eBPF</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#6-%E7%BB%93%E6%9D%9F%E8%AF%AD">6 &#x7ED3;&#x675F;&#x8BED;</a></li><li><a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">&#x53C2;&#x8003;&#x8D44;&#x6599;</a></li></ul><hr><p>&#x5F88;&#x591A;&#x4EBA;&#x53EF;&#x80FD;&#x8FD8;&#x6CA1;&#x610F;&#x8BC6;&#x5230;&#xFF0C;Linux &#x5185;&#x6838;&#x5728;&#x8FC7;&#x53BB;&#x51E0;&#x5E74;&#x5DF2;&#x7ECF;&#x53D1;&#x751F;&#x4E86;&#x4E00;&#x573A;&#x9769;&#x547D;&#x3002;&#x8FD9;&#x573A;&#x9769;&#x547D;&#x6E90;&#x4E8E; <strong>&#x4E24;&#x4E2A;&#x6FC0;&#x52A8;&#x4EBA;&#x5FC3;&#x7684;&#x65B0;&#x63A5;&#x53E3;</strong>&#x7684;&#x5F15;&#x5165;&#xFF1A;<strong>eBPF &#x548C; io_uring</strong>&#x3002; &#x6211;&#x4EEC;&#x8BA4;&#x4E3A;&#xFF0C;&#x4E8C;&#x8005;&#x5C06;&#x4F1A;&#x5B8C;&#x5168;<strong>&#x6539;&#x53D8;&#x5E94;&#x7528;&#x4E0E;&#x5185;&#x6838;&#x4EA4;&#x4E92;&#x7684;&#x65B9;&#x5F0F;</strong>&#xFF0C;&#x4EE5;&#x53CA; <strong>&#x5E94;&#x7528;&#x5F00;&#x53D1;&#x8005;&#x601D;&#x8003;&#x548C;&#x770B;&#x5F85;&#x5185;&#x6838;&#x7684;&#x65B9;&#x5F0F;</strong>&#x3002;</p><p>&#x672C;&#x6587;&#x4ECB;&#x7ECD; io_uring&#xFF08;&#x6211;&#x4EEC;&#x5728; ScyllaDB &#x4E2D;&#x6709; io_uring &#x7684;&#x6DF1;&#x5165;&#x4F7F;&#x7528;&#x7ECF;&#x9A8C;&#xFF09;&#xFF0C;&#x5E76;&#x7565;&#x5FAE;&#x63D0;&#x53CA;&#x4E00;&#x4E0B; eBPF&#x3002;</p><h1 id="1-linux-io-%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E6%BC%94%E8%BF%9B">1 Linux I/O &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x6F14;&#x8FDB;</h1><h2 id="11-%E5%9F%BA%E4%BA%8E-fd-%E7%9A%84%E9%98%BB%E5%A1%9E%E5%BC%8F-io%EF%BC%9Areadwrite">1.1 &#x57FA;&#x4E8E; fd &#x7684;&#x963B;&#x585E;&#x5F0F; I/O&#xFF1A;<code>read()/write()</code></h2><p>&#x4F5C;&#x4E3A;&#x5927;&#x5BB6;&#x6700;&#x719F;&#x6089;&#x7684;&#x8BFB;&#x5199;&#x65B9;&#x5F0F;&#xFF0C;Linux &#x5185;&#x6838;&#x63D0;&#x4F9B;&#x4E86;<strong>&#x57FA;&#x4E8E;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#x7684;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;</strong>&#xFF0C; &#x8FD9;&#x4E9B;&#x63CF;&#x8FF0;&#x7B26;&#x6307;&#x5411;&#x7684;&#x53EF;&#x80FD;&#x662F;<strong>&#x5B58;&#x50A8;&#x6587;&#x4EF6;</strong>&#xFF08;storage file&#xFF09;&#xFF0C;&#x4E5F;&#x53EF;&#x80FD;&#x662F; <strong>network sockets</strong>&#xFF1A;</p><pre><code>ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
</code></pre><p>&#x4E8C;&#x8005;&#x79F0;&#x4E3A;<strong>&#x963B;&#x585E;&#x5F0F;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;</strong>&#xFF08;blocking system calls&#xFF09;&#xFF0C;&#x56E0;&#x4E3A;&#x7A0B;&#x5E8F;&#x8C03;&#x7528; &#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x65F6;&#x4F1A;&#x8FDB;&#x5165; sleep &#x72B6;&#x6001;&#xFF0C;&#x7136;&#x540E;&#x88AB;&#x8C03;&#x5EA6;&#x51FA;&#x53BB;&#xFF08;&#x8BA9;&#x51FA;&#x5904;&#x7406;&#x5668;&#xFF09;&#xFF0C;&#x76F4;&#x5230; I/O &#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#xFF1A;</p><ul><li>&#x5982;&#x679C;&#x6570;&#x636E;&#x5728;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x5E76;&#x4E14;&#x6587;&#x4EF6;&#x5185;&#x5BB9;<strong>&#x5DF2;&#x7ECF;&#x7F13;&#x5B58;&#x5728; page cache &#x4E2D;</strong>&#xFF0C;&#x8C03;&#x7528;&#x4F1A;<strong>&#x7ACB;&#x5373;&#x8FD4;&#x56DE;</strong>&#xFF1B;</li><li>&#x5982;&#x679C;&#x6570;&#x636E;&#x5728;&#x53E6;&#x4E00;&#x53F0;&#x673A;&#x5668;&#x4E0A;&#xFF0C;&#x5C31;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#xFF08;&#x4F8B;&#x5982; TCP&#xFF09;&#x83B7;&#x53D6;&#xFF0C;&#x4F1A;&#x963B;&#x585E;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#xFF1B;</li><li>&#x5982;&#x679C;&#x6570;&#x636E;&#x5728;&#x786C;&#x76D8;&#x4E0A;&#xFF0C;&#x4E5F;&#x4F1A;&#x963B;&#x585E;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x3002;</li></ul><p>&#x4F46;&#x5F88;&#x5BB9;&#x6613;&#x60F3;&#x5230;&#xFF0C;&#x968F;&#x7740;&#x5B58;&#x50A8;<strong>&#x8BBE;&#x5907;&#x8D8A;&#x6765;&#x8D8A;&#x5FEB;&#xFF0C;&#x7A0B;&#x5E8F;&#x8D8A;&#x6765;&#x8D8A;&#x590D;&#x6742;</strong>&#xFF0C; &#x963B;&#x585E;&#x5F0F;&#xFF08;blocking&#xFF09;&#x5DF2;&#x7ECF;&#x8FD9;&#x79CD;&#x6700;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x5F0F;&#x5DF2;&#x7ECF;&#x4E0D;&#x9002;&#x7528;&#x4E86;&#x3002;</p><h2 id="12-%E9%9D%9E%E9%98%BB%E5%A1%9E%E5%BC%8F-io%EF%BC%9Aselectpollepoll">1.2 &#x975E;&#x963B;&#x585E;&#x5F0F; I/O&#xFF1A;<code>select()/poll()/epoll()</code></h2><p>&#x963B;&#x585E;&#x5F0F;&#x4E4B;&#x540E;&#xFF0C;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x4E9B;&#x65B0;&#x7684;&#x3001;&#x975E;&#x963B;&#x585E;&#x7684;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF0C;&#x4F8B;&#x5982; <code>select()</code>&#x3001;<code>poll()</code> &#x4EE5;&#x53CA;&#x66F4;&#x65B0;&#x7684; <code>epoll()</code>&#x3002; &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5728;&#x8C03;&#x7528;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x8BFB;&#x5199;&#x65F6;&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#xFF0C;&#x800C;&#x662F;<strong>&#x7ACB;&#x5373;&#x8FD4;&#x56DE;</strong>&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x4E00;&#x4E2A; <strong>&#x5DF2;&#x7ECF; ready &#x7684;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#x5217;&#x8868;</strong>&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://arthurchiao.art/assets/img/intro-to-io-uring/epoll.png" class="kg-image" alt loading="lazy" width="50" height="50"></figure><p>&#x4F46;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x81F4;&#x547D;&#x7F3A;&#x70B9;&#xFF1A;<strong>&#x53EA;&#x652F;&#x6301; network sockets &#x548C; pipes</strong> &#x2014;&#x2014; <code>epoll()</code> &#x751A;&#x81F3;&#x8FDE; storage files &#x90FD;&#x4E0D;&#x652F;&#x6301;&#x3002;</p><h2 id="13-%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%96%B9%E5%BC%8F">1.3 &#x7EBF;&#x7A0B;&#x6C60;&#x65B9;&#x5F0F;</h2><p>&#x5BF9;&#x4E8E; storage I/O&#xFF0C;&#x7ECF;&#x5178;&#x7684;&#x89E3;&#x51B3;&#x601D;&#x8DEF;&#x662F; <a href="https://en.wikipedia.org/wiki/Thread_pool">thread pool</a>&#xFF1A; &#x4E3B;&#x7EBF;&#x7A0B;&#x5C06; I/O &#x5206;&#x53D1;&#x7ED9; worker &#x7EBF;&#x7A0B;&#xFF0C;&#x540E;&#x8005;&#x4EE3;&#x66FF;&#x4E3B;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x963B;&#x585E;&#x5F0F;&#x8BFB;&#x5199;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://arthurchiao.art/assets/img/intro-to-io-uring/thread-pools.png" class="kg-image" alt loading="lazy" width="40" height="40"></figure><p>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x7684;&#x95EE;&#x9898;&#x662F;<strong>&#x7EBF;&#x7A0B;&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#x5F00;&#x9500;&#x53EF;&#x80FD;&#x975E;&#x5E38;&#x5927;</strong>&#xFF0C;&#x540E;&#x9762;&#x6027;&#x80FD;&#x538B;&#x6D4B;&#x4F1A;&#x770B;&#x5230;&#x3002;</p><h2 id="14-direct-io%EF%BC%88%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BD%AF%E4%BB%B6%EF%BC%89%EF%BC%9A%E7%BB%95%E8%BF%87-page-cache">1.4 Direct I/O&#xFF08;&#x6570;&#x636E;&#x5E93;&#x8F6F;&#x4EF6;&#xFF09;&#xFF1A;&#x7ED5;&#x8FC7; page cache</h2><p>&#x968F;&#x540E;&#x51FA;&#x73B0;&#x4E86;&#x66F4;&#x52A0;&#x7075;&#x6D3B;&#x548C;&#x5F3A;&#x5927;&#x7684;&#x65B9;&#x5F0F;&#xFF1A;<strong>&#x6570;&#x636E;&#x5E93;&#x8F6F;&#x4EF6;</strong>&#xFF08;database software&#xFF09; &#x6709;&#x65F6; <a href="https://www.scylladb.com/2018/07/26/how-scylla-data-cache-works">&#x5E76;&#x4E0D;&#x60F3;&#x4F7F;&#x7528;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684; page cache</a>&#xFF0C; &#x800C;&#x662F;&#x5E0C;&#x671B;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x540E;&#xFF0C;<strong>&#x76F4;&#x63A5;&#x4ECE;&#x8BBE;&#x5907;&#x8BFB;&#x5199;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;</strong>&#xFF08;direct access to the device&#xFF09;&#x3002; &#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x79F0;&#x4E3A;<strong>&#x76F4;&#x63A5;&#x8BBF;&#x95EE;</strong>&#xFF08;direct access&#xFF09;&#x6216;<strong>&#x76F4;&#x63A5; I/O</strong>&#xFF08;direct I/O&#xFF09;&#xFF0C;</p><ul><li>&#x9700;&#x8981;&#x6307;&#x5B9A; <strong><code>O_DIRECT</code></strong> flag&#xFF1B;</li><li>&#x9700;&#x8981;<strong>&#x5E94;&#x7528;&#x81EA;&#x5DF1;&#x7BA1;&#x7406;&#x81EA;&#x5DF1;&#x7684;&#x7F13;&#x5B58;</strong> &#x2014;&#x2014; &#x8FD9;&#x6B63;&#x662F;&#x6570;&#x636E;&#x5E93;&#x8F6F;&#x4EF6;&#x6240;&#x5E0C;&#x671B;&#x7684;&#xFF1B;</li><li>&#x662F; <strong>zero-copy I/O</strong>&#xFF0C;&#x56E0;&#x4E3A;&#x5E94;&#x7528;&#x7684;&#x7F13;&#x51B2;&#x6570;&#x636E;&#x76F4;&#x63A5;&#x53D1;&#x9001;&#x5230;&#x8BBE;&#x5907;&#xFF0C;&#x6216;&#x8005;&#x76F4;&#x63A5;&#x4ECE;&#x8BBE;&#x5907;&#x8BFB;&#x53D6;&#x3002;</li></ul><h2 id="15-%E5%BC%82%E6%AD%A5-io%EF%BC%88aio%EF%BC%89">1.5 &#x5F02;&#x6B65; IO&#xFF08;AIO&#xFF09;</h2><p>&#x524D;&#x9762;&#x63D0;&#x5230;&#xFF0C;&#x968F;&#x7740;&#x5B58;&#x50A8;&#x8BBE;&#x5907;&#x8D8A;&#x6765;&#x8D8A;&#x5FEB;&#xFF0C;&#x4E3B;&#x7EBF;&#x7A0B;&#x548C; worker &#x7EBF;&#x6027;&#x4E4B;&#x95F4;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#x5F00;&#x9500;&#x5360;&#x6BD4;&#x8D8A;&#x6765;&#x8D8A;&#x9AD8;&#x3002; &#x73B0;&#x5728;&#x5E02;&#x573A;&#x4E0A;&#x7684;&#x4E00;&#x4E9B;&#x8BBE;&#x5907;&#xFF0C;&#x4F8B;&#x5982; <a href="https://pcper.com/2018/12/intels-optane-dc-persistent-memory-dimms-push-latency-closer-to-dram">Intel Optane</a> &#xFF0C;<strong>&#x5EF6;&#x8FDF;&#x5DF2;&#x7ECF;&#x4F4E;&#x5230;&#x548C;&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#x4E00;&#x4E2A;&#x91CF;&#x7EA7;</strong>&#xFF08;&#x5FAE;&#x79D2; <code>us</code>&#xFF09;&#x3002;&#x6362;&#x4E2A;&#x65B9;&#x5F0F;&#x63CF;&#x8FF0;&#xFF0C; &#x66F4;&#x80FD;&#x8BA9;&#x6211;&#x4EEC;&#x611F;&#x53D7;&#x5230;&#x8FD9;&#x79CD;&#x5F00;&#x9500;&#xFF1A; <strong>&#x4E0A;&#x4E0B;&#x6587;&#x6BCF;&#x5207;&#x6362;&#x4E00;&#x6B21;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x5C11;&#x4E00;&#x6B21; dispatch I/O &#x7684;&#x673A;&#x4F1A;</strong>&#x3002;</p><p>&#x56E0;&#x6B64;&#xFF0C;Linux <strong>2.6</strong> &#x5185;&#x6838;&#x5F15;&#x5165;&#x4E86;&#x5F02;&#x6B65; I/O&#xFF08;asynchronous I/O&#xFF09;&#x63A5;&#x53E3;&#xFF0C; &#x65B9;&#x4FBF;&#x8D77;&#x89C1;&#xFF0C;&#x672C;&#x6587;&#x7B80;&#x5199;&#x4E3A; <code>linux-aio</code>&#x3002;AIO <strong>&#x539F;&#x7406;</strong>&#x662F;&#x5F88;&#x7B80;&#x5355;&#x7684;&#xFF1A;</p><ul><li>&#x7528;&#x6237;&#x901A;&#x8FC7; <code>io_submit()</code> &#x63D0;&#x4EA4; I/O &#x8BF7;&#x6C42;&#xFF0C;</li><li>&#x8FC7;&#x4E00;&#x4F1A;&#x518D;&#x8C03;&#x7528; <code>io_getevents()</code> &#x6765;&#x68C0;&#x67E5;&#x54EA;&#x4E9B; events &#x5DF2;&#x7ECF; ready &#x4E86;&#x3002;</li><li>&#x4F7F;&#x7A0B;&#x5E8F;&#x5458;<strong>&#x80FD;&#x7F16;&#x5199;&#x5B8C;&#x5168;&#x5F02;&#x6B65;&#x7684;&#x4EE3;&#x7801;</strong>&#x3002;</li></ul><p>&#x8FD1;&#x671F;&#xFF0C;<a href="https://lwn.net/Articles/742978/">Linux AIO &#x751A;&#x81F3;&#x652F;&#x6301;&#x4E86;</a> <code>epoll()</code>&#xFF1A;&#x4E5F;&#x5C31;&#x662F;&#x8BF4; &#x4E0D;&#x4EC5;&#x80FD;&#x63D0;&#x4EA4; storage I/O &#x8BF7;&#x6C42;&#xFF0C;&#x8FD8;&#x80FD;&#x63D0;&#x4EA4;&#x7F51;&#x7EDC; I/O &#x8BF7;&#x6C42;&#x3002;&#x7167;&#x8FD9;&#x6837;&#x53D1;&#x5C55;&#x4E0B;&#x53BB;&#xFF0C;linux-aio <strong>&#x4F3C;&#x4E4E;&#x80FD;&#x6210;&#x4E3A;&#x4E00;&#x4E2A;&#x738B;&#x8005;</strong>&#x3002;&#x4F46;&#x7531;&#x4E8E;&#x5B83;&#x7CDF;&#x7CD5;&#x7684;&#x6F14;&#x8FDB;&#x4E4B;&#x8DEF;&#xFF0C;&#x8FD9;&#x4E2A;&#x613F;&#x671B;&#x51E0;&#x4E4E;&#x4E0D;&#x53EF;&#x80FD;&#x5B9E;&#x73B0;&#x4E86;&#x3002; &#x6211;&#x4EEC;&#x4ECE; <strong>Linus &#x6807;&#x5FD7;&#x6027;&#x7684;&#x6FC0;&#x70C8;&#x8A00;&#x8F9E;&#x4E2D;&#x5C31;&#x80FD;&#x7565;&#x7AA5;&#x4E00;&#x6591;</strong>&#xFF1A;</p><blockquote>Reply to: <a href="https://lwn.net/Articles/671657/">to support opening files asynchronously</a><br><br><em>So I think this is ridiculously ugly.</em><br><br><em>AIO is a horrible ad-hoc design, with the main excuse being &#x201C;other, less gifted people, made that design, and we are implementing it for compatibility because database people &#x2014; who seldom have any shred of taste &#x2014; actually use it&#x201D;.</em><br><br>&#x2014; Linus Torvalds (on lwn.net)</blockquote><p>&#x9996;&#x5148;&#xFF0C;&#x4F5C;&#x4E3A;&#x6570;&#x636E;&#x5E93;&#x4ECE;&#x4E1A;&#x4EBA;&#x5458;&#xFF0C;&#x6211;&#x4EEC;&#x60F3;&#x501F;&#x6B64;&#x673A;&#x4F1A;&#x4E3A;&#x6211;&#x4EEC;&#x7684;&#x6CA1;&#x54C1;&#xFF08;lack of taste&#xFF09;&#x5411; Linus &#x9053;&#x6B49;&#x3002; &#x4F46;&#x66F4;&#x91CD;&#x8981;&#x7684;&#x662F;&#xFF0C;&#x6211;&#x4EEC;&#x8981;&#x8FDB;&#x4E00;&#x6B65;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;<strong>&#x4E3A;&#x4EC0;&#x4E48; Linus &#x662F;&#x5BF9;&#x7684;</strong>&#xFF1A;Linux AIO &#x786E;&#x5B9E;&#x95EE;&#x9898;&#x7F20;&#x8EAB;&#xFF0C;</p><ol><li><strong>&#x53EA;&#x652F;&#x6301; <code>O_DIRECT</code> &#x6587;&#x4EF6;</strong>&#xFF0C;&#x56E0;&#x6B64;<strong>&#x5BF9;&#x5E38;&#x89C4;&#x7684;&#x975E;&#x6570;&#x636E;&#x5E93;&#x5E94;&#x7528;</strong> &#xFF08;normal, non-database applications&#xFF09;<strong>&#x51E0;&#x4E4E;&#x662F;&#x65E0;&#x7528;&#x7684;</strong>&#xFF1B;</li><li>&#x63A5;&#x53E3;&#x5728;<strong>&#x8BBE;&#x8BA1;&#x65F6;&#x5E76;&#x672A;&#x8003;&#x8651;&#x6269;&#x5C55;&#x6027;</strong>&#x3002;&#x867D;&#x7136;&#x53EF;&#x4EE5;&#x6269;&#x5C55; &#x2014;&#x2014; &#x6211;&#x4EEC;&#x4E5F;&#x786E;&#x5B9E;&#x8FD9;&#x4E48;&#x505A;&#x4E86; &#x2014;&#x2014; &#x4F46;&#x6BCF;&#x52A0;&#x4E00;&#x4E2A;&#x4E1C;&#x897F;&#x90FD;&#x76F8;&#x5F53;&#x590D;&#x6742;&#xFF1B;</li><li>&#x867D;&#x7136;&#x4ECE;<strong>&#x6280;&#x672F;&#x4E0A;&#x8BF4;&#x63A5;&#x53E3;&#x662F;&#x975E;&#x963B;&#x585E;&#x7684;</strong>&#xFF0C;&#x4F46;&#x5B9E;&#x9645;&#x4E0A;&#x6709; <a href="https://lwn.net/Articles/724198">&#x5F88;&#x591A;&#x53EF;&#x80FD;&#x7684;&#x539F;&#x56E0;&#x90FD;&#x4F1A;&#x5BFC;&#x81F4;&#x5B83;&#x963B;&#x585E;</a>&#xFF0C;&#x800C;&#x4E14;&#x5F15;&#x53D1;&#x7684;&#x65B9;&#x5F0F;&#x96BE;&#x4EE5;&#x9884;&#x6599;&#x3002;</li></ol><h2 id="16-%E5%B0%8F%E7%BB%93">1.6 &#x5C0F;&#x7ED3;</h2><p>&#x4EE5;&#x4E0A;&#x53EF;&#x4EE5;&#x6E05;&#x6670;&#x5730;&#x770B;&#x51FA; Linux I/O &#x7684;&#x6F14;&#x8FDB;&#xFF1A;</p><ul><li>&#x6700;&#x5F00;&#x59CB;&#x662F;&#x540C;&#x6B65;&#xFF08;&#x963B;&#x585E;&#x5F0F;&#xFF09;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF1B;</li><li>&#x7136;&#x540E;&#x968F;&#x7740;<strong>&#x5B9E;&#x9645;&#x9700;&#x6C42;&#x548C;&#x5177;&#x4F53;&#x573A;&#x666F;</strong>&#xFF0C;&#x4E0D;&#x65AD;&#x52A0;&#x5165;&#x65B0;&#x7684;&#x5F02;&#x6B65;&#x63A5;&#x53E3;&#xFF0C;&#x8FD8;&#x8981;&#x4FDD;&#x6301;&#x4E0E;&#x8001;&#x63A5;&#x53E3;&#x7684;&#x517C;&#x5BB9;&#x548C;&#x534F;&#x540C;&#x5DE5;&#x4F5C;&#x3002;</li></ul><p>&#x53E6;&#x5916;&#x4E5F;&#x770B;&#x5230;&#xFF0C;&#x5728;&#x975E;&#x963B;&#x585E;&#x5F0F;&#x8BFB;&#x5199;&#x7684;&#x95EE;&#x9898;&#x4E0A;<strong>&#x5E76;&#x6CA1;&#x6709;&#x5F62;&#x6210;&#x7EDF;&#x4E00;&#x65B9;&#x6848;</strong>&#xFF1A;</p><ol><li>Network socket &#x9886;&#x57DF;&#xFF1A;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x63A5;&#x53E3;&#xFF0C;&#x7136;&#x540E;&#x53BB;&#x8F6E;&#x8BE2;&#xFF08;poll&#xFF09;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x5B8C;&#x6210;&#xFF08;readiness&#xFF09;&#xFF1B;</li><li>Storage I/O &#x9886;&#x57DF;&#xFF1A;<strong>&#x53EA;&#x9488;&#x5BF9;&#x67D0;&#x4E00;&#x7EC6;&#x5206;&#x9886;&#x57DF;</strong>&#xFF08;&#x6570;&#x636E;&#x5E93;&#xFF09;&#x5728;&#x67D0;&#x4E00;&#x7279;&#x5B9A;&#x65F6;&#x671F;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x6DFB;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x5B9A;&#x5236;&#x7248;&#x7684;&#x5F02;&#x6B65;&#x63A5;&#x53E3;&#x3002;</li></ol><p><strong>&#x8FD9;&#x5C31;&#x662F; Linux I/O &#x7684;&#x6F14;&#x8FDB;&#x5386;&#x53F2;</strong> &#x2014;&#x2014; &#x53EA;&#x7740;&#x773C;&#x5F53;&#x524D;&#xFF0C;&#x51FA;&#x73B0;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x5C31;&#x5F15;&#x5165;&#x4E00;&#x79CD;&#x8BBE;&#x8BA1;&#xFF0C;&#x800C;&#x5E76;&#x6CA1;&#x6709;&#x591A;&#x5C11;&#x524D;&#x77BB;&#x6027; &#x2014;&#x2014; &#x76F4;&#x5230; <code>io_uring</code> &#x7684;&#x51FA;&#x73B0;&#x3002;</p><h1 id="2-iouring">2 <code>io_uring</code></h1><p>io_uring &#x6765;&#x81EA;&#x8D44;&#x6DF1;&#x5185;&#x6838;&#x5F00;&#x53D1;&#x8005; Jens Axboe &#x7684;&#x60F3;&#x6CD5;&#xFF0C;&#x4ED6;&#x5728; Linux I/O stack &#x9886;&#x57DF;&#x9887;&#x6709;&#x7814;&#x7A76;&#x3002; &#x4ECE;&#x6700;&#x65E9;&#x7684; patch <a href="https://lwn.net/ml/linux-fsdevel/20181221192236.12866-9-axboe@kernel.dk">aio: support for IO polling</a> &#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x8FD9;&#x9879;&#x5DE5;&#x4F5C;&#x59CB;&#x4E8E;&#x4E00;&#x4E2A;&#x5F88;&#x7B80;&#x5355;&#x7684;&#x89C2;&#x5BDF;&#xFF1A;&#x968F;&#x7740;&#x8BBE;&#x5907;&#x8D8A;&#x6765;&#x8D8A;&#x5FEB;&#xFF0C; <strong>&#x4E2D;&#x65AD;&#x9A71;&#x52A8;&#xFF08;interrupt-driven&#xFF09;&#x6A21;&#x5F0F;&#x6548;&#x7387;&#x5DF2;&#x7ECF;&#x4F4E;&#x4E8E;&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;</strong> &#xFF08;polling for completions&#xFF09; &#x2014;&#x2014; &#x8FD9;&#x4E5F;&#x662F;&#x9AD8;&#x6027;&#x80FD;&#x9886;&#x57DF;&#x6700;&#x5E38;&#x89C1;&#x7684;&#x4E3B;&#x9898;&#x4E4B;&#x4E00;&#x3002;</p><ul><li><code>io_uring</code> &#x7684;<strong>&#x57FA;&#x672C;&#x903B;&#x8F91;&#x4E0E; linux-aio &#x662F;&#x7C7B;&#x4F3C;&#x7684;</strong>&#xFF1A;&#x63D0;&#x4F9B;&#x4E24;&#x4E2A;&#x63A5;&#x53E3;&#xFF0C;&#x4E00;&#x4E2A;&#x5C06; I/O &#x8BF7;&#x6C42;&#x63D0;&#x4EA4;&#x5230;&#x5185;&#x6838;&#xFF0C;&#x4E00;&#x4E2A;&#x4ECE;&#x5185;&#x6838;&#x63A5;&#x6536;&#x5B8C;&#x6210;&#x4E8B;&#x4EF6;&#x3002;</li><li>&#x4F46;&#x968F;&#x7740;&#x5F00;&#x53D1;&#x6DF1;&#x5165;&#xFF0C;&#x5B83;&#x9010;&#x6E10;&#x53D8;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x7684;&#x63A5;&#x53E3;&#xFF1A;&#x8BBE;&#x8BA1;&#x8005;&#x5F00;&#x59CB;&#x4ECE;&#x6E90;&#x5934;&#x601D;&#x8003; <strong>&#x5982;&#x4F55;&#x652F;&#x6301;&#x5B8C;&#x5168;&#x5F02;&#x6B65;&#x7684;&#x64CD;&#x4F5C;</strong>&#x3002;</li></ul><h2 id="21-%E4%B8%8E-linux-aio-%E7%9A%84%E4%B8%8D%E5%90%8C">2.1 &#x4E0E; Linux AIO &#x7684;&#x4E0D;&#x540C;</h2><p><code>io_uring</code> &#x4E0E; <code>linux-aio</code> &#x6709;&#x7740;&#x672C;&#x8D28;&#x7684;&#x4E0D;&#x540C;&#xFF1A;</p><ol><li><strong>&#x5728;&#x8BBE;&#x8BA1;&#x4E0A;&#x662F;&#x771F;&#x6B63;&#x5F02;&#x6B65;&#x7684;</strong>&#xFF08;truly asynchronous&#xFF09;&#x3002;&#x53EA;&#x8981; &#x8BBE;&#x7F6E;&#x4E86;&#x5408;&#x9002;&#x7684; flag&#xFF0C;&#x5B83;&#x5728;<strong>&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x4E0A;&#x4E0B;&#x6587;&#x4E2D;&#x5C31;&#x53EA;&#x662F;&#x5C06;&#x8BF7;&#x6C42;&#x653E;&#x5165;&#x961F;&#x5217;</strong>&#xFF0C; &#x4E0D;&#x4F1A;&#x505A;&#x5176;&#x4ED6;&#x4EFB;&#x4F55;&#x989D;&#x5916;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;<strong>&#x4FDD;&#x8BC1;&#x4E86;&#x5E94;&#x7528;&#x6C38;&#x8FDC;&#x4E0D;&#x4F1A;&#x963B;&#x585E;</strong>&#x3002;</li></ol><p><strong>&#x652F;&#x6301;&#x4EFB;&#x4F55;&#x7C7B;&#x578B;&#x7684; I/O</strong>&#xFF1A;cached files&#x3001;direct-access files &#x751A;&#x81F3; blocking sockets&#x3002;</p><p>&#x7531;&#x4E8E;&#x8BBE;&#x8BA1;&#x4E0A;&#x5C31;&#x662F;&#x5F02;&#x6B65;&#x7684;&#xFF08;async-by-design nature&#xFF09;&#xFF0C;&#x56E0;&#x6B64;<strong>&#x65E0;&#x9700; poll+read/write &#x6765;&#x5904;&#x7406; sockets</strong>&#x3002; &#x53EA;&#x9700;&#x63D0;&#x4EA4;&#x4E00;&#x4E2A;&#x963B;&#x585E;&#x5F0F;&#x8BFB;&#xFF08;blocking read&#xFF09;&#xFF0C;&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x5C31;&#x4F1A;&#x51FA;&#x73B0;&#x5728; completion ring&#x3002;</p><ol><li><strong>&#x7075;&#x6D3B;&#x3001;&#x53EF;&#x6269;&#x5C55;</strong>&#xFF1A;&#x57FA;&#x4E8E; <code>io_uring</code> &#x751A;&#x81F3;&#x80FD;&#x91CD;&#x5199;&#xFF08;re-implement&#xFF09;Linux &#x7684;&#x6BCF;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x3002;</li></ol><h2 id="22-%E5%8E%9F%E7%90%86%E5%8F%8A%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%9Asqcqsqecqe">2.2 &#x539F;&#x7406;&#x53CA;&#x6838;&#x5FC3;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF1A;SQ/CQ/SQE/CQE</h2><p>&#x6BCF;&#x4E2A; io_uring &#x5B9E;&#x4F8B;&#x90FD;&#x6709;<strong>&#x4E24;&#x4E2A;&#x73AF;&#x5F62;&#x961F;&#x5217;</strong>&#xFF08;ring&#xFF09;&#xFF0C;&#x5728;&#x5185;&#x6838;&#x548C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E4B;&#x95F4;&#x5171;&#x4EAB;&#xFF1A;</p><ul><li><strong>&#x63D0;&#x4EA4;&#x961F;&#x5217;</strong>&#xFF1A;submission queue (SQ)</li><li><strong>&#x5B8C;&#x6210;&#x961F;&#x5217;</strong>&#xFF1A;completion queue (CQ)</li></ul><figure class="kg-card kg-image-card"><img src="https://arthurchiao.art/assets/img/intro-to-io-uring/io_uring.png" class="kg-image" alt loading="lazy" width="60" height="60"></figure><p>&#x8FD9;&#x4E24;&#x4E2A;&#x961F;&#x5217;&#xFF1A;</p><ul><li>&#x90FD;&#x662F;<strong>&#x5355;&#x751F;&#x4EA7;&#x8005;&#x3001;&#x5355;&#x6D88;&#x8D39;&#x8005;</strong>&#xFF0C;size &#x662F; 2 &#x7684;&#x5E42;&#x6B21;&#xFF1B;</li><li>&#x63D0;&#x4F9B;<strong>&#x65E0;&#x9501;&#x63A5;&#x53E3;</strong>&#xFF08;lock-less access interface&#xFF09;&#xFF0C;&#x5185;&#x90E8;&#x4F7F;&#x7528; <strong>&#x5185;&#x5B58;&#x5C4F;&#x969C;</strong>&#x505A;&#x540C;&#x6B65;&#xFF08;coordinated with memory barriers&#xFF09;&#x3002;</li></ul><p><strong>&#x4F7F;&#x7528;&#x65B9;&#x5F0F;</strong>&#xFF1A;</p><p>&#x8BF7;&#x6C42;</p><ul><li>&#x5E94;&#x7528;&#x521B;&#x5EFA; SQ entries (SQE)&#xFF0C;&#x66F4;&#x65B0; SQ tail&#xFF1B;</li><li>&#x5185;&#x6838;&#x6D88;&#x8D39; SQE&#xFF0C;&#x66F4;&#x65B0; SQ head&#x3002;</li></ul><p>&#x5B8C;&#x6210;</p><ul><li>&#x5185;&#x6838;&#x4E3A;&#x5B8C;&#x6210;&#x7684;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x521B;&#x5EFA; CQ entries (CQE)&#xFF0C;&#x66F4;&#x65B0; CQ tail&#xFF1B;</li><li>&#x5E94;&#x7528;&#x6D88;&#x8D39; CQE&#xFF0C;&#x66F4;&#x65B0; CQ head&#x3002;</li><li>&#x5B8C;&#x6210;&#x4E8B;&#x4EF6;&#xFF08;completion events&#xFF09;&#x53EF;&#x80FD;&#x4EE5;&#x4EFB;&#x610F;&#x987A;&#x5E8F;&#x5230;&#x8FBE;&#xFF0C;&#x5230;&#x603B;&#x662F;&#x4E0E;&#x7279;&#x5B9A;&#x7684; SQE &#x76F8;&#x5173;&#x8054;&#x7684;&#x3002;</li><li>&#x6D88;&#x8D39; CQE &#x8FC7;&#x7A0B;&#x65E0;&#x9700;&#x5207;&#x6362;&#x5230;&#x5185;&#x6838;&#x6001;&#x3002;</li></ul><h2 id="23-%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%A5%BD%E5%A4%84">2.3 &#x5E26;&#x6765;&#x7684;&#x597D;&#x5904;</h2><p><code>io_uring</code> &#x8FD9;&#x79CD;&#x8BF7;&#x6C42;&#x65B9;&#x5F0F;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x597D;&#x5904;&#x662F;&#xFF1A;&#x539F;&#x6765;&#x9700;&#x8981;&#x591A;&#x6B21;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF08;&#x8BFB;&#x6216;&#x5199;&#xFF09;&#xFF0C;&#x73B0;&#x5728;&#x53D8;&#x6210;&#x6279;&#x5904;&#x7406;&#x4E00;&#x6B21;&#x63D0;&#x4EA4;&#x3002;</p><p>&#x8FD8;&#x8BB0;&#x5F97; Meltdown &#x6F0F;&#x6D1E;&#x5417;&#xFF1F;&#x5F53;&#x65F6;&#x6211;&#x8FD8;&#x5199;&#x4E86;<a href="https://www.scylladb.com/2018/01/07/cost-of-avoiding-a-meltdown/">&#x4E00;&#x7BC7;&#x6587;&#x7AE0;</a> &#x89E3;&#x91CA;&#x4E3A;&#x4EC0;&#x4E48;&#x6211;&#x4EEC;&#x7684; Scylla NoSQL &#x6570;&#x636E;&#x5E93;&#x53D7;&#x5F71;&#x54CD;&#x5F88;&#x5C0F;&#xFF1A;<code>aio</code> &#x5DF2;&#x7ECF;&#x5C06;&#x6211;&#x4EEC;&#x7684; I/O &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x6279;&#x5904;&#x7406;&#x5316;&#x4E86;&#x3002;</p><p><code>io_uring</code> <strong>&#x5C06;&#x8FD9;&#x79CD;&#x6279;&#x5904;&#x7406;&#x80FD;&#x529B;&#x5E26;&#x7ED9;&#x4E86;</strong> storage I/O &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x4E4B;&#x5916;&#x7684; <strong>&#x5176;&#x4ED6;&#x4E00;&#x4E9B;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;</strong>&#xFF0C;&#x5305;&#x62EC;&#xFF1A;</p><ul><li><code>read</code></li><li><code>write</code></li><li><code>send</code></li><li><code>recv</code></li><li><code>accept</code></li><li><code>openat</code></li><li><code>stat</code></li><li>&#x4E13;&#x7528;&#x7684;&#x4E00;&#x4E9B;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF0C;&#x4F8B;&#x5982; <code>fallocate</code></li></ul><p>&#x6B64;&#x5916;&#xFF0C;<code>io_uring</code> &#x4F7F;&#x5F02;&#x6B65; I/O &#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x4E5F;&#x4E0D;&#x518D;&#x4EC5;&#x9650;&#x4E8E;&#x6570;&#x636E;&#x5E93;&#x5E94;&#x7528;&#xFF0C;<strong>&#x666E;&#x901A;&#x7684; &#x975E;&#x6570;&#x636E;&#x5E93;&#x5E94;&#x7528;&#x4E5F;&#x80FD;&#x7528;</strong>&#x3002;&#x8FD9;&#x4E00;&#x70B9;&#x503C;&#x5F97;&#x91CD;&#x590D;&#x4E00;&#x904D;&#xFF1A;</p><blockquote>&#x867D;&#x7136; <code>io_uring</code> &#x4E0E; <code>aio</code> &#x6709;&#x4E00;&#x4E9B;&#x76F8;&#x4F3C;&#x4E4B;&#x5904;&#xFF0C;&#x4F46;&#x5B83;&#x7684;<strong>&#x6269;&#x5C55;&#x6027;&#x548C;&#x67B6;&#x6784;&#x662F;&#x9769;&#x547D;&#x6027;&#x7684;</strong>&#xFF1A; &#x5B83;<strong>&#x5C06;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7684;&#x5F3A;&#x5927;&#x80FD;&#x529B;&#x5E26;&#x7ED9;&#x4E86;&#x6240;&#x6709;&#x5E94;&#x7528;</strong>&#xFF08;&#x53CA;&#x5176;&#x5F00;&#x53D1;&#x8005;&#xFF09;&#xFF0C;&#x800C; <strong>&#x4E0D;&#x518D;&#x4EC5;&#x9650;&#x4E8E;&#x662F;&#x6570;&#x636E;&#x5E93;&#x5E94;&#x7528;&#x8FD9;&#x4E00;&#x7EC6;&#x5206;&#x9886;&#x57DF;</strong>&#x3002;</blockquote><p>&#x6211;&#x4EEC;&#x7684; CTO Avi Kivity &#x5728; the Core C++ 2019 event &#x4E0A; <a href="https://www.scylladb.com/2020/03/26/avi-kivity-at-core-c-2019">&#x6709;&#x4E00;&#x6B21;&#x5173;&#x4E8E; async &#x7684;&#x5206;&#x4EAB;</a>&#x3002; &#x6838;&#x5FC3;&#x70B9;&#x5305;&#x62EC;&#xFF1A;<strong>&#x4ECE;&#x5EF6;&#x8FDF;&#x4E0A;&#x6765;&#x8BF4;</strong>&#xFF0C;</p><ol><li>&#x73B0;&#x4EE3;&#x591A;&#x6838;&#x3001;&#x591A; CPU &#x8BBE;&#x5907;&#xFF0C;&#x5176;&#x5185;&#x90E8;&#x672C;&#x8EAB;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x57FA;&#x7840;&#x7F51;&#x7EDC;&#xFF1B;</li><li><strong>CPU &#x4E4B;&#x95F4;</strong>&#x662F;&#x53E6;&#x4E00;&#x4E2A;&#x7F51;&#x7EDC;&#xFF1B;</li><li><strong>CPU &#x548C;&#x78C1;&#x76D8; I/O &#x4E4B;&#x95F4;</strong>&#x53C8;&#x662F;&#x4E00;&#x4E2A;&#x7F51;&#x7EDC;&#x3002;</li></ol><p>&#x56E0;&#x6B64;&#x7F51;&#x7EDC;&#x7F16;&#x7A0B;&#x91C7;&#x7528;&#x5F02;&#x6B65;&#x662F;&#x660E;&#x667A;&#x7684;&#xFF0C;&#x800C;&#x73B0;&#x5728;&#x5F00;&#x53D1;&#x81EA;&#x5DF1;&#x7684;&#x5E94;&#x7528;&#x4E5F;&#x5E94;&#x8BE5;&#x8003;&#x8651;&#x5F02;&#x6B65;&#x3002; &#x8FD9;<strong>&#x4ECE;&#x6839;&#x672C;&#x4E0A;&#x6539;&#x53D8;&#x4E86; Linux &#x5E94;&#x7528;&#x7684;&#x8BBE;&#x8BA1;&#x65B9;&#x5F0F;</strong>&#xFF1A;</p><ul><li>&#x4E4B;&#x524D;&#x90FD;&#x662F;&#x4E00;&#x6BB5;&#x987A;&#x5E8F;&#x4EE3;&#x7801;&#x6D41;&#xFF0C;&#x9700;&#x8981;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x65F6;&#x624D;&#x6267;&#x884C;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF0C;</li><li>&#x73B0;&#x5728;&#x9700;&#x8981;&#x601D;&#x8003;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x662F;&#x5426; ready&#xFF0C;&#x56E0;&#x800C;&#x81EA;&#x7136;&#x5730;&#x5F15;&#x5165; event-loop&#xFF0C;&#x4E0D;&#x65AD;&#x901A;&#x8FC7;&#x5171;&#x4EAB; buffer &#x63D0;&#x4EA4;&#x8BF7;&#x6C42;&#x548C;&#x63A5;&#x6536;&#x7ED3;&#x679C;&#x3002;</li></ul><h2 id="24-%E4%B8%89%E7%A7%8D%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F">2.4 &#x4E09;&#x79CD;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;</h2><p>io_uring &#x5B9E;&#x4F8B;&#x53EF;&#x5DE5;&#x4F5C;&#x5728;&#x4E09;&#x79CD;&#x6A21;&#x5F0F;&#xFF1A;</p><p><strong>&#x4E2D;&#x65AD;&#x9A71;&#x52A8;&#x6A21;&#x5F0F;</strong>&#xFF08;interrupt driven&#xFF09;</p><p><strong>&#x9ED8;&#x8BA4;&#x6A21;&#x5F0F;</strong>&#x3002;&#x53EF;&#x901A;&#x8FC7; io_uring_enter() &#x63D0;&#x4EA4; I/O &#x8BF7;&#x6C42;&#xFF0C;&#x7136;&#x540E;&#x76F4;&#x63A5;&#x68C0;&#x67E5; CQ &#x72B6;&#x6001;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5B8C;&#x6210;&#x3002;</p><p><strong>&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;</strong>&#xFF08;polled&#xFF09;</p><p>Busy-waiting for an I/O completion&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x901A;&#x8FC7;&#x5F02;&#x6B65; IRQ&#xFF08;Interrupt Request&#xFF09;&#x63A5;&#x6536;&#x901A;&#x77E5;&#x3002;</p><p>&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x9700;&#x8981;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#xFF08;&#x5982;&#x679C;&#x6709;&#xFF09;&#x548C;&#x5757;&#x8BBE;&#x5907;&#xFF08;block device&#xFF09;&#x652F;&#x6301;&#x8F6E;&#x8BE2;&#x529F;&#x80FD;&#x3002; &#x76F8;&#x6BD4;&#x4E2D;&#x65AD;&#x9A71;&#x52A8;&#x65B9;&#x5F0F;&#xFF0C;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x5EF6;&#x8FDF;&#x66F4;&#x4F4E;&#xFF08;<a href="https://www.phoronix.com/scan.php?page=news_item&amp;px=Linux-io_uring-Fast-Efficient">&#x8FDE;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x90FD;&#x7701;&#x4E86;</a>&#xFF09;&#xFF0C; &#x4F46;&#x53EF;&#x80FD;&#x4F1A;&#x6D88;&#x8017;&#x66F4;&#x591A; CPU &#x8D44;&#x6E90;&#x3002;</p><p>&#x76EE;&#x524D;&#xFF0C;&#x53EA;&#x6709;&#x6307;&#x5B9A;&#x4E86; O_DIRECT flag &#x6253;&#x5F00;&#x7684;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#xFF0C;&#x624D;&#x80FD;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x3002;&#x5F53;&#x4E00;&#x4E2A;&#x8BFB; &#x6216;&#x5199;&#x8BF7;&#x6C42;&#x63D0;&#x4EA4;&#x7ED9;&#x8F6E;&#x8BE2;&#x4E0A;&#x4E0B;&#x6587;&#xFF08;polled context&#xFF09;&#x4E4B;&#x540E;&#xFF0C;&#x5E94;&#x7528;&#xFF08;application&#xFF09;&#x5FC5;&#x987B;&#x8C03;&#x7528; <code>io_uring_enter()</code> &#x6765;&#x8F6E;&#x8BE2; CQ &#x961F;&#x5217;&#xFF0C;&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x662F;&#x5426;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x3002;</p><p>&#x5BF9;&#x4E00;&#x4E2A; io_uring &#x5B9E;&#x4F8B;&#x6765;&#x8BF4;&#xFF0C;<strong>&#x4E0D;&#x652F;&#x6301;&#x6DF7;&#x5408;&#x4F7F;&#x7528;&#x8F6E;&#x8BE2;&#x548C;&#x975E;&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;</strong>&#x3002;</p><p><strong>&#x5185;&#x6838;&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;</strong>&#xFF08;kernel polled&#xFF09;</p><p>&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x4E2D;&#xFF0C;&#x4F1A; <strong>&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5185;&#x6838;&#x7EBF;&#x7A0B;</strong>&#xFF08;kernel thread&#xFF09;&#x6765;&#x6267;&#x884C; SQ &#x7684;&#x8F6E;&#x8BE2;&#x5DE5;&#x4F5C;&#x3002;</p><p>&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x7684; io_uring &#x5B9E;&#x4F8B;&#xFF0C; <strong>&#x5E94;&#x7528;&#x65E0;&#x9700;&#x5207;&#x5230;&#x5230;&#x5185;&#x6838;&#x6001;</strong> &#x5C31;&#x80FD;&#x89E6;&#x53D1;&#xFF08;issue&#xFF09;I/O &#x64CD;&#x4F5C;&#x3002; &#x901A;&#x8FC7; SQ &#x6765;&#x63D0;&#x4EA4; SQE&#xFF0C;&#x4EE5;&#x53CA;&#x76D1;&#x63A7; CQ &#x7684;&#x5B8C;&#x6210;&#x72B6;&#x6001;&#xFF0C;&#x5E94;&#x7528;&#x65E0;&#x9700;&#x4EFB;&#x4F55;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF0C;&#x5C31;&#x80FD;&#x63D0;&#x4EA4;&#x548C;&#x6536;&#x5272; I/O&#xFF08;submit and reap I/Os&#xFF09;&#x3002;</p><p>&#x5982;&#x679C;&#x5185;&#x6838;&#x7EBF;&#x7A0B;&#x7684;&#x7A7A;&#x95F2;&#x65F6;&#x95F4;&#x8D85;&#x8FC7;&#x4E86;&#x7528;&#x6237;&#x7684;&#x914D;&#x7F6E;&#x503C;&#xFF0C;&#x5B83;&#x4F1A;&#x901A;&#x77E5;&#x5E94;&#x7528;&#xFF0C;&#x7136;&#x540E;&#x8FDB;&#x5165; idle &#x72B6;&#x6001;&#x3002; &#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5E94;&#x7528;&#x5FC5;&#x987B;&#x8C03;&#x7528; <code>io_uring_enter()</code> &#x6765;&#x5524;&#x9192;&#x5185;&#x6838;&#x7EBF;&#x7A0B;&#x3002;&#x5982;&#x679C; I/O &#x4E00;&#x76F4;&#x5F88;&#x7E41;&#x5FD9;&#xFF0C;&#x5185;&#x6838;&#x7EBF;&#x6027;&#x662F;&#x4E0D;&#x4F1A; sleep &#x7684;&#x3002;</p><h2 id="25-iouring-%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8-api">2.5 <code>io_uring</code> &#x7CFB;&#x7EDF;&#x8C03;&#x7528; API</h2><p>&#x6709;&#x4E09;&#x4E2A;&#xFF1A;</p><ul><li><code>io_uring_setup(2)</code></li><li><code>io_uring_register(2)</code></li><li><code>io_uring_enter(2)</code></li></ul><p>&#x4E0B;&#x9762;&#x5C55;&#x5F00;&#x4ECB;&#x7ECD;&#x3002;&#x5B8C;&#x6574;&#x6587;&#x6863;&#x89C1; <a href="https://github.com/axboe/liburing/tree/master/man">manpage</a>&#x3002;</p><h3 id="251-iouringsetup">2.5.1 <code>io_uring_setup()</code></h3><p>&#x6267;&#x884C;&#x5F02;&#x6B65; I/O &#x9700;&#x8981;&#x5148;<strong>&#x8BBE;&#x7F6E;&#x4E0A;&#x4E0B;&#x6587;</strong>&#xFF1A;</p><pre><code>int io_uring_setup(u32 entries, struct io_uring_params *p);
</code></pre><p>&#x8FD9;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;</p><ul><li><strong>&#x521B;&#x5EFA;&#x4E00;&#x4E2A; SQ &#x548C;&#x4E00;&#x4E2A; CQ</strong>&#xFF0C;</li><li>queue size &#x81F3;&#x5C11; <code>entries</code> &#x4E2A;&#x5143;&#x7D20;&#xFF0C;</li><li>&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#xFF0C;&#x968F;&#x540E;&#x7528;&#x4E8E;&#x5728;&#x8FD9;&#x4E2A; io_uring &#x5B9E;&#x4F8B;&#x4E0A;&#x6267;&#x884C;&#x64CD;&#x4F5C;&#x3002;</li></ul><p>SQ &#x548C; CQ &#x5728;&#x5E94;&#x7528;&#x548C;&#x5185;&#x6838;&#x4E4B;&#x95F4;&#x5171;&#x4EAB;&#xFF0C;&#x907F;&#x514D;&#x4E86;&#x5728;&#x521D;&#x59CB;&#x5316;&#x548C;&#x5B8C;&#x6210; I/O &#x65F6;&#xFF08;initiating and completing I/O&#xFF09;&#x62F7;&#x8D1D;&#x6570;&#x636E;&#x3002;</p><p>&#x53C2;&#x6570; p&#xFF1A;</p><ul><li>&#x5E94;&#x7528;&#x7528;&#x6765;&#x914D;&#x7F6E; io_uring&#xFF0C;</li><li>&#x5185;&#x6838;&#x8FD4;&#x56DE;&#x7684; SQ/CQ &#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x4E5F;&#x901A;&#x8FC7;&#x5B83;&#x5E26;&#x56DE;&#x6765;&#x3002;</li></ul><p>io_uring_setup() &#x6210;&#x529F;&#x65F6;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#xFF08;fd&#xFF09;&#x3002;&#x5E94;&#x7528;&#x968F;&#x540E;&#x53EF;&#x4EE5;&#x5C06;&#x8FD9;&#x4E2A; fd &#x4F20;&#x7ED9; mmap(2) &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#xFF0C;&#x6765; map the submission and completion queues &#x6216;&#x8005;&#x4F20;&#x7ED9; to the io_uring_register() or io_uring_enter() system calls.</p><h3 id="252-iouringregister">2.5.2 <code>io_uring_register()</code></h3><p>&#x6CE8;&#x518C;&#x7528;&#x4E8E;&#x5F02;&#x6B65; I/O &#x7684;<strong>&#x6587;&#x4EF6;&#x6216;&#x7528;&#x6237;&#x7F13;&#x51B2;&#x533A;</strong>&#xFF08;files or user buffers&#xFF09;&#xFF1A;</p><pre><code>int io_uring_register(unsigned int fd, unsigned int opcode, void *arg, unsigned int nr_args);
</code></pre><p>&#x6CE8;&#x518C;&#x6587;&#x4EF6;&#x6216;&#x7528;&#x6237;&#x7F13;&#x51B2;&#x533A;&#xFF0C;&#x4F7F;&#x5185;&#x6838;&#x80FD;<strong>&#x957F;&#x65F6;&#x95F4;&#x6301;&#x6709;&#x5BF9;&#x8BE5;&#x6587;&#x4EF6;&#x5728;&#x5185;&#x6838;&#x5185;&#x90E8;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x5F15;&#x7528;</strong>&#xFF08;internal kernel data structures associated with the files&#xFF09;&#xFF0C; &#x6216;&#x521B;&#x5EFA;<strong>&#x5E94;&#x7528;&#x5185;&#x5B58;&#x7684;&#x957F;&#x671F;&#x6620;&#x5C04;</strong>&#xFF08;long term mappings of application memory associated with the buffers&#xFF09;&#xFF0C; &#x8FD9;&#x4E2A;&#x64CD;&#x4F5C;&#x53EA;&#x4F1A;&#x5728;&#x6CE8;&#x518C;&#x65F6;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x6BCF;&#x4E2A; I/O &#x8BF7;&#x6C42;&#x90FD;&#x4F1A;&#x5904;&#x7406;&#xFF0C;&#x56E0;&#x6B64;&#x51CF;&#x5C11;&#x4E86; per-I/O overhead&#x3002;</p><h4 id="%E6%B3%A8%E5%86%8C%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%EF%BC%88buffer%EF%BC%89%E6%80%A7%E8%B4%A8">&#x6CE8;&#x518C;&#x7684;&#x7F13;&#x51B2;&#x533A;&#xFF08;buffer&#xFF09;&#x6027;&#x8D28;</h4><ul><li>Registered buffers &#x5C06;&#x4F1A;<strong>&#x88AB;&#x9501;&#x5B9A;&#x5728;&#x5185;&#x5B58;&#x4E2D;</strong>&#xFF08;be locked in memory&#xFF09;&#xFF0C;&#x5E76;<strong>&#x8BA1;&#x5165;&#x7528;&#x6237;&#x7684; RLIMIT_MEMLOCK</strong> &#x8D44;&#x6E90;&#x9650;&#x5236;&#x3002;</li><li>&#x6B64;&#x5916;&#xFF0C;&#x6BCF;&#x4E2A; buffer &#x6709; <strong>1GB &#x7684;&#x5927;&#x5C0F;&#x9650;&#x5236;</strong>&#x3002;</li><li>&#x5F53;&#x524D;&#xFF0C;buffers &#x5FC5;&#x987B;&#x662F;<strong>&#x533F;&#x540D;&#x3001;&#x975E;&#x6587;&#x4EF6;&#x540E;&#x7AEF;&#x7684;&#x5185;&#x5B58;</strong>&#xFF08;anonymous, non-file-backed memory&#xFF09;&#xFF0C;&#x4F8B;&#x5982; malloc(3) or mmap(2) with the MAP_ANONYMOUS flag set &#x8FD4;&#x56DE;&#x7684;&#x5185;&#x5B58;&#x3002;</li><li>Huge pages &#x4E5F;&#x662F;&#x652F;&#x6301;&#x7684;&#x3002;&#x6574;&#x4E2A; huge page &#x90FD;&#x4F1A;&#x88AB; pin &#x5230;&#x5185;&#x6838;&#xFF0C;&#x5373;&#x4F7F;&#x53EA;&#x7528;&#x5230;&#x4E86;&#x5176;&#x4E2D;&#x4E00;&#x90E8;&#x5206;&#x3002;</li><li>&#x5DF2;&#x7ECF;&#x6CE8;&#x518C;&#x7684; buffer &#x65E0;&#x6CD5;&#x8C03;&#x6574;&#x5927;&#x5C0F;&#xFF0C;&#x60F3;&#x8C03;&#x6574;&#x53EA;&#x80FD;&#x5148; unregister&#xFF0C;&#x518D;&#x91CD;&#x65B0; register &#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x3002;</li></ul><h4 id="%E9%80%9A%E8%BF%87-eventfd-%E8%AE%A2%E9%98%85-completion-%E4%BA%8B%E4%BB%B6">&#x901A;&#x8FC7; <code>eventfd()</code> &#x8BA2;&#x9605; completion &#x4E8B;&#x4EF6;</h4><p>&#x53EF;&#x4EE5;&#x7528; <code>eventfd(2)</code> &#x8BA2;&#x9605; io_uring &#x5B9E;&#x4F8B;&#x7684; completion events&#x3002; &#x5C06; eventfd &#x63CF;&#x8FF0;&#x7B26;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x6CE8;&#x518C;&#x5C31;&#x884C;&#x4E86;&#x3002;</p><blockquote>The credentials of the running application can be registered with io_uring which returns an id associated with those credentials. Applications wishing to share a ring between separate users/processes can pass in this credential id in the SQE personality field. If set, that particular SQE will be issued with these credentials.</blockquote><h3 id="253-iouringenter">2.5.3 <code>io_uring_enter()</code></h3><pre><code>int io_uring_enter(unsigned int fd, unsigned int to_submit, unsigned int min_complete, unsigned int flags, sigset_t *sig);
</code></pre><p>&#x8FD9;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x7528;&#x4E8E;&#x521D;&#x59CB;&#x5316;&#x548C;&#x5B8C;&#x6210;&#xFF08;initiate and complete&#xFF09;I/O&#xFF0C;&#x4F7F;&#x7528;&#x5171;&#x4EAB;&#x7684; SQ &#x548C; CQ&#x3002; &#x5355;&#x6B21;&#x8C03;&#x7528;&#x540C;&#x65F6;&#x6267;&#x884C;&#xFF1A;</p><ol><li>&#x63D0;&#x4EA4;&#x65B0;&#x7684; I/O &#x8BF7;&#x6C42;</li><li>&#x7B49;&#x5F85; I/O &#x5B8C;&#x6210;</li></ol><p>&#x53C2;&#x6570;&#xFF1A;</p><ol><li><code>fd</code> &#x662F; <code>io_uring_setup()</code> &#x8FD4;&#x56DE;&#x7684;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#xFF1B;</li><li><code>to_submit</code> &#x6307;&#x5B9A;&#x4E86; SQ &#x4E2D;&#x63D0;&#x4EA4;&#x7684; I/O &#x6570;&#x91CF;&#xFF1B;</li></ol><p>&#x4F9D;&#x636E;&#x4E0D;&#x540C;&#x6A21;&#x5F0F;&#xFF1A;</p><ul><li>&#x9ED8;&#x8BA4;&#x6A21;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x6307;&#x5B9A;&#x4E86; <code>min_complete</code>&#xFF0C;&#x4F1A;&#x7B49;&#x5F85;&#x8FD9;&#x4E2A;&#x6570;&#x91CF;&#x7684; I/O &#x4E8B;&#x4EF6;&#x5B8C;&#x6210;&#x518D;&#x8FD4;&#x56DE;&#xFF1B;</li></ul><p>&#x5982;&#x679C; io_uring &#x662F; polling &#x6A21;&#x5F0F;&#xFF0C;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x8868;&#x793A;&#xFF1A;</p><ol><li>0&#xFF1A;&#x8981;&#x6C42;&#x5185;&#x6838;&#x8FD4;&#x56DE;&#x5F53;&#x524D;&#x4EE5;&#x53CA;&#x5B8C;&#x6210;&#x7684;&#x6240;&#x6709; events&#xFF0C;&#x65E0;&#x963B;&#x585E;&#xFF1B;</li><li>&#x975E;&#x96F6;&#xFF1A;&#x5982;&#x679C;&#x6709;&#x4E8B;&#x4EF6;&#x5B8C;&#x6210;&#xFF0C;&#x5185;&#x6838;&#x4ECD;&#x7136;&#x7ACB;&#x5373;&#x8FD4;&#x56DE;&#xFF1B;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x5B8C;&#x6210;&#x4E8B;&#x4EF6;&#xFF0C;&#x5185;&#x6838;&#x4F1A; poll&#xFF0C;&#x7B49;&#x5F85;&#x6307;&#x5B9A;&#x7684;&#x6B21;&#x6570;&#x5B8C;&#x6210;&#xFF0C;&#x6216;&#x8005;&#x8FD9;&#x4E2A;&#x8FDB;&#x7A0B;&#x7684;&#x65F6;&#x95F4;&#x7247;&#x7528;&#x5B8C;&#x3002;</li></ol><p>&#x6CE8;&#x610F;&#xFF1A;&#x5BF9;&#x4E8E; interrupt driven I/O&#xFF0C;<strong>&#x5E94;&#x7528;&#x65E0;&#x9700;&#x8FDB;&#x5165;&#x5185;&#x6838;&#x5C31;&#x80FD;&#x68C0;&#x67E5; CQ &#x7684; event completions</strong>&#x3002;</p><p><code>io_uring_enter()</code> &#x652F;&#x6301;&#x5F88;&#x591A;&#x64CD;&#x4F5C;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;</p><ul><li>Open, close, and stat files</li><li>Read and write into multiple buffers or pre-mapped buffers</li><li>Socket I/O operations</li><li>Synchronize file state</li><li>Asynchronously monitor a set of file descriptors</li><li>Create a timeout linked to a specific operation in the ring</li><li>Attempt to cancel an operation that is currently in flight</li><li>Create I/O chains</li><li>Ordered execution within a chain</li><li>Parallel execution of multiple chains</li></ul><p>&#x5F53;&#x8FD9;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x8FD4;&#x56DE;&#x65F6;&#xFF0C;&#x8868;&#x793A;&#x4E00;&#x5B9A;&#x6570;&#x91CF;&#x7684; SEQ &#x5DF2;&#x7ECF;&#x88AB;&#x6D88;&#x8D39;&#x548C;&#x63D0;&#x4EA4;&#x4E86;&#xFF0C;&#x6B64;&#x65F6;&#x53EF;&#x4EE5;&#x5B89;&#x5168;&#x7684;&#x91CD;&#x7528;&#x961F;&#x5217;&#x4E2D;&#x7684; SEQ&#x3002; &#x6B64;&#x65F6; IO &#x63D0;&#x4EA4;&#x6709;&#x53EF;&#x80FD;&#x8FD8;&#x505C;&#x7559;&#x5728;&#x5F02;&#x6B65;&#x4E0A;&#x4E0B;&#x6587;&#x4E2D;&#xFF0C;&#x5373;&#x5B9E;&#x9645;&#x4E0A; SQE &#x53EF;&#x80FD;&#x8FD8;&#x6CA1;&#x6709;&#x88AB;&#x63D0;&#x4EA4; &#x2014;&#x2014; &#x4E0D;&#x8FC7; &#x7528;&#x6237;&#x4E0D;&#x7528;&#x5173;&#x5FC3;&#x8FD9;&#x4E9B;&#x7EC6;&#x8282; &#x2014;&#x2014; &#x5F53;&#x968F;&#x540E;&#x5185;&#x6838;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x67D0;&#x4E2A;&#x7279;&#x5B9A;&#x7684; SQE &#x65F6;&#xFF0C;&#x5B83;&#x5DF2;&#x7ECF;&#x590D;&#x5236;&#x4E86;&#x4E00;&#x4EFD;&#x3002;</p><h2 id="26-%E9%AB%98%E7%BA%A7%E7%89%B9%E6%80%A7">2.6 &#x9AD8;&#x7EA7;&#x7279;&#x6027;</h2><p><code>io_uring</code> &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x7528;&#x4E8E;&#x7279;&#x6B8A;&#x573A;&#x666F;&#x7684;&#x9AD8;&#x7EA7;&#x7279;&#x6027;&#xFF1A;</p><ol><li><strong>File registration</strong>&#xFF08;&#x6587;&#x4EF6;&#x6CE8;&#x518C;&#xFF09;&#xFF1A;&#x6BCF;&#x6B21;&#x53D1;&#x8D77;&#x4E00;&#x4E2A;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7684;&#x64CD; &#x4F5C;&#xFF0C;&#x5185;&#x6838;&#x90FD;&#x9700;&#x8981;<strong>&#x82B1;&#x8D39;&#x4E00;&#x4E9B;&#x65F6;&#x949F;&#x5468;&#x671F;</strong>&#xFF08;cycles&#xFF09;<strong>&#x5C06;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#x6620;&#x5C04;&#x5230;&#x5185;&#x90E8;&#x8868;&#x793A;</strong>&#x3002; &#x5BF9;&#x4E8E;&#x90A3;&#x4E9B;<strong>&#x9488;&#x5BF9;&#x540C;&#x4E00;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x91CD;&#x590D;&#x64CD;&#x4F5C;</strong>&#x7684;&#x573A;&#x666F;&#xFF0C;<code>io_uring</code> &#x652F;&#x6301;<strong>&#x63D0;&#x524D;&#x6CE8;&#x518C;&#x8FD9;&#x4E9B;&#x6587;&#x4EF6;</strong>&#xFF0C;&#x540E;&#x9762;&#x76F4;&#x63A5;&#x67E5;&#x627E;&#x5C31;&#x884C;&#x4E86;&#x3002;</li><li><strong>Buffer registration</strong>&#xFF08;&#x7F13;&#x51B2;&#x533A;&#x6CE8;&#x518C;&#xFF09;&#xFF1A;&#x4E0E; file registration &#x7C7B; &#x4F3C;&#xFF0C;direct I/O &#x573A;&#x666F;&#x4E2D;&#xFF0C;&#x5185;&#x6838;&#x9700;&#x8981; map/unmap memory areas&#x3002;<code>io_uring</code> &#x652F;&#x6301;&#x63D0;&#x524D; &#x6CE8;&#x518C;&#x8FD9;&#x4E9B;&#x7F13;&#x51B2;&#x533A;&#xFF08;buffers&#xFF09;&#x3002;</li><li><strong>Poll ring</strong>&#xFF08;&#x8F6E;&#x8BE2;&#x73AF;&#x5F62;&#x7F13;&#x51B2;&#x533A;&#xFF09;&#xFF1A;&#x5BF9;&#x4E8E;&#x975E;&#x5E38;&#x5FEB;&#x662F;&#x8BBE;&#x5907;&#xFF0C;&#x5904;&#x7406;&#x4E2D;&#x65AD;&#x7684;&#x5F00; &#x9500;&#x662F;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#x3002;<code>io_uring</code> &#x5141;&#x8BB8;&#x7528;&#x6237;&#x5173;&#x95ED;&#x4E2D;&#x65AD;&#xFF0C;&#x4F7F;&#x7528;&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;&#x3002;&#x524D;&#x9762;&#x201C;&#x4E09;&#x79CD;&#x5DE5;&#x4F5C;&#x6A21;&#x5F0F;&#x201D;&#x5C0F;&#x8282; &#x4E5F;&#x4ECB;&#x7ECD;&#x5230;&#x4E86;&#x8FD9;&#x4E00;&#x70B9;&#x3002;</li><li><strong>Linked operations</strong>&#xFF08;&#x94FE;&#x63A5;&#x64CD;&#x4F5C;&#xFF09;&#xFF1A;&#x5141;&#x8BB8;&#x7528;&#x6237;&#x53D1;&#x9001;&#x4E32;&#x8054;&#x7684;&#x8BF7;&#x6C42;&#x3002;&#x8FD9;&#x4E24; &#x4E2A;&#x8BF7;&#x6C42;&#x540C;&#x65F6;&#x63D0;&#x4EA4;&#xFF0C;&#x4F46;&#x540E;&#x9762;&#x7684;&#x4F1A;&#x7B49;&#x524D;&#x9762;&#x7684;&#x5904;&#x7406;&#x5B8C;&#x624D;&#x5F00;&#x59CB;&#x6267;&#x884C;&#x3002;</li></ol><h2 id="27-%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E5%BA%93-liburing">2.7 &#x7528;&#x6237;&#x7A7A;&#x95F4;&#x5E93; <code>liburing</code></h2><p><a href="https://github.com/axboe/liburing/"><code>liburing</code></a> &#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x9AD8;&#x5C42; API&#xFF0C; &#x53EF;&#x7528;&#x4E8E;&#x4E00;&#x4E9B;&#x57FA;&#x672C;&#x573A;&#x666F;&#xFF0C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x907F;&#x514D;&#x4E86;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x66F4;&#x5E95;&#x5C42;&#x7684;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x3002; &#x6B64;&#x5916;&#xFF0C;&#x8FD9;&#x4E2A; API &#x8FD8;&#x907F;&#x514D;&#x4E86;&#x4E00;&#x4E9B;&#x91CD;&#x590D;&#x64CD;&#x4F5C;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5982;&#x8BBE;&#x7F6E; io_uring &#x5B9E;&#x4F8B;&#x3002;</p><p>&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x5728; <code>io_uring_setup()</code> &#x7684; manpage &#x63CF;&#x8FF0;&#x4E2D;&#xFF0C;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x83B7;&#x5F97;&#x4E00;&#x4E2A; ring &#x6587; &#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#x4E4B;&#x540E;&#xFF0C;&#x5E94;&#x7528;&#x5FC5;&#x987B;&#x8C03;&#x7528; <code>mmap()</code> &#x6765;&#x8FD9;&#x6837;&#x7684;&#x903B;&#x8F91;&#x9700;&#x8981;&#x4E00;&#x6BB5;&#x7565;&#x957F;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x800C;&#x7528; <code>liburing</code> &#x7684;&#x8BDD;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x51FD;&#x6570;&#x5DF2;&#x7ECF;&#x5C06;&#x4E0A;&#x8FF0;&#x6D41;&#x7A0B;&#x5C01;&#x88C5;&#x597D;&#x4E86;&#xFF1A;</p><pre><code>int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags);
</code></pre><p>&#x4E0B;&#x4E00;&#x8282;&#x6765;&#x770B;&#x4E24;&#x4E2A;&#x4F8B;&#x5B50;&#x57FA;&#x4E8E; liburing &#x7684;&#x4F8B;&#x5B50;&#x3002;</p><h1 id="3-%E5%9F%BA%E4%BA%8E-liburing-%E7%9A%84%E7%A4%BA%E4%BE%8B%E5%BA%94%E7%94%A8">3 &#x57FA;&#x4E8E; liburing &#x7684;&#x793A;&#x4F8B;&#x5E94;&#x7528;</h1><p>&#x7F16;&#x8BD1;&#xFF1A;</p><pre><code>$ git clone https://github.com/axboe/liburing.git
$ git co -b liburing-2.0 tags/liburing-2.0

$ cd liburing
$ ls examples/
io_uring-cp  io_uring-cp.c  io_uring-test  io_uring-test.c  link-cp  link-cp.c  Makefile  ucontext-cp  ucontext-cp.c

$ make -j4

$ ./examples/io_uring-test &lt;file&gt;
Submitted=4, completed=4, bytes=16384

$ ./examples/link-cp &lt;in-file&gt; &lt;out-file&gt;
</code></pre><h2 id="31-iouring-test">3.1 <code>io_uring-test</code></h2><p>&#x8FD9;&#x4E2A;&#x7A0B;&#x5E8F;&#x4F7F;&#x7528; 4 &#x4E2A; SQE&#xFF0C;&#x4ECE;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#x4E2D;<strong>&#x8BFB;&#x53D6;&#x6700;&#x591A; 16KB &#x6570;&#x636E;</strong>&#x3002;</p><h3 id="%E6%BA%90%E7%A0%81%E5%8F%8A%E6%B3%A8%E9%87%8A">&#x6E90;&#x7801;&#x53CA;&#x6CE8;&#x91CA;</h3><p>&#x4E3A;&#x65B9;&#x4FBF;&#x770B;&#x6E05;&#x4E3B;&#x8981;&#x903B;&#x8F91;&#xFF0C;&#x5FFD;&#x7565;&#x4E86;&#x4E00;&#x4E9B;&#x9519;&#x8BEF;&#x5904;&#x7406;&#x4EE3;&#x7801;&#xFF0C;&#x5B8C;&#x6574;&#x4EE3;&#x7801;&#x89C1; <a href="https://github.com/axboe/liburing/blob/liburing-2.0/examples/io_uring-test.c">io_uring-test.c</a>&#x3002;</p><pre><code>/* SPDX-License-Identifier: MIT */
/*
 * Simple app that demonstrates how to setup an io_uring interface,
 * submit and complete IO against it, and then tear it down.
 *
 * gcc -Wall -O2 -D_GNU_SOURCE -o io_uring-test io_uring-test.c -luring
 */
#include &quot;liburing.h&quot;

#define QD    4 // io_uring &#x961F;&#x5217;&#x957F;&#x5EA6;

int main(int argc, char *argv[]) {
    int i, fd, pending, done;
    void *buf;

    // 1. &#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A; io_uring &#x5B9E;&#x4F8B;
    struct io_uring ring;
    ret = io_uring_queue_init(QD,    // &#x961F;&#x5217;&#x957F;&#x5EA6;
                              &amp;ring, // io_uring &#x5B9E;&#x4F8B;
                              0);    // flags&#xFF0C;0 &#x8868;&#x793A;&#x9ED8;&#x8BA4;&#x914D;&#x7F6E;&#xFF0C;&#x4F8B;&#x5982;&#x4F7F;&#x7528;&#x4E2D;&#x65AD;&#x9A71;&#x52A8;&#x6A21;&#x5F0F;

    // 2. &#x6253;&#x5F00;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#xFF0C;&#x6CE8;&#x610F;&#x8FD9;&#x91CC;&#x6307;&#x5B9A;&#x4E86; O_DIRECT flag&#xFF0C;&#x5185;&#x6838;&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;&#x9700;&#x8981;&#x8FD9;&#x4E2A; flag&#xFF0C;&#x89C1;&#x524D;&#x9762;&#x4ECB;&#x7ECD;
    fd = open(argv[1], O_RDONLY | O_DIRECT);
    struct stat sb;
    fstat(fd, &amp;sb); // &#x83B7;&#x53D6;&#x6587;&#x4EF6;&#x4FE1;&#x606F;&#xFF0C;&#x4F8B;&#x5982;&#x6587;&#x4EF6;&#x957F;&#x5EA6;&#xFF0C;&#x540E;&#x9762;&#x4F1A;&#x7528;&#x5230;

    // 3. &#x521D;&#x59CB;&#x5316; 4 &#x4E2A;&#x8BFB;&#x7F13;&#x51B2;&#x533A;
    ssize_t fsize = 0;             // &#x7A0B;&#x5E8F;&#x7684;&#x6700;&#x5927;&#x8BFB;&#x53D6;&#x957F;&#x5EA6;
    struct iovec *iovecs = calloc(QD, sizeof(struct iovec));
    for (i = 0; i &lt; QD; i++) {
        if (posix_memalign(&amp;buf, 4096, 4096))
            return 1;
        iovecs[i].iov_base = buf;  // &#x8D77;&#x59CB;&#x5730;&#x5740;
        iovecs[i].iov_len = 4096;  // &#x7F13;&#x51B2;&#x533A;&#x5927;&#x5C0F;
        fsize += 4096;
    }

    // 4. &#x4F9D;&#x6B21;&#x51C6;&#x5907; 4 &#x4E2A; SQE &#x8BFB;&#x8BF7;&#x6C42;&#xFF0C;&#x6307;&#x5B9A;&#x5C06;&#x968F;&#x540E;&#x8BFB;&#x5165;&#x7684;&#x6570;&#x636E;&#x5199;&#x5165; iovecs 
    struct io_uring_sqe *sqe;
    offset = 0;
    i = 0;
    do {
        sqe = io_uring_get_sqe(&amp;ring);  // &#x83B7;&#x53D6;&#x53EF;&#x7528; SQE
        io_uring_prep_readv(sqe,        // &#x7528;&#x8FD9;&#x4E2A; SQE &#x51C6;&#x5907;&#x4E00;&#x4E2A;&#x5F85;&#x63D0;&#x4EA4;&#x7684; read &#x64CD;&#x4F5C;
                            fd,         // &#x4ECE; fd &#x6253;&#x5F00;&#x7684;&#x6587;&#x4EF6;&#x4E2D;&#x8BFB;&#x53D6;&#x6570;&#x636E;
                            &amp;iovecs[i], // iovec &#x5730;&#x5740;&#xFF0C;&#x8BFB;&#x5230;&#x7684;&#x6570;&#x636E;&#x5199;&#x5165; iovec &#x7F13;&#x51B2;&#x533A;
                            1,          // iovec &#x6570;&#x91CF;
                            offset);    // &#x8BFB;&#x53D6;&#x64CD;&#x4F5C;&#x7684;&#x8D77;&#x59CB;&#x5730;&#x5740;&#x504F;&#x79FB;&#x91CF;
        offset += iovecs[i].iov_len;    // &#x66F4;&#x65B0;&#x504F;&#x79FB;&#x91CF;&#xFF0C;&#x4E0B;&#x6B21;&#x4F7F;&#x7528;
        i++;

        if (offset &gt; sb.st_size)        // &#x5982;&#x679C;&#x8D85;&#x51FA;&#x4E86;&#x6587;&#x4EF6;&#x5927;&#x5C0F;&#xFF0C;&#x505C;&#x6B62;&#x51C6;&#x5907;&#x540E;&#x9762;&#x7684; SQE
            break;
    } while (1);

    // 5. &#x63D0;&#x4EA4; SQE &#x8BFB;&#x8BF7;&#x6C42;
    ret = io_uring_submit(&amp;ring);       // 4 &#x4E2A; SQE &#x4E00;&#x6B21;&#x63D0;&#x4EA4;&#xFF0C;&#x8FD4;&#x56DE;&#x63D0;&#x4EA4;&#x6210;&#x529F;&#x7684; SQE &#x6570;&#x91CF;
    if (ret &lt; 0) {
        fprintf(stderr, &quot;io_uring_submit: %s\n&quot;, strerror(-ret));
        return 1;
    } else if (ret != i) {
        fprintf(stderr, &quot;io_uring_submit submitted less %d\n&quot;, ret);
        return 1;
    }

    // 6. &#x7B49;&#x5F85;&#x8BFB;&#x8BF7;&#x6C42;&#x5B8C;&#x6210;&#xFF08;CQE&#xFF09;
    struct io_uring_cqe *cqe;
    done = 0;
    pending = ret;
    fsize = 0;
    for (i = 0; i &lt; pending; i++) {
        io_uring_wait_cqe(&amp;ring, &amp;cqe);  // &#x7B49;&#x5F85;&#x7CFB;&#x7EDF;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x8BFB;&#x5B8C;&#x6210;&#x4E8B;&#x4EF6;
        done++;

        if (cqe-&gt;res != 4096 &amp;&amp; cqe-&gt;res + fsize != sb.st_size) {
            fprintf(stderr, &quot;ret=%d, wanted 4096\n&quot;, cqe-&gt;res);
        }

        fsize += cqe-&gt;res;
        io_uring_cqe_seen(&amp;ring, cqe);   // &#x66F4;&#x65B0; io_uring &#x5B9E;&#x4F8B;&#x7684;&#x5B8C;&#x6210;&#x961F;&#x5217;
    }

    // 7. &#x6253;&#x5370;&#x7EDF;&#x8BA1;&#x4FE1;&#x606F;
    printf(&quot;Submitted=%d, completed=%d, bytes=%lu\n&quot;, pending, done, (unsigned long) fsize);

    // 8. &#x6E05;&#x7406;&#x5DE5;&#x4F5C;
    close(fd);
    io_uring_queue_exit(&amp;ring);
    return 0;
}
</code></pre><h3 id="%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E">&#x5176;&#x4ED6;&#x8BF4;&#x660E;</h3><p>&#x4EE3;&#x7801;&#x4E2D;&#x5DF2;&#x7ECF;&#x6DFB;&#x52A0;&#x4E86;&#x6CE8;&#x91CA;&#xFF0C;&#x8FD9;&#x91CC;&#x518D;&#x89E3;&#x91CA;&#x51E0;&#x70B9;&#xFF1A;</p><ul><li>&#x6BCF;&#x4E2A; SQE &#x90FD;&#x6267;&#x884C;&#x4E00;&#x4E2A; allocated buffer&#xFF0C;&#x540E;&#x8005;&#x662F;&#x7528; <code>iovec</code> &#x7ED3;&#x6784;&#x63CF;&#x8FF0;&#x7684;&#xFF1B;</li><li>&#x7B2C; 3 &amp; 4 &#x6B65;&#xFF1A;&#x521D;&#x59CB;&#x5316;&#x6240;&#x6709; SQE&#xFF0C;&#x7528;&#x4E8E;&#x63A5;&#x4E0B;&#x6765;&#x7684; <code>IORING_OP_READV</code> &#x64CD;&#x4F5C;&#xFF0C;&#x540E;&#x8005; <strong>&#x63D0;&#x4F9B;&#x4E86; <code>readv(2)</code> &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x7684;&#x5F02;&#x6B65;&#x63A5;&#x53E3;</strong>&#x3002;</li><li>&#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x8FD9;&#x4E2A; SQE iovec buffer &#x4E2D;&#x5B58;&#x653E;&#x7684;&#x662F;&#x76F8;&#x5173; <code>readv</code> &#x64CD;&#x4F5C;&#x7684;&#x7ED3;&#x679C;&#xFF1B;</li><li>&#x63A5;&#x4E0B;&#x6765;&#x8C03;&#x7528; <code>io_uring_wait_cqe()</code> &#x6765; reap CQE&#xFF0C;&#x5E76;&#x901A;&#x8FC7; <code>cqe-&gt;res</code> &#x5B57;&#x6BB5;&#x9A8C;&#x8BC1;&#x8BFB;&#x53D6;&#x7684;&#x5B57;&#x8282;&#x6570;&#xFF1B;</li><li><code>io_uring_cqe_seen()</code> &#x901A;&#x77E5;&#x5185;&#x6838;&#x8FD9;&#x4E2A; CQE &#x5DF2;&#x7ECF;&#x88AB;&#x6D88;&#x8D39;&#x4E86;&#x3002;</li></ul><h2 id="32-link-cp">3.2 <code>link-cp</code></h2><p>link-cp &#x4F7F;&#x7528; io_uring &#x9AD8;&#x7EA7;&#x7279;&#x6027; SQE chaining &#x7279;&#x6027;&#x6765;&#x590D;&#x5236;&#x6587;&#x4EF6;&#x3002;</p><h3 id="io-chain">I/O chain</h3><p>io_uring &#x652F;&#x6301;&#x521B;&#x5EFA; I/O chain&#x3002;&#x4E00;&#x4E2A; chain &#x5185;&#x7684; I/O &#x662F;&#x987A;&#x5E8F;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x591A;&#x4E2A; I/O chain &#x53EF;&#x4EE5;&#x5E76;&#x884C;&#x6267;&#x884C;&#x3002;</p><p><code>io_uring_enter()</code> manpage &#x4E2D;&#x5BF9; <code>IOSQE_IO_LINK</code> &#x6709; <a href="https://www.mankier.com/2/io_uring_enter#Description-IOSQE_IO_LINK">&#x8BE6;&#x7EC6;&#x89E3;&#x91CA;</a>&#xFF1A;</p><blockquote>When this flag is specified, it forms a link with the next SQE in the submission ring. That next SQE will not be started before this one completes. This, in effect, forms a chain of SQEs, which can be arbitrarily long. The tail of the chain is denoted by the first SQE that does not have this flag set. This flag has no effect on previous SQE submissions, nor does it impact SQEs that are outside of the chain tail. This means that multiple chains can be executing in parallel, or chains and individual SQEs. Only members inside the chain are serialized. A chain of SQEs will be broken, if any request in that chain ends in error. io_uring considers any unexpected result an error. This means that, eg, a short read will also terminate the remainder of the chain. If a chain of SQE links is broken, the remaining unstarted part of the chain will be terminated and completed with -ECANCELED as the error code. Available since 5.3.</blockquote><p>&#x4E3A;&#x5B9E;&#x73B0;&#x590D;&#x5236;&#x6587;&#x4EF6;&#x529F;&#x80FD;&#xFF0C;link-cp &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x957F;&#x5EA6;&#x4E3A; 2 &#x7684; SQE chain&#x3002;</p><ul><li>&#x7B2C;&#x4E00;&#x4E2A; SQE &#x662F;&#x4E00;&#x4E2A;&#x8BFB;&#x8BF7;&#x6C42;&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x4ECE;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#x8BFB;&#x5230; buffer&#xFF1B;</li><li>&#x7B2C;&#x4E8C;&#x4E2A;&#x8BF7;&#x6C42;&#xFF0C;&#x4E0E;&#x7B2C;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x662F; linked&#xFF0C;&#x662F;&#x4E00;&#x4E2A;&#x5199;&#x8BF7;&#x6C42;&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x4ECE; buffer &#x5199;&#x5165;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x3002;</li></ul><h3 id="%E6%BA%90%E7%A0%81%E5%8F%8A%E6%B3%A8%E9%87%8A-1">&#x6E90;&#x7801;&#x53CA;&#x6CE8;&#x91CA;</h3><pre><code>/* SPDX-License-Identifier: MIT */
/*
 * Very basic proof-of-concept for doing a copy with linked SQEs. Needs a
 * bit of error handling and short read love.
 */
#include &quot;liburing.h&quot;

#define QD    64         // io_uring &#x961F;&#x5217;&#x957F;&#x5EA6;
#define BS    (32*1024)

struct io_data {
    size_t offset;
    int index;
    struct iovec iov;
};

static int infd, outfd;
static unsigned inflight;

// &#x521B;&#x5EFA;&#x4E00;&#x4E2A; read-&gt;write SQE chain
static void queue_rw_pair(struct io_uring *ring, off_t size, off_t offset) {
    struct io_uring_sqe *sqe;
    struct io_data *data;
    void *ptr;

    ptr = malloc(size + sizeof(*data));
    data = ptr + size;
    data-&gt;index = 0;
    data-&gt;offset = offset;
    data-&gt;iov.iov_base = ptr;
    data-&gt;iov.iov_len = size;

    sqe = io_uring_get_sqe(ring);                            // &#x83B7;&#x53D6;&#x53EF;&#x7528; SQE
    io_uring_prep_readv(sqe, infd, &amp;data-&gt;iov, 1, offset);   // &#x51C6;&#x5907; read &#x8BF7;&#x6C42;
    sqe-&gt;flags |= IOSQE_IO_LINK;                             // &#x8BBE;&#x7F6E;&#x4E3A; LINK &#x6A21;&#x5F0F;
    io_uring_sqe_set_data(sqe, data);                        // &#x8BBE;&#x7F6E; data

    sqe = io_uring_get_sqe(ring);                            // &#x83B7;&#x53D6;&#x53E6;&#x4E00;&#x4E2A;&#x53EF;&#x7528; SQE
    io_uring_prep_writev(sqe, outfd, &amp;data-&gt;iov, 1, offset); // &#x51C6;&#x5907; write &#x8BF7;&#x6C42;
    io_uring_sqe_set_data(sqe, data);                        // &#x8BBE;&#x7F6E; data
}

// &#x5904;&#x7406;&#x5B8C;&#x6210;&#xFF08;completion&#xFF09;&#x4E8B;&#x4EF6;&#xFF1A;&#x91CA;&#x653E; SQE &#x7684;&#x5185;&#x5B58;&#x7F13;&#x51B2;&#x533A;&#xFF0C;&#x901A;&#x77E5;&#x5185;&#x6838;&#x5DF2;&#x7ECF;&#x6D88;&#x8D39;&#x4E86; CQE&#x3002;
static int handle_cqe(struct io_uring *ring, struct io_uring_cqe *cqe) {
    struct io_data *data = io_uring_cqe_get_data(cqe);       // &#x83B7;&#x53D6; CQE
    data-&gt;index++;

    if (cqe-&gt;res &lt; 0) {
        if (cqe-&gt;res == -ECANCELED) {
            queue_rw_pair(ring, BS, data-&gt;offset);
            inflight += 2;
        } else {
            printf(&quot;cqe error: %s\n&quot;, strerror(cqe-&gt;res));
            ret = 1;
        }
    }

    if (data-&gt;index == 2) {        // read-&gt;write chain &#x5B8C;&#x6210;&#xFF0C;&#x91CA;&#x653E;&#x7F13;&#x51B2;&#x533A;&#x5185;&#x5B58;
        void *ptr = (void *) data - data-&gt;iov.iov_len;
        free(ptr);
    }

    io_uring_cqe_seen(ring, cqe);  // &#x901A;&#x77E5;&#x5185;&#x6838;&#x5DF2;&#x7ECF;&#x6D88;&#x8D39;&#x4E86; CQE &#x4E8B;&#x4EF6;
    return ret;
}

static int copy_file(struct io_uring *ring, off_t insize) {
    struct io_uring_cqe *cqe;
    size_t this_size;
    off_t offset;

    offset = 0;
    while (insize) {                      // &#x6570;&#x636E;&#x8FD8;&#x6CA1;&#x5904;&#x7406;&#x5B8C;
        int has_inflight = inflight;      // &#x5F53;&#x524D;&#x6B63;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#x7684; SQE &#x6570;&#x91CF;
        int depth;  // SQE &#x9608;&#x503C;&#xFF0C;&#x5F53;&#x524D;&#x8FDB;&#x884C;&#x4E2D;&#x7684; SQE &#x6570;&#x91CF;&#xFF08;inflight&#xFF09;&#x8D85;&#x8FC7;&#x8FD9;&#x4E2A;&#x503C;&#x4E4B;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x963B;&#x585E;&#x7B49;&#x5F85; CQE &#x5B8C;&#x6210;

        while (insize &amp;&amp; inflight &lt; QD) { // &#x6570;&#x636E;&#x8FD8;&#x6CA1;&#x5904;&#x7406;&#x5B8C;&#xFF0C;io_uring &#x961F;&#x5217;&#x4E5F;&#x8FD8;&#x6CA1;&#x7528;&#x5B8C;
            this_size = BS;
            if (this_size &gt; insize)       // &#x6700;&#x540E;&#x4E00;&#x6BB5;&#x6570;&#x636E;&#x4E0D;&#x8DB3; BS &#x5927;&#x5C0F;
                this_size = insize;

            queue_rw_pair(ring, this_size, offset); // &#x521B;&#x5EFA;&#x4E00;&#x4E2A; read-&gt;write chain&#xFF0C;&#x5360;&#x7528;&#x4E24;&#x4E2A; SQE
            offset += this_size;
            insize -= this_size;
            inflight += 2;                // &#x6B63;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#x7684; SQE &#x6570;&#x91CF; +2
        }

        if (has_inflight != inflight)     // &#x5982;&#x679C;&#x6709;&#x65B0;&#x521B;&#x5EFA;&#x7684; SQE&#xFF0C;
            io_uring_submit(ring);        // &#x5C31;&#x63D0;&#x4EA4;&#x7ED9;&#x5185;&#x6838;

        if (insize)                       // &#x5982;&#x679C;&#x8FD8;&#x6709; data &#x7B49;&#x5F85;&#x5904;&#x7406;&#xFF0C;
            depth = QD;                   // &#x9608;&#x503C;&#x8BBE;&#x7F6E; SQ &#x7684;&#x961F;&#x5217;&#x957F;&#x5EA6;&#xFF0C;&#x5373; SQ &#x961F;&#x5217;&#x7528;&#x5B8C;&#x624D;&#x5F00;&#x59CB;&#x963B;&#x585E;&#x7B49;&#x5F85; CQE&#xFF1B;
        else                              // data &#x5904;&#x7406;&#x5DF2;&#x7ECF;&#x5168;&#x90E8;&#x63D0;&#x4EA4;&#xFF0C;
            depth = 1;                    // &#x9608;&#x503C;&#x8BBE;&#x7F6E;&#x4E3A; 1&#xFF0C;&#x5373;&#x53EA;&#x8981;&#x8FD8;&#x6709; SQE &#x672A;&#x5B8C;&#x6210;&#xFF0C;&#x5C31;&#x963B;&#x585E;&#x7B49;&#x5F85; CQE

        // &#x4E0B;&#x9762;&#x8FD9;&#x4E2A; while &#x53EA;&#x6709; SQ &#x961F;&#x5217;&#x7528;&#x5B8C;&#x6216; data &#x5168;&#x90E8;&#x63D0;&#x4EA4;&#x4E4B;&#x540E;&#x624D;&#x4F1A;&#x6267;&#x884C;&#x5230;
        while (inflight &gt;= depth) {       // &#x5982;&#x679C;&#x6240;&#x6709; SQE &#x90FD;&#x5DF2;&#x7ECF;&#x7528;&#x5B8C;&#xFF0C;&#x6216;&#x8005;&#x6240;&#x6709; data read-&gt;write &#x8BF7;&#x6C42;&#x90FD;&#x5DF2;&#x7ECF;&#x63D0;&#x4EA4;
            io_uring_wait_cqe(ring, &amp;cqe);// &#x7B49;&#x5F85;&#x5185;&#x6838; completion &#x4E8B;&#x4EF6;
            handle_cqe(ring, cqe);        // &#x5904;&#x7406; completion &#x4E8B;&#x4EF6;&#xFF1A;&#x91CA;&#x653E; SQE &#x5185;&#x5B58;&#x7F13;&#x51B2;&#x533A;&#xFF0C;&#x901A;&#x77E5;&#x5185;&#x6838; CQE &#x5DF2;&#x6D88;&#x8D39;
            inflight--;                   // &#x6B63;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#x7684; SQE &#x6570;&#x91CF; -1
        }
    }

    return 0;
}

static int setup_context(unsigned entries, struct io_uring *ring) {
    io_uring_queue_init(entries, ring, 0);
    return 0;
}

static int get_file_size(int fd, off_t *size) {
    struct stat st;

    if (fstat(fd, &amp;st) &lt; 0)
        return -1;
    if (S_ISREG(st.st_mode)) {
        *size = st.st_size;
        return 0;
    } else if (S_ISBLK(st.st_mode)) {
        unsigned long long bytes;

        if (ioctl(fd, BLKGETSIZE64, &amp;bytes) != 0)
            return -1;

        *size = bytes;
        return 0;
    }

    return -1;
}

int main(int argc, char *argv[]) {
    struct io_uring ring;
    off_t insize;
    int ret;

    infd = open(argv[1], O_RDONLY);
    outfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);

    if (setup_context(QD, &amp;ring))
        return 1;
    if (get_file_size(infd, &amp;insize))
        return 1;

    ret = copy_file(&amp;ring, insize);

    close(infd);
    close(outfd);
    io_uring_queue_exit(&amp;ring);
    return ret;
}
</code></pre><h3 id="%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E-1">&#x5176;&#x4ED6;&#x8BF4;&#x660E;</h3><p>&#x4EE3;&#x7801;&#x4E2D;&#x5B9E;&#x73B0;&#x4E86;&#x4E09;&#x4E2A;&#x51FD;&#x6570;&#xFF1A;</p><p><code>copy_file()</code>&#xFF1A;&#x9AD8;&#x5C42;&#x590D;&#x5236;&#x5FAA;&#x73AF;&#x903B;&#x8F91;&#xFF1B;&#x5B83;&#x4F1A;&#x8C03;&#x7528; <code>queue_rw_pair(ring, this_size, offset)</code> &#x6765;&#x6784;&#x9020; SQE pair&#xFF1B; &#x5E76;&#x901A;&#x8FC7;&#x4E00;&#x6B21; <code>io_uring_submit()</code> &#x8C03;&#x7528;&#x5C06;&#x6240;&#x6709;&#x6784;&#x5EFA;&#x7684; SQE pair &#x63D0;&#x4EA4;&#x3002;</p><p>&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x7EF4;&#x62A4;&#x4E86;&#x4E00;&#x4E2A;&#x6700;&#x5927; DQ &#x6570;&#x91CF;&#x7684; inflight SQE&#xFF0C;&#x53EA;&#x8981;&#x6570;&#x636E; copy &#x8FD8;&#x5728;&#x8FDB;&#x884C;&#x4E2D;&#xFF1B;&#x5426;&#x5219;&#xFF0C;&#x5373;&#x6570;&#x636E;&#x5DF2;&#x7ECF;&#x5168;&#x90E8;&#x8BFB;&#x53D6;&#x5B8C;&#x6210;&#xFF0C;&#x5C31;&#x5F00;&#x59CB;&#x7B49;&#x5F85;&#x548C;&#x6536;&#x5272;&#x6240;&#x6709;&#x7684; CQE&#x3002;</p><p><code>queue_rw_pair()</code> &#x6784;&#x9020;&#x4E00;&#x4E2A; read-write SQE pair.</p><p>read SQE &#x7684; <code>IOSQE_IO_LINK</code> flag &#x8868;&#x793A;&#x5F00;&#x59CB;&#x4E00;&#x4E2A; chain&#xFF0C;write SQE &#x4E0D;&#x7528;&#x8BBE;&#x7F6E;&#x8FD9;&#x4E2A; flag&#xFF0C;&#x6807;&#x5FD7;&#x7740;&#x8FD9;&#x4E2A; chain &#x7684;&#x7ED3;&#x675F;&#x3002; &#x7528;&#x6237; data &#x5B57;&#x6BB5;&#x8BBE;&#x7F6E;&#x4E3A;&#x540C;&#x4E00;&#x4E2A; data &#x63CF;&#x8FF0;&#x7B26;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x968F;&#x540E;&#x7684; completion &#x5904;&#x7406;&#x4E2D;&#x4F1A;&#x7528;&#x5230;&#x3002;</p><p><code>handle_cqe()</code> &#x4ECE; CQE &#x4E2D;&#x63D0;&#x53D6;&#x4E4B;&#x524D;&#x7531; <code>queue_rw_pair()</code> &#x4FDD;&#x5B58;&#x7684; data &#x63CF;&#x8FF0;&#x7B26;&#xFF0C;&#x5E76;&#x5728;&#x63CF;&#x8FF0;&#x7B26;&#x4E2D;&#x8BB0;&#x5F55;&#x5904;&#x7406;&#x8FDB;&#x5C55;&#xFF08;index&#xFF09;&#x3002;</p><p>&#x5982;&#x679C;&#x4E4B;&#x524D;&#x8BF7;&#x6C42;&#x88AB;&#x53D6;&#x6D88;&#xFF0C;&#x5B83;&#x8FD8;&#x4F1A;&#x91CD;&#x65B0;&#x63D0;&#x4EA4; read-write pair&#x3002;</p><p>&#x4E00;&#x4E2A; CQE pair &#x7684;&#x4E24;&#x4E2A; member &#x90FD;&#x5904;&#x7406;&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF08;<code>index==2</code>&#xFF09;&#xFF0C;&#x91CA;&#x653E;&#x5171;&#x4EAB;&#x7684; data descriptor&#x3002; &#x6700;&#x540E;&#x901A;&#x77E5;&#x5185;&#x6838;&#x8FD9;&#x4E2A; CQE &#x5DF2;&#x7ECF;&#x88AB;&#x6D88;&#x8D39;&#x3002;</p><h1 id="4-iouring-%E6%80%A7%E8%83%BD%E5%8E%8B%E6%B5%8B%EF%BC%88%E5%9F%BA%E4%BA%8E-fio%EF%BC%89">4 <code>io_uring</code> &#x6027;&#x80FD;&#x538B;&#x6D4B;&#xFF08;&#x57FA;&#x4E8E; <code>fio</code>&#xFF09;</h1><p><strong>&#x5BF9;&#x4E8E;&#x5DF2;&#x7ECF;&#x5728;&#x4F7F;&#x7528; linux-aio &#x7684;&#x5E94;&#x7528;</strong>&#xFF0C;&#x4F8B;&#x5982; ScyllaDB&#xFF0C; <strong>&#x4E0D;&#x8981;&#x671F;&#x671B;&#x6362;&#x6210; io_uring &#x4E4B;&#x540E;&#x80FD;&#x83B7;&#x5F97;&#x5927;&#x5E45;&#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;</strong>&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#xFF1A; <code>io_uring</code> &#x6027;&#x80FD;&#x76F8;&#x5173;&#x7684;&#x5E95;&#x5C42;&#x673A;&#x5236;&#x4E0E; <code>linux-aio</code> &#x5E76;&#x65E0;&#x672C;&#x8D28;&#x4E0D;&#x540C;&#xFF08;&#x90FD;&#x662F;&#x5F02;&#x6B65;&#x63D0;&#x4EA4;&#xFF0C;&#x8F6E;&#x8BE2;&#x7ED3;&#x679C;&#xFF09;&#x3002;</p><p>&#x5728;&#x6B64;&#xFF0C;&#x672C;&#x6587;&#x4E5F;&#x5E0C;&#x671B;&#x4F7F;&#x8BFB;&#x8005;&#x660E;&#x767D;&#xFF1A;<code>io_uring</code> <strong>&#x9996;&#x5148;&#x548C;&#x6700;&#x91CD;&#x8981;&#x7684;&#x8D21;&#x732E;</strong>&#x5728;&#x4E8E;&#xFF1A; <strong>&#x5C06; linux-aio &#x7684;&#x6240;&#x6709;&#x4F18;&#x826F;&#x7279;&#x6027;&#x5E26;&#x7ED9;&#x4E86;&#x666E;&#x7F57;&#x5927;&#x4F17;</strong>&#xFF08;&#x800C;&#x975E;&#x5C40;&#x9650;&#x4E8E;&#x6570;&#x636E;&#x5E93;&#x8FD9;&#x6837;&#x7684;&#x7EC6;&#x5206;&#x9886;&#x57DF;&#xFF09;&#x3002;</p><h2 id="41-%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83">4.1 &#x6D4B;&#x8BD5;&#x73AF;&#x5883;</h2><p>&#x672C;&#x8282;&#x4F7F;&#x7528; <code>fio</code> &#x6D4B;&#x8BD5; 4 &#x79CD;&#x6A21;&#x5F0F;&#xFF1A;</p><ol><li>synchronous reads</li><li><code>posix-aio</code> (implemented as a thread pool)</li><li><code>linux-aio</code></li><li><code>io_uring</code></li></ol><p>&#x786C;&#x4EF6;&#xFF1A;</p><ul><li>NVMe &#x5B58;&#x50A8;&#x8BBE;&#x5907;&#xFF0C;&#x7269;&#x7406;&#x6781;&#x9650;&#x80FD;&#x6253;&#x5230; <strong>3.5M IOPS</strong>&#x3002;</li><li>8 &#x6838;&#x5904;&#x7406;&#x5668;</li></ul><h2 id="42-%E5%9C%BA%E6%99%AF%E4%B8%80%EF%BC%9Adirect-io-1kb-%E9%9A%8F%E6%9C%BA%E8%AF%BB%EF%BC%88%E7%BB%95%E8%BF%87-page-cache%EF%BC%89">4.2 &#x573A;&#x666F;&#x4E00;&#xFF1A;direct I/O <code>1KB</code> &#x968F;&#x673A;&#x8BFB;&#xFF08;&#x7ED5;&#x8FC7; page cache&#xFF09;</h2><p>&#x7B2C;&#x4E00;&#x7EC4;&#x6D4B;&#x8BD5;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x6240;&#x6709;&#x7684;&#x8BFB;&#x8BF7;&#x6C42;&#x90FD;&#x80FD;<strong>&#x547D;&#x4E2D;&#x5B58;&#x50A8;&#x8BBE;&#x5907;</strong>&#xFF08;all reads to hit the storage&#xFF09;&#xFF0C;<strong>&#x5B8C;&#x5168;&#x7ED5;&#x5F00;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x9875;&#x7F13;&#x5B58;</strong>&#xFF08;page cache&#xFF09;&#x3002;</p><p>&#x6D4B;&#x8BD5;&#x914D;&#x7F6E;&#xFF1A;</p><ul><li>8 &#x4E2A; CPU &#x6267;&#x884C; 72 <code>fio</code> job&#xFF0C;</li><li>&#x6BCF;&#x4E2A; job &#x968F;&#x673A;&#x8BFB;&#x53D6; 4 &#x4E2A;&#x6587;&#x4EF6;&#xFF0C;</li><li><code>iodepth=8</code>&#xFF08;number of I/O units to keep in flight against the file.&#xFF09;&#x3002;</li></ul><p>&#x8FD9;&#x79CD;&#x914D;&#x7F6E;<strong>&#x4FDD;&#x8BC1;&#x4E86; CPU &#x5904;&#x4E8E;&#x9971;&#x548C;&#x72B6;&#x6001;</strong>&#xFF0C;&#x4FBF;&#x4E8E;&#x89C2;&#x5BDF; I/O &#x6027;&#x80FD;&#x3002; &#x5982;&#x679C; CPU &#x6570;&#x91CF;&#x8DB3;&#x591F;&#x591A;&#xFF0C;&#x90A3;&#x6BCF;&#x7EC4;&#x6D4B;&#x8BD5;&#x90FD;&#x53EF;&#x80FD;&#x4F1A;&#x6253;&#x6EE1;&#x8BBE;&#x5907;&#x5E26;&#x5BBD;&#xFF0C;&#x7ED3;&#x679C;&#x5BF9; I/O &#x538B;&#x6D4B;&#x5C31;&#x6CA1;&#x610F;&#x4E49;&#x4E86;&#x3002;</p><p>&#x8868; 1. Direct I/O&#xFF08;&#x7ED5;&#x8FC7;&#x7CFB;&#x7EDF;&#x9875;&#x7F13;&#x5B58;&#xFF09;&#xFF1A;1KB &#x968F;&#x673A;&#x8BFB;&#xFF0C;CPU 100% &#x4E0B;&#x7684; I/O &#x6027;&#x80FD;</p><!--kg-card-begin: html--><table width="100%" style="box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 890px; border: 1px solid rgb(208, 208, 208); margin-bottom: 16px; margin-top: 0px; overflow: auto; color: rgb(51, 51, 51); font-family: -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, Arial, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: center;"><strong style="box-sizing: border-box; font-weight: 600;">backend</strong></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">IOPS</strong></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">context switches</strong></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">IOPS &#xB1;% vs io_uring</strong></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: center;">sync</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">814,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">27,625,004</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(255, 0, 0);"><strong style="box-sizing: border-box; font-weight: 600;">-42.6%</strong></span></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: center;">posix-aio (thread pool)</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">433,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">64,112,335</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(255, 0, 0);"><strong style="box-sizing: border-box; font-weight: 600;">-69.4%</strong></span></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: center;">linux-aio</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">1,322,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">10,114,149</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(255, 0, 0);"><strong style="box-sizing: border-box; font-weight: 600;">-6.7%</strong></span></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: center;">io_uring (basic)</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">1,417,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">11,309,574</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">&#x2014;</strong></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: center;">io_uring (enhanced)</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">1,486,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">11,483,468</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(0, 128, 0);"><strong style="box-sizing: border-box; font-weight: 600;">4.9%</strong></span></td></tr></tbody></table><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://arthurchiao.art/assets/img/intro-to-io-uring/benchmark-1.png" class="kg-image" alt loading="lazy" width="65" height="65"></figure><p>&#x51E0;&#x70B9;&#x5206;&#x6790;&#xFF1A;</p><ol><li><code>io_uring</code> &#x76F8;&#x6BD4; <code>linux-aio</code> &#x786E;&#x5B9E;&#x6709;&#x4E00;&#x5B9A;&#x63D0;&#x5347;&#xFF0C;&#x4F46;&#x5E76;&#x975E;&#x9769;&#x547D;&#x6027;&#x7684;&#x3002;</li><li>&#x5F00;&#x542F;&#x9AD8;&#x7EA7;&#x7279;&#x6027;&#xFF0C;&#x4F8B;&#x5982; buffer &amp; file registration &#x4E4B;&#x540E;&#x6027;&#x80FD;&#x6709;&#x8FDB;&#x4E00;&#x6B65;&#x63D0;&#x5347; &#x2014;&#x2014; &#x4F46;&#x4E5F;&#x8FD8; &#x6CA1;&#x6709;&#x5230;&#x4E3A;&#x4E86;&#x8FD9;&#x4E9B;&#x6027;&#x80FD;&#x800C;&#x91CD;&#x5199;&#x6574;&#x4E2A;&#x5E94;&#x7528;&#x7684;&#x5730;&#x6B65;&#xFF0C;&#x9664;&#x975E;&#x4F60;&#x662F;&#x641E;&#x6570;&#x636E;&#x5E93;&#x7814;&#x53D1;&#xFF0C;&#x60F3;&#x69A8;&#x53D6;&#x786C;&#x4EF6;&#x7684;&#x6700;&#x540E;&#x4E00;&#x5206;&#x6027;&#x80FD;&#x3002;</li></ol><p><code>io_uring</code> and <code>linux-aio</code> <strong>&#x90FD;&#x6BD4;&#x540C;&#x6B65; read &#x63A5;&#x53E3;&#x5FEB; 2 &#x500D;&#xFF0C;&#x800C;&#x540E;&#x8005;&#x53C8;&#x6BD4; posix-aio &#x5FEB; 2 &#x500D;</strong> &#x2014;&#x2014; &#x521D;&#x770B;&#x6709;&#x70B9;&#x5DEE;&#x5F02;&#x3002;&#x4F46;&#x770B;&#x770B;<strong>&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#x6B21;&#x6570;</strong>&#xFF0C;&#x5C31;&#x4E0D;&#x96BE;&#x7406;&#x89E3;&#x4E3A;&#x4EC0;&#x4E48; posix-aio &#x8FD9;&#x4E48;&#x6162;&#x4E86;&#x3002;</p><ul><li>&#x540C;&#x6B65; read &#x6027;&#x80FD;&#x5DEE;&#x662F;&#x56E0;&#x4E3A;&#xFF1A;&#x5728;&#x8FD9;&#x79CD;&#x6CA1;&#x6709; page cache &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C; <strong>&#x6BCF;&#x6B21; read &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x90FD;&#x4F1A;&#x963B;&#x585E;&#xFF0C;&#x56E0;&#x6B64;&#x5C31;&#x4F1A;&#x6D89;&#x53CA;&#x4E00;&#x6B21;&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;</strong>&#x3002;</li><li><code>posix-aio</code> &#x6027;&#x80FD;&#x66F4;&#x5DEE;&#x662F;&#x56E0;&#x4E3A;&#xFF1A;&#x4E0D;&#x4EC5;&#x5185;&#x6838;&#x548C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E4B;&#x95F4;&#x8981;&#x9891;&#x7E41;&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#xFF0C;&#x7EBF;&#x7A0B;&#x6C60;&#x7684;<strong>&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x4E4B;&#x95F4;&#x4E5F;&#x5728;&#x9891;&#x7E41;&#x5207;&#x6362;</strong>&#x3002;</li></ul><h2 id="42-%E5%9C%BA%E6%99%AF%E4%BA%8C%EF%BC%9Abuffered-io-1kb-%E9%9A%8F%E6%9C%BA%E8%AF%BB%EF%BC%88%E6%95%B0%E6%8D%AE%E6%8F%90%E5%89%8D%E5%8A%A0%E8%BD%BD%E5%88%B0%E5%86%85%E5%AD%98%EF%BC%8C100-hot-cache%EF%BC%89">4.2 &#x573A;&#x666F;&#x4E8C;&#xFF1A;buffered I/O <code>1KB</code> &#x968F;&#x673A;&#x8BFB;&#xFF08;&#x6570;&#x636E;&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x5230;&#x5185;&#x5B58;&#xFF0C;100% hot cache&#xFF09;</h2><p>&#x7B2C;&#x4E8C;&#x7EC4;&#x6D4B;&#x8BD5; buffered I/O&#xFF1A;</p><p>&#x5C06;&#x6587;&#x4EF6;&#x6570;&#x636E;&#x63D0;&#x524D;&#x52A0;&#x8F7D;&#x5230;&#x5185;&#x5B58;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x6D4B;&#x968F;&#x673A;&#x8BFB;&#x3002;</p><ul><li>&#x7531;&#x4E8E;<strong>&#x6570;&#x636E;&#x5168;&#x90E8;&#x5728; page cache</strong>&#xFF0C;&#x56E0;&#x6B64;<strong>&#x540C;&#x6B65; read &#x6C38;&#x8FDC;&#x4E0D;&#x4F1A;&#x963B;&#x585E;</strong>&#x3002;</li><li>&#x8FD9;&#x79CD;&#x573A;&#x666F;&#x4E0B;&#xFF0C;&#x6211;&#x4EEC;&#x9884;&#x671F;<strong>&#x540C;&#x6B65;&#x8BFB;&#x548C; io_uring &#x7684;&#x6027;&#x80FD;&#x5DEE;&#x8DDD;&#x4E0D;&#x5927;&#xFF08;&#x90FD;&#x662F;&#x6700;&#x597D;&#x7684;&#xFF09;</strong>&#x3002;</li></ul><ol><li>&#x5176;&#x4ED6;&#x6D4B;&#x8BD5;&#x6761;&#x4EF6;&#x4E0D;&#x53D8;&#x3002;</li></ol><p>&#x8868; 2. Buffered I/O&#xFF08;&#x6570;&#x636E;&#x5168;&#x90E8;&#x6765;&#x81EA; page cache&#xFF0C;100% hot cache&#xFF09;&#xFF1A;1KB &#x968F;&#x673A;&#x8BFB;&#xFF0C;100% CPU &#x4E0B;&#x7684; I/O &#x6027;&#x80FD;</p><!--kg-card-begin: html--><table width="100%" style="box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 890px; border: 1px solid rgb(208, 208, 208); margin-bottom: 16px; margin-top: 0px; overflow: auto; color: rgb(51, 51, 51); font-family: -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, Arial, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229);"><strong style="box-sizing: border-box; font-weight: 600;">Backend</strong></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">IOPS</strong></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">context switches</strong></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">IOPS &#xB1;% vs io_uring</strong></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229);">sync</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">4,906,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">&#xA0;105,797</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(255, 0, 0);"><strong style="box-sizing: border-box; font-weight: 600;">-2.3%</strong></span></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229);">posix-aio (thread pool)</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">1,070,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">114,791,187</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(255, 0, 0);"><strong style="box-sizing: border-box; font-weight: 600;">-78.7%</strong></span></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229);">linux-aio</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">4,127,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">105,052</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><span style="box-sizing: border-box; color: rgb(255, 0, 0);"><strong style="box-sizing: border-box; font-weight: 600;">-17.9%</strong></span></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229);">io_uring</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">5,024,000</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;">106,683</td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); text-align: right;"><strong style="box-sizing: border-box; font-weight: 600;">&#x2014;</strong></td></tr></tbody></table><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://arthurchiao.art/assets/img/intro-to-io-uring/benchmark-2.png" class="kg-image" alt loading="lazy" width="65" height="65"></figure><p>&#x7ED3;&#x679C;&#x5206;&#x6790;&#xFF1A;</p><p>&#x540C;&#x6B65;&#x8BFB;&#x548C; <code>io_uring</code> &#x6027;&#x80FD;&#x5DEE;&#x8DDD;&#x786E;&#x5B9E;&#x5F88;&#x5C0F;&#xFF0C;&#x4E8C;&#x8005;&#x90FD;&#x662F;&#x6700;&#x597D;&#x7684;&#x3002;</p><p>&#x4F46;&#x6CE8;&#x610F;&#xFF0C;<strong>&#x5B9E;&#x9645;&#x7684;&#x5E94;&#x7528;</strong>&#x4E0D;&#x53EF;&#x80FD;&#x4E00;&#x76F4; 100% &#x65F6;&#x95F4;&#x6267;&#x884C; IO &#x64CD;&#x4F5C;&#xFF0C;&#x56E0;&#x6B64; &#x57FA;&#x4E8E;&#x540C;&#x6B65;&#x8BFB;&#x7684;&#x771F;&#x5B9E;&#x5E94;&#x7528;&#x6027;&#x80FD;<strong>&#x8FD8;&#x662F;&#x8981;&#x6BD4;&#x57FA;&#x4E8E; io_uring &#x8981;&#x5DEE;&#x7684;</strong>&#xFF0C;&#x56E0;&#x4E3A; io_uring &#x4F1A;&#x5C06;&#x591A;&#x4E2A;&#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x6279;&#x5904;&#x7406;&#x5316;&#x3002;</p><ol><li><code>posix-aio</code> &#x6027;&#x80FD;&#x6700;&#x5DEE;&#xFF0C;&#x76F4;&#x63A5;&#x539F;&#x56E0;&#x662F;<strong>&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#x6B21;&#x6570;&#x592A;&#x591A;</strong>&#xFF0C;&#x8FD9;&#x4E5F;&#x548C;&#x573A;&#x666F;&#x76F8;&#x5173;&#xFF1A; &#x5728;&#x8FD9;&#x79CD; <strong>CPU &#x9971;&#x548C;&#x7684;&#x60C5;&#x51B5;&#x4E0B;</strong>&#xFF0C;&#x5B83;&#x7684;&#x7EBF;&#x7A0B;&#x6C60;&#x53CD;&#x800C;&#x662F;&#x7D2F;&#x8D58;&#xFF0C;&#x4F1A;&#x5B8C;&#x5168;&#x62D6;&#x6162;&#x6027;&#x80FD;&#x3002;</li><li><code>linux-aio</code> &#x5E76;<strong>&#x4E0D;&#x662F;&#x9488;&#x5BF9; buffered I/O &#x8BBE;&#x8BA1;&#x7684;</strong>&#xFF0C;&#x5728;&#x8FD9;&#x79CD; page cache &#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x7684;&#x573A;&#x666F;&#xFF0C; &#x5B83;&#x7684;<strong>&#x5F02;&#x6B65;&#x63A5;&#x53E3;&#x53CD;&#x800C;&#x4F1A;&#x9020;&#x6210;&#x6027;&#x80FD;&#x635F;&#x5931;</strong> &#x2014;&#x2014; &#x5C06;&#x64CD;&#x4F5C;&#x5206; &#x4E3A; dispatch &#x548C; consume &#x4E24;&#x6B65;&#x4E0D;&#x4F46;&#x6CA1;&#x6709;&#x6027;&#x80FD;&#x6536;&#x76CA;&#xFF0C;&#x53CD;&#x800C;&#x6709;&#x989D;&#x5916;&#x5F00;&#x9500;&#x3002;</li></ol><h2 id="43-%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%B0%8F%E7%BB%93">4.3 &#x6027;&#x80FD;&#x6D4B;&#x8BD5;&#x5C0F;&#x7ED3;</h2><p>&#x6700;&#x540E;&#x518D;&#x6B21;&#x63D0;&#x9192;&#xFF0C;&#x672C;&#x8282;&#x662F;&#x6781;&#x7AEF;&#x5E94;&#x7528;/&#x573A;&#x666F;&#xFF08;<strong>100% CPU + 100% cache miss/hit</strong>&#xFF09;&#x6D4B;&#x8BD5;&#xFF0C; &#x771F;&#x5B9E;&#x5E94;&#x7528;&#x7684;&#x884C;&#x4E3A;&#x901A;&#x5E38;&#x5904;&#x4E8E;&#x540C;&#x6B65;&#x8BFB;&#x548C;&#x5F02;&#x6B65;&#x8BFB;&#x4E4B;&#x95F4;&#xFF1A;&#x65F6;&#x800C;&#x4E00;&#x4E9B;&#x963B;&#x585E;&#x64CD;&#x4F5C;&#xFF0C;&#x65F6;&#x800C;&#x4E00;&#x4E9B;&#x975E;&#x963B;&#x585E;&#x64CD;&#x4F5C;&#x3002; &#x4F46;&#x4E0D;&#x7BA1;&#x600E;&#x4E48;&#x8BF4;&#xFF0C;&#x7528;&#x4E86; io_uring &#x4E4B;&#x540E;&#xFF0C;&#x7528;&#x6237;&#x5C31;&#x65E0;&#x9700;&#x62C5;&#x5FC3;&#x540C;&#x6B65;&#x548C;&#x5F02;&#x6B65;&#x5404;&#x5360;&#x591A;&#x5C11;&#x6BD4;&#x4F8B;&#x4E86;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;<strong>&#x5728;&#x4EFB;&#x4F55;&#x573A;&#x666F;&#x4E0B;&#x90FD;&#x8868;&#x73B0;&#x826F;&#x597D;</strong>&#x3002;</p><ol><li>&#x5982;&#x679C;&#x64CD;&#x4F5C;&#x662F;&#x975E;&#x963B;&#x585E;&#x7684;&#xFF0C;<code>io_uring</code> &#x4E0D;&#x4F1A;&#x6709;&#x989D;&#x5916;&#x5F00;&#x9500;&#xFF1B;</li><li>&#x5982;&#x679C;&#x64CD;&#x4F5C;&#x662F;&#x963B;&#x585E;&#x5F0F;&#x7684;&#xFF0C;&#x4E5F;&#x6CA1;&#x5173;&#x7CFB;&#xFF0C;<code>io_uring</code> &#x662F;&#x5B8C;&#x5168;&#x5F02;&#x6B65;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x4F9D;&#x8D56;&#x7EBF;&#x7A0B;&#x6C60;&#x6216;&#x6602;&#x8D35;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x5207;&#x6362;&#x6765;&#x5B9E;&#x73B0;&#x8FD9;&#x79CD;&#x5F02;&#x6B65;&#x80FD;&#x529B;&#xFF1B;</li></ol><p>&#x672C;&#x6587;&#x6D4B;&#x8BD5;&#x7684;&#x90FD;&#x662F;&#x968F;&#x673A;&#x8BFB;&#xFF0C;&#x4F46;&#x5BF9;<strong>&#x5176;&#x4ED6;&#x7C7B;&#x578B;&#x7684;&#x64CD;&#x4F5C;</strong>&#xFF0C;<code>io_uring</code> &#x8868;&#x73B0;&#x4E5F;&#x662F;&#x975E;&#x5E38;&#x826F;&#x597D;&#x7684;&#x3002;&#x4F8B;&#x5982;&#xFF1A;</p><ol><li>&#x6253;&#x5F00;/&#x5173;&#x95ED;&#x6587;&#x4EF6;</li><li>&#x8BBE;&#x7F6E;&#x5B9A;&#x65F6;&#x5668;</li><li>&#x901A;&#x8FC7; network sockets &#x4F20;&#x8F93;&#x6570;&#x636E;</li></ol><p>&#x800C;&#x4E14;<strong>&#x4F7F;&#x7528;&#x7684;&#x662F;&#x540C;&#x4E00;&#x5957; io_uring &#x63A5;&#x53E3;</strong>&#x3002;</p><h2 id="44-scylladb-%E4%B8%8E-iouring">4.4 ScyllaDB &#x4E0E; io_uring</h2><p>Scylla &#x91CD;&#x5EA6;&#x4F9D;&#x8D56; direct I/O&#xFF0C;&#x4ECE;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x4F7F;&#x7528; <code>linux-aio</code>&#x3002; &#x5728;&#x6211;&#x4EEC;&#x8F6C;&#x5411; <code>io_uring</code> &#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x6700;&#x5F00;&#x59CB;&#x6D4B;&#x8BD5;&#x663E;&#x793A;&#x5BF9;&#x67D0;&#x4E9B; workloads&#xFF0C;&#x80FD;&#x53D6;&#x5F97; 50% &#x4EE5;&#x4E0A;&#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;&#x3002; &#x4F46;<strong>&#x6DF1;&#x5165;&#x7814;&#x7A76;&#x4E4B;&#x540E;&#x53D1;&#x73B0;</strong>&#xFF0C;&#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;<strong>&#x4E4B;&#x524D;&#x7684; linux-aio &#x7528;&#x7684;&#x4E0D;&#x591F;&#x597D;</strong>&#x3002; &#x8FD9;&#x4E5F;&#x63ED;&#x793A;&#x4E86;&#x4E00;&#x4E2A;<strong>&#x7ECF;&#x5E38;&#x88AB;&#x5FFD;&#x89C6;&#x7684;&#x4E8B;&#x5B9E;</strong>&#xFF1A;&#x83B7;&#x5F97;&#x9AD8;&#x6027;&#x80FD;&#x6CA1;&#x6709;&#x90A3;&#x4E48;&#x96BE;&#xFF08;&#x524D;&#x63D0;&#x662F;&#x4F60;&#x5F97;&#x5F04;&#x5BF9;&#x4E86;&#xFF09;&#x3002; &#x5728;&#x5BF9;&#x6BD4; <code>io_uring</code> &#x548C; <code>linux-aio</code> &#x5E94;&#x7528;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;<strong>&#x5F88;&#x5FEB;&#x6539;&#x8FDB;&#x4E86;&#x4E00;&#x7248;&#xFF0C;&#x4E8C;&#x8005;&#x7684;&#x6027;&#x80FD;&#x5DEE;&#x8DDD;&#x5C31;&#x6D88;&#x5931;&#x4E86;</strong>&#x3002; &#x4F46;&#x5766;&#x7387;&#x5730;&#x8BF4;&#xFF0C;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;<strong>&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x5DE5;&#x4F5C;&#x91CF;</strong>&#xFF0C;&#x56E0;&#x4E3A;&#x8981;&#x6539;&#x52A8;&#x4E00;&#x4E2A;&#x5DF2;&#x7ECF;&#x4F7F;&#x7528; &#x4E86;&#x5F88;&#x591A;&#x5E74;&#x7684;&#x57FA;&#x4E8E; <code>linux-aio</code> &#x7684;&#x63A5;&#x53E3;&#x3002;&#x800C;&#x5BF9; <code>io_uring</code> &#x5E94;&#x7528;&#x6765;&#x8BF4;&#xFF0C;&#x505A;&#x7C7B;&#x4F3C;&#x7684;&#x6539;&#x52A8;&#x662F;&#x8F7B;&#x800C; &#x6613;&#x4E3E;&#x7684;&#x3002;</p><p>&#x4EE5;&#x4E0A;&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x573A;&#x666F;&#xFF0C;<code>io_uring</code> &#x76F8;&#x6BD4; <code>linux-aio</code> &#x7684;<strong>&#x4F18;&#x52BF;</strong>&#x662F;&#x80FD;&#x5E94;&#x7528;&#x4E8E; file I/O &#x4E4B;&#x5916;&#x7684;&#x573A;&#x666F;&#x3002; &#x6B64;&#x5916;&#xFF0C;&#x5B83;&#x8FD8;&#x81EA;&#x5E26;&#x4E86;&#x7279;&#x6B8A;&#x7684; <a href="https://www.p99conf.io/">&#x9AD8;&#x6027;&#x80FD;</a> &#x63A5;&#x53E3;&#xFF0C;&#x4F8B;&#x5982; buffer registration&#x3001;file registration&#x3001;&#x8F6E;&#x8BE2;&#x6A21;&#x5F0F;&#x7B49;&#x7B49;&#x3002;</p><p>&#x542F;&#x7528; <code>io_uring</code> &#x9AD8;&#x7EA7;&#x7279;&#x6027;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x770B;&#x5230;&#x6027;&#x80FD;&#x786E;&#x5B9E;&#x6709;&#x63D0;&#x5347;&#xFF1A;Intel Optane &#x8BBE;&#x5907;&#xFF0C;&#x5355;&#x4E2A; CPU &#x8BFB;&#x53D6; 512 &#x5B57;&#x8282;&#xFF0C;&#x89C2;&#x5BDF;&#x5230; 5% &#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;&#x3002;&#x4E0E; &#x8868; 1 &amp; 2 &#x5BF9;&#x5F97;&#x4E0A;&#x3002;&#x867D;&#x7136; 5% &#x7684;&#x63D0;&#x5347; &#x770B;&#x4E0A;&#x53BB;&#x4E0D;&#x662F;&#x592A;&#x5927;&#xFF0C;&#x4F46;&#x5BF9;&#x4E8E;&#x5E0C;&#x671B;&#x538B;&#x69A8;&#x51FA;&#x786C;&#x4EF6;&#x6240;&#x6709;&#x6027;&#x80FD;&#x7684;&#x6570;&#x636E;&#x5E93;&#x6765;&#x8BF4;&#xFF0C;&#x8FD8;&#x662F;&#x975E;&#x5E38;&#x5B9D;&#x8D35;&#x7684;&#x3002;</p><!--kg-card-begin: html--><table width="100%" style="box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 890px; border: 1px solid rgb(208, 208, 208); margin-bottom: 16px; margin-top: 0px; overflow: auto; color: rgb(51, 51, 51); font-family: -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, Arial, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: justify; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(255, 255, 255); border-top: 1px solid rgb(198, 203, 209);"><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); vertical-align: top; width: 444.667px;"><mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">linux-aio:</mark><p style="box-sizing: border-box; margin: 0px auto 16px; width: 418px; float: none;">Throughput : 330 MB/s<br style="box-sizing: border-box;">Lat average : 1549 usec<br style="box-sizing: border-box;">Lat quantile= 0.5 : 1547 usec<br style="box-sizing: border-box;">Lat quantile= 0.95 : 1694 usec<br style="box-sizing: border-box;">Lat quantile= 0.99 : 1703 usec<br style="box-sizing: border-box;">Lat quantile=0.999 : 1950 usec<br style="box-sizing: border-box;">Lat max : 2177 usec</p></td><td style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229); vertical-align: top; width: 444.667px;"><mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">io_uring, with buffer and file registration and poll:</mark><p style="box-sizing: border-box; margin: 0px auto 16px; width: 418px; float: none;">Throughput : 346 MB/s<br style="box-sizing: border-box;">Lat average : 1470 usec<br style="box-sizing: border-box;">Lat quantile= 0.5 : 1468 usec<br style="box-sizing: border-box;">Lat quantile= 0.95 : 1558 usec<br style="box-sizing: border-box;">Lat quantile= 0.99 : 1613 usec<br style="box-sizing: border-box;">Lat quantile=0.999 : 1674 usec<br style="box-sizing: border-box;">Lat max : 1829 usec</p></td></tr><tr style="box-sizing: border-box; border-bottom: 1px solid rgb(208, 208, 208); background-color: rgb(246, 248, 250); border-top: 1px solid rgb(198, 203, 209);"><td colspan="2" style="box-sizing: border-box; padding: 6px 13px; border: 1px solid rgb(223, 226, 229);">&#x4F7F;&#x7528; 1 &#x4E2A; CPU &#x4ECE; Intel Optane &#x8BBE;&#x5907;&#x8BFB;&#x53D6; 512 &#x5B57;&#x8282;&#x3002;1000 &#x5E76;&#x53D1;&#x8BF7;&#x6C42;&#x3002;linux-aio &#x548C; io_uring basic interface &#x6027;&#x80FD;&#x5DEE;&#x5F02;&#x5F88;&#x5C0F;&#x3002; &#x4F46;&#x542F;&#x7528; io_uring &#x9AD8;&#x7EA7;&#x7279;&#x6027;&#x540E;&#xFF0C;&#x6709; 5% &#x7684;&#x6027;&#x80FD;&#x5DEE;&#x8DDD;&#x3002;</td></tr></tbody></table><!--kg-card-end: html--><h1 id="5-ebpf">5 eBPF</h1><p>eBPF &#x4E5F;&#x662F;&#x4E00;&#x4E2A;<strong>&#x4E8B;&#x4EF6;&#x9A71;&#x52A8;&#x6846;&#x67B6;</strong>&#xFF08;&#x56E0;&#x6B64;&#x4E5F;&#x662F;&#x5F02;&#x6B65;&#x7684;&#xFF09;&#xFF0C;&#x5141;&#x8BB8;&#x7528;&#x6237;&#x7A7A;&#x95F4;&#x7A0B;&#x5E8F;&#x52A8;&#x6001;&#x5411;&#x5185;&#x6838;&#x6CE8;&#x5165;&#x5B57;&#x8282;&#x7801;&#xFF0C;&#x4E3B;&#x8981;&#x6709;&#x4E24;&#x4E2A;&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF1A;</p><ol><li>Networking&#xFF1A;<a href="https://arthurchiao.art/">&#x672C;&#x7AD9;</a> &#x5DF2;&#x7ECF;&#x6709;&#x76F8;&#x5F53;&#x591A;&#x7684;&#x6587;&#x7AE0;</li><li>Tracing &amp; Observability&#xFF1A;&#x4F8B;&#x5982; <a href="https://github.com/iovisor/bcc">bcc</a> &#x7B49;&#x5DE5;&#x5177;</li></ol><p>eBPF &#x5728;&#x5185;&#x6838; 4.9 &#x9996;&#x6B21;&#x5F15;&#x5165;&#xFF0C;4.19 &#x4EE5;&#x540E;&#x529F;&#x80FD;&#x5DF2;&#x7ECF;&#x5F88;&#x5F3A;&#x5927;&#x3002;&#x66F4;&#x591A;&#x5173;&#x4E8E; eBPF &#x7684;&#x6F14;&#x8FDB;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x53C2;&#x8003;&#xFF1A; <a href="https://arthurchiao.art/blog/ebpf-and-k8s-zh/">&#xFF08;&#x8BD1;&#xFF09;&#x5927;&#x89C4;&#x6A21;&#x5FAE;&#x670D;&#x52A1;&#x5229;&#x5668;&#xFF1A;eBPF + Kubernetes&#xFF08;KubeCon, 2020&#xFF09;</a>&#x3002;</p><p>&#x8C08;&#x5230;&#x4E0E; io_uring &#x7684;&#x7ED3;&#x5408;&#xFF0C;&#x5C31;&#x662F;&#x7528; bcc &#x4E4B;&#x7C7B;&#x7684;&#x5DE5;&#x5177;&#x8DDF;&#x8E2A;&#x4E00;&#x4E9B; I/O &#x76F8;&#x5173;&#x7684;&#x5185;&#x6838;&#x51FD;&#x6570;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p><ol><li>Trace how much time an application spends sleeping, and what led to those sleeps. (<code>wakeuptime</code>)</li><li>Find all programs in the system that reached a particular place in the code (<code>trace</code>)</li><li>Analyze network TCP throughput aggregated by subnet (<code>tcpsubnet</code>)</li><li>Measure how much time the kernel spent processing softirqs (<code>softirqs</code>)</li><li>Capture information about all short-lived files, where they come from, and for how long they were opened (<code>filelife</code>)</li></ol><h1 id="6-%E7%BB%93%E6%9D%9F%E8%AF%AD">6 &#x7ED3;&#x675F;&#x8BED;</h1><p><code>io_uring</code> &#x548C; eBPF &#x8FD9;&#x4E24;&#x5927;&#x7279;&#x6027;<strong>&#x5C06;&#x7ED9; Linux &#x7F16;&#x7A0B;&#x5E26;&#x6765;&#x9769;&#x547D;&#x6027;&#x7684;&#x53D8;&#x5316;</strong>&#x3002; &#x6709;&#x4E86;&#x8FD9;&#x4E24;&#x4E2A;&#x7279;&#x6027;&#x7684;&#x52A0;&#x6301;&#xFF0C;&#x5F00;&#x53D1;&#x8005;&#x5C31;&#x80FD;&#x66F4;&#x5145;&#x5206;&#x5730;&#x5229;&#x7528; <a href="https://www.scylladb.com/2019/05/28/aws-new-i3en-meganode">Amazon i3en meganode systems</a> &#x4E4B;&#x7C7B;&#x7684;&#x591A;&#x6838;/&#x591A;&#x5904;&#x7406;&#x5668;&#x7CFB;&#x7EDF;&#xFF0C;&#x4EE5;&#x53CA; <a href="https://www.scylladb.com/2017/09/27/intel-optane-scylla-providing-speed-memory-database-persistency">Intel Optane &#x6301;&#x4E45;&#x5B58;&#x50A8;</a> &#x4E4B;&#x7C7B;&#x7684; <code>us</code> &#x7EA7;&#x5EF6;&#x8FDF;&#x5B58;&#x50A8;&#x8BBE;&#x5907;&#x3002;</p><h1 id="%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99">&#x53C2;&#x8003;&#x8D44;&#x6599;</h1><ul><li><a href="https://kernel.dk/io_uring.pdf">Efficient IO with io_uring</a>, pdf</li><li><a href="https://lwn.net/Articles/776703/">Ringing in a new asynchronous I/O API</a>, lwn.net</li><li><a href="https://lwn.net/Articles/810414/">The rapid growth of io_uring</a>, lwn.net</li><li><a href="https://github.com/axboe/liburing/tree/master/man">System call API</a>, manpage</li></ul><!--kg-card-begin: markdown--><hr>
<p>&#x539F;&#x6587;:<a href="https://arthurchiao.art/blog/intro-to-io-uring-zh/">https://arthurchiao.art/blog/intro-to-io-uring-zh/</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[deepseek 对话]]></title><description><![CDATA[deepseek,ai,chat]]></description><link>https://www.listera.top/deepseek-ai-chat/</link><guid isPermaLink="false">67932b99d693600524c92112</guid><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Fri, 24 Jan 2025 05:57:16 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: html--><iframe src="https://www.deepseekv3.com/embed" width="100%" height="600px" frameborder="0"></iframe>
<!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[xmake 测试]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>makefile &#x4E0D;&#x4F1A;&#x5199;&#xFF0C;cmake &#x867D;&#x7136;&#x5E38;&#x7528;&#xFF0C;&#x4F46;&#x6587;&#x6863;&#x592A;&#x70C2;&#x4E86;&#xFF0C;&#x771F;&#x4E0D;&#x597D;&#x7528;&#x3002;&#x524D;&#x4E00;&#x6BB5;&#x6709;&#x540C;&#x4E8B;&#x8BF4; xmake &#x4E0D;&#x9519;&#xFF0C;&#x8BD5;&#x8BD5;</p>
<hr>
<h3 id="%E5%AE%89%E8%A3%85">&#x5B89;&#x88C5;</h3>
<p>&#x5B98;&#x65B9;&#x7F51;&#x7AD9;&#x6709;&#x811A;&#x672C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4E0B;</p>]]></description><link>https://www.listera.top/xmake-ce-shi/</link><guid isPermaLink="false">654aedb0174d5326c7b45032</guid><category><![CDATA[xmake]]></category><category><![CDATA[cmake]]></category><category><![CDATA[C++]]></category><category><![CDATA[编译]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Thu, 21 Sep 2023 09:37:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>makefile &#x4E0D;&#x4F1A;&#x5199;&#xFF0C;cmake &#x867D;&#x7136;&#x5E38;&#x7528;&#xFF0C;&#x4F46;&#x6587;&#x6863;&#x592A;&#x70C2;&#x4E86;&#xFF0C;&#x771F;&#x4E0D;&#x597D;&#x7528;&#x3002;&#x524D;&#x4E00;&#x6BB5;&#x6709;&#x540C;&#x4E8B;&#x8BF4; xmake &#x4E0D;&#x9519;&#xFF0C;&#x8BD5;&#x8BD5;</p>
<hr>
<h3 id="%E5%AE%89%E8%A3%85">&#x5B89;&#x88C5;</h3>
<p>&#x5B98;&#x65B9;&#x7F51;&#x7AD9;&#x6709;&#x811A;&#x672C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;&#xFF0C;&#x8FD9;&#x91CC;&#x662F; github &#x4E0B;&#x8F7D;&#x7684;&#x5B89;&#x88C5;&#x5305;</p>
<pre><code class="language-bash">./xmake-v2.8.1.gz.run
</code></pre>
<h3 id="%E6%B5%8B%E8%AF%95">&#x6D4B;&#x8BD5;</h3>
<p>&#x4E0D;&#x4F1A;&#x5199;makefile&#xFF1F;&#x6CA1;&#x5173;&#x7CFB;&#xFF0C;&#x76F4;&#x63A5;&#x5728;&#x6E90;&#x7801;&#x76EE;&#x5F55;&#x8FD0;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x5373;&#x53EF;&#x76F4;&#x63A5;&#x7F16;&#x8BD1;:</p>
<pre><code class="language-bash">xmake
xmake -P .

xmake f -m release
xmake f -p cross --cross=arm-linux-gnueabihf- -m release

xmake build -j4
xmake install -o install/armhf
xmake uninstall
xmake clean
</code></pre>
<p>xmake&#x4F1A;&#x81EA;&#x52A8;&#x626B;&#x63CF;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6E90;&#x7801;&#x7ED3;&#x6784;&#xFF0C;&#x751F;&#x6210;&#x4E00;&#x4E2A;xmake.lua&#x5DE5;&#x7A0B;&#x63CF;&#x8FF0;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5C1D;&#x8BD5;&#x76F4;&#x63A5;&#x7F16;&#x8BD1;&#x3002;</p>
<p>&#x60F3;&#x8981;&#x76F4;&#x63A5;&#x8FD0;&#x884C;&#x7F16;&#x8BD1;&#x540E;&#x7684;&#x53EF;&#x6267;&#x884C;&#x7A0B;&#x5E8F;&#xFF0C;&#x7B80;&#x5355;&#xFF0C;&#x76F4;&#x63A5;&#x6572;:</p>
<pre><code class="language-bash">xmake run
</code></pre>
<h3 id="%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE">&#x521B;&#x5EFA;&#x9879;&#x76EE;</h3>
<pre><code class="language-bash">xmake create -l c++ -t qt.quickapp test
xmake create -l c -t test
xmake project -k vs2017 -m &quot;debug,release&quot;
xmake project -k makefile
</code></pre>
<p>&#x9759;&#x6001;&#x5E93;</p>
<pre><code class="language-bash">xmake create -l c -t static test
</code></pre>
<p>&#x52A8;&#x6001;&#x5E93;</p>
<pre><code class="language-bash">xmake create -l c -t shared test
</code></pre>
<h3 id="%E6%89%8B%E5%B7%A5%E5%A1%AB%E5%86%99-xmakelua">&#x624B;&#x5DE5;&#x586B;&#x5199; xmake.lua</h3>
<pre><code class="language-lua">target(&quot;test&quot;)
    set_kind(&quot;binary&quot;) 
    add_files(&quot;src/*.c&quot;)
    
target(&quot;test&quot;) 
    set_kind(&quot;static&quot;) 
    add_files(&quot;src/*.c&quot;)
    add_files(&quot;lib/libxxx.a&quot;, &quot;obj/bbb.o&quot;)
    
target(&quot;test&quot;)
    set_kind(&quot;binary&quot;) 
    add_files(&quot;src/*.c&quot;) 
    if is_mode(&quot;debug&quot;) then 
        add_cxflags(&quot;-DDEBUG&quot;) 
    end
    
target(&quot;test&quot;) 
    set_kind(&quot;binary&quot;) 
    add_files(&quot;src/*.c&quot;) 
    after_build(function (target) 
        os.exec(&quot;file %s&quot;, target:targetfile()) 
    end)
</code></pre>
<p>&#x6DFB;&#x52A0;&#x4F9D;&#x8D56;</p>
<pre><code class="language-lua">target(&quot;test&quot;) 
    set_kind(&quot;static&quot;) 
    add_files(&quot;src/test/*.c&quot;) 
target(&quot;hello&quot;) 
    add_deps(&quot;test&quot;) --&#x6DFB;&#x52A0;&#x4F9D;&#x8D56; 
    set_kind(&quot;binary&quot;) 
    add_files(&quot;src/hello/*.c&quot;)
</code></pre>
<p>&#x76F4;&#x63A5;&#x8FD0;&#x884C;</p>
<pre><code class="language-bash">xmake run
</code></pre>
<p>&#x5982;&#x679C;&#x6709;&#x591A;&#x4E2A;target&#x76EE;&#x6807;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x9700;&#x8981;&#x8FD0;&#x884C;&#x7684;target&#x540D;&#xFF0C;&#x4F8B;&#x5982;:</p>
<pre><code class="language-bash">xmake run test
</code></pre>
<p>&#x60F3;&#x8981;&#x5FEB;&#x901F;&#x8C03;&#x8BD5;&#x7A0B;&#x5E8F;&#xFF1F;&#x52A0;&#x4E0A;-d&#x53C2;&#x6570;&#x5373;&#x53EF;</p>
<pre><code class="language-bash">xmake run -d test
</code></pre>
<h3 id="%E7%95%8C%E9%9D%A2">&#x754C;&#x9762;</h3>
<pre><code class="language-bash">xmake f --menu
</code></pre>
<p>&#x53EF;&#x4EE5;&#x663E;&#x793A;&#x6307;&#x5B9A; target &#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5404;&#x79CD;&#x914D;&#x7F6E;&#x6765;&#x6E90;&#x4E8E;&#x54EA;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x548C;&#x5177;&#x4F53;&#x7684;&#x884C;&#x6570;&#x3002;</p>
<pre><code class="language-bash">xmake show -t &lt;target&gt;
</code></pre>
<p>&#x68C0;&#x67E5;&#x5DE5;&#x7A0B;&#x914D;&#x7F6E;&#x548C;&#x4EE3;&#x7801;&#x3002;</p>
<pre><code class="language-bash">xmake check
</code></pre>
<h3 id="xrepo%E9%A1%B9%E7%9B%AE">xrepo&#x9879;&#x76EE;</h3>
<pre><code class="language-bash">xmake create -l c++ test
</code></pre>
<p>xmake.lua &#x6587;&#x4EF6;</p>
<pre><code class="language-lua">add_rules(&quot;mode.debug&quot;, &quot;mode.release&quot;)
add_requires(&quot;cereal&quot;)
target(&quot;test&quot;)
    set_kind(&quot;binary&quot;)
    add_files(&quot;src/*.cpp&quot;)
    add_packages(&quot;cereal&quot;)
</code></pre>
<p>github &#x65E0;&#x6CD5;&#x4E0B;&#x8F7D;&#xFF0C;&#x624B;&#x5DE5;&#x4E0B;&#x8F7D;</p>
<pre><code class="language-bash">mkdir lib &amp;&amp; cd lib
wget -O cereal-1.3.2.tar.gz https://ghproxy.com/https://github.com/USCiLab/cereal/archive/refs/tags/v1.3.2.tar.gz
</code></pre>
<p>&#x8BBE;&#x7F6E;&#x641C;&#x7D22;&#x5E93;&#x7EDD;&#x5BF9;&#x8DEF;&#x5F84;</p>
<pre><code class="language-bash">xmake --pkg_searchdirs=&quot;/mnt/d/Download/test/lib/&quot;
</code></pre>
<p>&#x7F16;&#x8BD1;</p>
<pre><code class="language-bash">xmake
</code></pre>
<p>&#x770B;&#x8D77;&#x6765;&#x53EF;&#x4EE5;&#xFF0C;&#x4E0D;&#x8FC7;&#x672C;&#x5730;&#x6CA1;&#x6709;&#x5934;&#x6587;&#x4EF6;&#xFF0C;&#x770B;&#x8D77;&#x6765;&#x4E5F;&#x4E0D;&#x592A;&#x8212;&#x670D;</p>
<h4 id="%E8%AF%AD%E4%B9%89%E7%89%88%E6%9C%AC%E8%AE%BE%E7%BD%AE">&#x8BED;&#x4E49;&#x7248;&#x672C;&#x8BBE;&#x7F6E;</h4>
<p>Xmake &#x7684;&#x4F9D;&#x8D56;&#x5305;&#x7BA1;&#x7406;&#x662F;&#x5B8C;&#x5168;&#x652F;&#x6301;&#x8BED;&#x4E49;&#x7248;&#x672C;&#x9009;&#x62E9;&#x7684;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;&#x201D;~1.6.1&#x201D;&#xFF0C;&#x5BF9;&#x4E8E;&#x8BED;&#x4E49;&#x7248;&#x672C;&#x7684;&#x5177;&#x4F53;&#x63CF;&#x8FF0;&#x89C1;&#xFF1A;<a href="https://semver.org/">https://semver.org/</a></p>
<p>&#x6BD4;&#x5982;&#x4E0B;&#x9762;&#x4E00;&#x4E9B;&#x8BED;&#x4E49;&#x7248;&#x672C;&#x5199;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox 1.6.*&quot;, &quot;pcre 1.3.x&quot;, &quot;libpng ^1.18&quot;) 
add_requires(&quot;libpng ~1.16&quot;, &quot;zlib 1.1.2 || &gt;=1.2.11 &lt;1.3.0&quot;)
</code></pre>
<p>&#x5F53;&#x7136;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x5BF9;&#x5F53;&#x524D;&#x7684;&#x4F9D;&#x8D56;&#x5305;&#x7684;&#x7248;&#x672C;&#x6CA1;&#x6709;&#x7279;&#x6B8A;&#x8981;&#x6C42;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8FD9;&#x4E48;&#x5199;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox&quot;, &quot;libpng&quot;, &quot;zlib&quot;)
</code></pre>
<p>&#x8FD9;&#x4F1A;&#x4F7F;&#x7528;&#x5DF2;&#x77E5;&#x7684;&#x6700;&#x65B0;&#x7248;&#x672C;&#x5305;&#xFF0C;&#x6216;&#x8005;&#x662F;master&#x5206;&#x652F;&#x7684;&#x6E90;&#x7801;&#x7F16;&#x8BD1;&#x7684;&#x5305;&#xFF0C;&#x5982;&#x679C;&#x5F53;&#x524D;&#x5305;&#x6709;git repo&#x5730;&#x5740;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x80FD;&#x6307;&#x5B9A;&#x7279;&#x5B9A;&#x5206;&#x652F;&#x7248;&#x672C;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox master&quot;) 
add_requires(&quot;tbox dev&quot;)
</code></pre>
<p>Xmake &#x7684;&#x8BED;&#x4E49;&#x7248;&#x672C;&#x652F;&#x6301;&#xFF0C;&#x5728;&#x51E0;&#x5E74;&#x524D;&#x5C31;&#x5DF2;&#x7ECF;&#x5F88;&#x597D;&#x7684;&#x652F;&#x6301;&#xFF0C;&#x800C; vcpkg &#x4E5F;&#x4EC5;&#x4EC5;&#x5728;&#x6700;&#x8FD1;&#x4E00;&#x5E74;&#x624D;&#x901A;&#x8FC7;&#x6E05;&#x5355;&#x6A21;&#x5F0F;&#x52C9;&#x5F3A;&#x652F;&#x6301;&#x5B83;&#x3002;</p>
<p>&#x5373;&#x4F7F;&#x73B0;&#x5728;&#xFF0C;vcpkg &#x5BF9;&#x7248;&#x672C;&#x8BED;&#x4E49;&#x7684;&#x652F;&#x6301;&#x4E5F;&#x5F88;&#x53D7;&#x9650;&#xFF0C;&#x53EA;&#x80FD;&#x652F;&#x6301; &gt;=1.0, 1.0 &#x7B49;&#x51E0;&#x79CD;&#x7248;&#x672C;&#x6A21;&#x5F0F;&#xFF0C;&#x60F3;&#x8981;&#x9009;&#x62E9;&#x4EFB;&#x610F;&#x7248;&#x672C;&#x7684;&#x5305;&#xFF0C;&#x6BD4;&#x5982; &gt;=1.0 &lt;1.5 &#x7B49;&#x590D;&#x6742;&#x7248;&#x672C;&#x6761;&#x4EF6;&#x7684;&#x5305;&#xFF0C;vcpkg &#x8FD8;&#x662F;&#x65E0;&#x6CD5;&#x652F;&#x6301;&#x3002;</p>
<h5 id="%E5%8F%AF%E9%80%89%E5%8C%85%E8%AE%BE%E7%BD%AE">&#x53EF;&#x9009;&#x5305;&#x8BBE;&#x7F6E;</h5>
<p>&#x5982;&#x679C;&#x6307;&#x5B9A;&#x7684;&#x4F9D;&#x8D56;&#x5305;&#x5F53;&#x524D;&#x5E73;&#x53F0;&#x4E0D;&#x652F;&#x6301;&#xFF0C;&#x6216;&#x8005;&#x7F16;&#x8BD1;&#x5B89;&#x88C5;&#x5931;&#x8D25;&#x4E86;&#xFF0C;&#x90A3;&#x4E48; Xmake &#x4F1A;&#x7F16;&#x8BD1;&#x62A5;&#x9519;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x6709;&#x4E9B;&#x5FC5;&#x987B;&#x8981;&#x4F9D;&#x8D56;&#x67D0;&#x4E9B;&#x5305;&#x624D;&#x80FD;&#x5DE5;&#x4F5C;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x8FD9;&#x662F;&#x5408;&#x7406;&#x7684;&#x3002; &#x4F46;&#x662F;&#x5982;&#x679C;&#x6709;&#x4E9B;&#x5305;&#x662F;&#x53EF;&#x9009;&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x5373;&#x4F7F;&#x6CA1;&#x6709;&#x4E5F;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x7F16;&#x8BD1;&#x4F7F;&#x7528;&#x7684;&#x8BDD;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A;&#x53EF;&#x9009;&#x5305;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox&quot;, {optional = true})
</code></pre>
<h5 id="%E4%BD%BF%E7%94%A8%E7%B3%BB%E7%BB%9F%E5%BA%93">&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x5E93;</h5>
<p>&#x9ED8;&#x8BA4;&#x7684;&#x8BBE;&#x7F6E;&#xFF0C;Xmake &#x4F1A;&#x53BB;&#x4F18;&#x5148;&#x68C0;&#x6D4B;&#x7CFB;&#x7EDF;&#x5E93;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF08;&#x5982;&#x679C;&#x6CA1;&#x8BBE;&#x7F6E;&#x7248;&#x672C;&#x8981;&#x6C42;&#xFF09;&#xFF0C;&#x5982;&#x679C;&#x7528;&#x6237;&#x5B8C;&#x5168;&#x4E0D;&#x60F3;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x5E93;&#x4EE5;&#x53CA;&#x7B2C;&#x4E09;&#x65B9;&#x5305;&#x7BA1;&#x7406;&#x63D0;&#x4F9B;&#x7684;&#x5E93;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox&quot;, {system = false})
</code></pre>
<p>&#x800C;&#x5982;&#x679C;&#x914D;&#x7F6E;&#x6210;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox&quot;, {system = true})
</code></pre>
<p>&#x5C31;&#x662F;&#x4EC5;&#x4EC5;&#x67E5;&#x627E;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x5E93;&#xFF0C;&#x4E0D;&#x4F1A;&#x53BB;&#x8FDC;&#x7A0B;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;&#x5B83;&#xFF0C;&#x8FD9;&#x7C7B;&#x4F3C;&#x4E8E; CMake &#x7684; find_package&#xFF0C;&#x4F46;&#x662F;&#x96C6;&#x6210;&#x65B9;&#x5F0F;&#x66F4;&#x52A0;&#x7B80;&#x5355;&#x4E00;&#x81F4;&#x3002;</p>
<h5 id="%E4%BD%BF%E7%94%A8%E8%B0%83%E8%AF%95%E7%89%88%E6%9C%AC%E7%9A%84%E5%8C%85">&#x4F7F;&#x7528;&#x8C03;&#x8BD5;&#x7248;&#x672C;&#x7684;&#x5305;</h5>
<p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x60F3;&#x540C;&#x65F6;&#x6E90;&#x7801;&#x8C03;&#x8BD5;&#x4F9D;&#x8D56;&#x5305;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A;&#x4F7F;&#x7528;debug&#x7248;&#x672C;&#x7684;&#x5305;&#xFF08;&#x5F53;&#x7136;&#x524D;&#x63D0;&#x662F;&#x8FD9;&#x4E2A;&#x5305;&#x652F;&#x6301;debug&#x7F16;&#x8BD1;&#xFF09;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;tbox&quot;, {debug = true})
</code></pre>
<h5 id="%E5%90%AF%E7%94%A8%E5%8C%85%E7%9A%84%E5%8F%AF%E9%80%89%E7%89%B9%E6%80%A7">&#x542F;&#x7528;&#x5305;&#x7684;&#x53EF;&#x9009;&#x7279;&#x6027;</h5>
<p>&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5B89;&#x88C5;&#x5E26;&#x6709;&#x6307;&#x5B9A;&#x7279;&#x6027;&#x7684;&#x5305;&#xFF0C;&#x6BD4;&#x5982;&#x5B89;&#x88C5;&#x5F00;&#x542F;&#x4E86; zlib &#x548C; libx265 &#x7684; ffmpeg &#x5305;&#x3002;</p>
<pre><code class="language-lua">add_requires(&quot;ffmpeg&quot;, {configs = {zlib = true, libx265 = true}})
</code></pre>
<h5 id="%E4%BC%A0%E9%80%92%E9%A2%9D%E5%A4%96%E7%9A%84%E7%BC%96%E8%AF%91%E9%80%89%E9%A1%B9">&#x4F20;&#x9012;&#x989D;&#x5916;&#x7684;&#x7F16;&#x8BD1;&#x9009;&#x9879;</h5>
<p>&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4F20;&#x9012;&#x989D;&#x5916;&#x7684;&#x7F16;&#x8BD1;&#x9009;&#x9879;&#x7ED9;&#x5305;&#xFF1A;</p>
<pre><code class="language-lua">add_requires(&quot;spdlog&quot;, {configs = {cxflags = &quot;-Dxxx&quot;}})
</code></pre>
<hr>
<h3 id="%E7%8B%AC%E7%AB%8B%E7%9A%84%E5%8C%85%E7%AE%A1%E7%90%86%E5%91%BD%E4%BB%A4-xrepo">&#x72EC;&#x7ACB;&#x7684;&#x5305;&#x7BA1;&#x7406;&#x547D;&#x4EE4; Xrepo</h3>
<p>Xrepo &#x662F;&#x4E00;&#x4E2A;&#x57FA;&#x4E8E; Xmake &#x7684;&#x8DE8;&#x5E73;&#x53F0; C/C++ &#x5305;&#x7BA1;&#x7406;&#x5668;&#x3002;</p>
<p>&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x72EC;&#x7ACB;&#x4E8E; Xmake &#x7684;&#x547D;&#x4EE4;&#x7A0B;&#x5E8F;&#xFF0C;&#x7528;&#x4E8E;&#x8F85;&#x52A9;&#x7528;&#x6237;&#x53BB;&#x7BA1;&#x7406;&#x4F9D;&#x8D56;&#x5305;&#xFF0C;&#x7C7B;&#x4F3C; vcpkg/conan&#xFF0C;&#x4F46;&#x76F8;&#x6BD4;&#x5B83;&#x4EEC;&#xFF0C;&#x6709;&#x989D;&#x5916;&#x591A;&#x4E86;&#x4E00;&#x4E9B;&#x5B9E;&#x7528;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x7B80;&#x5355;&#x4ECB;&#x7ECD;&#x4E00;&#x4E9B;&#x3002;</p>
<h4 id="%E5%A4%9A%E4%BB%93%E5%BA%93%E7%AE%A1%E7%90%86">&#x591A;&#x4ED3;&#x5E93;&#x7BA1;&#x7406;</h4>
<p>&#x9664;&#x4E86;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4ECE;&#x5B98;&#x65B9;&#x4ED3;&#x5E93;&#xFF1A;xmake-repo &#x68C0;&#x7D22;&#x5B89;&#x88C5;&#x5305;&#x4E4B;&#x5916;&#xFF0C; &#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x4EFB;&#x610F;&#x591A;&#x4E2A;&#x81EA;&#x5EFA;&#x7684;&#x4ED3;&#x5E93;&#xFF0C;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x5B8C;&#x5168;&#x9694;&#x79BB;&#x5916;&#x7F51;&#xFF0C;&#x4EC5;&#x4EC5;&#x5728;&#x516C;&#x53F8;&#x5185;&#x90E8;&#x7F51;&#x7EDC;&#x7EF4;&#x62A4;&#x79C1;&#x6709;&#x5305;&#x7684;&#x5B89;&#x88C5;&#x96C6;&#x6210;&#x3002;</p>
<p>&#x53EA;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x4E0B;&#x9762;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x6DFB;&#x52A0;&#x4E0A;&#x81EA;&#x5DF1;&#x7684;&#x4ED3;&#x5E93;&#x5730;&#x5740;&#xFF1A;</p>
<pre><code class="language-bash">xrepo add-repo myrepo https://github.com/mygroup/myrepo
</code></pre>
<p>&#x57FA;&#x672C;&#x4F7F;&#x7528;</p>
<pre><code class="language-bash">xrepo install zlib tbox
</code></pre>
<p>&#x5B89;&#x88C5;&#x6307;&#x5B9A;&#x7248;&#x672C;&#x5305;</p>
<p>&#x5B8C;&#x6574;&#x652F;&#x6301; Semantic Versioning (&#x8BED;&#x4E49;&#x7248;&#x672C;)&#x3002;</p>
<pre><code class="language-bash">xrepo install &quot;zlib 1.2.x&quot; 
xrepo install &quot;zlib &gt;=1.2.0&quot;
</code></pre>
<p>&#x5B89;&#x88C5;&#x6307;&#x5B9A;&#x5E73;&#x53F0;&#x5305;</p>
<pre><code class="language-bash">xrepo install -p iphoneos -a arm64 zlib 
xrepo install -p android [--ndk=/xxx] zlib 
xrepo install -p mingw [--mingw=/xxx] zlib 
xrepo install -p cross --sdk=/xxx/arm-linux-musleabi-cross zlib
</code></pre>
<p>&#x5B89;&#x88C5;&#x8C03;&#x8BD5;&#x7248;&#x672C;&#x5305;</p>
<pre><code class="language-bash">xrepo install -m debug zlib
</code></pre>
<p>&#x5B89;&#x88C5;&#x52A8;&#x6001;&#x5E93;&#x7248;&#x672C;&#x5305;</p>
<pre><code class="language-bash">xrepo install -k shared zlib
</code></pre>
<p>&#x5B89;&#x88C5;&#x6307;&#x5B9A;&#x914D;&#x7F6E;&#x5305;</p>
<pre><code class="language-bash">xrepo install -f &quot;vs_runtime=MD&quot; zlib 
xrepo install -f &quot;regex=true,thread=true&quot; boost
</code></pre>
<p>&#x5B89;&#x88C5;&#x7B2C;&#x4E09;&#x65B9;&#x5305;&#x7BA1;&#x7406;&#x5668;&#x7684;&#x5305;</p>
<pre><code class="language-bash">xrepo install brew::zlib 
xrepo install vcpkg::zlib 
xrepo install conan::zlib/1.2.11
</code></pre>
<p>&#x67E5;&#x770B;&#x5305;&#x7684;&#x5E93;&#x4F7F;&#x7528;&#x4FE1;&#x606F;</p>
<pre><code class="language-bash">xrepo fetch pcre2 { { linkdirs = { &quot;/usr/local/Cellar/pcre2/10.33/lib&quot; }, links = { &quot;pcre2-8&quot; }, defines = { &quot;PCRE2_CODE_UNIT_WIDTH=8&quot; }, includedirs = &quot;/usr/local/Cellar/pcre2/10.33/include&quot; } }
</code></pre>
<p>&#x5BFC;&#x5165;&#x5BFC;&#x51FA;&#x5B89;&#x88C5;&#x540E;&#x7684;&#x5305;</p>
<p>xrepo &#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x5BFC;&#x51FA;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x540E;&#x7684;&#x5305;&#xFF0C;&#x5305;&#x62EC;&#x5BF9;&#x5E94;&#x7684;&#x5E93;&#x6587;&#x4EF6;&#xFF0C;&#x5934;&#x6587;&#x4EF6;&#x7B49;&#x7B49;&#x3002;</p>
<pre><code class="language-bash">xrepo export -o /tmp/output zlib
</code></pre>
<p>&#x4E5F;&#x53EF;&#x4EE5;&#x5728;&#x5176;&#x4ED6;&#x673A;&#x5668;&#x4E0A;&#x5BFC;&#x5165;&#x4E4B;&#x524D;&#x5BFC;&#x51FA;&#x7684;&#x5B89;&#x88C5;&#x5305;&#xFF0C;&#x5B9E;&#x73B0;&#x5305;&#x7684;&#x8FC1;&#x79FB;&#x3002;</p>
<pre><code class="language-bash">xrepo import -i /xxx/packagedir zlib
</code></pre>
<p>&#x641C;&#x7D22;&#x652F;&#x6301;&#x7684;&#x5305;</p>
<pre><code class="language-bash">xrepo search zlib &quot;pcr*&quot; 
    zlib: 
      -&gt; zlib: A Massively Spiffy Yet Delicately Unobtrusive Compression Library (in xmake-repo) 
    pcr*:
      -&gt; pcre2: A Perl Compatible Regular Expressions Library (in xmake-repo) 
      -&gt; pcre: A Perl Compatible Regular Expressions Library (in xmake-repo)
</code></pre>
<p>&#x53E6;&#x5916;&#xFF0C;&#x73B0;&#x5728;&#x8FD8;&#x53EF;&#x4EE5;&#x4ECE; vcpkg, conan, conda &#x4EE5;&#x53CA; apt &#x7B49;&#x7B2C;&#x4E09;&#x65B9;&#x5305;&#x7BA1;&#x7406;&#x5668;&#x4E2D;&#x641C;&#x7D22;&#x5B83;&#x4EEC;&#x7684;&#x5305;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x52A0;&#x4E0A;&#x5BF9;&#x5E94;&#x7684;&#x5305;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x5C31;&#x884C;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;</p>
<pre><code class="language-bash">xrepo search vcpkg::pcre 
The package names: 
    vcpkg::pcre: 
      -&gt; vcpkg::pcre-8.44
      #8: Perl Compatible Regular Expressions -&gt; vcpkg::pcre2-10.35
      #2: PCRE2 is a re-working of the original Perl Compatible Regular Expressions library
</code></pre>
<h4 id="%E5%8C%85%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86">&#x5305;&#x865A;&#x62DF;&#x73AF;&#x5883;&#x7BA1;&#x7406;</h4>
<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x6DFB;&#x52A0; xmake.lua &#x6587;&#x4EF6;&#xFF0C;&#x5B9A;&#x5236;&#x5316;&#x4E00;&#x4E9B;&#x5305;&#x914D;&#x7F6E;&#xFF0C;&#x7136;&#x540E;&#x8FDB;&#x5165;&#x7279;&#x5B9A;&#x7684;&#x5305; shell &#x73AF;&#x5883;&#x3002;</p>
<pre><code class="language-lua">add_requires(&quot;zlib 1.2.11&quot;) 
add_requires(&quot;python 3.x&quot;, &quot;luajit&quot;)
</code></pre>
<p>&#x8FDB;&#x884C;&#x865A;&#x62DF;&#x73AF;&#x5883;&#xFF1A;</p>
<pre><code class="language-bash">xrepo env shell 
python --version 
luajit --version
</code></pre>
<hr>
<h3 id="%E5%9C%A8-xmake-%E4%B8%AD%E9%9B%86%E6%88%90%E7%AC%AC%E4%B8%89%E6%96%B9%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F">&#x5728; Xmake &#x4E2D;&#x96C6;&#x6210;&#x7B2C;&#x4E09;&#x65B9;&#x6784;&#x5EFA;&#x7CFB;&#x7EDF;</h3>
<h4 id="%E5%9C%A8-xmake-%E4%B8%AD%E9%9B%86%E6%88%90-cmake-%E9%A1%B9%E7%9B%AE">&#x5728; Xmake &#x4E2D;&#x96C6;&#x6210; Cmake &#x9879;&#x76EE;</h4>
<p>Xmake &#x5E76;&#x4E0D;&#x6253;&#x7B97;&#x5206;&#x88C2; C/C++ &#x751F;&#x6001;&#xFF0C;&#x5B83;&#x80FD;&#x5F88;&#x597D;&#x548C;&#x517C;&#x5BB9;&#x590D;&#x7528;&#x73B0;&#x6709; cmake/autoconf/meson &#x7EF4;&#x62A4;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x6BD4;&#x5982;&#x53EF;&#x4EE5;&#x5C06;&#x4E00;&#x4E9B;&#x5176;&#x4ED6;&#x4F7F;&#x7528; CMake &#x7EF4;&#x62A4;&#x7684;&#x4EE3;&#x7801;&#x5E93;&#xFF0C;&#x76F4;&#x63A5;&#x672C;&#x5730;&#x96C6;&#x6210;&#x8FDB;&#x6765;&#xFF0C;&#x53C2;&#x4E0E;&#x6DF7;&#x5408;&#x7F16;&#x8BD1;&#x3002;</p>
<p>&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;Xmake &#x4E0D;&#x4F1A;&#x5F3A;&#x5236;&#x7528;&#x6237;&#x5C06;&#x6240;&#x6709;&#x7684;&#x9879;&#x76EE;&#x91CD;&#x65B0; port &#x5230; xmake.lua&#xFF0C;&#x73B0;&#x6709;&#x7684; CMake &#x9879;&#x76EE;&#xFF0C;&#x4E00;&#x6837;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x96C6;&#x6210;&#x5230; Xmake &#x9879;&#x76EE;&#x4E2D;&#x53BB;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x6211;&#x4EEC;&#x6709;&#x5982;&#x4E0B;&#x9879;&#x76EE;&#x7ED3;&#x6784;&#xFF1A;</p>
<pre><code>.
&#x251C;&#x2500;&#x2500; foo 
&#x2502; &#x251C;&#x2500;&#x2500; CMakeLists.txt 
&#x2502; &#x2514;&#x2500;&#x2500; src 
&#x2502; &#x251C;&#x2500;&#x2500; foo.c 
&#x2502; &#x2514;&#x2500;&#x2500; foo.h 
&#x251C;&#x2500;&#x2500; src 
&#x2502; &#x2514;&#x2500;&#x2500; main.c 
&#x251C;&#x2500;&#x2500; test.lua 
&#x2514;&#x2500;&#x2500; xmake.lua
</code></pre>
<p>foo &#x76EE;&#x5F55;&#x4E0B;&#x662F;&#x4E00;&#x4E2A;&#x4F7F;&#x7528; CMake &#x7EF4;&#x62A4;&#x7684;&#x9759;&#x6001;&#x5E93;&#xFF0C;&#x800C;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x4F7F;&#x7528;&#x4E86; Xmake &#x6765;&#x7EF4;&#x62A4;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5728; xmake.lua &#x4E2D;&#x901A;&#x8FC7;&#x5B9A;&#x4E49; package(&quot;foo&quot;) &#x5305;&#x6765;&#x63CF;&#x8FF0;&#x5982;&#x4F55;&#x6784;&#x5EFA; foo &#x4EE3;&#x7801;&#x5E93;&#x3002;</p>
<pre><code class="language-lua">add_rules(&quot;mode.debug&quot;, &quot;mode.release&quot;) 

package(&quot;foo&quot;) 
add_deps(&quot;cmake&quot;) 
set_sourcedir(path.join(os.scriptdir(), &quot;foo&quot;)) 
on_install(function (package) 
local configs = {} 
table.insert(configs, &quot;-DCMAKE_BUILD_TYPE=&quot; .. (package:debug() and &quot;Debug&quot; or &quot;Release&quot;)) 
table.insert(configs, &quot;-DBUILD_SHARED_LIBS=&quot; .. (package:config(&quot;shared&quot;) and &quot;ON&quot; or &quot;OFF&quot;)) 
import(&quot;package.tools.cmake&quot;).install(package, configs) 
end) 

on_test(function (package) 
assert(package:has_cfuncs(&quot;add&quot;, {includes = &quot;foo.h&quot;})) 
end) 
package_end() 

add_requires(&quot;foo&quot;) 
target(&quot;demo&quot;) 
set_kind(&quot;binary&quot;) 
add_files(&quot;src/main.c&quot;) 
add_packages(&quot;foo&quot;)
</code></pre>
<p>&#x5176;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x8FC7; set_sourcedir() &#x6765;&#x8BBE;&#x7F6E; foo &#x5305;&#x7684;&#x4EE3;&#x7801;&#x76EE;&#x5F55;&#x4F4D;&#x7F6E;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7; import &#x5BFC;&#x5165; package.tools.cmake &#x8F85;&#x52A9;&#x6A21;&#x5757;&#x6765;&#x8C03;&#x7528; cmake &#x6784;&#x5EFA;&#x4EE3;&#x7801;&#xFF0C;xmake &#x4F1A;&#x81EA;&#x52A8;&#x83B7;&#x53D6;&#x751F;&#x6210;&#x7684; libfoo.a &#x548C;&#x5BF9;&#x5E94;&#x7684;&#x5934;&#x6587;&#x4EF6;&#x3002;</p>
<blockquote>
<p>&#x5982;&#x679C;&#x4EC5;&#x4EC5;&#x672C;&#x5730;&#x6E90;&#x7801;&#x96C6;&#x6210;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x9700;&#x8981;&#x989D;&#x5916;&#x8BBE;&#x7F6E; add_urls &#x548C; add_versions&#x3002;</p>
</blockquote>
<p>&#x5B9A;&#x4E49;&#x5B8C;&#x5305;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; add_requires(&quot;foo&quot;) &#x548C; add_packages(&quot;foo&quot;) &#x6765;&#x96C6;&#x6210;&#x4F7F;&#x7528;&#x5B83;&#x4E86;&#xFF0C;&#x5C31;&#x8DDF;&#x96C6;&#x6210;&#x8FDC;&#x7A0B;&#x5305;&#x4E00;&#x6837;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#x3002;</p>
<p>&#x53E6;&#x5916;&#xFF0C;on_test &#x662F;&#x53EF;&#x9009;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x8981;&#x4E25;&#x683C;&#x68C0;&#x6D4B;&#x5305;&#x7684;&#x7F16;&#x8BD1;&#x5B89;&#x88C5;&#x662F;&#x5426;&#x6210;&#x529F;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x91CC;&#x9762;&#x505A;&#x4E00;&#x4E9B;&#x6D4B;&#x8BD5;&#x3002;</p>
<h4 id="%E5%9C%A8-xmake-%E4%B8%AD%E9%9B%86%E6%88%90-autoconf-%E9%A1%B9%E7%9B%AE">&#x5728; Xmake &#x4E2D;&#x96C6;&#x6210; Autoconf &#x9879;&#x76EE;</h4>
<p>&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; package.tools.autoconf &#x6765;&#x672C;&#x5730;&#x96C6;&#x6210;&#x5E26;&#x6709; autoconf &#x7EF4;&#x62A4;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x4EE3;&#x7801;&#x5E93;&#x3002;</p>
<pre><code class="language-lua">package(&quot;libev&quot;) 
set_sourcedir(path.join(os.scriptdir(), &quot;3rd/libev&quot;)) 

on_install(function (package) 
import(&quot;package.tools.autoconf&quot;).install(package) 
end)
</code></pre>
<p>package.tools.autoconf &#x548C; package.tools.cmake &#x6A21;&#x5757;&#x90FD;&#x662F;&#x53EF;&#x4EE5;&#x652F;&#x6301; mingw/cross/iphoneos/android &#x7B49;&#x4EA4;&#x53C9;&#x7F16;&#x8BD1;&#x5E73;&#x53F0;&#x548C;&#x5DE5;&#x5177;&#x94FE;&#x7684;&#xFF0C;xmake &#x4F1A;&#x81EA;&#x52A8;&#x4F20;&#x9012;&#x5BF9;&#x5E94;&#x7684;&#x5DE5;&#x5177;&#x94FE;&#x8FDB;&#x53BB;&#xFF0C;&#x7528;&#x6237;&#x4E0D;&#x9700;&#x8981;&#x505A;&#x4EFB;&#x4F55;&#x5176;&#x4ED6;&#x4E8B;&#x60C5;&#x3002;</p>
<h4 id="%E5%9C%A8-xmake-%E4%B8%AD%E9%9B%86%E6%88%90-gn-%E9%A1%B9%E7%9B%AE">&#x5728; Xmake &#x4E2D;&#x96C6;&#x6210; Gn &#x9879;&#x76EE;</h4>
<p>&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; package.tools.gn &#x6765;&#x672C;&#x5730;&#x96C6;&#x6210;&#x5E26;&#x6709; GN &#x7EF4;&#x62A4;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x4EE3;&#x7801;&#x5E93;&#x3002;</p>
<pre><code class="language-lua">package(&quot;skia&quot;) 
set_sourcedir(path.join(os.scriptdir(), &quot;3rd/skia&quot;)) 
add_deps(&quot;gn&quot;, &quot;ninja&quot;) 

on_install(function (package) 
import(&quot;package.tools.gn&quot;).install(package) 
end)
</code></pre>
<h4 id="%E5%9C%A8-xmake-%E4%B8%AD%E6%9F%A5%E6%89%BE%E4%BD%BF%E7%94%A8-cmakec-%E5%8C%85">&#x5728; Xmake &#x4E2D;&#x67E5;&#x627E;&#x4F7F;&#x7528; CMake/C++ &#x5305;</h4>
<p>&#x73B0;&#x5728; CMake &#x5DF2;&#x7ECF;&#x662F;&#x4E8B;&#x5B9E;&#x4E0A;&#x7684;&#x6807;&#x51C6;&#xFF0C;&#x6240;&#x4EE5; CMake &#x63D0;&#x4F9B;&#x7684; find_package &#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x67E5;&#x627E;&#x5927;&#x91CF;&#x7684;&#x7CFB;&#x7EDF;&#x5E93;&#x548C;&#x6A21;&#x5757;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5B8C;&#x5168;&#x590D;&#x7528; CMake &#x7684;&#x8FD9;&#x90E8;&#x5206;&#x751F;&#x6001;&#x6765;&#x6269;&#x5145; xmake &#x5BF9;&#x5305;&#x7684;&#x96C6;&#x6210;&#x3002;</p>
<p>&#x53EA;&#x9700;&#x8981;&#x50CF;&#x96C6;&#x6210; vcpkg/conan &#x5305;&#x90A3;&#x6837;&#xFF0C;&#x5C06;&#x5305;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x6539;&#x6210; cmake:: &#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#x3002;</p>
<pre><code class="language-lua">add_requires(&quot;cmake::ZLIB&quot;, {alias = &quot;zlib&quot;, system = true}) 

target(&quot;test&quot;) 
set_kind(&quot;binary&quot;) 
add_files(&quot;src/*.c&quot;) 
add_packages(&quot;zlib&quot;)
</code></pre>
<p>&#x6211;&#x4EEC;&#x6307;&#x5B9A; system = true &#x544A;&#x8BC9; xmake &#x5F3A;&#x5236;&#x4ECE;&#x7CFB;&#x7EDF;&#x4E2D;&#x8C03;&#x7528; cmake &#x67E5;&#x627E;&#x5305;&#xFF0C;&#x5982;&#x679C;&#x627E;&#x4E0D;&#x5230;&#xFF0C;&#x4E0D;&#x518D;&#x8D70;&#x5B89;&#x88C5;&#x903B;&#x8F91;&#xFF0C;&#x56E0;&#x4E3A; cmake &#x6CA1;&#x6709;&#x63D0;&#x4F9B;&#x7C7B;&#x4F3C; vcpkg/conan &#x7B49;&#x5305;&#x7BA1;&#x7406;&#x5668;&#x7684;&#x5B89;&#x88C5;&#x529F;&#x80FD;&#xFF0C;&#x53EA;&#x63D0;&#x4F9B;&#x4E86;&#x5305;&#x67E5;&#x627E;&#x7279;&#x6027;&#x3002;</p>
<p>&#x6307;&#x5B9A;&#x7248;&#x672C;</p>
<pre><code class="language-lua">add_requires(&quot;cmake::OpenCV 4.1.1&quot;, {system = true})
</code></pre>
<p>&#x6307;&#x5B9A;&#x7EC4;&#x4EF6;</p>
<pre><code class="language-lua">add_requires(&quot;cmake::Boost&quot;, {system = true, configs = {components = {&quot;regex&quot;, &quot;system&quot;}})}
</code></pre>
<p>&#x9884;&#x8BBE;&#x5F00;&#x5173;</p>
<pre><code class="language-lua">add_requires(&quot;cmake::Boost&quot;, {system = true, configs = {components = {&quot;regex&quot;, &quot;system&quot;}, presets = {Boost_USE_STATIC_LIB = true}}})
</code></pre>
<p>&#x76F8;&#x5F53;&#x4E8E;&#x5185;&#x90E8;&#x8C03;&#x7528; find_package &#x67E5;&#x627E;&#x5305;&#x4E4B;&#x524D;&#xFF0C;&#x5728; CMakeLists.txt &#x4E2D;&#x9884;&#x5B9A;&#x4E49;&#x4E00;&#x4E9B;&#x914D;&#x7F6E;&#xFF0C;&#x63A7;&#x5236; find_package &#x7684;&#x67E5;&#x627E;&#x7B56;&#x7565;&#x548C;&#x72B6;&#x6001;&#x3002;</p>
<pre><code class="language-lua">set(Boost_USE_STATIC_LIB ON) 
-- will be used in FindBoost.cmake find_package(Boost REQUIRED COMPONENTS regex system)
</code></pre>
<p>&#x8BBE;&#x7F6E;&#x73AF;&#x5883;&#x53D8;&#x91CF;</p>
<pre><code class="language-lua">add_requires(&quot;cmake::OpenCV&quot;, {system = true, configs = {envs = {CMAKE_PREFIX_PATH = &quot;xxx&quot;}}})
</code></pre>
<p>&#x6307;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49; FindFoo.cmake &#x6A21;&#x5757;&#x811A;&#x672C;&#x76EE;&#x5F55;<br>
mydir/cmake_modules/FindFoo.cmake</p>
<pre><code class="language-lua">add_requires(&quot;cmake::Foo&quot;, {system = true, configs = {moduledirs = &quot;mydir/cmake_modules&quot;}})
</code></pre>
<h4 id="%E5%9C%A8-cmake-%E4%B8%AD%E9%9B%86%E6%88%90-xrepo-%E4%BE%9D%E8%B5%96%E5%8C%85">&#x5728; Cmake &#x4E2D;&#x96C6;&#x6210; Xrepo &#x4F9D;&#x8D56;&#x5305;</h4>
<p>&#x9664;&#x4E86;&#x53EF;&#x4EE5;&#x5728; Xmake &#x4E2D;&#x96C6;&#x6210; CMake &#x9879;&#x76EE;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x5728; CMake &#x4E2D;&#x76F4;&#x63A5;&#x96C6;&#x6210; Xmake/Xrepo &#x63D0;&#x4F9B;&#x7684;&#x5305;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x4F7F;&#x7528; xrepo-cmake &#x63D0;&#x4F9B;&#x7684; CMake Wrapper&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF1A;</p>
<pre><code class="language-lua">cmake_minimum_required(VERSION 3.13.0) 
project(foo)

# Download xrepo.cmake if not exists in build directory. 
if(NOT EXISTS &quot;${CMAKE_BINARY_DIR}/xrepo.cmake&quot;) 
    message(STATUS &quot;Downloading xrepo.cmake from https://github.com/xmake-io/xrepo-cmake/&quot;) 

    # mirror https://cdn.jsdelivr.net/gh/xmake-io/xrepo-cmake@main/xrepo.cmake 
    file(DOWNLOAD &quot;https://raw.githubusercontent.com/xmake-io/xrepo-cmake/main/xrepo.cmake&quot; &quot;${CMAKE_BINARY_DIR}/xrepo.cmake&quot; TLS_VERIFY ON) 
endif() 

# Include xrepo.cmake so we can use xrepo_package function. 
include(${CMAKE_BINARY_DIR}/xrepo.cmake) 
xrepo_package(&quot;zlib&quot;) 
add_executable(example-bin &quot;&quot;) 
target_sources(example-bin PRIVATE src/main.cpp ) 
xrepo_target_packages(example-bin zlib)
</code></pre>
<h5 id="%E6%B7%BB%E5%8A%A0%E5%B8%A6%E6%9C%89%E9%85%8D%E7%BD%AE%E7%9A%84%E5%8C%85">&#x6DFB;&#x52A0;&#x5E26;&#x6709;&#x914D;&#x7F6E;&#x7684;&#x5305;</h5>
<p>&#x6211;&#x4EEC;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x8DDF;&#x5728; Xmake &#x4E2D;&#x4E00;&#x6837;&#xFF0C;&#x5B9A;&#x5236;&#x5305;&#x7684;&#x53EF;&#x9009;&#x7279;&#x6027;&#x3002;</p>
<pre><code class="language-lua">xrepo_package(&quot;gflags 2.2.2&quot; CONFIGS &quot;shared=true,mt=true&quot;) 
add_executable(example-bin &quot;&quot;) 
target_sources(example-bin PRIVATE src/main.cpp ) 
xrepo_target_packages(example-bin gflags)
</code></pre>
<h5 id="%E4%BD%BF%E7%94%A8%E6%9D%A5%E8%87%AA%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%AD%98%E5%82%A8%E5%BA%93%E7%9A%84%E5%8C%85">&#x4F7F;&#x7528;&#x6765;&#x81EA;&#x7B2C;&#x4E09;&#x4E2A;&#x5B58;&#x50A8;&#x5E93;&#x7684;&#x5305;</h5>
<p>&#x9664;&#x4E86;&#x4ECE; Xmake &#x5B98;&#x65B9;&#x7EF4;&#x62A4;&#x7684;&#x5B58;&#x50A8;&#x5E93;&#x5B89;&#x88C5;&#x8F6F;&#x4EF6;&#x5305;&#x4E4B;&#x5916;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728; CMake &#x4E2D;&#x4F7F;&#x7528;&#x5B83;&#x6765;&#x5B89;&#x88C5;&#x6765;&#x81EA;&#x7B2C;&#x4E09;&#x65B9;&#x4ED3;&#x5E93;&#x7684;&#x5305;&#xFF0C;&#x53EA;&#x9700;&#x5C06;&#x4ED3;&#x5E93;&#x540D;&#x79F0;&#x6DFB;&#x52A0;&#x4E3A;&#x547D;&#x540D;&#x7A7A;&#x95F4;&#x5373;&#x53EF;&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF1A;vcpkg::zlib, conan::pcre2&#x3002;</p>
<pre><code class="language-lua">xrepo_package(&quot;conan::gflags/2.2.2&quot;) 
xrepo_package(&quot;conda::gflags 2.2.2&quot;) 
xrepo_package(&quot;vcpkg::gflags&quot;)
xrepo_package(&quot;brew::gflags&quot;)
</code></pre>
<p>&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x5728; CMake &#x4E2D;&#x96C6;&#x6210;&#x4F7F;&#x7528; vcpkg/conan &#x5305;&#x7684;&#x65B9;&#x5F0F;&#x8FDB;&#x884C;&#x4E86;&#x7EDF;&#x4E00;&#xFF0C;&#x5E76;&#x4E14;&#x989D;&#x5916;&#x63D0;&#x4F9B;&#x4E86;&#x81EA;&#x52A8;&#x5305;&#x5B89;&#x88C5;&#x7279;&#x6027;&#xFF0C;&#x4EE5;&#x53CA;&#x5BF9; homebrew/conda &#x7B49;&#x5176;&#x4ED6;&#x5305;&#x4ED3;&#x5E93;&#x7684;&#x652F;&#x6301;&#x3002;</p>
<hr>
<h3 id="xmake-vscode-%E6%8F%92%E4%BB%B6">xmake-vscode &#x63D2;&#x4EF6;</h3>
<p>&#x6211;&#x4EEC;&#x4E4B;&#x524D;&#x7684;&#x6240;&#x6709;&#x5B9E;&#x9A8C;&#xFF0C;&#x90FD;&#x662F;&#x4F7F;&#x7528; xmake &#x7684;&#x547D;&#x4EE4;&#x884C;&#x7A0B;&#x5E8F;&#x5728;&#x7EC8;&#x7AEF;&#x4E0B;&#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#x7684;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x4E00;&#x4E9B;&#x521D;&#x5B66;&#x8005;&#x6765;&#x8BF4;&#x8FD8;&#x662F;&#x6709;&#x4E0D;&#x5C11;&#x95E8;&#x69DB;&#x7684;&#xFF0C;&#x5E76;&#x4E14;&#x64CD;&#x4F5C;&#x8D77;&#x6765;&#x4E5F;&#x4E0D;&#x80FD;&#x591F;&#x50CF;&#x5176;&#x5B83; IDE &#x7B49;&#x5E26;&#x6709;&#x53EF;&#x89C6;&#x5316;&#x754C;&#x9762;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x90A3;&#x6837;&#x987A;&#x624B;&#xFF0C;&#x5C24;&#x5176;&#x662F;&#x4EE3;&#x7801;&#x7684;&#x7F16;&#x8F91;&#x3001;&#x7F16;&#x8BD1;&#x548C;&#x65AD;&#x70B9;&#x8C03;&#x8BD5;&#x90FD;&#x9700;&#x8981;&#x4E0D;&#x505C;&#x7684;&#x5207;&#x6362;&#x5404;&#x79CD;&#x7EC8;&#x7AEF;&#x3001;&#x7F16;&#x8F91;&#x5668;&#x73AF;&#x5883;&#x624D;&#x80FD;&#x5B8C;&#x6210;&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x6211;&#x4EEC;&#x7684;&#x65E5;&#x5E38;&#x5F00;&#x53D1;&#xFF0C;xmake &#x5B98;&#x65B9;&#x63D0;&#x4F9B;&#x4E86;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x65E0;&#x7F1D;&#x96C6;&#x6210;&#x5230; Visual Studio Code &#x7F16;&#x8F91;&#x5668;&#x7684; xmake-vscode &#x63D2;&#x4EF6;&#xFF0C;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x63D2;&#x4EF6;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; vscode &#x7F16;&#x8F91;&#x5668;&#x73AF;&#x5883;&#x6765;&#x4E00;&#x7AD9;&#x5F0F;&#x8FDB;&#x884C; C/C++ &#x7A0B;&#x5E8F;&#x5F00;&#x53D1;&#xFF0C;&#x5185;&#x7F6E; xmake &#x7F16;&#x8BD1;&#x3001;&#x65AD;&#x70B9;&#x8C03;&#x8BD5;&#x3001;&#x7F16;&#x8BD1;&#x9519;&#x8BEF;&#x5206;&#x6790;&#x5B9A;&#x4F4D;&#x3001;&#x7F16;&#x8BD1;&#x914D;&#x7F6E;&#x7684;&#x5FEB;&#x901F;&#x5207;&#x6362;&#x7B49;&#x5404;&#x79CD;&#x5B9E;&#x7528;&#x529F;&#x80FD;&#x3002;</p>
<p>&#x800C; Visual Studio Code &#x7F16;&#x8F91;&#x5668;&#x662F;&#x5FAE;&#x8F6F;&#x63A8;&#x51FA;&#x7684;&#x4E00;&#x6B3E;&#x8F7B;&#x91CF;&#x7EA7;&#x8DE8;&#x5E73;&#x53F0;&#x7684;&#x7F16;&#x8F91;&#x5668;&#xFF0C;&#x5177;&#x6709;&#x975E;&#x5E38;&#x597D;&#x7684;&#x8DE8;&#x5E73;&#x53F0;&#x6027;&#x3001;&#x53EF;&#x6269;&#x5C55;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x5728;&#x5B9E;&#x9A8C;&#x73AF;&#x5883;&#x7684;&#x684C;&#x9762;&#x4E0A;&#xFF0C;&#x5C31;&#x80FD;&#x627E;&#x5230;&#x5E26;&#x6709; Visual Studio Code &#x5B57;&#x6837;&#x7684;&#x56FE;&#x6807;&#xFF0C;&#x53CC;&#x51FB;&#x8FD0;&#x884C;&#x5C31;&#x53EF;&#x4EE5;&#x6253;&#x5F00;&#x5B83;&#x3002;</p>
<h4 id="%E5%AE%89%E8%A3%85-xmake-vscode-%E6%8F%92%E4%BB%B6">&#x5B89;&#x88C5; xmake-vscode &#x63D2;&#x4EF6;</h4>
<p>&#x9996;&#x5148;&#x5728;&#x73AF;&#x5883;&#x4E2D;&#x5B89;&#x88C5; xmake&#xFF0C;&#x6267;&#x884C;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p>
<pre><code class="language-bash">bash &lt;(curl -kfsSL https://labfile.oss.aliyuncs.com/courses/2764/shget.text) v2.3.7
source ~/.xmake/profile
</code></pre>
<h4 id="%E6%A3%80%E6%9F%A5%E7%89%88%E6%9C%AC%EF%BC%8C%E9%AA%8C%E8%AF%81%E5%AE%89%E8%A3%85%E6%88%90%E5%8A%9F">&#x68C0;&#x67E5;&#x7248;&#x672C;&#xFF0C;&#x9A8C;&#x8BC1;&#x5B89;&#x88C5;&#x6210;&#x529F;</h4>
<pre><code class="language-bash">xmake --version
</code></pre>
<p>&#x5728;&#x4F7F;&#x7528; xmake-vscode &#x63D2;&#x4EF6;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x5B83;&#xFF0C;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5207;&#x6362;&#x5230; vscode &#x7684;&#x63D2;&#x4EF6;&#x6269;&#x5C55; tab &#x9875;&#xFF0C;&#x7136;&#x540E;&#x8F93;&#x5165; xmake &#x641C;&#x7D22;&#x76F8;&#x5173;&#x63D2;&#x4EF6;&#x3002;</p>
<p>&#x5982;&#x679C;&#x770B;&#x5230;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x5185;&#x5BB9;&#xFF0C;&#x8BF4;&#x660E;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x627E;&#x5230;&#x4E86; xmake-vscode &#x63D2;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB;&#x65C1;&#x8FB9;&#x7684; Install &#x5B57;&#x6837;&#x6309;&#x94AE;&#x5C31;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x5B89;&#x88C5;&#x4E86;&#x3002;</p>
<h4 id="%E5%88%9B%E5%BB%BA%E5%92%8C%E6%89%93%E5%BC%80-cc-%E5%B7%A5%E7%A8%8B">&#x521B;&#x5EFA;&#x548C;&#x6253;&#x5F00; C/C++ &#x5DE5;&#x7A0B;</h4>
<p>&#x63D2;&#x4EF6;&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x5148;&#x6765;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7A7A;&#x7684; C &#x5DE5;&#x7A0B;&#xFF0C;&#x4E4B;&#x524D;&#x4ECB;&#x7ECD;&#x8FC7;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; xmake create &#x547D;&#x4EE4;&#x6765;&#x521B;&#x5EFA;&#x5DE5;&#x7A0B;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x6253;&#x7B97;&#x76F4;&#x63A5;&#x4F7F;&#x7528; xmake-vscode &#x63D2;&#x4EF6;&#x63D0;&#x4F9B;&#x7684;&#x5DE5;&#x7A0B;&#x521B;&#x5EFA;&#x529F;&#x80FD;&#x6765;&#x5B8C;&#x6210; C/C++ &#x5DE5;&#x7A0B;&#x7684;&#x521B;&#x5EFA;&#x3002;</p>
<p>&#x5728;&#x521B;&#x5EFA;&#x4E4B;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x51C6;&#x5907;&#x4E00;&#x4E2A;&#x7A7A;&#x76EE;&#x5F55;&#x7528;&#x6765;&#x5B58;&#x653E;&#x5DE5;&#x7A0B;&#x6587;&#x4EF6;&#xFF0C;&#x4F8B;&#x5982;&#x5C06;&#x5DE5;&#x7A0B;&#x653E;&#x7F6E;&#x5728; ~/Code/vscode_test &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5982;&#x679C;&#x8FD8;&#x4E0D;&#x5B58;&#x5728;&#x6B64;&#x76EE;&#x5F55;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x624B;&#x52A8;&#x521B;&#x5EFA;&#x4E0B;&#x3002;</p>
<p>&#x7136;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x76F4;&#x63A5;&#x5728; vscode &#x91CC;&#x9762;&#x6253;&#x5F00;&#x8FD9;&#x4E2A;&#x7A7A;&#x76EE;&#x5F55;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x70B9;&#x51FB;&#x4E0B;&#x56FE;&#x7EA2;&#x6846;&#x4F4D;&#x7F6E;&#x7684;&#x6309;&#x94AE;&#x3002;</p>
<p>&#x70B9;&#x51FB;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x8FDB;&#x5165;&#x521A;&#x521A;&#x521B;&#x5EFA;&#x7684; vscode_test &#x76EE;&#x5F55;&#xFF0C;&#x9009;&#x4E2D;&#x5E76;&#x6253;&#x5F00;&#x5B83;&#x3002;</p>
<p>&#x6253;&#x5F00;&#x76EE;&#x5F55;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x521B;&#x5EFA;&#x5DE5;&#x7A0B;&#x6587;&#x4EF6;&#x4E86;&#xFF0C;&#x7EE7;&#x7EED;&#x8FDB;&#x5165;&#x83DC;&#x5355;&#x7684; view &#x5B50;&#x83DC;&#x5355;&#x6253;&#x5F00; vscode &#x91CC;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x9762;&#x677F;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x3002;</p>
<p>&#x547D;&#x4EE4;&#x9762;&#x677F;&#x6253;&#x5F00;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x8F93;&#x5165; xmake &#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x5C31;&#x4F1A;&#x770B;&#x5230;&#x4E00;&#x7CFB;&#x5217;&#x8DDF; xmake &#x63D2;&#x4EF6;&#x76F8;&#x5173;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x7136;&#x540E;&#x4ECE;&#x5176;&#x4E2D;&#x627E;&#x5230;&#x5E26; Create Project &#x5B57;&#x6837;&#x7684;&#x547D;&#x4EE4;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#xFF0C;&#x7531;&#x4E8E;&#x5F53;&#x524D;&#x8FD8;&#x6CA1;&#x6709; xmake.lua &#x6587;&#x4EF6;&#xFF0C;&#x4F1A;&#x5728;&#x5E95;&#x4E0B;&#x5F39;&#x51FA;&#x4E00;&#x4E2A;&#x63D0;&#x793A;&#x6846;&#xFF0C;&#x7EE7;&#x7EED;&#x70B9;&#x51FB;&#x91CC;&#x9762;&#x7684;&#x84DD;&#x8272;&#x6309;&#x94AE;&#x3002;<br>
&#x63A5;&#x7740;&#x5C31;&#x4F1A;&#x5F39;&#x51FA;&#x7F16;&#x7A0B;&#x8BED;&#x8A00;&#x7684;&#x9009;&#x62E9;&#x5217;&#x8868;&#xFF0C;&#x8FD9;&#x91CC;&#x9009;&#x62E9;&#x7B2C;&#x4E8C;&#x9879;&#xFF0C;&#x4E5F;&#x5C31;&#x662F; C++ &#x8BED;&#x8A00;&#x3002;</p>
<p>&#x9009;&#x62E9;&#x5B8C;&#x8BED;&#x8A00;&#x540E;&#xFF0C;&#x8FD8;&#x4F1A;&#x63D0;&#x793A;&#x9009;&#x62E9;&#x5DE5;&#x7A0B;&#x7C7B;&#x578B;&#xFF0C;&#x8FD9;&#x91CC;&#x9009;&#x62E9; console &#x7EC8;&#x7AEF;&#x7A0B;&#x5E8F;&#x7C7B;&#x578B;&#x3002;</p>
<p>&#x9009;&#x62E9;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x5C31;&#x521B;&#x5EFA;&#x597D;&#x4E86;&#xFF0C;&#x4E0B;&#x56FE;&#x5DE6;&#x8FB9;&#x5C31;&#x662F;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x5DE5;&#x7A0B;&#x6587;&#x4EF6;&#xFF0C;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x6709; xmake.lua&#xFF0C;&#x800C;&#x56FE;&#x6700;&#x5E95;&#x4E0B;&#x7684;&#x5DE5;&#x5177;&#x680F;&#x5C31;&#x662F; xmake &#x63D2;&#x4EF6;&#x7684;&#x64CD;&#x4F5C;&#x9762;&#x677F;&#x4E86;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x5927;&#x90E8;&#x5206;&#x64CD;&#x4F5C;&#x90FD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x9762;&#x677F;&#x5FEB;&#x901F;&#x5B8C;&#x6210;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;&#x7F16;&#x8BD1;&#x3001;&#x8FD0;&#x884C;&#x3001;&#x8C03;&#x8BD5;&#x4EE5;&#x53CA;&#x914D;&#x7F6E;&#x5207;&#x6362;&#x7B49;&#x7B49;&#x3002;</p>
<h4 id="%E5%B7%A5%E5%85%B7%E6%A0%8F%E9%9D%A2%E6%9D%BF%E4%BB%8B%E7%BB%8D">&#x5DE5;&#x5177;&#x680F;&#x9762;&#x677F;&#x4ECB;&#x7ECD;</h4>
<p>&#x521B;&#x5EFA;&#x5B8C;&#x6210;&#x5DE5;&#x7A0B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x770B;&#x5230; vscode &#x5E95;&#x90E8;&#x5DE5;&#x5177;&#x94FE;&#x51FA;&#x73B0;&#x4E86;&#x4E00;&#x6392;&#x8DDF; xmake &#x76F8;&#x5173;&#x7684;&#x64CD;&#x4F5C;&#x9762;&#x677F;&#xFF0C;xmake &#x7684;&#x5927;&#x90E8;&#x5206;&#x64CD;&#x4F5C;&#x90FD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x9762;&#x677F;&#x4E0A;&#x7684;&#x5DE5;&#x5177;&#x6309;&#x94AE;&#x6765;&#x5FEB;&#x901F;&#x5B8C;&#x6210;&#x3002;</p>
<p>&#x53E6;&#x5916;&#xFF0C;&#x4E0D;&#x4EC5;&#x4EC5;&#x662F;&#x521B;&#x5EFA;&#x5DE5;&#x7A0B;&#xFF0C;&#x5982;&#x679C;&#x5B89;&#x88C5; xmake-vscode &#x63D2;&#x4EF6;&#x540E;&#xFF0C;&#x4F7F;&#x7528; vscode &#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x5E26;&#x6709; xmake.lua &#x6587;&#x4EF6;&#x7684; C/C++ &#x5DE5;&#x7A0B;&#x6839;&#x76EE;&#x5F55;&#xFF0C;&#x90A3;&#x4E48; vscode &#x5E95;&#x90E8;&#x7684; xmake &#x5DE5;&#x5177;&#x680F;&#x9762;&#x677F;&#x4E5F;&#x4F1A;&#x88AB;&#x81EA;&#x52A8;&#x6FC0;&#x6D3B;&#x3002;</p>
<p>&#x901A;&#x8FC7;&#x4E0A;&#x56FE;&#xFF0C;&#x6211;&#x4EEC;&#x5927;&#x6982;&#x80FD;&#x77E5;&#x9053;&#x6BCF;&#x4E2A;&#x6309;&#x94AE;&#x7684;&#x5177;&#x4F53;&#x529F;&#x80FD;&#xFF0C;&#x5177;&#x4F53;&#x66F4;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x4F7F;&#x7528;&#x65B9;&#x5F0F;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x63A5;&#x4E0B;&#x6765;&#x4F1A;&#x6328;&#x4E2A;&#x8BB2;&#x89E3;&#x3002;</p>
<h4 id="%E7%BC%96%E8%AF%91-cc-%E7%A8%8B%E5%BA%8F">&#x7F16;&#x8BD1; C/C++ &#x7A0B;&#x5E8F;</h4>
<p>&#x521A;&#x521A;&#x6211;&#x4EEC;&#x901A;&#x8FC7; vscode &#x521B;&#x5EFA;&#x7684;&#x4E00;&#x4E2A; C++ &#x9879;&#x76EE;&#x5DE5;&#x7A0B;&#xFF0C;&#x5176;&#x5185;&#x90E8;&#x5C31;&#x662F;&#x6267;&#x884C;&#x4E86; xmake &#x7684; xmake create vscode_test &#x547D;&#x4EE4;&#x6765;&#x5B8C;&#x6210;&#x7684;&#xFF0C;&#x6574;&#x4E2A;&#x5DE5;&#x7A0B;&#x6587;&#x4EF6;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#x3002;</p>
<pre><code>.
&#x251C;&#x2500;&#x2500; src
&#x2502;   &#x2514;&#x2500;&#x2500; main.cpp
&#x2514;&#x2500;&#x2500; xmake.lua
</code></pre>
<p>&#x5728;&#x7F16;&#x8BD1;&#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x8C03;&#x6574;&#x4E0B;&#x751F;&#x6210;&#x7684; xmake.lua &#x6587;&#x4EF6;&#xFF0C;&#x4FEE;&#x6539;&#x6210;&#x5982;&#x4E0B;&#x914D;&#x7F6E;&#x3002;</p>
<pre><code class="language-lua">add_rules(&quot;mode.debug&quot;, &quot;mode.release&quot;)

target(&quot;test&quot;)
set_kind(&quot;binary&quot;)
add_files(&quot;src/*.cpp&quot;)
</code></pre>
<p>&#x5176;&#x5B9E;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5C06;&#x7A0B;&#x5E8F;&#x76EE;&#x6807;&#x540D;&#x6539;&#x6210; test&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB; vscode &#x5E95;&#x4E0B;&#x7684; xmake &#x5DE5;&#x5177;&#x680F;&#x91CC;&#x9762;&#x7684; Build &#x6309;&#x94AE;&#xFF0C;&#x6765;&#x7F16;&#x8BD1;&#x6211;&#x4EEC;&#x65B0;&#x521B;&#x5EFA;&#x7684; C++ &#x5DE5;&#x7A0B;&#x3002;</p>
<h4 id="%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F">&#x8FD0;&#x884C;&#x7A0B;&#x5E8F;</h4>
<p>&#x7F16;&#x8BD1;&#x5B8C;&#x6210;&#x540E;&#x5C31;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x8FD0;&#x884C;&#x7A0B;&#x5E8F;&#x4E86;&#xFF0C;&#x8FD8;&#x662F;&#x4F7F;&#x7528;&#x5E95;&#x4E0B;&#x7684;&#x5DE5;&#x5177;&#x680F;&#x6309;&#x94AE;&#xFF0C;&#x70B9;&#x51FB;&#x8FD0;&#x884C;&#x56FE;&#x6807;&#x3002;<br>
&#x5982;&#x679C;&#x8FD0;&#x884C;&#x6210;&#x529F;&#xFF0C;&#x5C31;&#x4F1A;&#x770B;&#x5230;&#x5B9E;&#x9645;&#x7684;&#x8FD0;&#x884C;&#x8F93;&#x51FA;&#x4FE1;&#x606F;&#xFF1A;Hello world!&#x3002;</p>
<h4 id="%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F">&#x8C03;&#x8BD5;&#x7A0B;&#x5E8F;</h4>
<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x91CD;&#x70B9;&#x8BB2;&#x89E3;&#x5982;&#x4F55;&#x901A;&#x8FC7; vscode &#x914D;&#x5408; xmake-vscode &#x63D2;&#x4EF6;&#x6765;&#x5B9E;&#x73B0;&#x65AD;&#x70B9;&#x8C03;&#x8BD5; C/C++ &#x7A0B;&#x5E8F;&#x3002;</p>
<p>&#x4E0D;&#x8FC7;&#x5728;&#x8C03;&#x8BD5;&#x524D;&#x8FD8;&#x9700;&#x8981;&#x505A;&#x4E00;&#x4E9B;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#xFF0C;&#x7531;&#x4E8E;&#x9ED8;&#x8BA4; xmake &#x91C7;&#x7528; release &#x6A21;&#x5F0F;&#x7F16;&#x8BD1;&#x7684;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#xFF0C;&#x662F;&#x4E0D;&#x5E26;&#x8C03;&#x8BD5;&#x7B26;&#x53F7;&#x4FE1;&#x606F;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5148;&#x5C06;&#x7F16;&#x8BD1;&#x6A21;&#x5F0F;&#x5207;&#x6362;&#x5230; debug &#x8C03;&#x5F0F;&#x7F16;&#x8BD1;&#x6A21;&#x5F0F;&#x53BB;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x5B83;&#xFF0C;&#x4F7F;&#x5176;&#x5E26;&#x4E0A;&#x8C03;&#x8BD5;&#x7B26;&#x53F7;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x5177;&#x4F53;&#x5982;&#x4F55;&#x5207;&#x6362;&#x5230; debug &#x6A21;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#x4E0B;&#x56FE;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x70B9;&#x51FB;&#x5E95;&#x4E0B; release &#x6587;&#x672C;&#x6240;&#x5728;&#x7684;&#x6309;&#x94AE;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x4E0A;&#x9762;&#x5217;&#x51FA;&#x7684;&#x5217;&#x8868;&#x4E2D;&#xFF0C;&#x9009;&#x62E9; debug &#x9879;&#x5373;&#x53EF;&#x3002;</p>
<p>&#x5B8C;&#x6210;&#x5207;&#x6362;&#x540E;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5E95;&#x4E0B;&#x7684; release &#x6309;&#x94AE;&#x5DF2;&#x7ECF;&#x53D8;&#x6210;&#x4E86; debug &#x5B57;&#x6837;&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB; build &#x6309;&#x94AE;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x5E26;&#x6709;&#x8C03;&#x8BD5;&#x7B26;&#x53F7;&#x7684;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x4E86;&#x3002;</p>
<p>&#x8C03;&#x8BD5;&#x7248;&#x672C;&#x7A0B;&#x5E8F;&#x7F16;&#x8BD1;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x989D;&#x5916;&#x505A;&#x4E00;&#x4EF6;&#x4E8B;&#xFF0C;&#x90A3;&#x5C31;&#x662F;&#x5B89;&#x88C5; vscode &#x7684; C/C++ &#x63D2;&#x4EF6;&#xFF0C;&#x56E0;&#x4E3A; xmake-vscode &#x63D2;&#x4EF6;&#x7684;&#x8C03;&#x8BD5;&#x529F;&#x80FD;&#x662F;&#x57FA;&#x4E8E;&#x8FD9;&#x4E2A;&#x63D2;&#x4EF6;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x4EC5;&#x4EC5;&#x53EA;&#x9700;&#x8981;&#x9996;&#x6B21;&#x4F7F;&#x7528;&#x65F6;&#x5B89;&#x88C5;&#x5B83;&#x5373;&#x53EF;&#x3002;</p>
<p>&#x91CD;&#x65B0;&#x5207;&#x5230;&#x63D2;&#x4EF6;&#x5E02;&#x573A;&#x9875;&#x9762;&#xFF0C;&#x641C;&#x7D22; C/C++&#xFF0C;&#x663E;&#x793A;&#x51FA;&#x6765;&#x7684;&#x7B2C;&#x4E00;&#x9879;&#x5C31;&#x662F;&#xFF0C;&#x70B9;&#x51FB; Install &#x5B89;&#x88C5;&#x5373;&#x53EF;&#x3002;</p>
<p>&#x5B89;&#x88C5;&#x597D; C/C++ &#x63D2;&#x4EF6;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x8C03;&#x8BD5;&#x64CD;&#x4F5C;&#x4E86;&#x3002;&#x9996;&#x5148;&#x70B9;&#x51FB; main.cpp &#x6253;&#x5F00;&#x6E90;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5728;&#x9700;&#x8981;&#x4E0B;&#x65AD;&#x70B9;&#x7684;&#x4EE3;&#x7801;&#x884C;&#x5DE6;&#x4FA7;&#x4F4D;&#x7F6E;&#x70B9;&#x51FB;&#x4E0B;&#x65AD;&#x70B9;&#xFF0C;&#x5982;&#x679C;&#x51FA;&#x73B0;&#x5C0F;&#x7EA2;&#x70B9;&#xFF0C;&#x8BF4;&#x660E;&#x5DF2;&#x7ECF;&#x6210;&#x529F;&#x4E0B;&#x597D;&#x4E86;&#x8C03;&#x8BD5;&#x65AD;&#x70B9;&#x3002;</p>
<p>&#x65AD;&#x70B9;&#x4E0B;&#x597D;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&#x5E95;&#x4E0B;&#x7684;&#x8C03;&#x8BD5;&#x6309;&#x94AE;&#xFF0C;&#x5F00;&#x542F;&#x65AD;&#x70B9;&#x8C03;&#x8BD5;&#x4E86;&#xFF0C;&#x5982;&#x679C;&#x4E00;&#x5207;&#x987A;&#x5229;&#xFF0C;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x8D77;&#x6765;&#x540E;&#x5C31;&#x4F1A;&#x547D;&#x4E2D;&#x521A;&#x521A;&#x8BBE;&#x7F6E;&#x7684;&#x65AD;&#x70B9;&#x3002;</p>
<h4 id="%E7%9B%AE%E6%A0%87%E7%A8%8B%E5%BA%8F%E5%88%87%E6%8D%A2">&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x5207;&#x6362;</h4>
<p>&#x63A5;&#x4E0B;&#x6765;&#x518D;&#x6765;&#x8BE6;&#x7EC6;&#x8BB2;&#x89E3;&#x7F16;&#x8BD1;&#xFF0C;&#x4E4B;&#x524D;&#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x4F7F;&#x7528;&#x8FC7; build &#x6309;&#x94AE;&#x6765;&#x7F16;&#x8BD1;&#x5DE5;&#x7A0B;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x9879;&#x76EE;&#x4E2D;&#x5B58;&#x5728;&#x591A;&#x4E2A;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x53C8;&#x4E0D;&#x60F3;&#x5168;&#x90E8;&#x7F16;&#x8BD1;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x9700;&#x8981;&#x6307;&#x5B9A;&#x7F16;&#x8BD1;&#x54EA;&#x4E2A;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x3002;</p>
<p>&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; xmake build test &#x547D;&#x4EE4;&#x6765;&#x663E;&#x793A;&#x7684;&#x6307;&#x5B9A;&#x7F16;&#x8BD1;&#x54EA;&#x4E2A;&#x76EE;&#x6807;&#xFF0C;&#x800C;&#x5728; vscode &#x4E2D;&#xFF0C;xmake &#x63D2;&#x4EF6;&#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x65B9;&#x4FBF;&#x7684;&#x76EE;&#x6807;&#x5207;&#x6362;&#x64CD;&#x4F5C;&#xFF0C;&#x6765;&#x5FEB;&#x901F;&#x5207;&#x6362;&#x7F16;&#x8BD1;&#x3002;</p>
<p>&#x9996;&#x5148;&#x4FEE;&#x6539; xmake.lua &#x6587;&#x4EF6;&#xFF0C;&#x65B0;&#x589E;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; test2 &#x7684;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#xFF0C;&#x7528;&#x4E8E;&#x4E4B;&#x540E;&#x7684;&#x76EE;&#x6807;&#x5207;&#x6362;&#x6D4B;&#x8BD5;&#xFF0C;&#x4F8B;&#x5982;&#x3002;</p>
<pre><code class="language-lua">add_rules(&quot;mode.debug&quot;, &quot;mode.release&quot;)

target(&quot;test&quot;)
set_kind(&quot;binary&quot;)
add_files(&quot;src/*.cpp&quot;)

target(&quot;test2&quot;)
set_kind(&quot;binary&quot;)
add_files(&quot;src/*.cpp&quot;)
</code></pre>
<p>&#x7136;&#x540E;&#x70B9;&#x51FB;&#x5E95;&#x4E0B; default &#x5B57;&#x6837;&#x7684;&#x6309;&#x94AE;&#xFF0C;&#x4E4B;&#x540E;&#x4F1A;&#x5728;&#x9876;&#x90E8;&#x663E;&#x793A;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x6240;&#x6709;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x540D;&#x7684;&#x5217;&#x8868;&#xFF0C;&#x6211;&#x4EEC;&#x70B9;&#x51FB;&#x5176;&#x4E2D;&#x7684; test2 &#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x5207;&#x6362;&#x3002;</p>
<p>&#x5982;&#x679C;&#x5207;&#x6362;&#x6210;&#x529F;&#xFF0C;&#x5E95;&#x4E0B;&#x7684; default &#x6587;&#x672C;&#x5C31;&#x4F1A;&#x53D8;&#x6210; test2&#xFF0C;&#x7531;&#x4E8E;&#x9ED8;&#x8BA4;&#x7F16;&#x8BD1; xmake &#x4F1A;&#x81EA;&#x52A8;&#x7F16;&#x8BD1;&#x6240;&#x6709;&#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#xFF0C;&#x6240;&#x4EE5;&#x6700;&#x521D;&#x663E;&#x793A;&#x7684;&#x662F; default &#x6587;&#x672C;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4EEC;&#x518D;&#x6267;&#x884C;&#x7F16;&#x8BD1;&#xFF0C;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x5B9E;&#x9645;&#x4EC5;&#x4EC5;&#x53EA;&#x7F16;&#x8BD1;&#x4E86;&#x6211;&#x4EEC;&#x6307;&#x5B9A;&#x7684; test2 &#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x3002;</p>
<h4 id="%E7%BC%96%E8%AF%91%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF">&#x7F16;&#x8BD1;&#x9519;&#x8BEF;&#x4FE1;&#x606F;</h4>
<p>&#x5982;&#x679C;&#x6211;&#x4EEC;&#x7684;&#x5DE5;&#x7A0B;&#x4EE3;&#x7801;&#x6CA1;&#x5199;&#x5BF9;&#x5BFC;&#x81F4;&#x7F16;&#x8BD1;&#x51FA;&#x9519;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4ECE;&#x7F16;&#x8BD1;&#x8F93;&#x51FA;&#x4E2D;&#x770B;&#x5230;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x800C; xmake-vscode &#x63D2;&#x4EF6;&#x8FD8;&#x4F1A;&#x81EA;&#x52A8;&#x89E3;&#x6790;&#x7F16;&#x8BD1;&#x9519;&#x8BEF;&#x8F93;&#x51FA;&#x4FE1;&#x606F;&#xFF0C;&#x5206;&#x7C7B;&#x6BCF;&#x4E2A;&#x7F16;&#x8BD1;&#x9519;&#x8BEF;&#xFF0C;&#x5E76;&#x53EF;&#x901A;&#x8FC7;&#x53CC;&#x51FB;&#x6307;&#x5B9A;&#x9519;&#x8BEF;&#xFF0C;&#x8DF3;&#x8F6C;&#x5B9A;&#x4F4D;&#x5230;&#x6307;&#x5B9A;&#x7684;&#x9519;&#x8BEF;&#x4EE3;&#x7801;&#x4F4D;&#x7F6E;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#x4F4D;&#x7F6E;&#x3002;</p>
<h4 id="%E6%9F%A5%E7%9C%8B%E7%BC%96%E8%AF%91%E8%AF%A6%E7%BB%86%E4%BF%A1%E6%81%AF">&#x67E5;&#x770B;&#x7F16;&#x8BD1;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;</h4>
<p>&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; xmake -v &#x6765;&#x67E5;&#x770B;&#x7F16;&#x8BD1;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x8BE6;&#x7EC6;&#x547D;&#x4EE4;&#x53C2;&#x6570;&#x4FE1;&#x606F;&#xFF0C;&#x800C;&#x5728; vscode &#x4E2D;&#x540C;&#x6837;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x5F00;&#x542F;&#x8BE6;&#x7EC6;&#x8F93;&#x51FA;&#x3002;</p>
<p>&#x9996;&#x5148;&#x6253;&#x5F00;&#x83DC;&#x5355;&#xFF0C;&#x70B9;&#x51FB; File -&gt; Preferences -&gt; Settings &#x5B50;&#x83DC;&#x5355;&#x3002;</p>
<p>&#x7136;&#x540E;&#x5728;&#x6253;&#x5F00;&#x7684; Setting &#x914D;&#x7F6E;&#x9875;&#x9762;&#xFF0C;&#x8F93;&#x5165; xmake &#x627E;&#x5230;&#x6240;&#x6709;&#x8DDF; xmake &#x63D2;&#x4EF6;&#x76F8;&#x5173;&#x7684;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x5176;&#x4E2D;&#x6709;&#x4E00;&#x9879;&#x662F; BuildLevel&#xFF0C;&#x5B83;&#x5C31;&#x662F;&#x7528;&#x4E8E;&#x8BBE;&#x7F6E;&#x7F16;&#x8BD1;&#x8FC7;&#x7A0B;&#x4E2D;&#x7684;&#x8F93;&#x51FA;&#x4FE1;&#x606F;&#x7EA7;&#x522B;&#x3002;</p>
<p>&#x9ED8;&#x8BA4;&#x662F; warnings &#x7EA7;&#x522B;&#xFF0C;&#x4EC5;&#x4EC5;&#x8F93;&#x51FA;&#x7F16;&#x8BD1;&#x8B66;&#x544A;&#x4FE1;&#x606F;&#x4EE5;&#x53CA;&#x6B63;&#x5E38;&#x4FE1;&#x606F;&#xFF0C;&#x6211;&#x4EEC;&#x628A;&#x5B83;&#x6539;&#x4E3A; verbose &#x7EA7;&#x522B;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8F93;&#x51FA;&#x5B8C;&#x6574;&#x7684;&#x7F16;&#x8BD1;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#x4E86;&#x3002;</p>
<p>&#x81F3;&#x4E8E; debug &#x7EA7;&#x522B;&#x5BF9;&#x5E94;&#x7684;&#x5C31;&#x662F; xmake -vD &#x7684;&#x8BCA;&#x65AD;&#x4FE1;&#x606F;&#xFF0C;&#x8FD8;&#x4F1A;&#x8FDB;&#x4E00;&#x6B65;&#x6253;&#x5370;&#x51FA;&#x9519;&#x7684;&#x6808;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x8FD9;&#x91CC;&#x5C06;&#x914D;&#x7F6E;&#x5207;&#x6362;&#x6210; verbose &#x7EA7;&#x522B;&#x540E;&#xFF0C;&#x518D;&#x91CD;&#x65B0;&#x6784;&#x5EFA;&#x4E0B;&#x7A0B;&#x5E8F;&#xFF0C;&#x770B;&#x770B;&#x5B9E;&#x9645;&#x7684;&#x8F93;&#x51FA;&#x662F;&#x600E;&#x6837;&#x7684;&#x3002;&#x4E0D;&#x8FC7;&#x7531;&#x4E8E;&#x5E95;&#x90E8;&#x53EA;&#x63D0;&#x4F9B;&#x4E86; build &#x6309;&#x94AE;&#xFF0C;&#x6CA1;&#x6709; rebuild &#x6309;&#x94AE;&#xFF0C;&#x4E3A;&#x4E86;&#x6267;&#x884C;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4ECE;&#x83DC;&#x5355;&#x91CC;&#x9762;&#x7684;&#x547D;&#x4EE4;&#x9762;&#x677F;&#x4E2D;&#xFF0C;&#x627E;&#x5230; xmake &#x7684; Rebuild &#x547D;&#x4EE4;&#xFF0C;&#x70B9;&#x51FB;&#x6267;&#x884C;&#x624D;&#x884C;&#x3002;</p>
<p>&#x4ECE;&#x4E0B;&#x56FE;&#x7684;&#x7EA2;&#x8272;&#x7BAD;&#x5934;&#x4F4D;&#x7F6E;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x547D;&#x4EE4;&#x9762;&#x677F;&#x3002;</p>
<p>&#x7136;&#x540E;&#x518D;&#x6253;&#x5F00;&#x7684;&#x547D;&#x4EE4;&#x9762;&#x677F;&#x4E2D;&#x8F93;&#x5165; xmake &#x8FC7;&#x6EE4;&#x51FA;&#x6240;&#x6709;&#x8DDF; xmake &#x76F8;&#x5173;&#x7684;&#x547D;&#x4EE4;&#x5217;&#x8868;&#xFF0C;&#x627E;&#x5230; Rebuild &#x547D;&#x4EE4;&#x540E;&#x70B9;&#x51FB;&#x7F16;&#x8BD1;&#x5373;&#x53EF;&#xFF0C;&#x5982;&#x4E0B;&#x56FE;&#x3002;</p>
<p>&#x5F00;&#x542F; verbose &#x7EA7;&#x522B;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x7F16;&#x8BD1;&#x8F93;&#x51FA;&#x4E2D;&#x5B8C;&#x6574;&#x7684;&#x547D;&#x4EE4;&#x53C2;&#x6570;&#x4E86;&#x3002;</p>
<h4 id="xmakelua-%E7%BC%96%E8%BE%91%E5%92%8C%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8">xmake.lua &#x7F16;&#x8F91;&#x548C;&#x81EA;&#x52A8;&#x8865;&#x5168;</h4>
<p>xmake-vscode &#x63D2;&#x4EF6;&#x8FD8;&#x5185;&#x7F6E;&#x4E86;&#x5BF9; xmake.lua &#x6587;&#x4EF6;&#x7F16;&#x5199;&#x65F6;&#x7684;&#x81EA;&#x52A8;&#x63D0;&#x793A;&#x548C;&#x8865;&#x5168;&#x652F;&#x6301;&#xFF0C;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x8F93;&#x5165; add_&#x3001;set_ &#x7B49;&#x5B57;&#x6837;&#x7684;&#x6587;&#x672C;&#xFF0C;&#x5C31;&#x4F1A;&#x81EA;&#x52A8;&#x5217;&#x4E3E;&#x51FA;&#x4E0E;&#x5176;&#x76F8;&#x5173;&#x7684;&#x6240;&#x6709; api &#x4F9B;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#xFF0C;&#x6765;&#x65B9;&#x4FBF;&#x5FEB;&#x901F;&#x914D;&#x7F6E; xmake.lua&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7F16;&#x8F91; xmake.lua &#x6587;&#x4EF6;&#x5BF9;&#x91CC;&#x9762; test2 &#x76EE;&#x6807;&#x7A0B;&#x5E8F;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A; add_defines(&quot;TEST2&quot;) &#x6765;&#x4F53;&#x9A8C;&#x4E0B;&#x81EA;&#x52A8;&#x8865;&#x5168;&#x529F;&#x80FD;&#x3002;</p>
<p>&#x6700;&#x7EC8;&#x7684;&#x5B8C;&#x6574;&#x914D;&#x7F6E;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#x3002;</p>
<pre><code class="language-lua">add_rules(&quot;mode.debug&quot;, &quot;mode.release&quot;)

target(&quot;test&quot;)
set_kind(&quot;binary&quot;)
add_files(&quot;src/*.cpp&quot;)

target(&quot;test2&quot;)
set_kind(&quot;binary&quot;)
add_files(&quot;src/*.cpp&quot;)
add_defines(&quot;TEST2&quot;)
</code></pre>
<p>&#x800C;&#x6211;&#x4EEC;&#x8F93;&#x5165;&#x65F6;&#x7684;&#x8865;&#x5168;&#x7279;&#x6027;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E0B;&#x9762;&#x7684;&#x56FE;&#x7247;&#x4F53;&#x4F1A;&#x5230;&#x3002;</p>
<p>&#x5B8C;&#x6210;&#x914D;&#x7F6E;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x518D;&#x6765;&#x70B9;&#x51FB;&#x5E95;&#x4E0B;&#x7684; Build &#x6309;&#x94AE;&#x6267;&#x884C;&#x7F16;&#x8BD1;&#xFF0C;&#x770B;&#x4E0B;&#x8BE6;&#x7EC6;&#x547D;&#x4EE4;&#x8F93;&#x51FA;&#xFF0C;&#x5E94;&#x8BE5;&#x80FD;&#x591F;&#x6B63;&#x5E38;&#x770B;&#x5230;&#x65B0;&#x52A0;&#x4E0A;&#x7684; -DTEST2 &#x5B8F;&#x5B9A;&#x4E49;&#x4E86;&#x3002;</p>
<hr>
<p>&#x7B80;&#x5355;&#x4F7F;&#x7528;&#x8FD8;&#x633A;&#x4E0D;&#x9519;&#xFF0C;&#x4EE5;&#x540E;&#x5C3D;&#x91CF;&#x4E0D;&#x7528; cmake &#x4E86;&#x3002;<br>
&#x540E;&#x9762;&#x90A3;&#x4E9B;&#x90FD;&#x662F;&#x6765;&#x81EA;<a href="https://xmake.io/#/">&#x5B98;&#x7F51;</a>&#xFF0C;&#x6211;&#x4E5F;&#x6CA1;&#x770B;&#x5B8C;&#xFF0C;&#x5907;&#x7528;&#x5427;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[一次 UOS 救砖过程]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x539F;&#x6765;&#x7B14;&#x8BB0;&#x672C;&#x4E0A;&#x4E70;&#x7684; UOS &#x5BB6;&#x5EAD;&#x7248;&#x7CFB;&#x7EDF;&#xFF0C;&#x7528;&#x7740;&#x8FD8;&#x53EF;&#x4EE5;&#xFF0C;&#x4E0D;&#x8FC7;&#x8FD9;&#x4E00;&#x5E74;&#x591A;&#x6CA1;&#x7528;&#x4E86;&#xFF0C;&#x6700;&#x8FD1;&#x8FDB;&#x53BB;&#x5347;&#x4E86;&#x4E0B;&#x7EA7;&#xFF0C;&#x7ED3;&#x679C;&#x542F;&#x52A8;&#x4E0D;&#x4E86;&#x4E86;&#x3002;&#x3002;&#x6CA1;</p>]]></description><link>https://www.listera.top/yi-ci-uos-jiu-zhuan-guo-cheng/</link><guid isPermaLink="false">64896427ada67b04e2226ad5</guid><category><![CDATA[deepin]]></category><category><![CDATA[Linux]]></category><category><![CDATA[U盘]]></category><category><![CDATA[系统]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Tue, 13 Jun 2023 15:10:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x539F;&#x6765;&#x7B14;&#x8BB0;&#x672C;&#x4E0A;&#x4E70;&#x7684; UOS &#x5BB6;&#x5EAD;&#x7248;&#x7CFB;&#x7EDF;&#xFF0C;&#x7528;&#x7740;&#x8FD8;&#x53EF;&#x4EE5;&#xFF0C;&#x4E0D;&#x8FC7;&#x8FD9;&#x4E00;&#x5E74;&#x591A;&#x6CA1;&#x7528;&#x4E86;&#xFF0C;&#x6700;&#x8FD1;&#x8FDB;&#x53BB;&#x5347;&#x4E86;&#x4E0B;&#x7EA7;&#xFF0C;&#x7ED3;&#x679C;&#x542F;&#x52A8;&#x4E0D;&#x4E86;&#x4E86;&#x3002;&#x3002;&#x6CA1;&#x529E;&#x6CD5;&#xFF0C;Linux &#x76EE;&#x524D;&#x8FD8;&#x662F;&#x8FD9;&#x718A;&#x6837;&#x3002;</p>
<p>&#x6298;&#x817E;&#x8FC7;&#x7A0B;&#x5982;&#x4E0B;</p>
<hr>
<p>&#x5347;&#x7EA7;&#x7CFB;&#x7EDF;&#xFF0C;&#x7ED3;&#x679C;&#x5F00;&#x673A;&#x8FDB;&#x4E0D;&#x53BB;&#x7CFB;&#x7EDF;&#xFF0C;&#x663E;&#x793A; i8042-present:0&#xFF0C;&#x786C;&#x76D8;&#x706F;&#x4E0D;&#x4EAE;&#x4E86;</p>
<p>grub &#x9009;&#x5B89;&#x5168;&#x6A21;&#x5F0F;&#x8FDB;&#x53BB;&#xFF0C;&#x6CA1;&#x6CD5;&#x4E0A;&#x7F51;&#x3002;&#x3002;&#x3002;&#x8FD9; TM &#x600E;&#x4E48;&#x60F3;&#x7684;&#x3002;<br>
uos &#x7684;&#x8F6F;&#x4EF6;&#x5305;&#x8FD8;&#x4E0D;&#x80FD;&#x5728;&#x7CFB;&#x7EDF;&#x5916;&#x4E0B;&#x8F7D;&#xFF0C;&#x5751;&#x7239;&#x7684;&#x8D27;&#x3002;&#x3002;&#x3002;</p>
<p>&#x91CD;&#x542F; grub &#x6309; e &#x8FDB;&#x5165;&#x7F16;&#x8F91;&#x6A21;&#x5F0F;&#xFF0C;ro &#x5F00;&#x59CB;&#x6539;&#x6210;</p>
<pre><code class="language-grub">rw single init=/bin/bash
</code></pre>
<p>ctrl+x &#x91CD;&#x65B0;&#x5F15;&#x5BFC;&#xFF0C;&#x5355;&#x7528;&#x6237;&#x6A21;&#x5F0F;&#xFF0C;&#x5361;&#x5728; random: crng init done</p>
<p>&#x4F30;&#x8BA1;&#x662F;&#x66F4;&#x65B0;&#x7684;&#x5185;&#x6838;&#x592A;&#x65B0;&#xFF0C;&#x4E0D;&#x517C;&#x5BB9;&#x8001;&#x673A;&#x5668;&#x3002;</p>
<p>deepin &#x5B98;&#x7F51;&#x4E0A;&#x4E0B;&#x8F7D; livecd &#x7684; iso&#xFF0C;u &#x76D8;&#x5236;&#x4F5C;&#x542F;&#x52A8;&#x76D8;&#x3002;&#x91CD;&#x542F; F12 &#x9009;&#x62E9;&#xFF0C;&#x53EF;&#x4EE5;&#x5F15;&#x5BFC;&#x8FDB;&#x53BB;&#xFF0C;&#x53EF;&#x4EE5;&#x7F51;&#x7EBF;&#x4E0A;&#x7F51;&#x3002;&#x3002;&#x3002;&#x8FD8;&#x597D;</p>
<p>&#x91CD;&#x65B0;&#x6302;&#x8F7D;&#x7CFB;&#x7EDF;&#x76D8;</p>
<pre><code class="language-bash">df -h
sudo umount /dev/sda2
sudo mount /dev/sda2 /mnt 
</code></pre>
<p>chroot &#x8FDB;&#x7CFB;&#x7EDF;&#x76D8;</p>
<pre><code class="language-bash">sudo chroot /mnt
</code></pre>
<p>apt &#x5B89;&#x88C5;&#x8001;&#x7248;&#x672C;&#x5185;&#x6838;</p>
<pre><code class="language-bash">sudo apt install linux-headers-5.4.50-amd64-desktop
sudo apt install linux-image-5.4.50-amd64-desktop
</code></pre>
<p>&#x5404;&#x79CD;&#x62A5;&#x9519;&#x3002;&#x8C8C;&#x4F3C;&#x9700;&#x8981;&#x5148; mount &#x4E00;&#x4E9B;&#x7CFB;&#x7EDF;&#x76EE;&#x5F55;</p>
<pre><code class="language-bash">sudo mount -t proc proc /mnt/proc
sudo mount -t sysfs sys /mnt/sys
sudo mount -o bind /dev /mnt/dev
sudo chroot /mnt
</code></pre>
<p>&#x80FD;&#x5B89;&#x88C5;&#x5185;&#x6838;&#x548C;&#x751F;&#x6210; initramfs&#xFF0C;&#x4F46;&#x66F4;&#x65B0;&#x4E0D;&#x4E86; grub&#x3002;</p>
<p>&#x91CD;&#x542F; grub &#x6309; e&#xFF0C;&#x628A;&#x5185;&#x6838;&#x7248;&#x672C;&#x6539;&#x6210;&#x65B0;&#x5B89;&#x88C5;&#x7684;&#x8001;&#x7248;&#x672C;&#x5185;&#x6838;<br>
ctrl+x&#x3002;&#x3002;&#x3002;&#x7EC8;&#x4E8E;&#x8FDB;&#x53BB;&#x7CFB;&#x7EDF;&#x4E86;</p>
<p>&#x8D76;&#x7D27;&#x628A;&#x521A;&#x624D;&#x4E71;&#x5B89;&#x88C5;&#x7684;&#x5305;&#xFF0C;&#x8BE5;&#x5220;&#x7684;&#x5220;&#xFF0C;&#x6CA1;&#x88C5;&#x597D;&#x7684;&#x88C5;&#x4E0A;&#xFF0C;&#x66F4;&#x65B0; grub</p>
<pre><code class="language-bash">sudo update_grub2
</code></pre>
<p>&#x91CD;&#x542F;&#x6D4B;&#x4E0B;&#x6CA1;&#x95EE;&#x9898;&#xFF0C;&#x7CFB;&#x7EDF;&#x5F15;&#x5BFC;&#x6B63;&#x5E38;&#x3002;</p>
<!--kg-card-end: markdown--><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[DJI Mobile SDK V4 Android 最新版本 4.16.4（译）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="msdk-v5-%E5%8F%91%E5%B8%83%E4%BA%86"><a href="https://github.com/dji-sdk/Mobile-SDK-Android-V5">MSDK V5 &#x53D1;&#x5E03;&#x4E86;</a></h1>
<p>MSDK V5 &#x652F;&#x6301;&#x7684;&#x4EA7;&#x54C1;&#xFF1A;</p>
<ul>
<li><a href="https://www.dji.com/cn/mavic-3-enterprise">DJI Mavic 3 Enterprise Series</a></li>
<li><a href="https://www.dji.com/matrice-30?site=brandsite&amp;from=nav">M30 Series</a></li>
<li><a href="https://www.dji.com/matrice-300?site=brandsite&amp;from=nav">M300 RTK</a></li>
</ul>
<h1 id="dji-mobile-sdk-v4-android-%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC-4164">DJI Mobile SDK V4 Android &#x6700;&#x65B0;&#x7248;&#x672C; 4.16.4</h1>
<h2 id="%E8%BF%99%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">&#x8FD9;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<p>DJI Mobile SDK &#x4F7F;&#x60A8;&#x80FD;&#x591F;&#x81EA;&#x52A8;&#x5316;&#x60A8;</p>]]></description><link>https://www.listera.top/dji-mobile-sdk-v4-android-zui-xin-ban-ben-4-16-4-yi/</link><guid isPermaLink="false">647d647916d4267d28c91b37</guid><category><![CDATA[无人机]]></category><category><![CDATA[android]]></category><category><![CDATA[翻译]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Mon, 05 Jun 2023 04:30:53 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="msdk-v5-%E5%8F%91%E5%B8%83%E4%BA%86"><a href="https://github.com/dji-sdk/Mobile-SDK-Android-V5">MSDK V5 &#x53D1;&#x5E03;&#x4E86;</a></h1>
<p>MSDK V5 &#x652F;&#x6301;&#x7684;&#x4EA7;&#x54C1;&#xFF1A;</p>
<ul>
<li><a href="https://www.dji.com/cn/mavic-3-enterprise">DJI Mavic 3 Enterprise Series</a></li>
<li><a href="https://www.dji.com/matrice-30?site=brandsite&amp;from=nav">M30 Series</a></li>
<li><a href="https://www.dji.com/matrice-300?site=brandsite&amp;from=nav">M300 RTK</a></li>
</ul>
<h1 id="dji-mobile-sdk-v4-android-%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC-4164">DJI Mobile SDK V4 Android &#x6700;&#x65B0;&#x7248;&#x672C; 4.16.4</h1>
<h2 id="%E8%BF%99%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">&#x8FD9;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<p>DJI Mobile SDK &#x4F7F;&#x60A8;&#x80FD;&#x591F;&#x81EA;&#x52A8;&#x5316;&#x60A8;&#x7684; DJI &#x4EA7;&#x54C1;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x98DE;&#x884C;&#xFF0C;&#x4EE5;&#x53CA;&#x4EA7;&#x54C1;&#x7684;&#x8BB8;&#x591A;&#x5B50;&#x7CFB;&#x7EDF;&#xFF0C;&#x5305;&#x62EC;&#x76F8;&#x673A;&#x548C;&#x4E07;&#x5411;&#x8282;&#x3002;&#x4F7F;&#x7528;&#x79FB;&#x52A8; SDK&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5B9A;&#x5236;&#x7684;&#x79FB;&#x52A8;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x4EE5;&#x91CA;&#x653E;&#x60A8;&#x7684; DJI &#x7A7A;&#x4E2D;&#x5E73;&#x53F0;&#x7684;&#x5168;&#x90E8;&#x6F5C;&#x529B;&#x3002;</p>
<h2 id="%E6%95%B4%E5%90%88">&#x6574;&#x5408;</h2>
<p>&#x901A;&#x8FC7; Maven &#x58F0;&#x660E;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#xFF1A;</p>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;com.dji&lt;/groupId&gt;
    &lt;artifactId&gt;dji-sdk&lt;/artifactId&gt;
    &lt;version&gt;4.16.4&lt;/version&gt;
&lt;/dependency&gt;

&lt;dependency&gt;
    &lt;groupId&gt;com.dji&lt;/groupId&gt;
    &lt;artifactId&gt;dji-sdk-provided&lt;/artifactId&gt;
    &lt;version&gt;4.16.4&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>&#x6216;&#x8005; Gradle:</p>
<pre><code class="language-groovy">compile &apos;com.dji:dji-sdk:4.16.4&apos;
provided &apos;com.dji:dji-sdk-provided:4.16.4&apos;
</code></pre>
<p>&#x6709;&#x5173;&#x5982;&#x4F55;&#x5C06; DJI Android SDK &#x96C6;&#x6210;&#x5230;&#x60A8;&#x7684; Android Studio &#x9879;&#x76EE;&#x4E2D;&#x7684;&#x66F4;&#x591A;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x67E5;&#x770B;<a href="http://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-integrate.html#import-maven-dependency">&#x5C06; SDK &#x96C6;&#x6210;&#x5230;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E2D;</a>&#x6559;&#x7A0B;&#x3002;</p>
<h2 id="%E8%BF%90%E8%A1%8C-sdk-%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81">&#x8FD0;&#x884C; SDK &#x793A;&#x4F8B;&#x4EE3;&#x7801;</h2>
<p>&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x53EF;&#x4EE5;<a href="https://developer.dji.com/mobile-sdk/documentation/quick-start/index.html#android-sample-app">&#x8FD0;&#x884C;&#x793A;&#x4F8B;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</a>&#x6765;&#x7ACB;&#x5373;&#x8FD0;&#x884C;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x67E5;&#x770B;&#x5982;&#x4F55;&#x4F7F;&#x7528; DJI Mobile SDK&#x3002;</p>
<p>&#x9700;&#x8981; &#x4E00;&#x67B6; DJI &#x98DE;&#x673A;&#x6216;&#x624B;&#x6301;&#x6444;&#x50CF;&#x673A;&#x624D;&#x80FD;&#x8FD0;&#x884C;&#x793A;&#x4F8B;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x3002;</p>
<h2 id="%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E6%B5%81">&#x5F00;&#x53D1;&#x5DE5;&#x4F5C;&#x6D41;</h2>
<p>&#x4ECE;&#x6CE8;&#x518C;&#x4E3A;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x5230;&#x90E8;&#x7F72;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#x5C06;&#x5E26;&#x60A8;&#x5B8C;&#x6210;&#x5B8C;&#x6574;&#x7684; Mobile SDK &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5F00;&#x53D1;&#x8FC7;&#x7A0B;&#xFF1A;</p>
<ul>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-prerequisits.html">&#x524D;&#x7F6E;&#x6761;&#x4EF6;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-register.html">&#x6CE8;&#x518C;&#x6210;&#x4E3A;&#x5927;&#x7586;&#x5F00;&#x53D1;&#x8005;&#x5E76;&#x4E0B;&#x8F7D; SDK</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-integrate.html">&#x5C06; SDK &#x96C6;&#x6210;&#x5230;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E2D;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-run.html">&#x8FD0;&#x884C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-testing.html">&#x6D4B;&#x8BD5;&#x3001;&#x5206;&#x6790;&#x548C;&#x8C03;&#x8BD5;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-deploy.html">&#x90E8;&#x7F72;</a></li>
</ul>
<h2 id="%E7%A4%BA%E4%BE%8B%E9%A1%B9%E7%9B%AE%E5%92%8C%E6%95%99%E7%A8%8B">&#x793A;&#x4F8B;&#x9879;&#x76EE;&#x548C;&#x6559;&#x7A0B;</h2>
<p>&#x63D0;&#x4F9B;&#x4E86;&#x51E0;&#x4E2A; Android &#x6559;&#x7A0B;&#x4F5C;&#x4E3A;&#x793A;&#x4F8B;&#xFF0C;&#x4ECB;&#x7ECD;&#x5982;&#x4F55;&#x4F7F;&#x7528; Mobile SDK &#x7684;&#x4E0D;&#x540C;&#x529F;&#x80FD;&#xFF0C;&#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#x5305;&#x62EC;&#xFF1A;</p>
<ul>
<li><a href="http://developer.dji.com/mobile-sdk/documentation/android-tutorials/ActivationAndBinding.html">&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6FC0;&#x6D3B;&#x548C;&#x98DE;&#x673A;&#x7ED1;&#x5B9A;</a></li>
<li><a href="http://developer.dji.com/mobile-sdk/documentation/android-tutorials/UXSDKDemo.html">UX SDK &#x5165;&#x95E8;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/android-tutorials/FPVDemo.html">&#x76F8;&#x673A;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/android-tutorials/GSDemo-Gaode-Map.html">MapView &#x548C; Waypoint &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF08;&#x9AD8;&#x5FB7;&#x5730;&#x56FE;&#xFF09;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/android-tutorials/GSDemo-Google-Map.html">MapView &#x548C;&#x822A;&#x8DEF;&#x70B9;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF08;GoogleMap&#xFF09;</a></li>
<li><a href="https://developer.dji.com/mobile-sdk/documentation/android-tutorials/P4MissionsDemo.html">TapFly &#x548C; ActiveTrack &#x5E94;&#x7528;&#x7A0B;&#x5E8F;</a></li>
<li><a href="http://developer.dji.com/mobile-sdk/documentation/android-tutorials/SimulatorDemo.html">&#x6A21;&#x62DF;&#x5668;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</a></li>
<li><a href="http://developer.dji.com/mobile-sdk/documentation/android-tutorials/GEODemo.html">GEO &#x7CFB;&#x7EDF;&#x5E94;&#x7528;</a></li>
</ul>
<h2 id="%E4%BA%86%E8%A7%A3%E6%9C%89%E5%85%B3-dji-%E4%BA%A7%E5%93%81%E5%92%8C%E7%A7%BB%E5%8A%A8-sdk-%E7%9A%84%E6%9B%B4%E5%A4%9A%E4%BF%A1%E6%81%AF">&#x4E86;&#x89E3;&#x6709;&#x5173; DJI &#x4EA7;&#x54C1;&#x548C;&#x79FB;&#x52A8; SDK &#x7684;&#x66F4;&#x591A;&#x4FE1;&#x606F;</h2>
<p>&#x8BF7;&#x8BBF;&#x95EE; <a href="https://developer.dji.com/mobile-sdk/documentation/introduction/index.html">DJI Mobile SDK &#x6587;&#x6863;</a>&#x4E86;&#x89E3;&#x66F4;&#x591A;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#x3002;</p>
<h2 id="dji-mobile-ux-sdk">DJI Mobile UX SDK</h2>
<p>DJI Mobile UX SDK &#x662F;&#x4E00;&#x5957;&#x4E0E;&#x4EA7;&#x54C1;&#x65E0;&#x5173;&#x7684; UI &#x5BF9;&#x8C61;&#xFF0C;&#x53EF;&#x4F7F;&#x7528; DJI Mobile SDK &#x5FEB;&#x901F;&#x8DDF;&#x8E2A; iOS &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7684;&#x5F00;&#x53D1;&#x3002;&#x6709;&#x5173;&#x66F4;&#x591A;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x67E5;&#x770B;<a href="https://github.com/dji-sdk/Mobile-UXSDK-Android">&#x6B64;&#x5904;</a>&#x3002;</p>
<h2 id="%E8%AE%BE%E5%A4%87%E8%BF%90%E8%A1%8C%E7%8A%B6%E5%86%B5%E4%BF%A1%E6%81%AF-json-%E6%96%87%E4%BB%B6">&#x8BBE;&#x5907;&#x8FD0;&#x884C;&#x72B6;&#x51B5;&#x4FE1;&#x606F; Json &#x6587;&#x4EF6;</h2>
<p>&#x60A8;&#x53EF;&#x4EE5;&#x5728;&#x8BE5; repo &#x7684;&#x6839;&#x6587;&#x4EF6;&#x5939;&#x4E2D;&#x627E;&#x5230; <strong>hms.json</strong> &#x548C; <strong><code>hms_match_sdkerror.json</code></strong> &#x6587;&#x4EF6;&#x3002;</p>
<p>&#x5B83;&#x5305;&#x542B;&#x9519;&#x8BEF;&#x4EE3;&#x7801;&#x548C;&#x8BBE;&#x5907;&#x7EC4;&#x4EF6;&#x7684;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#x3002;&#x4EC5;&#x7531; Matrice 300 RTK &#x548C; Zenmuse H20 &#x7CFB;&#x5217;&#x7684;&#x67D0;&#x4E9B;&#x7EC4;&#x4EF6;&#x652F;&#x6301;&#x3002;</p>
<p>&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;&#x8BBE;&#x5907;&#x5065;&#x5EB7;&#x4FE1;&#x606F;&#x6765;&#x66FF;&#x6362;&#x98DE;&#x884C;&#x63A7;&#x5236;&#x5668;&#x548C; RTK &#x7684;&#x65E7;&#x8BCA;&#x65AD;&#x3002;Matrice 300 RTK &#x4E0A;&#x7684;&#x4E07;&#x5411;&#x8282;&#x3001;&#x7535;&#x6C60;&#x3001;&#x611F;&#x77E5;&#x6A21;&#x5757;&#x4F1A;&#x6709;&#x4E00;&#x4E9B;&#x91CD;&#x590D;&#x7684;&#x7EC4;&#x4EF6;&#x9519;&#x8BEF;&#x3002;</p>
<p>&#x91CD;&#x590D;&#x6027;&#x9519;&#x8BEF;&#x8BF7;&#x53C2;&#x9605;&#x4E0B;&#x8868;&#xFF1A;</p>
<table>
<thead>
<tr>
<th style="text-align:left">DJIDiagnosticsError</th>
<th style="text-align:center">Enum Value</th>
<th style="text-align:right">AlarmId</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>BATTERY_DISCHARGE_OVER_CURRENT</code></td>
<td style="text-align:center">3001</td>
<td style="text-align:right">0x110B0001</td>
</tr>
<tr>
<td style="text-align:left"><code>BATTERY_DISCHARGE_OVER_HEAT</code></td>
<td style="text-align:center">3002</td>
<td style="text-align:right">0x110B0002</td>
</tr>
<tr>
<td style="text-align:left"><code>BATTERY_LOW_TEMPERATURE</code></td>
<td style="text-align:center">3003</td>
<td style="text-align:right">0x110B0003</td>
</tr>
<tr>
<td style="text-align:left"><code>BATTERY_CELL_BROKEN</code></td>
<td style="text-align:center">3004</td>
<td style="text-align:right">0x110B0006</td>
</tr>
<tr>
<td style="text-align:left"><code>GIMBAL_CONNECT_TO_FC_ERROR</code></td>
<td style="text-align:center">2005</td>
<td style="text-align:right">0x1D030001</td>
</tr>
<tr>
<td style="text-align:left"><code>GIMBAL_GYROSCOPE_ERROR</code></td>
<td style="text-align:center">2001</td>
<td style="text-align:right">0x1D040002</td>
</tr>
<tr>
<td style="text-align:left"><code>GIMBAL_PITCH_ERROR</code></td>
<td style="text-align:center">2002</td>
<td style="text-align:right">0x1D040004</td>
</tr>
<tr>
<td style="text-align:left"><code>GIMBAL_ROLL_ERROR</code></td>
<td style="text-align:center">2003</td>
<td style="text-align:right">0x1D040003</td>
</tr>
<tr>
<td style="text-align:left"><code>GIMBAL_YAW_ERROR</code></td>
<td style="text-align:center">2004</td>
<td style="text-align:right">0x1D040005</td>
</tr>
</tbody>
</table>
<h2 id="proguard">ProGuard</h2>
<p>&#x5982;&#x679C;&#x60A8;&#x8BA1;&#x5212;&#x4F7F;&#x7528; <a href="https://developer.android.com/studio/build/shrink-code.html">ProGuard</a> &#x4F18;&#x5316;&#x60A8;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x5C06;&#x4EE5;&#x4E0B;&#x89C4;&#x5219;&#x6DFB;&#x52A0;&#x5230;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7684; <code>proguard.cfg</code> &#x6587;&#x4EF6;&#x4E2D;&#xFF1A;</p>
<ul>
<li>&#x5BF9;&#x4E8E; <strong>AAR</strong> &#x6587;&#x4EF6;&#xFF0C;&#x8BF7;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x89C4;&#x5219;&#xFF1A;</li>
</ul>
<pre><code>&quot;-libraryjars ./PATH_TO_THIS_FILE/dji_android_sdk.aar&quot;
</code></pre>
<ul>
<li>&#x5BF9;&#x4E8E; <strong>API &#x5E93;</strong>&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x8BF7;&#x4F7F;&#x7528; <a href="https://github.com/dji-sdk/Mobile-SDK-Android/blob/master/SampleCode/app/proguard-rules.pro">proguard-project</a> &#x4E2D;&#x7684;&#x89C4;&#x5219;&#x6587;&#x4EF6;&#x3002;</li>
</ul>
<blockquote>
<p><strong>&#x6CE8;</strong>&#xFF1A;DJI Android SDK &#x6709;&#x4E24;&#x79CD;&#x7C7B;&#x578B;&#xFF1A;<strong>AAR</strong> &#x548C; <strong>API &#x5E93;&#x6587;&#x4EF6;&#x5939;</strong>&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x4ECE; DJI &#x5F00;&#x53D1;&#x8005;&#x7F51;&#x7AD9;&#x4E0B;&#x8F7D;&#xFF1A;<a href="http://developer.dji.com/mobile-sdk/downloads/">http://developer.dji.com/mobile-sdk/downloads/</a>&#x3002;</p>
</blockquote>
<h2 id="sdk-%E5%AF%86%E9%92%A5">SDK &#x5BC6;&#x94A5;</h2>
<p>SDK &#x5BC6;&#x94A5;&#x53EF;&#x4EE5;&#x7528;&#x4F5C;&#x8BBF;&#x95EE;&#x4EA7;&#x54C1;&#x7684;&#x66FF;&#x4EE3;&#x63A5;&#x53E3;&#x3002;</p>
<p>SDK &#x5BC6;&#x94A5;&#x7684;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5728;<a href="./docs/README-KeyedInterface.md">&#x8FD9;&#x91CC;</a>.</p>
<h2 id="%E4%BB%BB%E5%8A%A1%E9%87%8D%E6%9E%84%E5%99%A8">&#x4EFB;&#x52A1;&#x91CD;&#x6784;&#x5668;</h2>
<p>&#x4EFB;&#x52A1;&#x662F; SDK &#x7684;&#x91CD;&#x8981;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x5141;&#x8BB8;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x4F7F;&#x7528;&#x7B80;&#x5355;&#x7684;&#x9AD8;&#x7EA7;&#x754C;&#x9762;&#x6765;&#x81EA;&#x52A8;&#x5316; DJI &#x7684;&#x4EA7;&#x54C1;&#x3002;&#x5728; 4.0 &#x4E2D;&#xFF0C;&#x4EFB;&#x52A1;&#x88AB;&#x91CD;&#x6784;&#x4E3A;&#x66F4;&#x5065;&#x58EE;&#x3001;&#x66F4;&#x6613;&#x4E8E;&#x7BA1;&#x7406;&#x3002;</p>
<p>&#x4EFB;&#x52A1;&#x7684;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x5982;&#x4E0B;<a href="./docs/README-Mission.md">&#x6B64;&#x5904;</a>.</p>
<h2 id="%E5%AE%89%E5%8D%93%E6%A1%A5%E6%8E%A5%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F">&#x5B89;&#x5353;&#x6865;&#x63A5;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</h2>
<p>&#x8BF7;&#x67E5;&#x770B;&#x6B64;<a href="https://github.com/dji-sdk/Android-Bridge-App">&#x94FE;&#x63A5;</a>&#x4E0B;&#x8F7D;&#x5B89;&#x5353;&#x6865;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7684; apk &#x6587;&#x4EF6;&#x3002;</p>
<h2 id="sdk-api-%E5%8F%82%E8%80%83">SDK API &#x53C2;&#x8003;</h2>
<p><a href="http://developer.dji.com/api-reference/android-api/index.html"><strong>Android SDK API &#x6587;&#x6863;</strong></a></p>
<h2 id="%E8%AE%B8%E5%8F%AF%E8%AF%81">&#x8BB8;&#x53EF;&#x8BC1;</h2>
<p>DJI Android SDK &#x4E0E;&#x57FA;&#x4E8E; <a href="https://www.gnu.org/licenses/lgpl-2.1.html.en">LGPLv2.1</a> &#x53D1;&#x5E03;&#x7684; <a href="http://ffmpeg.org">FFmpeg &#x7684;&#x672A;&#x4FEE;&#x6539;&#x5E93;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x3002;&#x8FD9;&#x4E9B; FFmpeg &#x5E93;&#x7684;&#x6E90;&#x4EE3;&#x7801;&#x3001;&#x7F16;&#x8BD1;&#x8BF4;&#x660E;&#x548C; LGPLv2.1 &#x8BB8;&#x53EF;&#x8BC1;&#x5728; <a href="https://github.com/dji-sdk/FFmpeg">Github</a> &#x63D0;&#x4F9B;&#x3002;</a></p>
<p>&#x6839;&#x636E; <a href="https://www.gnu.org/licenses/lgpl-2.1.html.en">LGPLv2.1</a>&#xFF0C;DJI Android SDK &#x4E0E; <a href="https://mvnrepository.com/artifact/com.vividsolutions/jts/1.8">JTS &#x62D3;&#x6251;&#x5957;&#x4EF6;</a>&#x7684;&#x672A;&#x4FEE;&#x6539;&#x5E93;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x3002;</p>
<h2 id="%E6%94%AF%E6%8C%81">&#x652F;&#x6301;</h2>
<p>&#x60A8;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x65B9;&#x6CD5;&#x83B7;&#x5F97; DJI &#x7684;&#x652F;&#x6301;&#xFF1A;</p>
<ul>
<li>&#x5728;&#x5927;&#x7586;&#x5F00;&#x53D1;&#x8005;&#x8BBA;&#x575B;&#x53D1;&#x5E03;&#x95EE;&#x9898;&#xFF1A;<br>
<a href="https://djisdksupport.zendesk.com/hc/zh-cn/community/topics"><strong>&#x4E2D;&#x6587;&#x8BBA;&#x575B;</strong></a><br>
, <a href="https://djisdksupport.zendesk.com/hc/en-us/community/topics"><strong>&#x82F1;&#x6587;&#x8BBA;&#x575B;</strong></a></li>
</ul>
<h2 id="%E5%8A%A0%E5%85%A5%E6%88%91%E4%BB%AC">&#x52A0;&#x5165;&#x6211;&#x4EEC;</h2>
<p>DJI &#x62DB;&#x8F6F;&#x4EF6;&#x5DE5;&#x7A0B;&#x5E08;&#x5566;&#xFF0C;based&#x5728;&#x6DF1;&#x5733;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x548C;&#x6211;&#x4EEC;&#x4E00;&#x8D77;&#x628A; DJI &#x4EA7;&#x54C1;&#x505A;&#x5F97;&#x66F4;&#x597D;&#xFF0C;&#x8BF7;&#x53D1;&#x9001;&#x7B80;&#x5386;&#x5230; <a href="mailto:software-sz@dji.com">software-sz@dji.com</a>.  &#x6216;&#x8005;&#x5728;&#x8FD9;&#x91CC;&#x63D0;&#x4EA4;&#x60A8;&#x7684;&#x7B80;&#x5386;&#xFF1A;<a href="https://we.dji.com/zh-CN/position/detail?positionId=1382258951346253824">https://we.dji.com/zh-CN/position/detail?positionId=1382258951346253824</a> &#x66F4;&#x591A;&#x5C97;&#x4F4D;&#x8BE6;&#x60C5;&#x8BF7;&#x6D4F;&#x89C8; <a href="https://we.dji.com/zh-CN/social">https://we.dji.com/zh-CN/social</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[继续折腾下 llama.cpp + Chinese-LLaMA-Alpaca]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E94;&#x4E00;&#x6709;&#x70B9;&#x7A7A;&#xFF0C;&#x7EE7;&#x7EED;&#x6298;&#x817E;&#x4E0B; llama.cpp&#x3002;</p>
<p>&#x672C;&#x6765;&#x5E94;&#x8BE5;&#x4F18;&#x5148;&#x6298;&#x817E;&#x8FD9;&#x4E2A;&#x7684;&#xFF0C;&#x6BD5;&#x7ADF;&#x66F4;&#x51FA;&#x540D;&#xFF0C;&#x4E0D;&#x8FC7;&#x540C;&#x4E8B;&#x6298;&#x817E;&#x8FC7; gpt4all&#xFF0C;&#x4E5F;&#x662F; llama&#xFF0C;&#x4F46;&#x4F3C;&#x4E4E;&#x4E2D;&#x6587;</p>]]></description><link>https://www.listera.top/ji-xu-zhe-teng-xia-chinese-llama-alpaca/</link><guid isPermaLink="false">6450c2f066131850f011505e</guid><category><![CDATA[ai]]></category><category><![CDATA[gpt]]></category><category><![CDATA[llama]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Sun, 30 Apr 2023 08:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E94;&#x4E00;&#x6709;&#x70B9;&#x7A7A;&#xFF0C;&#x7EE7;&#x7EED;&#x6298;&#x817E;&#x4E0B; llama.cpp&#x3002;</p>
<p>&#x672C;&#x6765;&#x5E94;&#x8BE5;&#x4F18;&#x5148;&#x6298;&#x817E;&#x8FD9;&#x4E2A;&#x7684;&#xFF0C;&#x6BD5;&#x7ADF;&#x66F4;&#x51FA;&#x540D;&#xFF0C;&#x4E0D;&#x8FC7;&#x540C;&#x4E8B;&#x6298;&#x817E;&#x8FC7; gpt4all&#xFF0C;&#x4E5F;&#x662F; llama&#xFF0C;&#x4F46;&#x4F3C;&#x4E4E;&#x4E2D;&#x6587;&#x652F;&#x6301;&#x4E0D;&#x600E;&#x4E48;&#x6837;&#x7684;&#xFF0C;&#x89C9;&#x5F97;&#x4E0D;&#x884C;&#x5C31;&#x6CA1;&#x770B;&#x3002;&#x987A;&#x4FBF;&#x7F51;&#x4E0A;&#x627E;&#x627E;&#xFF0C;&#x770B;&#x770B;&#x878D;&#x5408; Chinese-LLaMA-Alpaca &#x7684;&#x4E2D;&#x6587;&#x600E;&#x4E48;&#x6837;</p>
<p>&#x64CD;&#x4F5C;&#x73AF;&#x5883;&#xFF1A;Windows 11 Python 3.10</p>
<hr>
<h4 id="%E4%B8%8B%E8%BD%BD%E5%B9%B6%E7%94%9F%E6%88%90-llamacpp">&#x4E0B;&#x8F7D;&#x5E76;&#x751F;&#x6210; llama.cpp</h4>
<p>&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;</p>
<pre><code class="language-bash">git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
</code></pre>
<p>&#x751F;&#x6210;</p>
<pre><code class="language-bash">mkdir build
cd build
cmake ..
cmake --build . --config Release
</code></pre>
<p>&#x8BD5;&#x8FD0;&#x884C;</p>
<pre><code class="language-bash">cd bin\Release
./main -h
</code></pre>
<h4 id="%E4%B8%8B%E8%BD%BD-llama-7b-%E6%A8%A1%E5%9E%8B">&#x4E0B;&#x8F7D; llama 7b &#x6A21;&#x578B;</h4>
<p>&#x4E0B;&#x8F7D; llama &#x534A;&#x7CBE;&#x5EA6;&#x6A21;&#x578B;</p>
<pre><code class="language-bash">$env:GIT_LFS_SKIP_SMUDGE=1
git lfs install
git clone https://huggingface.co/decapoda-research/llama-7b-hf
git lfs pull
</code></pre>
<h4 id="%E4%B8%8B%E8%BD%BD-chinese-llama-alpaca">&#x4E0B;&#x8F7D; Chinese-LLaMA-Alpaca</h4>
<pre><code class="language-bash">git clone https://ghproxy.com/github.com/ymcui/Chinese-LLaMA-Alpaca.git
</code></pre>
<h4 id="%E4%B8%8B%E8%BD%BD-chinese-alpaca-lora-7b-%E6%A8%A1%E5%9E%8B">&#x4E0B;&#x8F7D; chinese alpaca lora-7b &#x6A21;&#x578B;</h4>
<pre><code class="language-bash">$env:GIT_LFS_SKIP_SMUDGE=1
git lfs install
https://huggingface.co/ziqingyang/chinese-alpaca-lora-7b
git lfs pull
</code></pre>
<h3 id="%E6%A8%A1%E5%9E%8B%E8%9E%8D%E5%90%88">&#x6A21;&#x578B;&#x878D;&#x5408;</h3>
<p>&#x4F7F;&#x7528; ymcui/Chinese-LLaMA-Alpaca &#x91CC;&#x9762;&#x7684; scripts/merge_llama_with_chinese_lora.py &#x811A;&#x672C;&#x5BF9;&#x539F;&#x7248; LLaMA &#x6A21;&#x578B;&#xFF08;HF&#x683C;&#x5F0F;&#xFF09;&#x6269;&#x5145;&#x4E2D;&#x6587;&#x8BCD;&#x8868;&#xFF0C;&#x5E76;&#x4E0E; LoRA &#x6743;&#x91CD;&#x8FDB;&#x884C;&#x5408;&#x5E76;&#xFF0C;&#x751F;&#x6210;&#x5168;&#x91CF;&#x6A21;&#x578B;&#x6743;&#x91CD; consolidated.*.pth&#xFF08;&#x5EFA;&#x8BAE;&#x68C0;&#x67E5;&#x751F;&#x6210;&#x6A21;&#x578B;&#x7684; SHA256 &#x503C;&#xFF09;&#x548C;&#x914D;&#x7F6E;&#x6587;&#x4EF6; params.json</p>
<pre><code class="language-bash">cd Chinese-LLaMA-Alpaca
python scripts/merge_llama_with_chinese_lora.py --base_model D:\test\ai\llama\llama-7b-hf --lora_model D:\test\ai\llama\chinese-alpaca-lora-7b --output_dir ./ggml-model-chinese-alpaca-lora-7b/
</code></pre>
<p>&#x628A;&#x751F;&#x6210;&#x7684; tokenizer.model &#x6587;&#x4EF6;&#x653E;&#x5165; llama.cpp/models &#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5176;&#x4ED6;&#x5C0F;&#x6587;&#x4EF6;&#x653E;&#x5165; llama.cpp/models/7B &#x76EE;&#x5F55;&#x4E0B;&#x3002;</p>
<h4 id="%E8%BD%AC%E6%8D%A2%E4%B8%BA-ggml-fp16-%E6%A8%A1%E5%9E%8B">&#x8F6C;&#x6362;&#x4E3A; ggml fp16 &#x6A21;&#x578B;</h4>
<pre><code class="language-bash">cd llama.cpp
python convert.py D:\test\ai\llama\Chinese-LLaMA-Alpaca\ggml-model-chinese-alpaca-lora-7b
</code></pre>
<h4 id="%E9%87%8F%E5%8C%96%E4%B8%BA-4bit">&#x91CF;&#x5316;&#x4E3A; 4bit</h4>
<pre><code class="language-bash">cd build/bin/Release
./quantize  D:\test\ai\llama\Chinese-LLaMA-Alpaca\ggml-model-chinese-alpaca-lora-7b/ggml-model-f16.bin ../../../models/7B/ggml-model-q4_0.bin q4_0 4
</code></pre>
<h4 id="%E5%88%A0%E9%99%A4%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6">&#x5220;&#x9664;&#x4E34;&#x65F6;&#x6587;&#x4EF6;</h4>
<pre><code class="language-bash">rm -R D:\test\ai\llama\Chinese-LLaMA-Alpaca\ggml-model-chinese-alpaca-lora-7b
</code></pre>
<h4 id="%E8%BF%90%E8%A1%8C">&#x8FD0;&#x884C;</h4>
<pre><code class="language-bash">./main -m ../../../models/7B/ggml-model-q4_0.bin --color -f ../../../prompts/alpaca.txt -ins -c 2048 --temp 0.2 --repeat_penalty 1 -n 4096
</code></pre>
<p>&#x901F;&#x5EA6;&#x5012;&#x662F;&#x5F88;&#x5FEB;&#x3002;&#x4E0D;&#x8FC7;&#x8FD9;&#x4E2D;&#x6587;&#x7406;&#x89E3;&#x80FD;&#x529B;&#x6709;&#x95EE;&#x9898;&#x554A;&#x3002;&#x3002;&#x524D;&#x9762;&#x95EE;&#x5C0F;&#x8BF4;&#xFF0C;&#x540E;&#x9762;&#x4E0D;&#x95EE;&#x4E86;&#x4E5F;&#x662F;&#x56DE;&#x7B54;&#x5C0F;&#x8BF4;&#x3002;&#x3002;&#x3002;</p>
<p>&#x5199;&#x4E00;&#x6BB5; c &#x64CD;&#x4F5C;&#x4E32;&#x53E3;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x8FD8;&#x662F;&#x4E0D;&#x884C;&#x3002;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[顺便折腾下 Stable Diffusion]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x65E2;&#x7136;&#x73A9;&#x4E86; ai &#x804A;&#x5929;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x987A;&#x4FBF;&#x6298;&#x817E;&#x4E0B;&#x753B;&#x753B;&#x7684;&#x4E1C;&#x897F;&#x3002;&#x641C;&#x4E86;&#x4E0B;&#xFF0C;&#x53D1;&#x73B0;&#x4E86; Stable Diffusion&#x3002;</p>
<p>&#x64CD;&#x4F5C;&#x73AF;&#x5883;&#xFF1A;Windows 11 Python 3.10</p>
<hr>
<h3 id="%E4%B8%8B%E8%BD%BD%E4%BB%A3%E7%A0%81">&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;</h3>
<p>&#x5728;&#x9002;&#x5F53;&#x7684;</p>]]></description><link>https://www.listera.top/shun-bian-zhe-teng-xia/</link><guid isPermaLink="false">64509f8066131850f0114fd6</guid><category><![CDATA[ai]]></category><category><![CDATA[stable-diffusion]]></category><category><![CDATA[绘画]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Sun, 23 Apr 2023 05:43:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x65E2;&#x7136;&#x73A9;&#x4E86; ai &#x804A;&#x5929;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x987A;&#x4FBF;&#x6298;&#x817E;&#x4E0B;&#x753B;&#x753B;&#x7684;&#x4E1C;&#x897F;&#x3002;&#x641C;&#x4E86;&#x4E0B;&#xFF0C;&#x53D1;&#x73B0;&#x4E86; Stable Diffusion&#x3002;</p>
<p>&#x64CD;&#x4F5C;&#x73AF;&#x5883;&#xFF1A;Windows 11 Python 3.10</p>
<hr>
<h3 id="%E4%B8%8B%E8%BD%BD%E4%BB%A3%E7%A0%81">&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;</h3>
<p>&#x5728;&#x9002;&#x5F53;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x65B0;&#x5EFA;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x51C6;&#x5907;&#x83B7;&#x53D6;&#x4EE3;&#x7801;&#x3002;&#x4E0D;&#x5E26;&#x5176;&#x4ED6;&#x4EFB;&#x4F55;&#x6A21;&#x578B;&#x7684;&#x9ED8;&#x8BA4;&#x7248;&#x672C;&#x5927;&#x6982; 7G&#x3002;&#x6A21;&#x578B;&#x4E5F;&#x662F; GB &#x7EA7;&#x522B;&#xFF0C;&#x6240;&#x4EE5;&#x7A7A;&#x95F4;&#x53EF;&#x4EE5;&#x9002;&#x5F53;&#x7559;&#x5927;&#x4E00;&#x70B9;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x76EE;&#x5F55;&#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x4E0D;&#x8981;&#x5E26;&#x4E2D;&#x6587;&#x3002;</p>
<p>&#x6253;&#x5F00;&#x547D;&#x4EE4;&#x884C;&#xFF0C;&#x8FDB;&#x5165;&#x5F85;&#x5B89;&#x88C5;&#x7684;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x6267;&#x884C;&#x6307;&#x4EE4;&#x83B7;&#x53D6;&#x4EE3;&#x7801;&#x3002;</p>
<pre><code class="language-bash">git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
</code></pre>
<h3 id="%E8%BF%90%E8%A1%8C%E5%92%8C%E4%B8%8B%E8%BD%BD%E9%83%A8%E4%BB%B6">&#x8FD0;&#x884C;&#x548C;&#x4E0B;&#x8F7D;&#x90E8;&#x4EF6;</h3>
<p>&#x83B7;&#x53D6;&#x5B8C;&#x4EE3;&#x7801;&#x540E;&#xFF0C;&#x8FD0;&#x884C;&#x83B7;&#x53D6;&#x5230;&#x7684; webui.bat &#x3002;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x6CA1;&#x6709;&#x663E;&#x5361;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x52A0;&#x4E0A;&#x53C2;&#x6570;&#xFF0C;&#x8FD0;&#x884C;&#xFF1A;</p>
<pre><code class="language-bash">./webui --skip-torch-cuda-test --no-half
</code></pre>
<p>&#x8FD9;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x8DF3;&#x8FC7; CUDA&#xFF08;&#x4F9D;&#x8D56;&#x4E8E;&#x663E;&#x5361;&#x7684;&#x52A0;&#x901F;&#x7B97;&#x6CD5;&#xFF09;&#x4EE5;&#x53CA;&#x7981;&#x7528;&#x534A;&#x7CBE;&#x5EA6;&#x8FD0;&#x7B97;&#xFF0C;&#x89C4;&#x907F;&#x62A5;&#x9519;&#x3002;</p>
<p>&#x811A;&#x672C;&#x9996;&#x5148;&#x4F1A;&#x83B7;&#x53D6;&#x4F9D;&#x8D56;&#x9879;&#xFF0C;&#x968F;&#x540E;&#x4F1A;&#x83B7;&#x53D6;&#x4F9D;&#x8D56;&#x9879;&#x76EE;&#xFF0C;&#x7136;&#x540E;&#x4F1A;&#x83B7;&#x53D6;&#x9ED8;&#x8BA4;&#x6A21;&#x578B;&#x3002;&#x6700;&#x7EC8;&#x542F;&#x52A8;WebUI&#x670D;&#x52A1;&#x5668;&#x3002;&#x76F4;&#x5230;&#x63D0;&#x793A;</p>
<pre><code>Running on local URL: http://127.0.0.1:7860
</code></pre>
<p>&#x8FD9;&#x65F6;&#x5019;&#xFF0C;Web &#x670D;&#x52A1;&#x5C31;&#x542F;&#x52A8;&#x6210;&#x529F;&#x4E86;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#x6253;&#x5F00;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x59CB;&#x753B;&#x8D77;&#x6765;&#x4E86;&#x3002;</p>
<p>&#x8F93;&#x5165;&#x63CF;&#x8FF0;&#x6765;&#x753B;&#x56FE;&#x3002;&#x53EA;&#x80FD;&#x7528;&#x82F1;&#x6587;&#x63CF;&#x8FF0;&#x5173;&#x952E;&#x8BCD;&#x3002;</p>
<p>cpu &#x5360;&#x7528;&#x4E0D;&#x662F;&#x5F88;&#x5927;&#xFF0C;&#x4E0D;&#x5F71;&#x54CD;&#x6253;&#x5F00;&#x4E00;&#x4E2A; vscode&#x3002;</p>
<p>&#x4E0D;&#x8FC7;&#x8FD8;&#x662F;&#x6162;&#x3002;&#x6211;&#x7684;&#x7B14;&#x8BB0;&#x672C; 512x512 &#x7684;&#x9700;&#x8981; 5 &#x5206;&#x949F;&#x3002;&#x3002;1000x600 &#x7684; 20 &#x5206;&#x949F;&#x3002;&#x3002;</p>
<p>&#x70B9; save &#x4FDD;&#x5B58;&#xFF0C;&#x6587;&#x4EF6;&#x9ED8;&#x8BA4;&#x5728; stable-diffusion-webui\outputs\txt2img-images</p>
<p>&#x8001;&#x9E70;&#x6293;&#x5C0F;&#x9E21;&#x3002;&#x3002;</p>
<p><img src="https://www.listera.top/content/images/2023/05/00002-443804084.png" alt="00002-443804084" loading="lazy"></p>
<p>&#x753B;&#x51FA;&#x6765;&#x7684;&#x4EBA;&#x8138;&#x5168;&#x662F;&#x82B1;&#x7684;&#x3002;&#x3002;&#x3002;&#x5413;&#x4EBA;&#x3002;</p>
<p><img src="https://www.listera.top/content/images/2023/05/00002-1860859087.png" alt="00002-1860859087" loading="lazy"></p>
<h3 id="%E9%83%A8%E4%BB%B6%E4%B8%8B%E8%BD%BD%E9%97%AE%E9%A2%98">&#x90E8;&#x4EF6;&#x4E0B;&#x8F7D;&#x95EE;&#x9898;</h3>
<p>&#x65E0;&#x6CD5;&#x4E0B;&#x8F7D; gfpgan &#x5C31;&#x624B;&#x5DE5;&#x4E0B;&#x8F7D;</p>
<pre><code class="language-bash">git clone https://ghproxy.com/github.com/TencentARC/GFPGAN.git
</code></pre>
<p>&#x7B97;&#x4E86;&#xFF0C;&#x76F4;&#x63A5;&#x6539; launch.py &#x4E2D;&#x7684;&#x94FE;&#x63A5;</p>
<h3 id="%E4%B8%AD%E6%96%87%E6%8F%90%E7%A4%BA%E8%AF%8D">&#x4E2D;&#x6587;&#x63D0;&#x793A;&#x8BCD;</h3>
<p>&#x63D0;&#x793A;&#x8BCD;&#x53EA;&#x652F;&#x6301;&#x82F1;&#x6587;&#x4E5F;&#x662F;&#x65E0;&#x5948;&#xFF0C;&#x56FD;&#x5185;&#x7684;&#x592A;&#x4E59;&#x8FD8;&#x4E0D;&#x652F;&#x6301; cpu</p>
<p>&#x5B89;&#x88C5;&#x4E2A; Prompt Translator&#xFF0C;&#x8F93;&#x5165;&#x4E2D;&#x6587;&#x81EA;&#x52A8;&#x7528;&#x767E;&#x5EA6;&#x7FFB;&#x8BD1;</p>
<h3 id="%E6%9C%AC%E5%9C%B0%E5%8C%96%E7%95%8C%E9%9D%A2">&#x672C;&#x5730;&#x5316;&#x754C;&#x9762;</h3>
<p>&#x53E6;&#x4E00;&#x4E2A;&#x754C;&#x9762;&#x5E93; invokeai &#x91CC;&#x9762;&#x6709;&#x672C;&#x5730;&#x5316;&#x6587;&#x4EF6;&#xFF0C;&#x4E0B;&#x8F7D;&#x540E;&#x5728; invokeai\frontend\web\dist\locales &#x80FD;&#x627E;&#x5230;&#xFF0C;&#x590D;&#x5236;&#x5230;<br>
stable-diffusion-webui\localizations &#x4E2D;&#x3002;</p>
<p>&#x7136;&#x540E;&#x518D;&#x754C;&#x9762;&#x914D;&#x7F6E;&#x4E2D;&#x9009;&#x62E9; zh_CN&#xFF0C;&#x91CD;&#x542F;&#x670D;&#x52A1;&#x3002;</p>
<h3 id="%E9%9D%A2%E9%83%A8%E4%BF%AE%E5%A4%8D">&#x9762;&#x90E8;&#x4FEE;&#x590D;</h3>
<p>&#x5728;&#x914D;&#x7F6E;&#x754C;&#x9762;&#x4E0A;&#x9009;&#x62E9;&#x9762;&#x90E8;&#x4FEE;&#x590D;&#x3002;&#x4F3C;&#x4E4E;&#x6CA1;&#x4EC0;&#x4E48;&#x7528;&#x3002;</p>
<p>&#x7528; lora &#x6A21;&#x578B;&#x4F3C;&#x4E4E;&#x6CA1;&#x95EE;&#x9898;&#x3002;&#x3002;&#x53EF;&#x80FD;&#x662F;&#x63D0;&#x793A;&#x8BCD;&#x7684;&#x95EE;&#x9898;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[折腾 ChatGLM-MNN]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>ChatGLM &#x672C;&#x5730;&#x633A;&#x6162;&#x7684;&#xFF0C;&#x5728;&#x5B83;&#x7684; readme &#x4E2D;&#x627E;&#x5230;&#x4E00;&#x4E2A; cpp &#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x8BD5;&#x8BD5;</p>
<p>&#x64CD;&#x4F5C;&#x73AF;&#x5883;&#xFF1A;windows 11 python 3.10</p>
<p>&#x7ECF;&#x6298;&#x817E;&#x53D1;&#x73B0;&#xFF0C;&#x6BD4; python &#x7684;&#x8FD8;&#x6162;&#x3002;</p>
<hr>
<h3 id="%E7%BC%96%E8%AF%91-mnn">&#x7F16;&#x8BD1; mnn</h3>
<pre><code class="language-bash">git clone</code></pre>]]></description><link>https://www.listera.top/untitled-2/</link><guid isPermaLink="false">6450800066131850f0114ec5</guid><category><![CDATA[ai]]></category><category><![CDATA[chatglm]]></category><category><![CDATA[gpt]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Sat, 22 Apr 2023 04:05:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>ChatGLM &#x672C;&#x5730;&#x633A;&#x6162;&#x7684;&#xFF0C;&#x5728;&#x5B83;&#x7684; readme &#x4E2D;&#x627E;&#x5230;&#x4E00;&#x4E2A; cpp &#x5B9E;&#x73B0;&#x7684;&#xFF0C;&#x8BD5;&#x8BD5;</p>
<p>&#x64CD;&#x4F5C;&#x73AF;&#x5883;&#xFF1A;windows 11 python 3.10</p>
<p>&#x7ECF;&#x6298;&#x817E;&#x53D1;&#x73B0;&#xFF0C;&#x6BD4; python &#x7684;&#x8FD8;&#x6162;&#x3002;</p>
<hr>
<h3 id="%E7%BC%96%E8%AF%91-mnn">&#x7F16;&#x8BD1; mnn</h3>
<pre><code class="language-bash">git clone https://github.com/alibaba/MNN.git
cd MNN
mkdir build &amp;&amp; cd build
cmake ..
cmake --build . -j4

cp -r ../include /path/to/ChatGLM-MNN/
cp libMNN.so /path/to/ChatGLM-MNN/libs
cp express/libMNN_Express.so /path/to/ChatGLM-MNN/libs
</code></pre>
<h3 id="%E4%B8%8B%E8%BD%BD%E6%A8%A1%E5%9E%8B">&#x4E0B;&#x8F7D;&#x6A21;&#x578B;</h3>
<pre><code class="language-bash">cd ChatGLM-MNN/resource/models
</code></pre>
<p>&#x540E;&#x9762;&#x4E24;&#x4E2A;&#x4E00;&#x6837;&#xFF0C;&#x4E0D;&#x7528;&#x91CD;&#x590D;&#x4E0B;&#x8F7D;</p>
<h5 id="int4">int4</h5>
<pre><code class="language-bash">mkdir in4 &amp;&amp; cd in4

wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.3/glm_block_0.mnn
... 
wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.3/glm_block_27.mnn 

wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/lm.mnn 
wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/slim_word_embeddings.bin
</code></pre>
<h5 id="int8">int8</h5>
<pre><code class="language-bash">mkdir in8 &amp;&amp; cd in8

wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.2/glm_block_0.mnn
...
wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.2/glm_block_27.mnn

wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/lm.mnn
wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/slim_word_embeddings.bin
</code></pre>
<h5 id="fp16">fp16</h5>
<pre><code class="language-bash">mkdir fp16 &amp;&amp; cd fp16

wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/glm_block_0.mnn
... 
wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/glm_block_27.mnn 

wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/lm.mnn
wget https://github.com/wangzhaode/ChatGLM-MNN/releases/download/v0.1/slim_word_embeddings.bin
</code></pre>
<h3 id="%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8C">&#x7F16;&#x8BD1;&#x8FD0;&#x884C;</h3>
<h6 id="%E6%9C%AC%E5%9C%B0-msvc-%E7%BC%96%E8%AF%91">&#x672C;&#x5730; msvc &#x7F16;&#x8BD1;</h6>
<pre><code class="language-bash">cd ChatGLM-MNN
mkdir build &amp;&amp; cd build
cmake ..
cmake --build . -j4
./cli_demo # cli demo
./web_demo # web ui demo
</code></pre>
<p>msvc &#x7F16;&#x8BD1;&#x9700;&#x8981; CMakeLists &#x6DFB;&#x52A0;</p>
<pre><code>add_compile_options(&quot;$&lt;$&lt;CXX_COMPILER_ID:MSVC&gt;:/source-charset:utf-8&gt;&quot;)
add_compile_options(&quot;$&lt;$&lt;C_COMPILER_ID:MSVC&gt;:/source-charset:utf-8&gt;&quot;)
</code></pre>
<p>web_demo &#x5F15;&#x7528;&#x4E86; pthread&#xFF0C;&#x9700;&#x8981; mingw &#x7F16;&#x8BD1;&#x3002;&#x3002;&#x4F9D;&#x8D56;&#x7684; mnn &#x5E93;&#x4E5F;&#x8981;&#x7F16;&#x8BD1;&#x3002;&#x3002;&#x3002;</p>
<pre><code class="language-bash">cmake .. -G &quot;MinGW Makefiles&quot;
cmake --build . -j4
</code></pre>
<p>&#x751F;&#x6210;&#x4E0D;&#x4E86; express &#x5E93;</p>
<p>&#x65E0;&#x6CD5;&#x8FD0;&#x884C;&#x3002;&#x3002;&#x7981;&#x7528;&#x6389; gpu</p>
<pre><code class="language-bash">./cli_demo -g0
</code></pre>
<p>&#x8FD8;&#x662F;&#x4E0D;&#x884C;&#x3002;&#x3002;</p>
<h6 id="wsl-%E7%BC%96%E8%AF%91">wsl &#x7F16;&#x8BD1;</h6>
<p>&#x76F4;&#x63A5; wsl &#x4E2D;&#x7F16;&#x8BD1;&#x8FD0;&#x884C;&#x5427;</p>
<pre><code class="language-bash">mkdir build &amp;&amp; cd build
cmake ..
cmake --build . -j4
</code></pre>
<p>&#x8FD0;&#x884C;</p>
<pre><code class="language-bash">export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../libs
./web_demo -g0 -m &quot;../resource/models/int4&quot;
</code></pre>
<p>&#x865A;&#x62DF;&#x673A;&#x5185;&#x5185;&#x5B58;&#x4E0D;&#x8DB3;&#x3002;&#x3002;&#x5DF2;&#x6740;&#x6B7B;&#x3002;&#x3002;&#x9700;&#x8981;&#x7684;&#x5185;&#x5B58;&#x771F;&#x591A;&#x3002;&#x3002;&#x5927;&#x6982;&#x9700;&#x8981; 25G</p>
<p>&#x6DFB;&#x52A0;&#x914D;&#x7F6E;&#xFF0C;&#x589E;&#x52A0; wsl &#x865A;&#x62DF;&#x5185;&#x5B58;&#x3002;%UserProfile%/.wslconfig &#x5185;&#x5BB9;</p>
<pre><code>[wsl2]
swap=20480MB
</code></pre>
<p>&#x5360;&#x7684; C &#x76D8;&#x7A7A;&#x95F4;&#x3002;&#x3002;&#x7528;&#x5B8C;&#x5F97;&#x53BB;&#x6389;&#x3002;&#x3002;</p>
<p>&#x6162;&#x5F97;&#x4E0D;&#x5F97;&#x4E86;&#x3002;&#x3002;&#x3002;</p>
<h5 id="mingw-%E7%BC%96%E8%AF%91">mingw &#x7F16;&#x8BD1;</h5>
<p>&#x6CE8;&#x91CA;&#x6389;&#x5BF9; mnn-express &#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x518D;&#x7528; mingw &#x7F16;&#x8BD1;</p>
<p>&#x51FA;&#x9519;&#xFF1A;undefined reference to `__imp_setsockopt&apos;<br>
&#x5C11; ws2_32 &#x5E93;</p>
<pre><code>        target_link_libraries(web_demo chat pthread)
</code></pre>
<p>&#x6539;&#x6210;</p>
<pre><code>if(WIN32)
        target_link_libraries(web_demo chat ws2_32)
else()
        target_link_libraries(web_demo chat pthread)
endif()
</code></pre>
<p>&#x628A; libMNN.dll &#x590D;&#x5236;&#x8FC7;&#x6765;&#xFF0C;&#x8FD0;&#x884C;</p>
<pre><code class="language-bash">./web_demo -g0 -m &quot;../resource/models/int4&quot;
</code></pre>
<p>&#x8FD8;&#x662F;&#x592A;&#x6162;&#x4E86;&#xFF0C;&#x6BD4; ptyhon &#x8FD8;&#x6162;&#x3002;&#x800C;&#x4E14; web &#x8F93;&#x8FDB;&#x53BB;&#x63A7;&#x5236;&#x53F0;&#x663E;&#x793A;&#x4E71;&#x7801;&#xFF0C;&#x7A0B;&#x5E8F;&#x65E0;&#x6CD5;&#x8BC6;&#x522B;&#x3002;&#x7A0B;&#x5E8F;&#x8F93;&#x51FA;&#x7684;&#x4E5F;&#x662F;&#x4E71;&#x7801;&#x3002;&#x6BD5;&#x7ADF;&#x91CC;&#x9762;&#x7F16;&#x7801; utf8</p>
<p>&#x7B97;&#x4E86;&#xFF0C;&#x4E0D;&#x6298;&#x817E;&#x4E86;&#x3002;&#x6CA1;&#x7528;&#xFF0C;&#x5220;&#x9664;&#x3002;&#x3002;&#x3002;&#x8FD8;&#x662F;&#x76F4;&#x63A5;&#x7528;&#x7F51;&#x4E0A;&#x80FD;&#x7528;&#x7684;&#x5427;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ChatGLM-6B 本地部署下玩玩]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x540C;&#x4E8B;&#x5728;&#x73A9; gpt4all&#xFF0C;&#x4E0D;&#x8FC7;&#x5BF9;&#x4E2D;&#x6587;&#x4E0D;&#x600E;&#x4E48;&#x652F;&#x6301;&#x3002;&#x56DE;&#x6765;&#x641C;&#x4E86;&#x4E0B;&#xFF0C;&#x53D1;&#x73B0;&#x56FD;&#x5185;&#x6E05;&#x534E;&#x51FA;&#x7684; ChatGLM-6B &#x5BF9;&#x4E2D;&#x6587;&#x652F;&#x6301;&#x4E0D;&#x9519;&#x3002;&#x672C;&#x5730;&#x90E8;&#x7F72;&#x4E0B;&#xFF0C;&#x7528;&#x7EAF; cpu &#x73A9;</p>]]></description><link>https://www.listera.top/chatglm-6b/</link><guid isPermaLink="false">64507e6066131850f0114e91</guid><category><![CDATA[chatglm]]></category><category><![CDATA[ai]]></category><category><![CDATA[gpt]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Tue, 18 Apr 2023 08:47:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x540C;&#x4E8B;&#x5728;&#x73A9; gpt4all&#xFF0C;&#x4E0D;&#x8FC7;&#x5BF9;&#x4E2D;&#x6587;&#x4E0D;&#x600E;&#x4E48;&#x652F;&#x6301;&#x3002;&#x56DE;&#x6765;&#x641C;&#x4E86;&#x4E0B;&#xFF0C;&#x53D1;&#x73B0;&#x56FD;&#x5185;&#x6E05;&#x534E;&#x51FA;&#x7684; ChatGLM-6B &#x5BF9;&#x4E2D;&#x6587;&#x652F;&#x6301;&#x4E0D;&#x9519;&#x3002;&#x672C;&#x5730;&#x90E8;&#x7F72;&#x4E0B;&#xFF0C;&#x7528;&#x7EAF; cpu &#x73A9;&#x73A9;&#x3002;</p>
<p>&#x64CD;&#x4F5C;&#x73AF;&#x5883;&#xFF1A;windows 11 python 3.10</p>
<p>&#x6CA1;&#x6709;&#x591A;&#x4F59;&#x7CBE;&#x529B;&#x7814;&#x7A76;&#xFF0C;&#x5C31;&#x5F53;&#x611F;&#x53D7;&#x611F;&#x53D7;&#x9AD8;&#x79D1;&#x6280;&#x5427;</p>
<hr>
<h3 id="%E5%8F%AF%E7%94%A8%E9%87%8F%E5%8C%96%E6%A8%A1%E5%9E%8B">&#x53EF;&#x7528;&#x91CF;&#x5316;&#x6A21;&#x578B;</h3>
<h6 id="chatglm-6b-int4">ChatGLM-6B-INT4</h6>
<p>ChatGLM-6B-INT4 &#x662F; ChatGLM-6B &#x91CF;&#x5316;&#x540E;&#x7684;&#x6A21;&#x578B;&#x6743;&#x91CD;&#x3002;&#x5177;&#x4F53;&#x7684;&#xFF0C;ChatGLM-6B-INT4 &#x5BF9; ChatGLM-6B &#x4E2D;&#x7684; 28 &#x4E2A; GLM Block &#x8FDB;&#x884C;&#x4E86; INT4 &#x91CF;&#x5316;&#xFF0C;&#x6CA1;&#x6709;&#x5BF9; Embedding &#x548C; LM Head &#x8FDB;&#x884C;&#x91CF;&#x5316;&#x3002;&#x91CF;&#x5316;&#x540E;&#x7684;&#x6A21;&#x578B;&#x7406;&#x8BBA;&#x4E0A; 6G &#x663E;&#x5B58;&#xFF08;&#x4F7F;&#x7528; CPU &#x5373;&#x5185;&#x5B58;&#xFF09; &#x5373;&#x53EF;&#x63A8;&#x7406;&#xFF0C;&#x5177;&#x6709;&#x5728; &#x5D4C;&#x5165;&#x5F0F;&#x8BBE;&#x5907;&#xFF08;&#x5982;&#x6811;&#x8393;&#x6D3E;&#xFF09;&#x4E0A;&#x8FD0;&#x884C;&#x7684;&#x53EF;&#x80FD;&#x3002;</p>
<p>&#x6B64;&#x5916;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x5728; cpu &#x4E0A;&#x8FD0;&#x884C;&#x91CF;&#x5316;&#x540E;&#x7684;&#x6A21;&#x578B;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5B89;&#x88C5; <code>gcc</code> &#x4E0E; <code>openmp</code>&#x3002;&#x591A;&#x6570; Linux &#x53D1;&#x884C;&#x7248;&#x9ED8;&#x8BA4;&#x5DF2;&#x5B89;&#x88C5;&#x3002;&#x5BF9;&#x4E8E; Windows &#xFF0C;&#x53EF;&#x5728;&#x5B89;&#x88C5; <a href="https://jmeubank.github.io/tdm-gcc/">TDM-GCC</a> &#x65F6;&#x52FE;&#x9009; <code>openmp</code>&#xFF08;components/gcc/opemp&#xFF09;&#x3002; Windows &#x6D4B;&#x8BD5;&#x73AF;&#x5883; <code>gcc</code> &#x7248;&#x672C;&#x4E3A; <code>TDM-GCC 10.3.0</code>&#xFF0C; Linux &#x4E3A; <code>gcc 11.3.0</code>&#x3002;</p>
<h5 id="chatglm-6b-int8">chatglm-6b-int8</h5>
<p>chatglm-6b-int8 &#x662F;&#x57FA;&#x4E8E; 64 &#x4F4D;&#x6D6E;&#x70B9;&#x6570;&#x7684;&#x6307;&#x4EE4;&#x96C6;&#xFF0C;&#x800C; chatglm-6b-int4 &#x662F;&#x57FA;&#x4E8E; 32 &#x4F4D;&#x6D6E;&#x70B9;&#x6570;&#x7684;&#x6307;&#x4EE4;&#x96C6;&#x3002;</p>
<p>&#x8BD5;&#x4E86;&#x4E0B;&#xFF0C;chatglm-6b-int8 &#x8FD8;&#x662F;&#x5F88;&#x6162;&#xFF0C;&#x800C;&#x4E14;&#x9700;&#x8981;&#x66F4;&#x5927;&#x7684;&#x5185;&#x5B58;&#x3002;&#x3002;</p>
<h5 id="chatglm-6b-int4-slim">chatglm-6b-int4-slim</h5>
<p>ChatGLM-6B-INT4-Slim &#x662F;&#x5728; ChatGLM-6B-INT4 &#x7684;&#x57FA;&#x7840;&#x4E0A;&#x901A;&#x8FC7;&#x88C1;&#x526A;&#x8BCD;&#x8868;&#x6784;&#x5EFA;&#x7684;&#x3002;&#x56E0;&#x4E3A; ChatGLM-6B &#x4F7F;&#x7528;&#x4E86; icetk&#xFF0C;&#x5728;&#x5176;&#x8BCD;&#x8868;&#x4E2D;&#xFF0C;&#x524D; 20000 &#x4E2A; token &#x662F;&#x9884;&#x7559;&#x7ED9;&#x56FE;&#x7247;&#x7684;&#xFF0C;&#x5728;&#x6587;&#x672C;&#x6A21;&#x578B;&#x4E2D;&#x6CA1;&#x6709;&#x7528;&#x5230;&#x8FD9;&#x4E9B;&#x56FE;&#x7247; token&#xFF0C;&#x4F46;&#x662F;&#x5728; infer &#x548C;&#x5FAE;&#x8C03;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8FD9;&#x4E9B; token &#x5BF9;&#x5E94;&#x7684; embedding &#x4F9D;&#x7136;&#x9700;&#x8981;&#x88AB;&#x52A0;&#x8F7D;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x89E3;&#x7801;&#x6BCF;&#x4E00;&#x4E2A; token &#x7684;&#x65F6;&#x5019;&#x9700;&#x8981;&#x591A;&#x8BA1;&#x7B97; 20K &#x4E2A; logits&#xFF0C;&#x4F1A;&#x5360;&#x7528;&#x4E0D;&#x5C11;&#x663E;&#x5B58;&#x3002;&#x56E0;&#x6B64;&#x5C06;&#x8FD9;&#x4E00;&#x90E8;&#x5206; token &#x88C1;&#x526A;&#x6389;&#x4EE5;&#x8282;&#x7701;&#x663E;&#x5B58;&#x3002;</p>
<p>&#x9664;&#x4E86;&#x8BCD;&#x8868;&#x5916;&#xFF0C;ChatGLM-6B-INT4-Slim &#x7684;&#x5176;&#x4ED6;&#x7ED3;&#x6784;&#x4E0E; ChatGLM-6B-INT4 &#x5B8C;&#x5168;&#x4E00;&#x81F4;&#xFF0C;&#x6027;&#x80FD;&#x4E5F;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA4;&#x4E3A;&#x662F; ChatGLM-6B-INT4 &#x7684;&#x4E00;&#x4E2A;&#x4F4E;&#x663E;&#x5B58;&#x7248;&#x7B49;&#x4EF7;&#x5E73;&#x66FF;&#x3002;</p>
<p>chatglm-6b-int4-slim &#x7ECF;&#x6D4B;&#x8BD5;&#x4F3C;&#x4E4E;&#x5B8C;&#x5168;&#x4E0D;&#x80FD;&#x7528;&#xFF0C;&#x5220;&#x6389;&#x3002;</p>
<h6 id="%E5%90%84%E6%A8%A1%E5%9E%8B%E5%86%85%E5%AD%98%E4%BD%BF%E7%94%A8">&#x5404;&#x6A21;&#x578B;&#x5185;&#x5B58;&#x4F7F;&#x7528;</h6>
<table>
<thead>
<tr>
<th>&#x91CF;&#x5316;&#x7B49;&#x7EA7;</th>
<th>&#x6700;&#x4F4E; GPU &#x663E;&#x5B58;&#xFF08;&#x63A8;&#x7406;&#xFF09;</th>
<th>&#x6700;&#x4F4E; GPU &#x663E;&#x5B58;&#xFF08;&#x9AD8;&#x6548;&#x53C2;&#x6570;&#x5FAE;&#x8C03;&#xFF09;</th>
</tr>
</thead>
<tbody>
<tr>
<td>FP16&#xFF08;&#x65E0;&#x91CF;&#x5316;&#xFF09;</td>
<td>13 GB</td>
<td>14 GB</td>
</tr>
<tr>
<td>INT8</td>
<td>8 GB</td>
<td>9 GB</td>
</tr>
<tr>
<td>INT4</td>
<td>6 GB</td>
<td>7 GB</td>
</tr>
</tbody>
</table>
<p>&#x968F;&#x7740;&#x5BF9;&#x8BDD;&#x8F6E;&#x6570;&#x7684;&#x589E;&#x591A;&#xFF0C;&#x5BF9;&#x5E94;&#x6D88;&#x8017;&#x663E;&#x5B58;&#x4E5F;&#x968F;&#x4E4B;&#x589E;&#x957F;</p>
<h3 id="%E4%B8%8B%E8%BD%BD%E4%BB%A3%E7%A0%81">&#x4E0B;&#x8F7D;&#x4EE3;&#x7801;</h3>
<pre><code class="language-bash">git clone https://github.com/THUDM/ChatGLM-6B
cd ChatGLM-6B
</code></pre>
<h3 id="%E4%B8%8B%E8%BD%BD%E6%A8%A1%E5%9E%8B">&#x4E0B;&#x8F7D;&#x6A21;&#x578B;</h3>
<pre><code class="language-bash">cd ChatGLM-6B

$Env:GIT_LFS_SKIP_SMUDGE=1

git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b
git lfs pull

git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b-int4
git lfs pull

git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b-int8
git lfs pull
</code></pre>
<h3 id="%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83">&#x914D;&#x7F6E;&#x73AF;&#x5883;</h3>
<p>&#x5982;&#x679C;&#x6CA1;&#x6709; 6G &#x663E;&#x5B58;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528; CPU &#x8FD0;&#x884C;&#xFF0C;&#x6A21;&#x578B;&#x4F1A;&#x6839;&#x636E;&#x786C;&#x4EF6;&#x81EA;&#x52A8;&#x7F16;&#x8BD1; CPU Kernel &#xFF0C;&#x8BF7;&#x786E;&#x4FDD;&#x5DF2;&#x5B89;&#x88C5; GCC &#x548C; OpenMP &#xFF08;Linux &#x4E00;&#x822C;&#x5DF2;&#x5B89;&#x88C5;&#xFF0C;Windows &#x5219;&#x9700;&#x624B;&#x52A8;&#x5B89;&#x88C5;&#xFF09;&#xFF0C;&#x4EE5;&#x83B7;&#x5F97;&#x6700;&#x4F73;&#x5E76;&#x884C;&#x8BA1;&#x7B97;&#x80FD;&#x529B;&#x3002;</p>
<p>&#x5982;&#x679C;&#x6709; 6G &#x663E;&#x5B58;&#xFF0C;&#x5219;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x4E0E;&#x663E;&#x5361;&#x7248;&#x672C;&#x5BF9;&#x5E94;&#x7684; cuda&#xFF0C;&#x4E4B;&#x540E;&#x518D;&#x5B89;&#x88C5;&#x4E0E; cuda &#x7248;&#x672C;&#x5BF9;&#x5E94;&#x7684; pytorch&#x3002;</p>
<p>&#x5B89;&#x88C5;&#x76F8;&#x5173;&#x4F9D;&#x8D56;&#xFF0C;&#x5728; ChatGLM-6B &#x76EE;&#x5F55;&#x4E0B;&#x6253;&#x5F00;&#x547D;&#x4EE4;&#x884C;&#x7EC8;&#x7AEF;&#xFF0C;&#x8F93;&#x5165;</p>
<pre><code class="language-bash">pip install -r requirements.txt 
</code></pre>
<p>&#x6309;&#x56DE;&#x8F66;&#x540E;&#xFF0C;pip &#x5C31;&#x81EA;&#x52A8;&#x4E0B;&#x8F7D;&#x548C;&#x5B89;&#x88C5;&#x76F8;&#x5173;&#x4F9D;&#x8D56;&#x5E93;&#x4E86;&#x3002;</p>
<h3 id="%E5%90%AF%E5%8A%A8-demo-%E7%A8%8B%E5%BA%8F">&#x542F;&#x52A8; demo &#x7A0B;&#x5E8F;</h3>
<p>&#x5728; ChatGLM-6B &#x76EE;&#x5F55;&#x4E0B;&#x6709;&#x4E24;&#x4E2A; demo &#x4EE3;&#x7801;&#xFF1A;</p>
<ul>
<li>cli_demo.py&#xFF0C;&#x76F4;&#x63A5;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x8F93;&#x5165;&#x8FDB;&#x884C;&#x95EE;&#x7B54;&#xFF1B;</li>
<li>web_demo.py&#xFF0C;&#x5229;&#x7528; gradio &#x5E93;&#x751F;&#x6210;&#x95EE;&#x7B54;&#x7F51;&#x9875;&#x3002;</li>
</ul>
<h5 id="%E5%90%AF%E5%8A%A8-clidemopy">&#x542F;&#x52A8; cli_demo.py</h5>
<p>&#x4FEE;&#x6539;&#x6A21;&#x578B;&#x8DEF;&#x5F84;&#x3002;&#x7F16;&#x8F91; cli_demo.py &#x4EE3;&#x7801;&#xFF0C;&#x4FEE;&#x6539; 5&#x3001;6 &#x884C;&#x7684;&#x6A21;&#x578B;&#x6587;&#x4EF6;&#x5939;&#x8DEF;&#x5F84;&#xFF0C;&#x5C06;&#x539F;&#x59CB;&#x7684; &#x201C;THUDM/ChatGLM-6B&#x201D; &#x66FF;&#x6362;&#x4E3A; &#x201C;chatglm-6b-int4&#x201D; &#x5373;&#x53EF;&#x3002;</p>
<p>&#x4FEE;&#x6539;&#x91CF;&#x5316;&#x7248;&#x672C;&#x3002;&#x5982;&#x679C;&#x4F60;&#x7684;&#x663E;&#x5B58;&#x5927;&#x4E8E; 14G&#xFF0C;&#x5219;&#x65E0;&#x9700;&#x91CF;&#x5316;&#x53EF;&#x4EE5;&#x8DF3;&#x8FC7;&#x6B64;&#x6B65;&#x9AA4;&#x3002;&#x5982;&#x679C;&#x4F60;&#x7684;&#x663E;&#x5B58;&#x53EA;&#x6709; 6G &#x6216; 10G&#xFF0C;&#x5219;&#x9700;&#x8981;&#x5728;&#x7B2C; 6 &#x884C;&#x4EE3;&#x7801;&#x4E0A;&#x6DFB;&#x52A0; quantize(4) &#x6216; quantize(8) &#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>
<p>6G &#x663E;&#x5B58;&#x53EF;&#x4EE5; 4 bit &#x91CF;&#x5316;</p>
<pre><code>model = AutoModel.from_pretrained(&quot;chatglm-6b-int4&quot;, trust_remote_code=True).half().quantize(4).cuda() 
</code></pre>
<p>10G &#x663E;&#x5B58;&#x53EF;&#x4EE5; 8 bit &#x91CF;&#x5316;</p>
<pre><code>model = AutoModel.from_pretrained(&quot;chatglm-6b-int4&quot;, trust_remote_code=True).half().quantize(8).cuda()
</code></pre>
<p>&#x8FD9;&#x91CC;&#x7528;&#x7684; cpu&#xFF0C;.half().quantize(8).cuda() &#x6539;&#x4E3A;.float()</p>
<p>&#x6267;&#x884C; python &#x6587;&#x4EF6;&#x5373;&#x53EF;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x7EC8;&#x7AEF;&#x8F93;&#x5165;&#xFF1A;</p>
<pre><code class="language-bash">python cli_demo.py 
</code></pre>
<p>&#x5373;&#x53EF;&#x542F;&#x52A8; demo</p>
<p>&#x51FA;&#x9519;&#xFF0C;&#x8BF4;&#x9700;&#x8981; icetk&#xFF1A;</p>
<pre><code class="language-bash">pip install icetk
</code></pre>
<p>&#x56DE;&#x7B54;&#x540E;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x8F93;&#x5165;&#x5185;&#x5BB9;&#xFF0C;&#x76F4;&#x63A5;&#x56DE;&#x8F66;&#xFF0C;&#x5B83;&#x53EA;&#x518D;&#x8865;&#x5145;&#x5185;&#x5BB9;&#x3002;</p>
<p>&#x754C;&#x9762;&#x5982;&#x4E0B;&#xFF1A;</p>
<p><img src="https://www.listera.top/content/images/2023/05/----_20230420120233.png" alt="----_20230420120233" loading="lazy"></p>
<h5 id="%E5%90%AF%E5%8A%A8-webdemopy">&#x542F;&#x52A8; web_demo.py</h5>
<p>&#x5B89;&#x88C5; gradio &#x5E93;&#xFF0C;&#x5728; ChatGLM &#x76EE;&#x5F55;&#x4E0B;&#x6253;&#x5F00;&#x547D;&#x4EE4;&#x884C;&#x7EC8;&#x7AEF;&#xFF0C;&#x8F93;&#x5165;&#xFF1A;</p>
<pre><code class="language-bash">pip install gradio 
</code></pre>
<p>&#x5373;&#x53EF;&#x5B89;&#x88C5; demo &#x6240;&#x9700;&#x8981;&#x7684;&#x5E93;&#x3002;</p>
<p>&#x540C;&#x4E0A;&#xFF0C;&#x4FEE;&#x6539; web_demo.py &#x4E2D;&#x7684;&#x6A21;&#x578B;&#x8DEF;&#x5F84;&#x548C;&#x7EAF; cpu &#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x53EF;&#x4EE5;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x7EC8;&#x7AEF;&#x8F93;&#x5165;&#xFF1A;</p>
<pre><code class="language-bash">python web_demo.py 
</code></pre>
<p>&#x5373;&#x53EF;&#x542F;&#x52A8; demo&#x3002;</p>
<p>&#x7A0B;&#x5E8F;&#x4F1A;&#x8FD0;&#x884C;&#x4E00;&#x4E2A; Web Server&#xFF0C;&#x5E76;&#x8F93;&#x51FA;&#x5730;&#x5740;&#x3002;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#x6253;&#x5F00;&#x8F93;&#x51FA;&#x7684;&#x5730;&#x5740;&#x5373;&#x53EF;&#x4F7F;&#x7528;&#x3002;</p>
<p>&#x754C;&#x9762;&#x5982;&#x4E0B;&#xFF1A;</p>
<p><img src="https://www.listera.top/content/images/2023/05/----_20230420185956.png" alt="----_20230420185956" loading="lazy"></p>
<!--kg-card-end: markdown--><p>&#x6BD4; <strong>llama &#x7684;&#x4E2D;&#x6587;&#x667A;&#x969C;&#x5F3A;&#x591A;&#x4E86;&#xFF0C;&#x5C31;&#x7B97;&#x52A0;&#x4E86; </strong>vicuna &#x7684; llama 7B &#x6A21;&#x578B;&#x90FD;&#x4E00;&#x6837;&#x3002;&#x4E00;&#x7528;&#x4E2D;&#x6587;&#x5C31;&#x5783;&#x573E;&#x5F97;&#x4E0D;&#x884C;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[lib60870：基于 IEC 60870-5 协议的 C 语言库（译）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="lib60870%EF%BC%9A%E5%9F%BA%E4%BA%8E-iec-60870-5-%E5%8D%8F%E8%AE%AE%E7%9A%84-c-%E8%AF%AD%E8%A8%80%E5%BA%93">lib60870&#xFF1A;&#x57FA;&#x4E8E; IEC 60870-5 &#x534F;&#x8BAE;&#x7684; C &#x8BED;&#x8A00;&#x5E93;</h1>
<p>&#x5F53;&#x524D;&#x7684;&#x5B9E;&#x73B0;&#x5305;&#x542B; IEC 60870-5-101&#xFF08;&#x5E94;&#x7528;&#x5C42;&#x548C;&#x4E32;&#x884C;&#x94FE;&#x8DEF;&#x5C42;&#xFF09;&#x548C; IEC 60870-5-104&#xFF08;TCP/IP &#x534F;&#x8BAE;&#x5E93;&#xFF09;&#x89C4;&#x8303;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>
<p>&#x7279;</p>]]></description><link>https://www.listera.top/lib60870-ji-yu-iec-60870-5-xie-yi-de-c-yu-yan-ku/</link><guid isPermaLink="false">64226d0b4e7ed31bab1401f5</guid><category><![CDATA[电力]]></category><category><![CDATA[通信]]></category><category><![CDATA[C++]]></category><category><![CDATA[文档]]></category><category><![CDATA[翻译]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Tue, 28 Mar 2023 04:30:11 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="lib60870%EF%BC%9A%E5%9F%BA%E4%BA%8E-iec-60870-5-%E5%8D%8F%E8%AE%AE%E7%9A%84-c-%E8%AF%AD%E8%A8%80%E5%BA%93">lib60870&#xFF1A;&#x57FA;&#x4E8E; IEC 60870-5 &#x534F;&#x8BAE;&#x7684; C &#x8BED;&#x8A00;&#x5E93;</h1>
<p>&#x5F53;&#x524D;&#x7684;&#x5B9E;&#x73B0;&#x5305;&#x542B; IEC 60870-5-101&#xFF08;&#x5E94;&#x7528;&#x5C42;&#x548C;&#x4E32;&#x884C;&#x94FE;&#x8DEF;&#x5C42;&#xFF09;&#x548C; IEC 60870-5-104&#xFF08;TCP/IP &#x534F;&#x8BAE;&#x5E93;&#xFF09;&#x89C4;&#x8303;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>
<p>&#x7279;&#x6027;:</p>
<ul>
<li>&#x652F;&#x6301;&#x6240;&#x6709;&#x5E94;&#x7528;&#x5C42;&#x6D88;&#x606F;&#x7C7B;&#x578B;</li>
<li>&#x4E3B;&#x7AD9;&#x548C;&#x4ECE;&#x7AD9;</li>
<li>&#x5E73;&#x8861;&#x548C;&#x4E0D;&#x5E73;&#x8861;&#x94FE;&#x8DEF;&#x5C42;&#xFF08;&#x7528;&#x4E8E; CS 101 &#x4E32;&#x884C;&#x901A;&#x4FE1;&#xFF09;</li>
<li>&#x7528;&#x4E8E; CS 104 TCP/IP &#x901A;&#x4FE1;&#x7684;&#x5BA2;&#x6237;&#x7AEF;/&#x670D;&#x52A1;&#x5668;</li>
<li>CS 104 &#x5197;&#x4F59;&#x7EC4;&#x652F;&#x6301;</li>
<li>&#x53EF;&#x79FB;&#x690D;&#x7684; C99 &#x4EE3;&#x7801;</li>
</ul>
<p>&#x8FD8;&#x8BF7;&#x8003;&#x8651;&#x7528;&#x6237;&#x6307;&#x5357;&#x548C; API &#x53C2;&#x8003;&#x6587;&#x6863; (<a href="https://support.mz-automation.de/doc/lib60870/latest/">https://support.mz-automation.de/doc/lib60870/latest/</a>)</p>
<h2 id="%E7%BC%96%E8%AF%91%E5%92%8C%E8%BF%90%E8%A1%8C%E7%A4%BA%E4%BE%8B">&#x7F16;&#x8BD1;&#x548C;&#x8FD0;&#x884C;&#x793A;&#x4F8B;:</h2>
<p>&#x5728; lib60870-C &#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x6784;&#x5EFA;&#x5E93;</p>
<p><code>make</code></p>
<p>&#x8F6C;&#x5230; examples &#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x5728;&#x6BCF;&#x4E2A;&#x793A;&#x4F8B;&#x6587;&#x4EF6;&#x5939;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x6784;&#x5EFA;&#x793A;&#x4F8B;</p>
<p><code>make</code></p>
<p>&#x8BE5;&#x5E93;&#x548C;&#x793A;&#x4F8B;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CMake</em> &#x6765;&#x6784;&#x5EFA;&#x3002;</p>
<p>&#x8981;&#x5728;&#x5355;&#x72EC;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E2D;&#x6784;&#x5EFA;&#x5E93;&#xFF0C;&#x8BF7;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x6587;&#x4EF6;&#x5939;&#x4F5C;&#x4E3A;&#x9879;&#x76EE;&#x6587;&#x4EF6;&#x5939;&#x7684;&#x5B50;&#x76EE;&#x5F55;&#xFF0C;&#x5E76;&#x8FD0;&#x884C; cmake &#x6765;&#x521B;&#x5EFA;&#x6784;&#x5EFA;&#x6587;&#x4EF6;&#xFF1A;</p>
<p><code>mkdir build</code><br>
<code>cd build</code><br>
<code>cmake ..</code></p>
<h2 id="%E6%9E%84%E5%BB%BA%E4%B8%8D%E5%B8%A6%E9%80%9A%E7%94%A8%E4%BB%A3%E7%A0%81%E5%92%8C-hal-%E7%9A%84%E7%89%88%E6%9C%AC">&#x6784;&#x5EFA;&#x4E0D;&#x5E26;&#x901A;&#x7528;&#x4EE3;&#x7801;&#x548C; HAL &#x7684;&#x7248;&#x672C;</h2>
<p>&#x8BE5;&#x5E93;&#x5305;&#x542B;&#x4E00;&#x4E9B;&#x516C;&#x5171;&#x4EE3;&#x7801;&#x548C;&#x4E0E; MZ Automation &#x7684;&#x5176;&#x4ED6;&#x534F;&#x8BAE;&#x5E93;&#xFF08;&#x4F8B;&#x5982; libiec61850&#xFF09;&#x5171;&#x4EAB;&#x7684;&#x5E73;&#x53F0;&#x62BD;&#x8C61;&#x5C42;&#xFF08;HAL&#xFF09;&#x3002;&#x5982;&#x679C;&#x8981;&#x7B80;&#x5316;&#x4F7F;&#x7528;&#x6240;&#x6709;&#x8FD9;&#x4E9B;&#x534F;&#x8BAE;&#x5E93;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x6CA1;&#x6709;&#x516C;&#x5171;&#x90E8;&#x5206;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x7F16;&#x8BD1;&#x5E93;&#x3002;</p>
<p>&#x8FD9;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5728;&#x8C03;&#x7528; make &#x65F6;&#x4F7F;&#x7528; <em>WITHOUT_HAL</em> &#x548C; <em>WITHOUT_COMMON</em> &#x5B9A;&#x4E49;&#x6765;&#x5B9E;&#x73B0;&#xFF1A;</p>
<p><code>make WITHOUT_HAL=1 WITHOUT_COMMON=1</code></p>
<h2 id="%E6%9E%84%E5%BB%BA%E6%94%AF%E6%8C%81-tls-%E7%9A%84%E7%89%88%E6%9C%AC">&#x6784;&#x5EFA;&#x652F;&#x6301; TLS &#x7684;&#x7248;&#x672C;</h2>
<p>&#x8BE5;&#x5E93;&#x53EF;&#x4EE5;&#x6784;&#x5EFA;&#x652F;&#x6301; TLS&#x3002;&#x4E3A;&#x4E86;&#x505A;&#x5230;&#x8FD9;&#x4E00;&#x70B9;&#xFF0C;&#x60A8;&#x5FC5;&#x987B;&#x4E0B;&#x8F7D; 2.16.12 &#x7248;&#x672C; mbedtls&#x3002;</p>
<p>&#x89E3;&#x538B;&#x7F29; dependencies &#x6587;&#x4EF6;&#x5939;&#x4E2D;&#x7684; mbedtls tar &#x5305;&#xFF0C;&#x4FDD;&#x8BC1;&#x4EE5;&#x4E0B;&#x6587;&#x4EF6;&#x5B58;&#x5728;</p>
<p>dependencies/mbedtls-2.16.12</p>
<p>cmake &#x6784;&#x5EFA;&#x7CFB;&#x7EDF;&#x5C06;&#x81EA;&#x52A8;&#x68C0;&#x6D4B; mbedtls &#x6E90;&#xFF0C;&#x5E76;&#x6784;&#x5EFA;&#x5305;&#x542B; TLS &#x652F;&#x6301;&#x548C; mbedtls &#x7684;&#x5E93;</p>
<p>&#x4F7F;&#x7528; make &#x65F6;&#xFF0C;&#x9700;&#x8981;&#x5E26; WITH_MBEDTLS=1 &#x9009;&#x9879;&#x8C03;&#x7528; make</p>
<p><code>make WITH_MBEDTLS=1</code></p>
<h2 id="%E5%BA%93%E9%85%8D%E7%BD%AE">&#x5E93;&#x914D;&#x7F6E;</h2>
<p>&#x6709;&#x4E0D;&#x540C;&#x7684;&#x8FD0;&#x884C;&#x65F6;&#x548C;&#x7F16;&#x8BD1;&#x65F6;&#x914D;&#x7F6E;&#x9009;&#x9879;&#x3002;</p>
<p>&#x7F16;&#x8BD1;&#x65F6;&#x914D;&#x7F6E;&#x9009;&#x9879;&#x53EF;&#x7528;&#x4E8E;&#x5728;&#x5C0F;&#x578B;&#x5D4C;&#x5165;&#x5F0F;&#x7CFB;&#x7EDF;&#x4E2D;&#x7F29;&#x5C0F;&#x5E93;&#x5927;&#x5C0F;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4FEE;&#x6539;&#x6587;&#x4EF6; _config/lib60870_config.h &#x6765;&#x66F4;&#x6539;&#x7F16;&#x8BD1;&#x65F6;&#x914D;&#x7F6E;&#x3002;</p>
<h2 id="%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D">&#x5185;&#x5B58;&#x5206;&#x914D;</h2>
<p>&#x8BE5;&#x5E93;&#x4F7F;&#x7528;&#x52A8;&#x6001;&#x5185;&#x5B58;&#x5206;&#x914D;&#xFF08;malloc/caloc &#x7531;&#x81EA;&#x5DF1;&#x7684;&#x51FD;&#x6570;&#x5305;&#x88C5;&#xFF0C;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5728;&#x9700;&#x8981;&#x65F6;&#x66FF;&#x6362;&#xFF09;&#x3002;</p>
<p>CS104 &#x4ECE;&#x673A;&#x4EC5;&#x5728;&#x542F;&#x52A8;&#x65F6;&#x4F7F;&#x7528;&#x52A8;&#x6001;&#x5185;&#x5B58;&#x5206;&#x914D;&#xFF08;&#x5F53;&#x8C03;&#x7528;&#x51FD;&#x6570; <em>CS104_slave_create</em> &#x548C; <em>CS104_Slave_start</em>/CS104_Slave_startThreadless_)&#x3002;</p>
<p>&#x6709;&#x5173;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x53C2;&#x9605; <em>User Guide</em>&#x3002;</p>
<h2 id="%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F">&#x8054;&#x7CFB;&#x65B9;&#x5F0F;:</h2>
<p>&#x8BE5;&#x5E93;&#x662F;&#x7531;&#x6211;&#x7684; MZ Automation GmbH &#x5F00;&#x53D1;&#x548C;&#x652F;&#x6301;&#x7684;&#x3002;</p>
<p>&#x6709;&#x5173;&#x9519;&#x8BEF;&#x62A5;&#x544A;&#x3001;&#x63D0;&#x793A;&#x6216;&#x652F;&#x6301;&#xFF0C;&#x8BF7;&#x8054;&#x7CFB; <a href="mailto:info@mz-automation.de">info@mz-automation.de</a></p>
<h2 id="%E8%AE%B8%E5%8F%AF%E8%AF%81">&#x8BB8;&#x53EF;&#x8BC1;</h2>
<p>&#x6B64;&#x8F6F;&#x4EF6;&#x53EF;&#x5728; GPLv3 (<a href="https://www.gnu.org/licenses/gpl-3.0.en.html">https://www.gnu.org/licenses/gpl-3.0.en.html</a>)&#x4EE5;&#x53CA;&#x5546;&#x4E1A;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;&#x4E0B;&#x83B7;&#x5F97;&#x53CC;&#x91CD;&#x8BB8;&#x53EF;&#x3002;</p>
<p>&#x5728;&#x5546;&#x4E1A;&#x548C;&#x975E; GPL &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E2D;&#x4F7F;&#x7528;&#x5E93;&#x65F6;&#xFF0C;&#x60A8;&#x5E94;&#x8BE5;&#x8D2D;&#x4E70;&#x5546;&#x4E1A;&#x8BB8;&#x53EF;&#x8BC1;&#x3002;</p>
<h2 id="%E5%95%86%E4%B8%9A%E8%AE%B8%E5%8F%AF%E8%AF%81%E5%92%8C%E6%94%AF%E6%8C%81">&#x5546;&#x4E1A;&#x8BB8;&#x53EF;&#x8BC1;&#x548C;&#x652F;&#x6301;</h2>
<p>MZ Automation GmbH &#x63D0;&#x4F9B;&#x652F;&#x6301;&#x548C;&#x5546;&#x4E1A;&#x8BB8;&#x53EF;&#x9009;&#x9879;&#x3002;&#x8BF7;&#x8054;&#x7CFB; <a href="mailto:info@mz-automation.de">info@mz-automation.de</a> &#x4E86;&#x89E3;&#x66F4;&#x591A;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#x3002;</p>
<h2 id="%E8%B4%A1%E7%8C%AE">&#x8D21;&#x732E;</h2>
<p>&#x5982;&#x679C;&#x4F60;&#x60F3;&#x4E3A;&#x5E93;&#x7684;&#x6539;&#x8FDB;&#x548C;&#x5F00;&#x53D1;&#x505A;&#x51FA;&#x8D21;&#x732E;&#xFF0C;&#x8BF7;&#x7ED9;&#x6211;&#x53D1;&#x8BC4;&#x8BBA;&#x3001;&#x529F;&#x80FD;&#x8BF7;&#x6C42;&#x3001;&#x9519;&#x8BEF;&#x62A5;&#x544A;&#x6216;&#x8865;&#x4E01;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x4E0D;&#x662F;&#x5FAE;&#x4E0D;&#x8DB3;&#x9053;&#x7684;&#x8D21;&#x732E;&#xFF0C;&#x6211;&#x8981;&#x6C42;&#x60A8;&#x7B7E;&#x7F72;&#x4E00;&#x4EFD;&#x8D21;&#x732E;&#x8005;&#x8BB8;&#x53EF;&#x534F;&#x8BAE;&#x3002;&#x8BF7;&#x8054;&#x7CFB; <a href="mailto:info@mz-automation.de">info@mz-automation.de</a>&#x3002;</p>
<hr>
<p>&#x82F1;&#x6587;&#x539F;&#x6587;&#xFF1A;<a href="https://github.com/mz-automation/lib60870">https://github.com/mz-automation/lib60870</a><br>
API&#x53C2;&#x8003;&#xFF1A;<a href="https://support.mz-automation.de/doc/lib60870/latest/index.html">https://support.mz-automation.de/doc/lib60870/latest/index.html</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[lib60870 - IEC 60870-5-101/104 C 源代码库用户指南（译）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="lib60870iec-60870-5-101104-c-%E6%BA%90%E4%BB%A3%E7%A0%81%E5%BA%93%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97%E7%89%88%E6%9C%AC-230">lib60870 - IEC 60870-5-101/104 C &#x6E90;&#x4EE3;&#x7801;&#x5E93;&#x7528;&#x6237;&#x6307;&#x5357; - &#x7248;&#x672C; 2.3.0</h1>
<h4 id="%E7%89%88%E6%9D%83-2020-mz-automation-gmbh">&#x7248;&#x6743; 2020 MZ Automation GmbH</h4>
<h2 id="%E4%BB%8B%E7%BB%8D">&#x4ECB;&#x7ECD;</h2>
<p>lib60870 &#x662F;&#x9488;&#x5BF9;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x4E3B;&#x7AD9;&#xFF09;&#x548C;&#x670D;&#x52A1;&#x5668;&#xFF08;&#x4ECE;&#x7AD9;&#x6216;&#x53D7;&#x63A7;&#x7AD9;</p>]]></description><link>https://www.listera.top/lib60870-iec-60870-5-101-104-c-yuan-dai-ma-ku-yong-hu-zhi-nan-ban-ben-2-3-0/</link><guid isPermaLink="false">642243704e7ed31bab140146</guid><category><![CDATA[电力]]></category><category><![CDATA[IEC104]]></category><category><![CDATA[C++]]></category><category><![CDATA[文档]]></category><category><![CDATA[翻译]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Tue, 28 Mar 2023 02:10:34 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="lib60870iec-60870-5-101104-c-%E6%BA%90%E4%BB%A3%E7%A0%81%E5%BA%93%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97%E7%89%88%E6%9C%AC-230">lib60870 - IEC 60870-5-101/104 C &#x6E90;&#x4EE3;&#x7801;&#x5E93;&#x7528;&#x6237;&#x6307;&#x5357; - &#x7248;&#x672C; 2.3.0</h1>
<h4 id="%E7%89%88%E6%9D%83-2020-mz-automation-gmbh">&#x7248;&#x6743; 2020 MZ Automation GmbH</h4>
<h2 id="%E4%BB%8B%E7%BB%8D">&#x4ECB;&#x7ECD;</h2>
<p>lib60870 &#x662F;&#x9488;&#x5BF9;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x4E3B;&#x7AD9;&#xFF09;&#x548C;&#x670D;&#x52A1;&#x5668;&#xFF08;&#x4ECE;&#x7AD9;&#x6216;&#x53D7;&#x63A7;&#x7AD9;&#xFF09;&#x7684; IEC 60870-5-101/104 &#x534F;&#x8BAE;&#x7684;&#x529F;&#x80FD;&#x4E30;&#x5BCC;&#x4E14;&#x7ECF;&#x8FC7;&#x73B0;&#x573A;&#x9A8C;&#x8BC1;&#x7684;&#x5B9E;&#x73B0;&#x3002;&#x8BE5;&#x5E93;&#x5B9E;&#x73B0;&#x4E86; IEC 60870-5-101/104 &#x89C4;&#x8303;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x3002;<em>lib60870</em> &#x4EE5;&#x6807;&#x51C6; C &#x5B9E;&#x73B0;&#xFF0C;&#x5E76;&#x4E0E; C99 &#x6807;&#x51C6;&#x517C;&#x5BB9;&#x3002;&#x5B83;&#x88AB;&#x8BBE;&#x8BA1;&#x6210;&#x5C3D;&#x53EF;&#x80FD;&#x6613;&#x4E8E;&#x4F7F;&#x7528;&#x3002;</p>
<p>&#x5BA2;&#x6237;&#x7AEF;/&#x670D;&#x52A1;&#x5668; API &#x662F;&#x4E25;&#x683C;&#x5F02;&#x6B65;&#x7684;&#x3002;&#x4F7F;&#x7528;&#x975E;&#x963B;&#x585E;&#x51FD;&#x6570;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x4E14;&#x5FC5;&#x987B;&#x5728;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x5904;&#x7406;&#x54CD;&#x5E94;&#x548C;&#x5176;&#x4ED6;&#x4E8B;&#x4EF6;&#x3002;</p>
<p>&#x4EE5;&#x4E0B;&#x662F;&#x652F;&#x6301;&#x7684;&#x529F;&#x80FD;&#x5217;&#x8868;&#xFF1A;</p>
<ul>
<li>CS 101 (IEC 60870-5-101) &#x5E73;&#x8861;&#x548C;&#x975E;&#x5E73;&#x8861;&#x4E32;&#x884C;&#x6A21;&#x5F0F;</li>
<li>CS 104 (IEC 60870-5-104) &#x5BA2;&#x6237;&#x7AEF;&#x548C;&#x670D;&#x52A1;&#x7AEF; TCP/IP &#x901A;&#x4FE1;</li>
<li>CS 104 &#x652F;&#x6301;&#x52A0;&#x5BC6;&#x548C;&#x6388;&#x6743;&#x7684; TLS &#x901A;&#x4FE1;</li>
<li>CS 104 &#x4F7F;&#x7528; CS 101 &#x5E94;&#x7528;&#x5C42;</li>
<li>CS 104 &#x4ECE;&#x673A;&#xFF1A;&#x652F;&#x6301;&#x5197;&#x4F59;&#x7EC4;</li>
<li>&#x4E3B;&#x7AD9;/&#x5BA2;&#x6237;&#x7AEF;&#x652F;&#x6301;&#x53CD;&#x5411;&#x53D1;&#x9001;&#x7CFB;&#x7EDF;&#x547D;&#x4EE4;&#x3001;&#x8FC7;&#x7A0B;&#x547D;&#x4EE4;&#x3001;&#x53C2;&#x6570;&#x547D;&#x4EE4;&#x548C;&#x6570;&#x636E;&#x6D88;&#x606F;&#x3002;</li>
<li>&#x4ECE;&#x673A;/&#x670D;&#x52A1;&#x5668;&#x652F;&#x6301;&#x5728;&#x76D1;&#x63A7;&#x65B9;&#x5411;&#x53D1;&#x9001;&#x6570;&#x636E;&#x6D88;&#x606F;&#xFF0C;&#x5E76;&#x652F;&#x6301;&#x5728;&#x76F8;&#x53CD;&#x65B9;&#x5411;&#x53D1;&#x9001;&#x547D;&#x4EE4;</li>
<li>&#x652F;&#x6301;&#x7684; ASDU &#x7C7B;&#x578B;&#x5217;&#x8868;&#x53EF;&#x5728;&#x9644;&#x4EF6;&#x4E2D;&#x627E;&#x5230;</li>
<li>&#x5E93;&#x652F;&#x6301;&#x7528;&#x6237;&#x5B9A;&#x4E49;&#x7684;&#x4E13;&#x7528; ASDU &#x7C7B;&#x578B;</li>
<li>&#x5E93;&#x6269;&#x5C55;&#x63D2;&#x4EF6;&#x63A5;&#x53E3;</li>
</ul>
<p><em>&#x6CE8;&#xFF1A;</em> CS &#x4EE3;&#x8868;&#x201C;&#x914D;&#x5957;&#x6807;&#x51C6;&#x201D;&#xFF0C;&#x89C4;&#x5B9A;&#x4E86; IEC 60870-5 &#x6807;&#x51C6;&#x7CFB;&#x5217;&#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x901A;&#x4FE1;&#x534F;&#x8BAE;&#x548C;&#x670D;&#x52A1;&#x7684;&#x53D8;&#x4F53;&#x3002;</p>
<p>&#x8BE5;&#x5E93;&#x4F7F;&#x7528;&#x201C;&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x201D;&#x7684;&#x7F16;&#x7A0B;&#x98CE;&#x683C;&#x3002;&#x5B83;&#x57FA;&#x4E8E;&#x62BD;&#x8C61;&#x6570;&#x636E;&#x7C7B;&#x578B;&#xFF08;ADT&#xFF09;&#x548C;&#x64CD;&#x4F5C;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x7684;&#x51FD;&#x6570;&#x3002;&#x901A;&#x5E38;&#xFF0C;&#x6570;&#x636E;&#x7C7B;&#x578B;&#xFF08;&#x4FDD;&#x5B58;&#x6570;&#x636E;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF09;&#x7684;&#x5B9E;&#x9645;&#x5B9E;&#x73B0;&#x5BF9; API &#x7528;&#x6237;&#x662F;&#x9690;&#x85CF;&#x7684;&#x3002;&#x5728;&#x51E0;&#x4E4E;&#x6240;&#x6709;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;API &#x7528;&#x6237;&#x4E0D;&#x9700;&#x8981;&#xFF08;&#x4E5F;&#x4E0D;&#x5EFA;&#x8BAE;&#xFF09;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x3002;</p>
<h2 id="%E5%BA%94%E7%94%A8%E5%B1%82%E6%B6%88%E6%81%AF">&#x5E94;&#x7528;&#x5C42;&#x6D88;&#x606F;</h2>
<p>&#x6B64;&#x7F16;&#x7A0B;&#x98CE;&#x683C;&#x5C06;&#x901A;&#x8FC7; <em><em>CS101_ASDU</em></em> ADT &#x7684;&#x793A;&#x4F8B;&#x8FDB;&#x884C;&#x89E3;&#x91CA;&#xFF0C;&#x540E;&#x8005;&#x662F;&#x5E93; API &#x7684;&#x6700;&#x91CD;&#x8981;&#x90E8;&#x5206;&#x3002;&#x8BE5;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x8868;&#x793A; CS101/C104 &#x534F;&#x8BAE;&#x7684;&#x5E94;&#x7528;&#x5C42;&#x6D88;&#x606F;&#x3002;&#x7F29;&#x5199; ASDU &#x4EE3;&#x8868;&#x201C;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x6570;&#x636E;&#x5355;&#x5143;&#x201D;&#x3002;&#x8981;&#x521B;&#x5EFA;&#x65B0;&#x7684; ASDU &#x5BF9;&#x8C61;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <em>CS101_ASDU_create</em> &#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x5BF9;&#x8C61;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x3002;</p>
<pre><code class="language-c">CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION,
        0, 1, false, false);
</code></pre>
<p>&#x6B64;&#x51FD;&#x6570;&#x5177;&#x6709;&#x591A;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x4EE5;&#x53CD;&#x6620; ASDU &#x7684;&#x4E0D;&#x540C;&#x5C5E;&#x6027;&#x3002;&#x4EE5;&#x4E0B;&#x662F; <em>CS101_ASDU_create</em> &#x51FD;&#x6570;&#x7684;&#x7B7E;&#x540D;&#xFF1A;</p>
<pre><code class="language-c">CS101_ASDU
CS101_ASDU_create(CS101_AppLayerParameters parameters, bool isSequence, CS101_CauseOfTransmission cot,
                  int oa, int ca, bool isTest, bool isNegative);
</code></pre>
<p>&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x53E6;&#x4E00;&#x4E2A; <em>CS101_AppLayerParameters</em> &#x7C7B;&#x578B;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x8BE5;&#x5BF9;&#x8C61;&#x8868;&#x793A;&#x4E3B;&#x8BBE;&#x5907;&#x548C;&#x4ECE;&#x8BBE;&#x5907;&#x4E4B;&#x95F4;&#x6839;&#x636E;&#x534F;&#x8BAE;&#x5171;&#x4EAB;&#x7684;&#x5E94;&#x7528;&#x5C42;&#x53C2;&#x6570;&#x3002;&#x5982;&#x679C;&#x53CC;&#x65B9;&#x6CA1;&#x6709;&#x76F8;&#x540C;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x4ED6;&#x4EEC;&#x5C06;&#x65E0;&#x6CD5;&#x7406;&#x89E3;&#x5BF9;&#x65B9;&#x7684; ASDU&#x3002;</p>
<p>&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570; <em>isSequence</em> &#x6307;&#x793A; ASDU &#x5305;&#x542B;&#x8FDE;&#x7EED;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5E8F;&#x5217;&#xFF08;&#x5982;&#x679C; <em>true</em>&#xFF09;&#x6216;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x72EC;&#x7ACB;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#xFF08;&#x5982;&#x679C; <em>false</em>&#xFF09;&#x3002;&#x8FDE;&#x7EED;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x7684;&#x5E8F;&#x5217;&#x610F;&#x5473;&#x7740; ASDU &#x4EC5;&#x5305;&#x542B;&#x5355;&#x4E2A;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5730;&#x5740;&#xFF08;IOA&#xFF09;&#x3002;&#x7136;&#x540E;&#xFF0C;&#x8FDE;&#x7EED;&#x7684;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5177;&#x6709;&#x5730;&#x5740; IOA&#x3001;IOA+1&#x3001;IOA+2&#x3002;&#x3002;&#x3002;</p>
<p>&#x7B2C;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x8868;&#x793A;&#x4F20;&#x8F93;&#x539F;&#x56E0;&#xFF08;COT&#xFF09;&#x3002;&#x8FD9;&#x662F;&#x4E3A;&#x4E86;&#x544A;&#x8BC9;&#x5BF9;&#x65B9;&#x53D1;&#x9001;&#x4FE1;&#x606F;&#x7684;&#x539F;&#x56E0;&#x3002;&#x5BF9;&#x4E8E;&#x5468;&#x671F;&#x6027;&#x6D88;&#x606F;&#xFF0C;&#x53EF;&#x80FD;&#x7684;&#x503C;&#x4E3A; <em>CS101_COT_PERIODIC</em>&#xFF0C;&#x5BF9;&#x4E8E;&#x81EA;&#x53D1;&#x6D88;&#x606F;&#xFF0C;&#x53EF;&#x80FD;&#x4E3A; <em>CS101_COT_SPONTANEOUS</em>&#x3002;</p>
<p>&#x5176;&#x4ED6;&#x53C2;&#x6570;&#x4E3A;&#xFF0C;<em>oa</em> &#x8868;&#x793A;&#x59CB;&#x53D1;&#x65B9;&#x5730;&#x5740;&#xFF0C;<em>ca</em> &#x8868;&#x793A; ASDU &#x7684;&#x516C;&#x5171;&#x5730;&#x5740;&#xFF0C;<em>isTest</em> &#x8868;&#x793A;&#x6D88;&#x606F;&#x662F;&#x6D4B;&#x8BD5;&#x6D88;&#x606F;&#xFF0C;<em>isNegative</em> &#x8868;&#x793A;&#x6D88;&#x606F;&#x4E3A;&#x53E6;&#x4E00;&#x6D88;&#x606F;&#x7684;&#x5426;&#x5B9A;&#x786E;&#x8BA4;&#x3002;</p>
<p>&#x6709;&#x4E86;&#x65B0;&#x7684; ASDU &#x5BF9;&#x8C61;&#x7684;&#x53E5;&#x67C4;&#xFF08;&#x5728;&#x6211;&#x4EEC;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#x4E3A; <em>newAsdu</em>&#xFF09;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8C03;&#x7528;&#x591A;&#x79CD;&#x51FD;&#x6570;&#x6765;&#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E; ASDU &#x6570;&#x636E;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS101_ASDU_isTest</em> &#x6216; <em>CS101_ASDU_setTest</em> &#x51FD;&#x6570;&#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E;&#x6D4B;&#x8BD5;&#x6807;&#x5FD7;&#x503C;&#x3002;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x59CB;&#x7EC8;&#x662F; ASDU &#x5BF9;&#x8C61;&#x7684;&#x53E5;&#x67C4;&#x3002;</p>
<pre><code class="language-c">bool isTest = CS101_ASDU_isTest(newAsdu);
</code></pre>
<p>&#x521B;&#x5EFA;&#x53EF;&#x7528; ASDU &#x5BF9;&#x8C61;&#x7684;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x51FD;&#x6570;&#x662F; <em>CS101_ASDU_addInformation Object</em> &#x51FD;&#x6570;&#x3002;&#x4F7F;&#x7528;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5C06;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;&#x6DFB;&#x52A0;&#x5230; ASDU &#x4E2D;&#x3002;</p>
<pre><code class="language-c">InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 100, -1,
                       IEC60870_QUALITY_GOOD);

CS101_ASDU_addInformationObject(newAsdu, io);
</code></pre>
<p>&#x53EF;&#x4EE5;&#x591A;&#x6B21;&#x8C03;&#x7528;&#x6B64;&#x51FD;&#x6570;&#xFF0C;&#x4EE5;&#x4FBF;&#x5411; ASDU &#x5BF9;&#x8C61;&#x6DFB;&#x52A0;&#x66F4;&#x591A;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x3002;&#x5B83;&#x6709;&#x4E00;&#x4E2A;&#x5E03;&#x5C14;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x6307;&#x793A;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x662F;&#x5426;&#x5DF2;&#x6210;&#x529F;&#x6DFB;&#x52A0;&#xFF08;&#x8FD4;&#x56DE;&#x503C; <em>true</em>&#xFF09;&#x3002;&#x5F53; ASDU &#x6709;&#x6548;&#x8D1F;&#x8F7D;&#x5DF2;&#x6EE1;&#x65F6;&#xFF0C;&#x6DFB;&#x52A0;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;&#x3002;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x51FD;&#x6570;&#x5C06;&#x8FD4;&#x56DE; <em>false</em>&#x3002;</p>
<p>&#x6700;&#x540E;&#xFF0C;&#x5F53;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A; ASDU &#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x5B83;&#x65F6;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <em>CS101_ASDU_destroy</em> &#x51FD;&#x6570;&#x6765;&#x91CA;&#x653E;&#x5B83;&#x3002;</p>
<pre><code class="language-c">CS101_ASDU_destroy(newAsdu);
</code></pre>
<h2 id="%E4%B8%BB%E7%AB%99-%E5%AE%A2%E6%88%B7%E7%AB%AF-%E4%BE%A7%E7%BC%96%E7%A8%8B">&#x4E3B;&#x7AD9; (&#x5BA2;&#x6237;&#x7AEF;) &#x4FA7;&#x7F16;&#x7A0B;</h2>
<p>&#x5BF9;&#x4E8E;&#x4E3B;&#x7AD9;&#x7AEF;&#x7F16;&#x7A0B;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x62BD;&#x8C61;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x548C; API&#xFF1A;</p>
<ul>
<li><em>CS101_Master</em> &#x9002;&#x7528;&#x4E8E;&#x7B26;&#x5408; CS 101 &#x7684;&#x5E73;&#x8861;&#x6A21;&#x5F0F;&#x548C;&#x975E;&#x5E73;&#x8861;&#x6A21;&#x5F0F;&#x4E32;&#x884C;&#x8FDE;&#x63A5;&#x3002;</li>
<li><em>CS104_Connection</em> &#x7528;&#x4E8E;&#x7B26;&#x5408; CS 104 &#x7684; TCP/IP &#x8FDE;&#x63A5;&#x3002;</li>
</ul>
<h3 id="%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%88%B0-cs-104-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%9A%84%E8%BF%9E%E6%8E%A5">&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5230; CS 104 &#x670D;&#x52A1;&#x7AEF;&#x7684;&#x8FDE;&#x63A5;</h3>
<p>&#x7531;&#x4E8E; IEC 60870-5-104 &#x8FDE;&#x63A5;&#x57FA;&#x4E8E; TCP &#x5BA2;&#x6237;&#x7AEF;/&#x670D;&#x52A1;&#x5668;&#x8FDE;&#x63A5;&#xFF0C;&#x56E0;&#x6B64;&#x8BE5;&#x8FDE;&#x63A5;&#x5C06;&#x7531;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x4E3B;&#x673A;&#xFF09;&#x5EFA;&#x7ACB;&#x3002;&#x670D;&#x52A1;&#x5668;&#xFF08;&#x4ECE;&#x7AD9;&#x6216;&#x5206;&#x7AD9;&#xFF09;&#x901A;&#x5E38;&#x88AB;&#x52A8;&#x7B49;&#x5F85;&#x8FDE;&#x63A5;&#x3002;</p>
<p>&#x901A;&#x8FC7;&#x8C03;&#x7528; CS104_connection &#x7C7B;&#x578B;&#x7684; <em>CS104_connection_create</em> &#x51FD;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x5730;&#x521B;&#x5EFA;&#x65B0;&#x8FDE;&#x63A5;&#xFF1A;</p>
<pre><code class="language-c">CS104_Connection con = CS104_Connection_create(&quot;127.0.0.1&quot;, 2404);
</code></pre>
<p>&#x8FD9;&#x5C06;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; CS104_Connection &#x5BF9;&#x8C61;&#xFF0C;&#x8BE5;&#x5BF9;&#x8C61;&#x5DF2;&#x51C6;&#x5907;&#x597D;&#x8FDE;&#x63A5;&#x5230;&#x670D;&#x52A1;&#x5668;&#x3002;&#x53C2;&#x6570;&#x662F;&#x670D;&#x52A1;&#x5668;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x6216; IP &#x5730;&#x5740;&#x4EE5;&#x53CA; TCP/IP &#x7AEF;&#x53E3;&#xFF08;&#x901A;&#x5E38;&#x4E3A; 2404&#xFF09;&#x3002;&#x5BF9;&#x4E8E;&#x7AEF;&#x53E3;&#x53C2;&#x6570;&#xFF0C;&#x60A8;&#x4E5F;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E; -1 &#x4EE5;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x7AEF;&#x53E3;&#x3002;</p>
<p>&#x521B;&#x5EFA;&#x8FDE;&#x63A5;&#x5BF9;&#x8C61;&#x540E;&#xFF0C;&#x73B0;&#x5728;&#x53EA;&#x9700;&#x8C03;&#x7528; <em>CS104_connection_connect</em> &#x51FD;&#x6570;&#x5373;&#x53EF;&#x8FDE;&#x63A5;&#x5230;&#x670D;&#x52A1;&#x5668;&#xFF1A;</p>
<pre><code class="language-c">CS104_Connection_connect(con);
</code></pre>
<p>&#x53C2;&#x6570; <em>con</em> &#x662F;&#x5BF9;&#x4E0A;&#x9762;&#x521B;&#x5EFA;&#x7684;&#x8FDE;&#x63A5;&#x5BF9;&#x8C61;&#x7684;&#x5F15;&#x7528;&#x3002;</p>
<p>&#x6B63;&#x786E;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8FDE;&#x63A5;&#x5BF9;&#x8C61;&#x53D1;&#x9001;&#x547D;&#x4EE4;&#x548C;&#x63A5;&#x6536;&#x6570;&#x636E;&#x3002;</p>
<p>&#x5F53;&#x60A8;&#x4F7F;&#x7528;&#x5B8C;&#x8FDE;&#x63A5;&#x5BF9;&#x8C61;&#x65F6;&#xFF0C;&#x60A8;&#x5FC5;&#x987B;&#x8C03;&#x7528;</p>
<pre><code class="language-c">CS104_Connection_destroy(con);
</code></pre>
<p>&#x91CA;&#x653E;&#x5BF9;&#x8C61;&#x5206;&#x914D;&#x7684;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x3002;&#x4F7F;&#x7528; <em>destroy</em> &#x51FD;&#x6570;&#x540E;&#xFF0C;&#x4E0D;&#x80FD;&#x5BF9; <em>con</em> &#x5F15;&#x7528;&#x4F7F;&#x7528;&#x4EFB;&#x4F55;&#x51FD;&#x6570;&#xFF01;</p>
<h3 id="%E5%87%86%E5%A4%87%E8%BF%9E%E6%8E%A5%E5%88%B0%E4%B8%80%E4%B8%AA%E6%88%96%E5%A4%9A%E4%B8%AA%E4%BB%8E%E6%9C%BA%E7%9A%84-cs-101">&#x51C6;&#x5907;&#x8FDE;&#x63A5;&#x5230;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x4ECE;&#x673A;&#x7684; CS 101</h3>
<p>CS 101 &#x4E3A;&#x4E3B;/&#x4ECE;&#x8FDE;&#x63A5;&#x63D0;&#x4F9B;&#x4E86;&#x4E24;&#x79CD;&#x94FE;&#x8DEF;&#x5C42;&#x6A21;&#x5F0F;&#x3002;</p>
<p><em>&#x5E73;&#x8861;&#x6A21;&#x5F0F;</em>&#x652F;&#x6301;&#x4F7F;&#x7528;&#x4E13;&#x7528;&#x4E32;&#x884C;&#x7EBF;&#x5728;&#x5355;&#x4E2A;&#x4E3B;&#x8BBE;&#x5907;&#x548C;&#x5355;&#x4E2A;&#x4ECE;&#x8BBE;&#x5907;&#x4E4B;&#x95F4;&#x8FDB;&#x884C;&#x901A;&#x4FE1;&#x3002;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x662F;&#x201C;&#x5E73;&#x8861;&#x7684;&#x201D;&#xFF0C;&#x56E0;&#x4E3A;&#x4E24;&#x7AEF;&#x53EF;&#x4EE5;&#x968F;&#x65F6;&#x81EA;&#x53D1;&#x5730;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x3002;</p>
<p><em>&#x4E0D;&#x5E73;&#x8861;&#x6A21;&#x5F0F;</em>&#x652F;&#x6301;&#x4E32;&#x884C;&#x603B;&#x7EBF;&#x4E0A;&#x5355;&#x4E2A;&#x4E3B;&#x8BBE;&#x5907;&#x548C;&#x591A;&#x4E2A;&#x4ECE;&#x8BBE;&#x5907;&#x4E4B;&#x95F4;&#x7684;&#x901A;&#x4FE1;&#x3002;&#x6BCF;&#x4E2A;&#x4ECE;&#x8BBE;&#x5907;&#x90FD;&#x901A;&#x8FC7;&#x5176;&#x552F;&#x4E00;&#x7684;&#x94FE;&#x8DEF;&#x5C42;&#x5730;&#x5740;&#x8FDB;&#x884C;&#x5BFB;&#x5740;&#x3002;&#x4ECE;&#x673A;&#x662F;&#x4E0D;&#x5141;&#x8BB8;&#x81EA;&#x53D1;&#x53D1;&#x9001;&#x4FE1;&#x606F;&#x7684;&#x3002;&#x4ED6;&#x4EEC;&#x53EA;&#x4F1A;&#x6839;&#x636E;&#x4E3B;&#x7AD9;&#x7684;&#x8BF7;&#x6C42;&#x505A;&#x51FA;&#x56DE;&#x5E94;&#x3002;&#x4E3B;&#x8BBE;&#x5907;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4F7F;&#x7528;&#x5E7F;&#x64AD;&#x5730;&#x5740;&#x540C;&#x65F6;&#x5BFB;&#x5740;&#x591A;&#x4E2A;&#x4ECE;&#x8BBE;&#x5907;&#x3002;</p>
<h4 id="%E9%85%8D%E7%BD%AE%E4%B8%B2%E5%8F%A3">&#x914D;&#x7F6E;&#x4E32;&#x53E3;</h4>
<p>&#x5BF9;&#x4E8E;&#x8FD9;&#x4E24;&#x79CD;&#x6A21;&#x5F0F;&#xFF0C;&#x9996;&#x5148;&#x5FC5;&#x987B;&#x914D;&#x7F6E;&#x548C;&#x521D;&#x59CB;&#x5316;&#x4E32;&#x884C;&#x7AEF;&#x53E3;&#x3002;&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x663E;&#x793A;&#x4E86;&#x5982;&#x4F55;&#x51C6;&#x5907;&#x4E32;&#x884C;&#x7AEF;&#x53E3;&#x4EE5;&#x4FBF;&#x4E0E;&#x5E93;&#x4E00;&#x8D77;&#x4F7F;&#x7528;&#x7684;&#x793A;&#x4F8B;&#xFF1A;</p>
<pre><code class="language-c">SerialPort port = SerialPort_create(&quot;/dev/ttsS0&quot;, 9600, 8, &apos;E&apos;, 1);
</code></pre>
<h4 id="%E5%88%9B%E5%BB%BA%E5%B9%B6%E4%BD%BF%E7%94%A8%E6%96%B0%E7%9A%84%E9%9D%9E%E5%B9%B3%E8%A1%A1%E4%B8%BB%E5%AE%9E%E4%BE%8B">&#x521B;&#x5EFA;&#x5E76;&#x4F7F;&#x7528;&#x65B0;&#x7684;&#x975E;&#x5E73;&#x8861;&#x4E3B;&#x5B9E;&#x4F8B;</h4>
<p>&#x5BF9;&#x4E8E;&#x5E73;&#x8861;&#x548C;&#x4E0D;&#x5E73;&#x8861;&#x901A;&#x4FE1;&#x6A21;&#x5F0F;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <em>CS101_Master</em> &#x7C7B;&#x578B;&#x3002;</p>
<p>&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x4F7F;&#x7528;&#x4E0A;&#x9762;&#x5B9A;&#x4E49;&#x7684;&#x4E32;&#x884C;&#x7AEF;&#x53E3;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x4E0D;&#x5E73;&#x8861;&#x4E3B;&#x7AD9;&#x5B9E;&#x4F8B;&#x3002;<em>CS101_Master_setASDUReceivedHandler</em> &#x51FD;&#x6570;&#x4E3A;&#x63A5;&#x6536;&#x5230;&#x7684; ASDU &#x63D0;&#x4F9B;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x3002;<em>CS101_Master_addSlave</em> &#x51FD;&#x6570;&#x5C06;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x4ECE;&#x673A;&#x4E13;&#x7528;&#x7684;&#x72B6;&#x6001;&#x673A;&#xFF0C;&#x4EE5;&#x5904;&#x7406;&#x4E0E;&#x94FE;&#x8DEF;&#x5C42;&#x5730;&#x5740;&#x4E3A; 1 &#x7684;&#x4ECE;&#x673A;&#x7684;&#x6240;&#x6709;&#x901A;&#x4FE1;&#x3002;</p>
<pre><code class="language-c">CS101_Master master = CS101_Master_create(port, NULL, NULL, IEC60870_LINK_LAYER_UNBALANCED);

CS101_Master_setASDUReceivedHandler(master, asduReceivedHandler, NULL);

CS101_Master_addSlave(master, 1);
</code></pre>
<p>&#x94FE;&#x8DEF;&#x5C42;&#x53C2;&#x6570;&#x548C;&#x5E94;&#x7528;&#x5C42;&#x53C2;&#x6570;&#x662F;&#x53EF;&#x9009;&#x53C2;&#x6570;&#x3002;&#x5982;&#x679C;&#x672A;&#x8BBE;&#x7F6E;&#xFF0C;&#x5219;&#x4F1A;&#x521B;&#x5EFA;&#x548C;&#x4F7F;&#x7528;&#x53C2;&#x6570;&#x5BF9;&#x8C61;&#x7684;&#x9ED8;&#x8BA4;&#x5B9E;&#x4F8B;&#x3002;&#x4EE5;&#x540E;&#x4E5F;&#x53EF;&#x4EE5;&#x4FEE;&#x6539;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x3002;</p>
<p>&#x5728;&#x5411;&#x7279;&#x5B9A;&#x4ECE;&#x673A;&#x53D1;&#x9001;&#x4EFB;&#x4F55;&#x547D;&#x4EE4;&#x6216;&#x5176;&#x4ED6;&#x8BF7;&#x6C42;&#x4E4B;&#x524D;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <em>CS101_Master_useSlaveAddress</em> &#x51FD;&#x6570;&#x8BBE;&#x7F6E;&#x4ECE;&#x673A;&#x5730;&#x5740;&#x3002;</p>
<pre><code class="language-c">CS101_Master_useSlaveAddress(master, 1);
CS101_Master_sendProcessCommand(master, CS101_COT_ACTIVATION, 1, sc);
</code></pre>
<h4 id="%E5%B9%B3%E8%A1%A1%E4%B8%BB%E7%AB%99">&#x5E73;&#x8861;&#x4E3B;&#x7AD9;</h4>
<p>&#x5E73;&#x8861;&#x4E3B;&#x7AD9;&#x4E5F;&#x662F;&#x4EE5;&#x540C;&#x6837;&#x7684;&#x65B9;&#x5F0F;&#x521B;&#x5EFA;&#x7684;&#x3002;&#x53EA;&#x662F;&#x94FE;&#x63A5;&#x5C42;&#x6A21;&#x5F0F;&#x53C2;&#x6570;&#x4E0D;&#x540C;&#x3002;<em>CS101_Master_useSlaveAddress</em> &#x7528;&#x4E8E;&#x8BBE;&#x7F6E;&#x4ECE;&#x673A;&#x5730;&#x5740;&#x3002;&#x5728;&#x5E73;&#x8861;&#x4E3B;&#x7AD9;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x53EA;&#x9700;&#x8BBE;&#x7F6E;&#x4E00;&#x6B21;&#xFF0C;&#x56E0;&#x4E3A;&#x53EA;&#x6709;</p>
<pre><code class="language-c">CS101_Master master = CS101_Master_create(port, NULL, NULL, IEC60870_LINK_LAYER_BALANCED);

CS101_Master_useSlaveAddress(master, 3);
CS101_Master_setASDUReceivedHandler(master, asduReceivedHandler, NULL);
</code></pre>
<h4 id="%E8%AE%BE%E7%BD%AE%E9%93%BE%E8%B7%AF%E5%B1%82%E5%8F%82%E6%95%B0">&#x8BBE;&#x7F6E;&#x94FE;&#x8DEF;&#x5C42;&#x53C2;&#x6570;</h4>
<p>&#x8BBE;&#x7F6E;&#x94FE;&#x63A5;&#x5C42;&#x53C2;&#x6570;&#x662F;&#x4E00;&#x4E2A;&#x53EF;&#x9009;&#x6B65;&#x9AA4;&#x3002;&#x5982;&#x679C;&#x672A;&#x660E;&#x786E;&#x8BBE;&#x7F6E;&#xFF0C;&#x5219;&#x5C06;&#x4E3A;&#x65B0;&#x7684;&#x4E3B;&#x7AD9;&#x5B9E;&#x4F8B;&#x4F7F;&#x7528;&#x4E00;&#x7EC4;&#x9ED8;&#x8BA4;&#x53C2;&#x6570;&#x3002;&#x53C2;&#x6570;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6784;&#x9020;&#x51FD;&#x6570; <em>CS101_Master_create</em> &#x7ED9;&#x51FA;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7A0D;&#x540E;&#x4FEE;&#x6539;&#x3002;</p>
<p><em>&#x793A;&#x4F8B;&#xFF1A;&#x7981;&#x7528;&#x5355;&#x5B57;&#x7B26; ACK &#x7684;&#x7528;&#x6CD5;</em></p>
<pre><code class="language-c">LinkLayerParameters llParams = CS101_Master_getLinkLayerParameters(master);
llParams-&gt;useSingleCharACK = false;
</code></pre>
<h3 id="%E5%90%91%E4%BB%8E%E6%9C%BA%E5%8F%91%E9%80%81%E8%AF%B7%E6%B1%82%E5%B9%B6%E6%8E%A5%E6%94%B6%E5%93%8D%E5%BA%94">&#x5411;&#x4ECE;&#x673A;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x5E76;&#x63A5;&#x6536;&#x54CD;&#x5E94;</h3>
<p>&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E13;&#x6CE8;&#x4E8E;&#x5411;&#x4ECE;&#x673A;&#x53D1;&#x9001;&#x5E94;&#x7528;&#x5C42;&#x6D88;&#x606F;&#xFF08;ASDU&#xFF09;&#x3002;&#x4E3B;&#x673A; API &#x5305;&#x542B;&#x5411;&#x4ECE;&#x673A;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x7684;&#x901A;&#x7528;&#x548C;&#x4E13;&#x7528;&#x51FD;&#x6570;&#x3002;&#x53D1;&#x9001;&#x7CFB;&#x7EDF;&#x547D;&#x4EE4;&#x6216;&#x8FC7;&#x7A0B;&#x547D;&#x4EE4;&#x65F6;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;&#x4E13;&#x7528;&#x51FD;&#x6570;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x6709;&#x52A9;&#x4E8E;&#x521B;&#x5EFA;&#x7B26;&#x5408;&#x6807;&#x51C6;&#x7684; ASDU&#x3002;&#x4EE5;&#x4E0B;&#x5404;&#x8282;&#x5C06;&#x5BF9;&#x8FD9;&#x4E9B;&#x4E13;&#x95E8;&#x51FD;&#x6570;&#x8FDB;&#x884C;&#x89E3;&#x91CA;&#x3002;&#x5B83;&#x4EEC;&#x901A;&#x5E38;&#x5B58;&#x5728;&#x4E8E; CS101 &#x548C; CS104 &#x7684;&#x4E24;&#x79CD;&#x53D8;&#x4F53;&#x4E2D;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x4E00;&#x822C;&#x60C5;&#x51B5;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS101_Master_sendASDU</em> &#x6216; <em>CS104_Connection_sendASDU</em> &#x51FD;&#x6570;&#x53D1;&#x9001;&#x4EFB;&#x610F; ASDU&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x63A5;&#x6536;&#x5E94;&#x7528;&#x5C42;&#x6D88;&#x606F;&#xFF0C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x5FC5;&#x987B;&#x5B9E;&#x73B0; <em>CS101_ASDUReceivedHandler</em> &#x56DE;&#x8C03;&#x3002;</p>
<p><em>&#x5728; CS101_ASDUReceivedHandler &#x4E2D;&#x5904;&#x7406;&#x63A5;&#x6536;&#x5230;&#x7684; ASDU &#x7684;&#x793A;&#x4F8B;</em></p>
<pre><code class="language-c">static bool
asduReceivedHandler (void* parameter, int address, CS101_ASDU asdu)
{
    printf(&quot;RECVD ASDU type: %s(%i) elements: %i\n&quot;,
            TypeID_toString(CS101_ASDU_getTypeID(asdu)),
            CS101_ASDU_getTypeID(asdu),
            CS101_ASDU_getNumberOfElements(asdu));

    if (CS101_ASDU_getTypeID(asdu) == M_ME_TE_1) {

        printf(&quot;  measured scaled values with CP56Time2a timestamp:\n&quot;);

        int i;

        for (i = 0; i &lt; CS101_ASDU_getNumberOfElements(asdu); i++) {

            MeasuredValueScaledWithCP56Time2a io =
                    (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu, i);

            printf(&quot;    IOA: %i value: %i\n&quot;,
                    InformationObject_getObjectAddress((InformationObject) io),
                    MeasuredValueScaled_getValue((MeasuredValueScaled) io)
            );

            MeasuredValueScaledWithCP56Time2a_destroy(io);
        }
    }
    else if (CS101_ASDU_getTypeID(asdu) == M_SP_NA_1) {
        printf(&quot;  single point information:\n&quot;);

        int i;

        for (i = 0; i &lt; CS101_ASDU_getNumberOfElements(asdu); i++) {

            SinglePointInformation io =
                    (SinglePointInformation) CS101_ASDU_getElement(asdu, i);

            printf(&quot;    IOA: %i value: %i\n&quot;,
                    InformationObject_getObjectAddress((InformationObject) io),
                    SinglePointInformation_getValue((SinglePointInformation) io)
            );

            SinglePointInformation_destroy(io);
        }
    }

    return true;
}
</code></pre>
<p>&#x6B64;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <em>CS104_Connection_setASDUReceivedHandler</em> &#x6216; _CS101_Master_setASDURLeceivedHandler &#x51FD;&#x6570;&#x5B89;&#x88C5;&#x3002;</p>
<pre><code class="language-c">CS101_Master_setASDUReceivedHandler(master, asduReceivedHandler, NULL);
</code></pre>
<p>&#x6240;&#x6709;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7684;&#x51FD;&#x6570;&#x7B7E;&#x540D;&#x4E2D;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; &#x201C;parameter&#x201D; &#x7684;&#x901A;&#x7528;&#x5F15;&#x7528;&#x53C2;&#x6570;&#x3002;&#x7528;&#x6237;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6B64;&#x53C2;&#x6570;&#x5411;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x63D0;&#x4F9B;&#x7279;&#x5B9A;&#x4E8E;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;&#x3002;&#x6B64;&#x53C2;&#x6570;&#x901A;&#x8FC7;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7684;&#x5B89;&#x88C5;&#x51FD;&#x6570;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF08;&#x5982;&#x4E0A;&#x4F8B;&#x4E2D;&#x7684; <em>CS101_Master_setASDUReceivedHandler</em>&#xFF09;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x4F7F;&#x7528;&#x6B64;&#x53C2;&#x6570;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x5C06;&#x5176;&#x8BBE;&#x7F6E;&#x4E3A; <em>NULL</em>&#x3002;</p>
<p><em>&#x4E3B;&#x7AD9;&#x4FA7;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7C7B;&#x578B;</em></p>
<table>
<thead>
<tr>
<th>&#x56DE;&#x8C03;&#x7C7B;&#x578B;</th>
<th>&#x4E8B;&#x4EF6;</th>
<th>CS 101</th>
<th>CS 104</th>
</tr>
</thead>
<tbody>
<tr>
<td>CS101_ASDUReceivedHandler</td>
<td>ASDU&#x5DF2;&#x63A5;&#x6536;&#xFF0C;&#x4F46;&#x672A;&#x7531;&#x5176;&#x4ED6;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x5904;&#x7406;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>IEC60870_LinkLayerStateChangedHandler</td>
<td>&#x94FE;&#x8DEF;&#x5C42;&#x72B6;&#x6001;&#x66F4;&#x6539;&#x4E8B;&#x4EF6;</td>
<td>+</td>
<td>-</td>
</tr>
<tr>
<td>CS104_ConnectionHandler</td>
<td>CS104 APCI &#x4E8B;&#x4EF6;</td>
<td>-</td>
<td>+</td>
</tr>
</tbody>
</table>
<h3 id="%E5%8F%91%E9%80%81%E8%AF%BB%E8%AF%B7%E6%B1%82">&#x53D1;&#x9001;&#x8BFB;&#x8BF7;&#x6C42;</h3>
<p>IEC 60870 &#x6587;&#x6863;&#x4E0D;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;&#x6B64;&#x670D;&#x52A1;&#xFF08;&#x5468;&#x671F;&#x6027;&#x6570;&#x636E;&#x8BF7;&#x6C42;&#x6216;&#x8F6E;&#x8BE2;&#xFF09;&#xFF0C;&#x4F46;&#x8FD9;&#x662F;&#x83B7;&#x53D6;&#x6240;&#x9700;&#x6570;&#x636E;&#x7684;&#x4E00;&#x79CD;&#x7B80;&#x5355;&#x65B9;&#x6CD5;&#x3002;&#x60A8;&#x53EA;&#x9700;&#x8981;&#x77E5;&#x9053;&#x516C;&#x5171;&#x5730;&#x5740;&#xFF08;CA&#xFF09;&#x548C;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5730;&#x5740;&#xFF08;IOA&#xFF09;&#x5C31;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x6B63;&#x786E;&#x7684;&#x8BF7;&#x6C42;&#x3002;</p>
<pre><code class="language-c">  CS104_Connection_sendReadCommand(con, 1 /* CA */, 2001 /* IOA */);
</code></pre>
<p>&#x6B64;&#x8C03;&#x7528;&#x662F;&#x975E;&#x963B;&#x585E;&#x7684;&#x3002;&#x60A8;&#x5FC5;&#x987B;&#x5728; <em>CS101_ASDUReceivedHandler</em> &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x8BC4;&#x4F30;&#x54CD;&#x5E94;&#x3002;</p>
<p>&#x901A;&#x5E38;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x54CD;&#x5E94;&#x53EA;&#x5305;&#x542B;&#x6CA1;&#x6709;&#x65F6;&#x95F4;&#x6233;&#x7684;&#x57FA;&#x672C;&#x6570;&#x636E;&#x7C7B;&#x578B;&#xFF08;&#x5373;&#x4F7F;&#x7528;&#x4E0D;&#x5305;&#x542B;&#x65F6;&#x95F4;&#x6233;&#x7684;&#x7279;&#x5B9A;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x7684;&#x6D88;&#x606F;&#x7C7B;&#x578B;&#xFF09;&#xFF01;</p>
<h3 id="%E5%8F%AC%E5%94%A4">&#x53EC;&#x5524;</h3>
<p>&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5355;&#x4E2A;&#x8BF7;&#x6C42;&#x5411;&#x4ECE;&#x673A;&#x8BF7;&#x6C42;&#x4E00;&#x7EC4;&#x6570;&#x636E;&#x9879;&#x3002;&#x5728;&#x4E3B;&#x7AD9;&#xFF08;&#x5BA2;&#x6237;&#x7AEF;&#xFF09;&#x7AEF;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x5730;&#x4F7F;&#x7528; Connection &#x5BF9;&#x8C61;&#x7684; <em>sendInterrogationCommand</em> &#x51FD;&#x6570;&#xFF1A;</p>
<pre><code class="language-c">CS104_Connection_sendInterrogationCommand (con, CS101_COT_ACTIVATION, /* CA */ 1, /* QOI */ 20);
</code></pre>
<p>&#x5BA2;&#x6237;&#x7AEF;/&#x4E3B;&#x673A;&#x7AEF;&#x65B9;&#x6CD5;&#x7B7E;&#x540D;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<pre><code class="language-c">bool
CS104_Connection_sendInterrogationCommand(CS104_Connection self, CS101_CauseOfTransmission cot, int ca, QualifierOfInterrogation qoi)
</code></pre>
<p>&#x4E0E;&#x5176;&#x4ED6;&#x65B9;&#x6CD5;&#x4E00;&#x6837;&#xFF0C;&#x53C2;&#x6570; ca &#x662F;&#x516C;&#x5171;&#x5730;&#x5740;&#xFF08;ca&#xFF09;&#x3002;&#x53C2;&#x6570; qoi &#x662F;&#x201C;&#x8BE2;&#x95EE;&#x9650;&#x5B9A;&#x7B26;&#x201D;&#xFF08;qoi&#xFF09;&#x3002;QOI &#x7684;&#x503C; &#x201C;20&#x201D;&#xFF08;&#x8868;&#x793A;&#x201C;&#x7AD9;&#x8BE2;&#x95EE;&#x201D;&#xFF09;&#x8868;&#x793A;&#x5B83;&#x662F;&#x5BF9;&#x6240;&#x6709;&#x6570;&#x636E;&#x70B9;&#x7684;&#x8BF7;&#x6C42;&#x3002;QOI &#x7684;&#x5176;&#x4ED6;&#x503C;&#x5C06;&#x6307;&#x793A;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x4E3B;&#x673A;&#xFF09;&#x53EA;&#x60F3;&#x4ECE;&#x7279;&#x5B9A;&#x8BE2;&#x95EE;&#x7EC4;&#x63A5;&#x6536;&#x6570;&#x636E;&#x3002;</p>
<h3 id="%E6%97%B6%E9%92%9F%E5%90%8C%E6%AD%A5%E8%BF%87%E7%A8%8B">&#x65F6;&#x949F;&#x540C;&#x6B65;&#x8FC7;&#x7A0B;</h3>
<p>&#x5BF9;&#x4E8E;&#x65F6;&#x949F;&#x540C;&#x6B65;&#x8FC7;&#x7A0B;&#xFF0C;&#x63A7;&#x5236;&#x7AD9;&#xFF08;&#x4E3B;&#x7AD9;&#xFF09;&#x5411;&#x53D7;&#x63A7;&#x7AD9;&#xFF08;&#x4ECE;&#x7AD9;&#xFF09;&#x53D1;&#x9001; C_CS_NA_1 ACT &#x6D88;&#x606F;&#xFF0C;&#x8BE5;&#x6D88;&#x606F;&#x5305;&#x542B;&#x4F5C;&#x4E3A; CP56Time2a &#x7C7B;&#x578B;&#x7684;&#x65F6;&#x95F4;&#x503C;&#x7684;&#x5F53;&#x524D;&#x6709;&#x6548;&#x65F6;&#x95F4;&#x4FE1;&#x606F;&#x3002;&#x53D7;&#x63A7;&#x7AD9;&#x5FC5;&#x987B;&#x66F4;&#x65B0;&#x5176;&#x5185;&#x90E8;&#x65F6;&#x95F4;&#xFF0C;&#x5E76;&#x5728;&#x53D1;&#x9001;&#x4E86;&#x6240;&#x6709;&#x6392;&#x961F;&#x7684;&#x65F6;&#x95F4;&#x6807;&#x8BB0; PDU &#x4E4B;&#x540E;&#x7528; C_CS_NAME_1 ACT_CON &#x6D88;&#x606F;&#x8FDB;&#x884C;&#x54CD;&#x5E94;&#x3002;</p>
<p>&#x53D7;&#x63A7;&#x7AD9;&#x7684;&#x65F6;&#x949F;&#x540C;&#x6B65;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; CS104 &#x7684; <em>CS104_Connection_sendClockSyncCommand</em> &#x51FD;&#x6570;&#x6216; CS101 &#x7684; <em>CS101_Master_sendClockSyncCommand</em> &#x6765;&#x5B8C;&#x6210;&#x3002;</p>
<p>&#x9996;&#x5148;&#xFF0C;&#x5FC5;&#x987B;&#x521B;&#x5EFA;&#x5E76;&#x521D;&#x59CB;&#x5316; CP56Time2a &#x65F6;&#x95F4;&#x6233;&#xFF1A;</p>
<pre><code class="language-c">struct sCP56Time2a currentTime;
CP56Time2a_createFromMsTimestamp(&amp;currentTime, Hal_getTimeInMs());
CS104_Connection_sendClockSyncCommand(con, 1 /* CA */, &amp;currentTime);
</code></pre>
<p>&#x6216;&#x8005;&#x5F53;&#x4F7F;&#x7528;&#x52A8;&#x6001;&#x5185;&#x5B58;&#x5206;&#x914D;&#x548C; CS 101 &#x65F6;&#xFF1A;</p>
<pre><code class="language-c">CP56Time2a currentTime = CP56Time2a_createFromMsTimestamp(NULL, Hal_getTimeInMs());
CS101_Master_sendClockSyncCommand(master, 1 /* CA */, currentTime);
</code></pre>
<p><em>&#x6CE8;</em>&#xFF1A;<em>Hal_getTimeInMs</em> &#x51FD;&#x6570;&#x662F;&#x4E00;&#x79CD;&#x72EC;&#x7ACB;&#x4E8E;&#x5E73;&#x53F0;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x81EA; 1970 &#x5E74; 1 &#x6708; UTC 00:00:00 1 &#x4EE5;&#x6765;&#x7684;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#xFF08;&#x4EE5;&#x6BEB;&#x79D2;&#x4E3A;&#x5355;&#x4F4D;&#xFF09;&#x3002;&#x60A8;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x81EA;&#x5DF1;&#x7684;&#x51FD;&#x6570;&#x6765;&#x83B7;&#x53D6;&#x65F6;&#x95F4;&#x3002;</p>
<h3 id="%E6%8C%87%E4%BB%A4%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B">&#x6307;&#x4EE4;&#x6267;&#x884C;&#x8FC7;&#x7A0B;</h3>
<p>&#x547D;&#x4EE4;&#x7528;&#x4E8E;&#x5728;&#x53D7;&#x63A7;&#x7AD9;&#x8BBE;&#x7F6E;&#x8BBE;&#x5B9A;&#x70B9;&#x3001;&#x53C2;&#x6570;&#x6216;&#x89E6;&#x53D1;&#x4E00;&#x4E9B;&#x52A8;&#x4F5C;&#x3002;</p>
<p>&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x7C7B;&#x578B;&#xFF08;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x53EF;&#x7528;&#x4E8E;&#x547D;&#x4EE4;&#xFF09;&#xFF1A;</p>
<ul>
<li>C_SC (&#x5355;&#x70B9;&#x547D;&#x4EE4;) - &#x63A7;&#x5236;&#x4E8C;&#x8FDB;&#x5236;&#x6570;&#x636E;&#xFF08;&#x5F00;&#x5173;&#x2026;&#xFF09;</li>
<li>C_DC (&#x53CC;&#x70B9;&#x547D;&#x4EE4;) - &#x7528;&#x8F6C;&#x6362;&#x72B6;&#x6001;&#x63A7;&#x5236;&#x4E8C;&#x8FDB;&#x5236;&#x6570;&#x636E;&#xFF08;&#x79FB;&#x52A8;&#x5F00;&#x5173;&#x2026;&#xFF09;</li>
<li>S_RC (&#x6B65;&#x8FDB;&#x4F4D;&#x7F6E;&#x547D;&#x4EE4;) - &#x63A7;&#x5236;&#x6B65;&#x8FDB;&#x4F4D;&#x7F6E;</li>
<li>S_SE (&#x8BBE;&#x5B9A;&#x503C;&#x547D;&#x4EE4;) - &#x63A7;&#x5236;&#x8BBE;&#x5B9A;&#x503C;&#xFF08;&#x7F29;&#x653E;&#x503C;&#x3001;&#x5F52;&#x4E00;&#x5316;&#x503C;&#x3001;&#x6D6E;&#x70B9;&#x503C;&#xFF09;-&#x4E5F;&#x53EF;&#x7528;&#x4E8E;&#x8BBE;&#x7F6E;&#x53C2;&#x6570;&#x3001;&#x62A5;&#x8B66;&#x9650;&#x503C;&#x7B49;&#x3002;</li>
</ul>
<p>&#x8FD9;&#x4E9B;&#x547D;&#x4EE4;&#x7C7B;&#x578B;&#x540C;&#x6837;&#x6709;&#x5E26;&#x65F6;&#x95F4;&#x6807;&#x7B7E;&#x7684;&#x7248;&#x672C;&#xFF08;CP56TIme2a&#xFF09;&#x3002;</p>
<p>&#x6709;&#x4E24;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x547D;&#x4EE4;&#x8FC7;&#x7A0B;&#x53EF;&#x7528;&#x3002;<em>&#x76F4;&#x63A5;&#x64CD;&#x4F5C;</em>&#x547D;&#x4EE4;&#x7A0B;&#x5E8F;&#x548C;<em>&#x64CD;&#x4F5C;&#x524D;&#x9009;&#x62E9;</em>&#x547D;&#x4EE4;&#x7A0B;&#x5E8F;&#x3002;</p>
<p>&#x8981;&#x53D1;&#x9001;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x547D;&#x4EE4;&#x8FC7;&#x7A0B;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x4F60;&#x5FC5;&#x987B;&#x5411;&#x53D7;&#x63A7;&#x7AD9;&#x53D1;&#x9001; ACTIVATION APDU&#x3002;</p>
<p><em>&#x5411;&#x53D7;&#x63A7;&#x7AD9;&#x53D1;&#x9001;&#x5904;&#x7406;&#x547D;&#x4EE4;</em></p>
<pre><code class="language-c">InformationObject sc = (InformationObject)
      SingleCommand_create(NULL, 5000, true, false, 0);

CS101_Master_sendProcessCommand(master, CS101_COT_ACTIVATION, 1, sc);

InformationObject_destroy(sc);
</code></pre>
<p>SingleCommand &#x6570;&#x636E;&#x7C7B;&#x578B;&#x7684;&#x6784;&#x9020;&#x5668;&#x5177;&#x6709;&#x4EE5;&#x4E0B;&#x7B7E;&#x540D;&#xFF1A;</p>
<pre><code class="language-c">SingleCommand
SingleCommand_create(SingleCommand self, int ioa, bool command, bool selectCommand, int qu);
</code></pre>
<p>&#x8981;&#x53D1;&#x9001;&#x76F4;&#x63A5;&#x64CD;&#x4F5C;&#x547D;&#x4EE4;&#xFF0C;<em>selectCommand</em> &#x53C2;&#x6570;&#x5E94;&#x4E3A; false&#x3002;&#x9650;&#x5B9A;&#x7B26;&#xFF08;<em>qu</em>&#xFF09;&#x901A;&#x5E38;&#x5E94;&#x8BBE;&#x7F6E;&#x4E3A; 0&#x3002;</p>
<p>&#x5BF9;&#x4E8E;<em>&#x64CD;&#x4F5C;&#x524D;&#x9009;&#x62E9;</em>&#xFF0C;&#x53D1;&#x9001;&#x547D;&#x4EE4;&#x65F6;&#x5FC5;&#x987B;&#x5C06; <em>selectCommand</em> &#x53C2;&#x6570;&#x8BBE;&#x7F6E;&#x4E3A; true&#xFF0C;&#x4EE5;&#x9009;&#x62E9;&#x63A7;&#x5236;&#x8F93;&#x51FA;&#x3002;&#x5728;&#x4E0B;&#x4E00;&#x6B65;&#x4E2D;&#xFF0C;&#x5FC5;&#x987B;&#x53D1;&#x9001;&#x4E00;&#x4E2A; <em>selectCommand</em> &#x8BBE;&#x7F6E;&#x4E3A; false &#x7684;&#x9644;&#x52A0;&#x547D;&#x4EE4;&#xFF0C;&#x624D;&#x80FD;&#x6267;&#x884C;&#x5B9E;&#x9645;&#x7684;&#x547D;&#x4EE4;&#x3002;</p>
<p>&#x5982;&#x679C;&#x547D;&#x4EE4;&#x6210;&#x529F;&#xFF0C;&#x5219;&#x5206;&#x7AD9;&#x5C06;&#x4EE5;&#x672A;&#x8BBE;&#x7F6E; <em>negative flag</em> &#x7684; ACT_CON &#x54CD;&#x5E94;&#x6D88;&#x606F;&#x8FDB;&#x884C;&#x5E94;&#x7B54;&#x3002;&#x5982;&#x679C;&#x5206;&#x7AD9;&#x65E0;&#x6CD5;&#x6267;&#x884C;&#x8BE5;&#x547D;&#x4EE4;&#xFF0C;&#x5B83;&#x4E5F;&#x5C06;&#x4F7F;&#x7528; ACT_CON &#x54CD;&#x5E94;&#x8FDB;&#x884C;&#x5E94;&#x7B54;&#xFF0C;&#x4F46;&#x8BBE;&#x7F6E; <em>negative flag</em> &#x3002;&#x60A8;&#x53EF;&#x4EE5;&#x5BF9;&#x63A5;&#x6536;&#x5230;&#x7684; <em>CS101_ASDU</em> &#x5B9E;&#x4F8B;&#x4F7F;&#x7528; <em>CS101_ASDU_isNegative</em> &#x51FD;&#x6570;&#xFF0C;&#x68C0;&#x67E5;&#x6B64;&#x6807;&#x5FD7;&#x662F;&#x5426;&#x8BBE;&#x7F6E;&#x3002;</p>
<p>&#x5BF9;&#x4E8E; CS 104 &#x4E3B;&#x673A;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_master_sendProcessCommandEx</em> &#x51FD;&#x6570;&#x4EE5;&#x76F8;&#x540C;&#x7684;&#x65B9;&#x5F0F;&#x53D1;&#x9001;&#x547D;&#x4EE4;&#x3002;</p>
<h2 id="%E4%BB%8E%E6%9C%BA-%E6%9C%8D%E5%8A%A1%E7%AB%AF-%E4%BE%A7%E7%BC%96%E7%A8%8B">&#x4ECE;&#x673A; (&#x670D;&#x52A1;&#x7AEF;) &#x4FA7;&#x7F16;&#x7A0B;</h2>
<h3 id="cs104%EF%BC%88tcpip%EF%BC%89%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E5%92%8C%E8%AE%BE%E7%BD%AE">CS104&#xFF08;TCP/IP&#xFF09;&#x670D;&#x52A1;&#x5668;&#x914D;&#x7F6E;&#x548C;&#x8BBE;&#x7F6E;</h3>
<p>&#x8981;&#x914D;&#x7F6E;&#x548C;&#x8BBE;&#x7F6E; IEC 60870-5-104 &#x670D;&#x52A1;&#x5668;/&#x4ECE;&#x673A;&#xFF0C;&#x9700;&#x8981;&#x4E00;&#x4E2A; <em>CS104_slave</em> &#x6570;&#x636E;&#x7C7B;&#x578B;&#x7684;&#x5B9E;&#x4F8B;&#x3002;</p>
<pre><code class="language-c">CS104_Slave slave = CS104_Slave_create(100, 100);
</code></pre>
<p>&#x521B;&#x5EFA;&#x670D;&#x52A1;&#x5668;&#x5B9E;&#x4F8B;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x914D;&#x7F6E;</p>
<h3 id="cs104-%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%A8%A1%E5%BC%8F">CS104 &#x670D;&#x52A1;&#x7AEF;&#x6A21;&#x5F0F;</h3>
<p>&#x670D;&#x52A1;&#x5668;&#x63D0;&#x4F9B;&#x4E86;&#x4E09;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x6A21;&#x5F0F;&#xFF0C;&#x6D89;&#x53CA;&#x5BF9;&#x5197;&#x4F59;&#x8FDE;&#x63A5;&#x548C;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x5904;&#x7406;&#x7684;&#x652F;&#x6301;&#xFF1A;</p>
<p>&#x9ED8;&#x8BA4;&#x6A21;&#x5F0F;&#xFF08;<em>CS104_mode_SINGLE_REDUNDANCY_GROUP</em>&#xFF09;&#x4EC5;&#x5141;&#x8BB8;<em>&#x5355;&#x4E2A;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;</em>&#x3002;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x662F;&#x53D1;&#x9001; ASDU&#xFF08;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6570;&#x636E;&#x5355;&#x5143;&#xFF09;&#x7684;&#x8FDE;&#x63A5;&#x3002;&#x6240;&#x6709;&#x5176;&#x4ED6;&#x8FDE;&#x63A5;&#x90FD;&#x53EA;&#x662F;&#x4E0D;&#x53D1;&#x9001;&#x5E94;&#x7528;&#x5C42;&#x6570;&#x636E;&#x7684;&#x5907;&#x7528;&#x8FDE;&#x63A5;&#x3002;<br>
&#x4E8B;&#x4EF6;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#x3002;&#x5F53;&#x6CA1;&#x6709;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x6216;&#x6CA1;&#x6709;&#x8FDE;&#x63A5;&#x5904;&#x4E8E;&#x6D3B;&#x52A8;&#x72B6;&#x6001;&#x65F6;&#xFF0C;&#x4E5F;&#x4F1A;&#x5B58;&#x50A8;&#x4E8B;&#x4EF6;&#x3002;</p>
<p>&#x7B2C;&#x4E8C;&#x79CD;&#x6A21;&#x5F0F;&#xFF08;<em>CS104_mode_CONNECTION_IS_REDUNDANCY_GROUP</em>&#xFF09;&#x5141;&#x8BB8;<em>&#x591A;&#x4E2A;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;</em>&#x3002;&#x6BCF;&#x4E2A;&#x8FDE;&#x63A5;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x3002;<br>
&#x5F53;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x5173;&#x95ED;&#x65F6;&#xFF0C;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x5C06;&#x88AB;&#x5220;&#x9664;&#x3002;&#x5F53;&#x6709;&#x591A;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x9700;&#x8981;&#x8BBF;&#x95EE;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6B64;&#x6A21;&#x5F0F;&#x3002;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x5F88;&#x5BB9;&#x6613;&#x4F7F;&#x7528;&#xFF0C;&#x4F46;&#x5B83;&#x7684;&#x7F3A;&#x70B9;&#x662F;&#xFF0C;&#x5F53;&#x6CA1;&#x6709;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x65F6;&#xFF0C;&#x4E8B;&#x4EF6;&#x4F1A;&#x4E22;&#x5931;&#x3002;</p>
<p>&#x7B2C;&#x4E09;&#x79CD;&#x6A21;&#x5F0F;&#xFF08;<em>CS104_mode_MULTIPLE_REDUNDANCY_GROUPS</em>&#xFF09;&#x5141;&#x8BB8;<em>&#x591A;&#x4E2A;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;</em>&#xFF0C;&#x540C;&#x65F6;&#x5728;&#x6CA1;&#x6709;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x65F6;&#x4FDD;&#x7559;&#x4E8B;&#x4EF6;&#x3002;&#x5728;&#x8FD9;&#x79CD;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x53EF;&#x4EE5;&#x88AB;&#x5206;&#x914D;&#x5230;&#x7279;&#x5B9A;&#x7684;&#x5197;&#x4F59;&#x7EC4;&#x3002;&#x5206;&#x914D;&#x57FA;&#x4E8E;&#x5BA2;&#x6237;&#x7AEF;&#x7684; IP &#x5730;&#x5740;&#x3002;&#x4E00;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x5177;&#x6709;&#x591A;&#x4E2A;&#x8FDE;&#x63A5;&#xFF0C;&#x4F46;&#x8FD9;&#x4E9B;&#x8FDE;&#x63A5;&#x4E2D;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x5904;&#x4E8E;&#x6D3B;&#x52A8;&#x72B6;&#x6001;&#x3002;&#x6FC0;&#x6D3B;&#x7684;&#x8FDE;&#x63A5;&#x6570;&#x91CF;&#x53D7;&#x5197;&#x4F59;&#x7EC4;&#x6570;&#x91CF;&#x7684;&#x9650;&#x5236;&#x3002;&#x6BCF;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x4E13;&#x7528;&#x7684;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x3002;</p>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_setServerMode</em> &#x529F;&#x80FD;&#x8BBE;&#x7F6E;&#x670D;&#x52A1;&#x5668;&#x6A21;&#x5F0F;&#xFF1A;</p>
<pre><code class="language-c">CS104_Slave_setServerMode(slave, CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS);
</code></pre>
<h3 id="cs104%EF%BC%9A%E5%AE%9A%E4%B9%89%E5%A4%9A%E4%B8%AA%E5%86%97%E4%BD%99%E7%BB%84">CS104&#xFF1A;&#x5B9A;&#x4E49;&#x591A;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;</h3>
<p>&#x53EA;&#x6709;&#x5728;&#x4F7F;&#x7528;&#x670D;&#x52A1;&#x5668;&#x6A21;&#x5F0F; <em>CS104_MODE_MULTIPLE_Redundancy_groups</em> &#x65F6;&#xFF0C;&#x624D;&#x9700;&#x8981;&#x663E;&#x5F0F;&#x521B;&#x5EFA;&#x5197;&#x4F59;&#x7EC4;&#x3002;&#x60A8;&#x53EF;&#x4EE5;&#x5C06;&#x591A;&#x4E2A; IP &#x5730;&#x5740;&#x5206;&#x914D;&#x7ED9;&#x4E00;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;&#x3002;&#x6765;&#x81EA;&#x5176;&#x4E2D;&#x4E00;&#x4E2A; IP &#x5730;&#x5740;&#x7684;&#x4F20;&#x5165;&#x8FDE;&#x63A5;&#x5C06;&#x81EA;&#x52A8;&#x5206;&#x914D;&#x7ED9;&#x8BE5;&#x7279;&#x5B9A;&#x7684;&#x5197;&#x4F59;&#x7EC4;&#x3002;</p>
<p>&#x5F53;&#x4E00;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;&#x6CA1;&#x6709;&#x5206;&#x914D; IP &#x5730;&#x5740;&#x65F6;&#xFF0C;&#x5B83;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x201C;&#x5305;&#x7F57;&#x4E07;&#x8C61;&#x201D;&#x7684;&#x7EC4;&#x5DE5;&#x4F5C;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#x6240;&#x6709;&#x672A;&#x5206;&#x914D;&#x7ED9;&#x5176;&#x4ED6;&#x7EC4;&#x7684;&#x4F20;&#x5165;&#x8FDE;&#x63A5;&#x90FD;&#x5C06;&#x6700;&#x7EC8;&#x5728;&#x6B64;&#x7EC4;&#x4E2D;&#x3002;</p>
<p><em>&#x5982;&#x4F55;&#x5B9A;&#x4E49;&#x591A;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;&#x7684;&#x793A;&#x4F8B;</em></p>
<pre><code class="language-c">CS104_Slave_setServerMode(slave, CS104_MODE_MULTIPLE_REDUNDANCY_GROUPS);

CS104_RedundancyGroup redGroup1 = CS104_RedundancyGroup_create(&quot;red-group-1&quot;);
CS104_RedundancyGroup_addAllowedClient(redGroup1, &quot;192.168.2.9&quot;);

CS104_RedundancyGroup redGroup2 = CS104_RedundancyGroup_create(&quot;red-group-2&quot;);
CS104_RedundancyGroup_addAllowedClient(redGroup2, &quot;192.168.2.223&quot;);
CS104_RedundancyGroup_addAllowedClient(redGroup2, &quot;192.168.2.222&quot;);

CS104_RedundancyGroup redGroup3 = CS104_RedundancyGroup_create(&quot;catch-all&quot;);

CS104_Slave_addRedundancyGroup(slave, redGroup1);
CS104_Slave_addRedundancyGroup(slave, redGroup2);
CS104_Slave_addRedundancyGroup(slave, redGroup3);
</code></pre>
<h3 id="cs101%EF%BC%88%E4%B8%B2%E8%A1%8C%EF%BC%89%E4%BB%8E%E6%9C%BA%E9%85%8D%E7%BD%AE%E5%92%8C%E8%AE%BE%E7%BD%AE">CS101&#xFF08;&#x4E32;&#x884C;&#xFF09;&#x4ECE;&#x673A;&#x914D;&#x7F6E;&#x548C;&#x8BBE;&#x7F6E;</h3>
<p>&#x4E0E;&#x4E3B;&#x7AD9;&#x4FA7;&#x7C7B;&#x4F3C;&#xFF0C;CS101 &#x4ECE;&#x7AD9;&#x4FA7;&#x4E5F;&#x53EF;&#x4EE5;&#x88AB;&#x914D;&#x7F6E;&#x7528;&#x4E8E;&#x4E24;&#x79CD;&#x94FE;&#x8DEF;&#x5C42;&#x6A21;&#x5F0F;&#x4E4B;&#x4E00;&#xFF08;<em>&#x5E73;&#x8861;</em> &#x6216; <em>&#x975E;&#x5E73;&#x8861;</em>&#xFF09;&#x3002;CS101 &#x4ECE;&#x673A;&#x7531; <em>CS101_slave</em> &#x5BF9;&#x8C61;&#x8868;&#x793A;&#x3002;</p>
<p>&#x5728;&#x521B;&#x5EFA; <em>CS101_Slave</em> &#x5BF9;&#x8C61;&#x4E4B;&#x524D;&#xFF0C;&#x9700;&#x8981;&#x4E00;&#x4E2A; <em>SerialPort</em> &#x5BF9;&#x8C61;&#x3002;<em>SerialPort</em> &#x5BF9;&#x8C61;&#x8868;&#x793A;&#x4E32;&#x884C;&#x63A5;&#x53E3;&#x53CA;&#x5176;&#x914D;&#x7F6E;&#x3002;</p>
<pre><code class="language-c">SerialPort port = SerialPort_create(serialPort, 9600, 8, &apos;E&apos;, 1);
</code></pre>
<p>&#x521B;&#x5EFA;&#x7684; <em>SerialPort</em> &#x5BF9;&#x8C61;&#x662F; <em>CS101_Slave_create</em> &#x51FD;&#x6570;&#x6240;&#x5FC5;&#x9700;&#x7684;&#xFF1A;</p>
<pre><code class="language-c">CS101_Slave slave = CS101_Slave_create(port, NULL, NULL, IEC60870_LINK_LAYER_UNBALANCED);
</code></pre>
<p>&#x6B64;&#x51FD;&#x6570;&#x5177;&#x6709;&#x4EE5;&#x4E0B;&#x7B7E;&#x540D;&#xFF1A;</p>
<pre><code class="language-c">CS101_Slave
CS101_Slave_create(SerialPort serialPort, LinkLayerParameters llParameters, CS101_AppLayerParameters alParameters, IEC60870_LinkLayerMode linkLayerMode)
</code></pre>
<p>&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x6307;&#x5B9A;&#x94FE;&#x8DEF;&#x5C42;&#x53C2;&#x6570;&#x548C;&#x5E94;&#x7528;&#x5C42;&#x53C2;&#x6570;&#x3002;&#x5982;&#x679C;&#x5E94;&#x8BE5;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x503C;&#xFF0C;&#x5219;&#x53EF;&#x4EE5;&#x8DF3;&#x8FC7;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#xFF08;&#x8BBE;&#x7F6E;&#x4E3A; <em>NULL</em>&#xFF09;&#x3002;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x6307;&#x5B9A;&#x662F;&#x4F7F;&#x7528; <em>&#x5E73;&#x8861;</em> &#x6A21;&#x5F0F;&#x8FD8;&#x662F;&#x4F7F;&#x7528; <em>&#x975E;&#x5E73;&#x8861;</em> &#x6A21;&#x5F0F;&#x3002;</p>
<p>&#x5BF9;&#x4E8E;&#x4E32;&#x884C;&#x4ECE;&#x673A;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x8BBE;&#x7F6E;&#x94FE;&#x8DEF;&#x5C42;&#x5730;&#x5740;&#xFF1A;</p>
<pre><code class="language-c">CS101_Slave_setLinkLayerAddress(slave, 1);
</code></pre>
<h3 id="%E8%AE%BE%E7%BD%AE%E5%9B%9E%E8%B0%83%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0">&#x8BBE;&#x7F6E;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x51FD;&#x6570;</h3>
<p>&#x5728;&#x542F;&#x52A8;&#x6216;&#x8FD0;&#x884C;&#x670D;&#x52A1;&#x5668;&#x524D;&#xFF0C;&#x5EFA;&#x8BAE;&#x8BBE;&#x7F6E;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6765;&#x5904;&#x7406;&#x4ECE;&#x7AD9;&#x4E8B;&#x4EF6;&#x3002;&#x4EE5;&#x4E0B;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7C7B;&#x578B;&#x53EF;&#x7528;&#xFF08;&#x6709;&#x5173;&#x51FD;&#x6570;&#x7B7E;&#x540D;&#x7684;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x53C2;&#x9605; API &#x53C2;&#x8003;&#x624B;&#x518C;&#xFF09;&#x3002;&#x5176;&#x4E2D;&#x4E00;&#x4E9B;&#x4EC5;&#x9002;&#x7528;&#x4E8E; CS 104 &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x800C;&#x53E6;&#x4E00;&#x4E9B;&#x5219;&#x4EC5;&#x9002;&#x7528;&#x4E8E; CS101 &#x4ECE;&#x7AD9;&#x3002;</p>
<p><em>&#x4ECE;&#x673A;&#x4FA7;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7C7B;&#x578B;</em></p>
<table>
<thead>
<tr>
<th>&#x56DE;&#x8C03;&#x7C7B;&#x578B;</th>
<th>&#x4E8B;&#x4EF6;</th>
<th>CS 101</th>
<th>CS 104</th>
</tr>
</thead>
<tbody>
<tr>
<td>CS101_InterrogationHandler</td>
<td>&#x53EC;&#x5524;&#x8BF7;&#x6C42;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>CS101_CounterInterrogationHandler</td>
<td>&#x9006;&#x5411;&#x53EC;&#x5524;&#x8BF7;&#x6C42;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>CS101_ReadHandler</td>
<td>&#x5BF9;&#x5355;&#x4E2A;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x7684;&#x8BFB;&#x53D6;&#x8BF7;&#x6C42;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>CS101_ClockSynchronizationHandler</td>
<td>&#x6536;&#x5230;&#x65F6;&#x949F;&#x540C;&#x6B65;&#x6D88;&#x606F;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>CS101_ResetProcessHandler</td>
<td>&#x6536;&#x5230;&#x91CD;&#x7F6E;&#x8FDB;&#x7A0B;&#x8BF7;&#x6C42;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>CS101_DelayAcquisitionHandler</td>
<td>&#x6536;&#x5230;&#x5EF6;&#x8FDF;&#x83B7;&#x53D6;&#x8BF7;&#x6C42;</td>
<td>+</td>
<td>-</td>
</tr>
<tr>
<td>CS101_ASDUHandler</td>
<td>ASDU &#x5DF2;&#x63A5;&#x6536;&#xFF0C;&#x4F46;&#x672A;&#x7531;&#x5176;&#x4ED6;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x5904;&#x7406;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>CS101_ResetCUHandler</td>
<td>&#x5DF2;&#x63A5;&#x6536;&#x5230;&#x7C7B;&#x578B;&#x4E3A;&#x91CD;&#x7F6E; CU&#xFF08;&#x901A;&#x4FE1;&#x5355;&#x5143;&#xFF09;&#x7684;&#x94FE;&#x8DEF;&#x5C42;&#x6D88;&#x606F;</td>
<td>+</td>
<td>-</td>
</tr>
<tr>
<td>CS104_ConnectionRequestHandler</td>
<td>&#x4E00;&#x4E2A;&#x65B0;&#x7684; TCP/IP &#x5BA2;&#x6237;&#x7AEF;&#x5C1D;&#x8BD5;&#x8FDE;&#x63A5;</td>
<td>-</td>
<td>+</td>
</tr>
</tbody>
</table>
<p><em>&#x4E3A; CS101 &#x4ECE;&#x673A;&#x8BBE;&#x7F6E;&#x4E00;&#x4E9B;&#x56DE;&#x8C03;&#x51FD;&#x6570;</em></p>
<pre><code class="language-c">/* set the callback handler for the clock synchronization command */
CS101_Slave_setClockSyncHandler(slave, clockSyncHandler, NULL);

/* set the callback handler for the interrogation command */
CS101_Slave_setInterrogationHandler(slave, interrogationHandler, NULL);

/* set handler for other message types */
CS101_Slave_setASDUHandler(slave, asduHandler, NULL);

/* set handler for reset CU (reset communication unit) message */
CS101_Slave_setResetCUHandler(slave, resetCUHandler, (void*) slave);
</code></pre>
<h3 id="cs104-%E5%90%AF%E5%8A%A8%E5%81%9C%E6%AD%A2%E6%9C%8D%E5%8A%A1%E7%AB%AF">CS104 &#x542F;&#x52A8;/&#x505C;&#x6B62;&#x670D;&#x52A1;&#x7AEF;</h3>
<p>&#x914D;&#x7F6E;&#x670D;&#x52A1;&#x5668;&#x540E;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_start</em> &#x51FD;&#x6570;&#x542F;&#x52A8;&#x670D;&#x52A1;&#x5668;&#x3002;&#x6B64;&#x51FD;&#x6570;&#x542F;&#x52A8;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x540E;&#x53F0;&#x7EBF;&#x7A0B;&#xFF0C;&#x4EE5;&#x4FA6;&#x542C;&#x4F20;&#x5165;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x3002;</p>
<pre><code class="language-c">CS104_Slave_start(slave);
</code></pre>
<p>&#x8981;&#x505C;&#x7528; IEC 60870-5-104 &#x670D;&#x52A1;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_stop</em> &#x51FD;&#x6570;&#x505C;&#x6B62;&#x670D;&#x52A1;&#x5668;&#x3002;</p>
<pre><code class="language-c">CS104_Slave_stop(slave);
</code></pre>
<h3 id="%E8%87%AA%E5%8F%91%E6%88%96%E5%91%A8%E6%9C%9F%E6%80%A7%E7%9A%84%E4%BF%A1%E6%81%AF%E4%BC%A0%E8%BE%93">&#x81EA;&#x53D1;&#x6216;&#x5468;&#x671F;&#x6027;&#x7684;&#x4FE1;&#x606F;&#x4F20;&#x8F93;</h3>
<p>&#x5BF9;&#x4E8E;&#x670D;&#x52A1;&#x5668;/&#x4ECE;&#x7AD9;&#x7684;&#x81EA;&#x53D1;&#x6216;&#x5468;&#x671F;&#x6027;&#x6D88;&#x606F;&#x4F20;&#x8F93;&#xFF0C;API &#x7528;&#x6237;&#x5FC5;&#x987B;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x4EE3;&#x8868;&#x5355;&#x4E2A; ASDU &#x7684; <em>CS101_ASDU</em> &#x5BF9;&#x8C61;&#xFF0C;&#x5C06;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x6DFB;&#x52A0;&#x5230; ASDU&#xFF0C;&#x5E76;&#x6700;&#x7EC8;&#x5C06; ASDU &#x653E;&#x5165;&#x4F20;&#x8F93;&#x961F;&#x5217;&#x3002;&#x4F20;&#x8F93;&#x961F;&#x5217;&#x662F;&#x4E00;&#x4E2A; FIFO&#xFF08;&#x5148;&#x8FDB;&#x5148;&#x51FA;&#xFF09;&#x5217;&#x8868;&#x3002;&#x5982;&#x679C;&#x961F;&#x5217;&#x5DF2;&#x6EE1;&#xFF0C;&#x5219;&#x6700;&#x65E7;&#x7684;&#x6D88;&#x606F;&#x5C06;&#x88AB;&#x5220;&#x9664;&#xFF0C;&#x5E76;&#x7531;&#x65B0;&#x6DFB;&#x52A0;&#x7684;&#x6D88;&#x606F;&#x66FF;&#x6362;&#x3002;&#x53EA;&#x6709;&#x5F53;&#x5B58;&#x5728;&#x6D3B;&#x52A8;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x6216;&#x5DE5;&#x4F5C;&#x7684;&#x94FE;&#x63A5;&#x5C42;&#x8FDE;&#x63A5;&#x65F6;&#xFF0C;&#x624D;&#x4F1A;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x3002;&#x5426;&#x5219;&#xFF0C;&#x6D88;&#x606F;&#x5C06;&#x4FDD;&#x7559;&#x5728;&#x961F;&#x5217;&#x4E2D;&#xFF0C;&#x76F4;&#x5230;&#x8FDE;&#x63A5;&#x88AB;&#x6FC0;&#x6D3B;&#x3002;</p>
<p><em>CS 104:</em> &#x5728; CS 104 &#x4ECE;&#x673A;&#x4E2D;&#xFF0C;&#x961F;&#x5217;&#x5927;&#x5C0F;&#x7531; <em>CS104_slave_create</em> &#x51FD;&#x6570;&#x7684; <em>maxLowPrioQueueSize</em> &#x53C2;&#x6570;&#x786E;&#x5B9A;&#x3002;&#x5982;&#x679C; <em>maxLowPrioQueueSize</em> &#x53C2;&#x6570;&#x8BBE;&#x7F6E;&#x4E3A;&#x96F6;&#xFF0C;&#x5219;&#x961F;&#x5217;&#x7684;&#x5927;&#x5C0F;&#x5C06;&#x59CB;&#x7EC8;&#x7531; <em>CONFIG_SLAVE_MESSAGE_queue_size</em> &#x5B9A;&#x4E49;&#x3002;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570; <em>maxHighPrioQueueSize</em> &#x786E;&#x5B9A;&#x9AD8;&#x4F18;&#x5148;&#x7EA7;&#x6570;&#x636E;&#x961F;&#x5217;&#x7684;&#x5927;&#x5C0F;&#x3002;&#x653E;&#x5165;&#x6B64;&#x961F;&#x5217;&#x7684;&#x6D88;&#x606F;&#x4F1A;&#x7ED5;&#x8FC7;&#x4F4E;&#x4F18;&#x5148;&#x7EA7;&#x961F;&#x5217;&#x7684;&#x6D88;&#x606F;&#x3002;&#x9AD8;&#x4F18;&#x5148;&#x7EA7;&#x961F;&#x5217;&#x7528;&#x4E8E;&#x5E93;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x4E2D;&#x7684;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x3002;</p>
<p>&#x8981;&#x53D1;&#x9001;&#x81EA;&#x53D1;&#x6216;&#x5468;&#x671F;&#x6027;&#x6D88;&#x606F;&#xFF0C;&#x5FC5;&#x987B;&#x6267;&#x884C;&#x4EE5;&#x4E0B;&#x6B65;&#x9AA4;&#xFF1A;</p>
<ol>
<li>Step: &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <em>CS101_ASDU</em> &#x5B9E;&#x4F8B;&#xFF08;&#x5BF9;&#x5468;&#x671F;&#x6027;&#x6570;&#x636E;&#x4F7F;&#x7528; <em>CS101_COT_PERIODIC</em>&#xFF0C;&#x5BF9;&#x81EA;&#x53D1;&#x6570;&#x636E;&#x4F7F;&#x7528; <em>CS101_COT_SPONTANEOUS</em>&#xFF09;</li>
</ol>
<pre><code class="language-c">CS101_ASDU newAsdu = CS101_ASDU_create(alParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
</code></pre>
<ol start="2">
<li>Step: &#x521B;&#x5EFA;&#x5305;&#x542B;&#x8981;&#x53D1;&#x9001;&#x7684;&#x6570;&#x636E;&#x7684;&#x65B0;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;</li>
</ol>
<pre><code class="language-c">InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
</code></pre>
<ol start="3">
<li>Step: &#x5C06;&#x65B0;&#x7684;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x6DFB;&#x52A0;&#x5230; ASDU</li>
</ol>
<pre><code class="language-c">CS101_ASDU_addInformationObject(newAsdu, io);
</code></pre>
<ol start="4">
<li>Step: &#x91CA;&#x653E;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5185;&#x5B58;</li>
</ol>
<pre><code class="language-c">InformationObject_destroy(io);
</code></pre>
<ol start="5">
<li>Step: &#x5C06; ASDU &#x653E;&#x5165; 2 &#x7C7B;&#x6570;&#x636E;&#x961F;&#x5217;&#x8FDB;&#x884C;&#x4F20;&#x8F93;</li>
</ol>
<pre><code class="language-c">CS101_Slave_enqueueUserDataClass2(slave, newAsdu);
</code></pre>
<ol start="6">
<li>Step: &#x91CA;&#x653E; ASDU &#x5185;&#x5B58;</li>
</ol>
<pre><code class="language-c">CS101_ASDU_destroy(newAsdu);
</code></pre>
<p><em>&#x6CE8;&#xFF1A;</em> &#x5BF9;&#x4E8E; <em>CS 104</em>&#xFF0C;&#x60A8;&#x5FC5;&#x987B;&#x5728;&#x6B65;&#x9AA4; 5 &#x4E2D;&#x4F7F;&#x7528; <em>CS104_Slave_enqueueASDU</em> &#x51FD;&#x6570;&#xFF1A;</p>
<pre><code class="language-c">CS104_Slave_enqueueASDU(slave, newAsdu);
</code></pre>
<h3 id="%E5%8F%AC%E5%94%A4%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86">&#x53EC;&#x5524;&#x8BF7;&#x6C42;&#x5904;&#x7406;</h3>
<p>&#x5728;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#xFF0C;&#x60A8;&#x5E94;&#x8BE5;&#x4F7F;&#x7528; InterrogationHandler &#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6765;&#x5904;&#x7406;&#x53EC;&#x5524;&#x8BF7;&#x6C42;&#x3002;&#x6839;&#x636E; QOI&#xFF08;<em>Qualifier of question</em> &#x95EE;&#x9898;&#x9650;&#x5B9A;&#x7B26;&#xFF09;&#x503C;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x8FD4;&#x56DE;&#x4E0D;&#x540C;&#x7684;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x3002;&#x5BF9;&#x4E8E;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x7CFB;&#x7EDF;&#x6765;&#x8BF4;&#xFF0C;&#x53EA;&#x5904;&#x7406;&#x7AD9;&#x53EC;&#x5524;&#x8BF7;&#x6C42;&#xFF08;QOI=20&#xFF09;&#x5C31;&#x8DB3;&#x591F;&#x4E86;&#x3002;QOI &#x503C; 21-36 &#x7528;&#x4E8E;&#x53EC;&#x5524;&#x7EC4;&#xFF08;1-16&#xFF09;&#x3002;&#x7531;&#x4ECE;&#x673A;&#x5B9E;&#x73B0;&#x8005;&#x5C06;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5206;&#x914D;&#x7ED9;&#x53EC;&#x5524;&#x7EC4;&#x3002;</p>
<p>&#x6839;&#x636E;&#x8BE5;&#x89C4;&#x8303;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x5FC5;&#x987B;&#x7528; ACT_CON &#x54CD;&#x5E94;&#x6765;&#x54CD;&#x5E94;&#x6765;&#x81EA;&#x5BA2;&#x6237;&#x7AEF;&#x7684; ACTIVATION &#x8BF7;&#x6C42;&#xFF0C;&#x7136;&#x540E;&#x662F;&#x5305;&#x542B;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x7684; ASDU&#xFF0C;&#x8BE5;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x5177;&#x6709;&#x7528;&#x4E8E;&#x7AD9;&#x53EC;&#x5524;&#x7684; <em>CS101_COT_INTERROGATED_by_STATION</em> &#x6216;&#x8868;&#x793A;&#x76F8;&#x5E94;&#x53EC;&#x5524;&#x7EC4;&#x7684; COT&#xFF08;&#x4F8B;&#x5982;&#xFF0C;&#x7528;&#x4E8E;&#x53EC;&#x5524;&#x7EC4; 1 &#x7684; <em>CS101-COT_INTERROGATED_by_group_1</em>&#xFF09;&#x3002;&#x5728;&#x53D1;&#x9001;&#x6240;&#x6709;&#x4FE1;&#x606F;&#x5BF9;&#x8C61;&#x4E4B;&#x540E;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x5FC5;&#x987B;&#x53D1;&#x9001;&#x5177;&#x6709; COT&#xFF1D;_CS101_COT_ACTIVATION_TERMINATION_ &#x7684;&#x521D;&#x59CB;&#x53EC;&#x5524;&#x547D;&#x4EE4;&#x6D88;&#x606F;&#xFF0C;&#x4EE5;&#x6307;&#x793A;&#x53EC;&#x5524;&#x6570;&#x636E;&#x7684;&#x4F20;&#x8F93;&#x5B8C;&#x6210;&#x3002;</p>
<p><em>&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x53EC;&#x5524;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7684;&#x793A;&#x4F8B;</em></p>
<pre><code class="language-c">static bool
interrogationHandler(void* parameter, IMasterConnection connection, CS101_ASDU asdu, uint8_t qoi)
{
    if (qoi == 20) { /* only handle station interrogation */

        CS101_AppLayerParameters alParams = IMasterConnection_getApplicationLayerParameters(connection);

        IMasterConnection_sendACT_CON(connection, asdu, false);

        CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_INTERROGATED_BY_STATION,
                0, 1, false, false);

        InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 100, -1, IEC60870_QUALITY_GOOD);

        CS101_ASDU_addInformationObject(newAsdu, io);

        CS101_ASDU_addInformationObject(newAsdu, (InformationObject)
            MeasuredValueScaled_create((MeasuredValueScaled) io, 101, 23, IEC60870_QUALITY_GOOD));

        CS101_ASDU_addInformationObject(newAsdu, (InformationObject)
            MeasuredValueScaled_create((MeasuredValueScaled) io, 102, 2300, IEC60870_QUALITY_GOOD));

        InformationObject_destroy(io);

        IMasterConnection_sendASDU(connection, newAsdu);

        CS101_ASDU_destroy(newAsdu);

        IMasterConnection_sendACT_TERM(connection, asdu);
    }
    else {
        IMasterConnection_sendACT_CON(connection, asdu, true);
    }

    return true;
}
</code></pre>
<p>&#x5728;&#x53EC;&#x5524;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x5185;&#x90E8;&#xFF0C;IMasterConnection &#x63A5;&#x53E3;&#x53EF;&#x7528;&#x4E8E;&#x5C06;&#x53EC;&#x5524;&#x7684;&#x6570;&#x636E;&#x53D1;&#x9001;&#x56DE;&#x5BA2;&#x6237;&#x7AEF;/&#x4E3B;&#x673A;&#x3002;&#x5728;&#x53EC;&#x5524;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x4E2D;&#x521B;&#x5EFA;&#x7684; <em>CS101_ASDU</em> &#x548C; <em>InformationObject</em> &#x5B9E;&#x4F8B;&#x7531;&#x7528;&#x6237;&#x8D1F;&#x8D23;&#xFF0C;&#x5982;&#x679C;&#x4E4B;&#x524D;&#x52A8;&#x6001;&#x5206;&#x914D;&#xFF0C;&#x5219;&#x5FC5;&#x987B;&#x4F7F;&#x7528;&#x9002;&#x5F53;&#x7684;&#x51FD;&#x6570;&#xFF08;<em>CS101_ASDU_destroy</em> &#x548C; <em>InformationObject_destroy</em>&#xFF09;&#x8FDB;&#x884C;&#x91CA;&#x653E;&#x3002;</p>
<h3 id="%E8%AF%BB%E6%95%B0%E6%8D%AE%E6%8C%87%E4%BB%A4-crdna1-%E5%A4%84%E7%90%86">&#x8BFB;&#x6570;&#x636E;&#x6307;&#x4EE4; (C_RD_NA_1) &#x5904;&#x7406;</h3>
<p>&#x5BA2;&#x6237;&#x7AEF;/&#x4E3B;&#x673A;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8BFB;&#x53D6;&#x547D;&#x4EE4; C_RD_NAME_1&#xFF08;102&#xFF09;&#x6765;&#x8BFB;&#x53D6;&#x76D1;&#x63A7;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x7279;&#x5B9A;&#x6570;&#x636E;&#x70B9;&#x7684;&#x503C;&#x3002;</p>
<p>&#x5728;&#x670D;&#x52A1;&#x5668;/&#x4ECE;&#x7AEF;&#x5904;&#x7406;&#x8BFB;&#x53D6;&#x547D;&#x4EE4;&#x6700;&#x65B9;&#x4FBF;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x5B9E;&#x73B0;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7C7B;&#x578B; <em>CS101_ReadHandler</em>&#x3002;&#x8BFB;&#x53D6;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7528;&#x4E8E; CS 104 &#x670D;&#x52A1;&#x5668;&#x6216; CS 101 &#x4ECE;&#x673A;&#x7684; <em>CS104_Slave_setReadHandler</em> &#x6216; <em>CS101_Slave_setReadHandler</em> &#x51FD;&#x6570;&#x5B89;&#x88C5;&#x3002;</p>
<p>&#x5728;&#x8BFB;&#x53D6;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x4E2D;&#xFF0C;&#x60A8;&#x5FC5;&#x987B;&#x53D1;&#x9001;&#x76F8;&#x540C;&#x7684;&#x8BFB;&#x53D6;&#x547D;&#x4EE4;&#xFF0C;&#x4F46;&#x5E26;&#x6709;&#x6307;&#x793A;&#x9519;&#x8BEF;&#x7684; COT&#x3002;&#x6216;&#x8005;&#xFF0C;&#x60A8;&#x5FC5;&#x987B;&#x4E3A;&#x6570;&#x636E;&#x70B9;&#x521B;&#x5EFA;&#x6B63;&#x786E;&#x7C7B;&#x578B;&#x7684; ASDU&#xFF0C;&#x5E76;&#x5C06;&#x5176;&#x53D1;&#x9001;&#x56DE;&#x5BA2;&#x6237;&#x7AEF;/&#x4E3B;&#x673A;&#x3002;&#x5F53;&#x6267;&#x884C;&#x540E;&#x8005;&#x65F6;&#xFF0C;&#x60A8;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <em>COT_CS101_COT_REQUEST</em> &#x6765;&#x6307;&#x793A;&#x6D88;&#x606F;&#x662F;&#x7531;&#x8BFB;&#x53D6;&#x8BF7;&#x6C42;&#x5F15;&#x8D77;&#x7684;&#x3002;</p>
<p><em>&#x8BFB;&#x53D6;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x7684;&#x7B80;&#x5355;&#x5B9E;&#x73B0;&#xFF08;&#x4F2A;&#x4EE3;&#x7801;&#xFF09;</em></p>
<pre><code class="language-c">static bool
readHandler(void* parameter, IMasterConnection connection, CS101_ASDU asdu, int ioa)
{
	if (request failed) {
	   /* send error reponse- e.g. unknown */
	   CS101_ASDU_setCOT(asdu, CS101_COT_UNKNOWN_CA);
	   CS101_ASDU_setNegative(asdu, true);
	   IMasterConnection_sendASDU(connection, asdu);
	}
	else {
	
		CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(cs104Slave);
		
		sCS101_StaticASDU _asdu;
		CS101_ADSU newAsdu = CS101_ASDU_initializeStatic(_asdu, alParams, false, CS101_COT_REQUEST,
		        0, 1, false, false);
		
		CS101_ASDU_addInformationObject(newAsdu, io);
		
		IMasterConnection_sendASDU(connection, newAsdu);
	}

   /* return true to indicate that the request ASDU is handled here */
	return true;   
}
</code></pre>
<h3 id="cs104%EF%BC%88tcpip%EF%BC%89%E7%89%B9%E5%AE%9A%E9%97%AE%E9%A2%98">CS104&#xFF08;TCP/IP&#xFF09;&#x7279;&#x5B9A;&#x95EE;&#x9898;</h3>
<h4 id="%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%A8%A1%E5%BC%8F">&#x670D;&#x52A1;&#x7AEF;&#x6A21;&#x5F0F;</h4>
<p>&#x670D;&#x52A1;&#x5668;&#x63D0;&#x4F9B;&#x4E09;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x6A21;&#x5F0F;&#xFF1A;</p>
<p>&#x9ED8;&#x8BA4;&#x6A21;&#x5F0F;&#xFF08;<em>CS104_mode_SINGLE_REDUNDANCY_GROUP</em>&#xFF09;&#x4EC5;&#x5141;&#x8BB8;<em>&#x5355;&#x4E2A;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;</em>&#x3002;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x662F;&#x53D1;&#x9001; ASDU &#x7684;&#x8FDE;&#x63A5;&#x3002;&#x6240;&#x6709;&#x5176;&#x4ED6;&#x8FDE;&#x63A5;&#x90FD;&#x662F;&#x5907;&#x7528;&#x8FDE;&#x63A5;&#x3002;&#x4E8B;&#x4EF6;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#x3002;&#x5F53;&#x6CA1;&#x6709;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x6216;&#x6CA1;&#x6709;&#x8FDE;&#x63A5;&#x5904;&#x4E8E;&#x6D3B;&#x52A8;&#x72B6;&#x6001;&#x65F6;&#xFF0C;&#x4E5F;&#x4F1A;&#x5B58;&#x50A8;&#x4E8B;&#x4EF6;&#x3002;</p>
<p>&#x7B2C;&#x4E8C;&#x79CD;&#x6A21;&#x5F0F;&#xFF08;<em>CS104_mode_CONNECTION_IS_REDUNDANCY_GROUP</em>&#xFF09;&#x5141;&#x8BB8;<em>&#x591A;&#x4E2A;&#x6D3B;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;</em>&#x3002;&#x6BCF;&#x4E2A;&#x8FDE;&#x63A5;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x3002;&#x5F53;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x5173;&#x95ED;&#x65F6;&#xFF0C;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x5C06;&#x88AB;&#x5220;&#x9664;&#x3002;&#x5F53;&#x591A;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x8BBF;&#x95EE;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x5FC5;&#x987B;&#x4F7F;&#x7528;&#x6B64;&#x6A21;&#x5F0F;&#x3002;</p>
<p>&#x7B2C;&#x4E09;&#x79CD;&#x6A21;&#x5F0F;&#xFF08;<em>CS104_mode_MULTIPLE_REDUNDANCY_GROUPS</em>&#xFF09;&#x662F;&#x6700;&#x7075;&#x6D3B;&#x7684;&#x6A21;&#x5F0F;&#xFF0C;&#x5141;&#x8BB8;&#x5B9A;&#x4E49;&#x7279;&#x5B9A;&#x7684; <em>REDUNDANCY</em> &#x7EC4;&#x3002;&#x8FD9;&#x4E9B;&#x5197;&#x4F59;&#x7EC4;&#x662F;&#x5171;&#x4EAB;&#x540C;&#x4E00;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x7EC4;&#x3002;&#x5BF9;&#x4E8E;&#x6BCF;&#x4E2A;&#x5197;&#x4F59;&#x7EC4;&#xFF0C;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x5B9E;&#x4F8B;&#x3002;</p>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_setServerMode</em> &#x51FD;&#x6570;&#x8BBE;&#x7F6E;&#x670D;&#x52A1;&#x5668;&#x6A21;&#x5F0F;&#x3002;</p>
<pre><code class="language-c">CS104_Slave_setServerMode(slave, CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP);
</code></pre>
<h4 id="%E9%99%90%E5%88%B6%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BF%9E%E6%8E%A5%E6%95%B0%E9%87%8F">&#x9650;&#x5236;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x6570;&#x91CF;</h4>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_setMaxOpenConnections</em> &#x51FD;&#x6570;&#x9650;&#x5236;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x6570;&#x91CF;&#x3002;</p>
<pre><code class="language-c">CS104_Slave_setMaxOpenConnections(slave, 2);
</code></pre>
<p>&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x5C06;&#x53EA;&#x5141;&#x8BB8;&#x4E24;&#x4E2A;&#x5E76;&#x53D1;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#x3002;</p>
<h4 id="%E8%AE%BE%E7%BD%AE%E6%9C%AC%E5%9C%B0%E7%AB%AF%E5%8F%A3%E5%92%8C-ip-%E5%9C%B0%E5%9D%80">&#x8BBE;&#x7F6E;&#x672C;&#x5730;&#x7AEF;&#x53E3;&#x548C; IP &#x5730;&#x5740;</h4>
<p>IEC 60870-5-104 &#x7684;&#x9ED8;&#x8BA4; TCP &#x7AEF;&#x53E3;&#x4E3A; 2404&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_setLocalPort</em> &#x51FD;&#x6570;&#x66F4;&#x6539;&#x7AEF;&#x53E3;&#x3002;</p>
<pre><code class="language-c">CS104_Slave_setLocalPort(slave, 2405);
</code></pre>
<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x4FA6;&#x542C;&#x6240;&#x6709;&#x672C;&#x5730;IP&#x5730;&#x5740;&#x3002;&#x4F7F;&#x7528; <em>CS104_Slave_setLocalAddress</em> &#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x9650;&#x5236;&#x670D;&#x52A1;&#x5668;&#x76D1;&#x542C;&#x5355;&#x4E2A;&#x672C;&#x5730; IP &#x5730;&#x5740;&#x3002;</p>
<pre><code class="language-c">CS104_Slave_setLocalAddress(slave, &quot;192.168.1.50&quot;);
</code></pre>
<p>&#x901A;&#x8FC7;&#x6B64;&#x8BBE;&#x7F6E;&#xFF0C;CS104 &#x670D;&#x52A1;&#x5668;&#x5C06;&#x4EC5;&#x5728;&#x6307;&#x5B9A; IP &#x5730;&#x5740;&#x4E3A; 192.168.1.50 &#x7684;&#x672C;&#x5730;&#x63A5;&#x53E3;&#x4E0A;&#x4FA6;&#x542C;&#x3002;</p>
<h4 id="%E8%AE%BE%E7%BD%AE%E8%BF%9E%E6%8E%A5%E8%AF%B7%E6%B1%82%E5%A4%84%E7%90%86%E7%A8%8B%E5%BA%8F%E4%BB%A5%E9%99%90%E5%88%B6%E8%AE%BF%E9%97%AE%E5%B9%B6%E8%B7%9F%E8%B8%AA%E8%BF%9E%E6%8E%A5">&#x8BBE;&#x7F6E;&#x8FDE;&#x63A5;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x4EE5;&#x9650;&#x5236;&#x8BBF;&#x95EE;&#x5E76;&#x8DDF;&#x8E2A;&#x8FDE;&#x63A5;</h4>
<p><em>CS104_ConnectionRequestHandler</em> &#x53EF;&#x7528;&#x4E8E;&#x9650;&#x5236;&#x5BF9;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8BBF;&#x95EE;&#x3002;&#x901A;&#x8FC7;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x5141;&#x8BB8;&#x6216;&#x62D2;&#x7EDD;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8FDE;&#x63A5;&#x5C1D;&#x8BD5;&#x3002;</p>
<p>&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>CS104_Slave_setConnectionRequestHandler</em> &#x51FD;&#x6570;&#x8BBE;&#x7F6E; <em>CS104_ConnectionRequestHandler</em>&#x3002;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x7528;&#x6237;&#x63D0;&#x4F9B;&#x7684;&#x4EFB;&#x610F;&#x5BF9;&#x8C61;&#xFF0C;&#x5F53;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x88AB;&#x8C03;&#x7528;&#x65F6;&#xFF0C;&#x8BE5;&#x5BF9;&#x8C61;&#x5C06;&#x88AB;&#x4F20;&#x9012;&#x7ED9;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x9700;&#x8981;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;&#x5176;&#x8BBE;&#x7F6E;&#x4E3A; <em>NULL</em>&#x3002;</p>
<pre><code class="language-c">CS104_Slave_setConnectionRequestHandler(slave, connectionRequestHandler, NULL);
</code></pre>
<p>&#x5728;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#x4E2D;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x5141;&#x8BB8;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x767D;&#x540D;&#x5355;&#x68C0;&#x67E5;&#x5BA2;&#x6237;&#x7AEF; IP &#x5730;&#x5740;&#xFF0C;&#x6216;&#x8005;&#x5B9E;&#x73B0;&#x9ED1;&#x540D;&#x5355;&#x3002;</p>
<p><em>&#x793A;&#x4F8B;&#x5982;&#x4F55;&#x5B9E;&#x73B0; ConnectionRequestHandler</em></p>
<pre><code class="language-c">static bool connectionRequestHandler(void* parameter, const char* ipAddress)
{
  /* Allow only known IP addresses! */
  /* You can implement your allowed client whitelist here */
  if (strcmp(ipAddress, &quot;127.0.0.1&quot;) == 0) {
    return true;
  else
    return false;
}
</code></pre>
<h4 id="%E4%BD%BF%E7%94%A8-tls-%E5%88%9B%E5%BB%BA%E5%AE%89%E5%85%A8%E8%BF%9E%E6%8E%A5">&#x4F7F;&#x7528; TLS &#x521B;&#x5EFA;&#x5B89;&#x5168;&#x8FDE;&#x63A5;</h4>
<p>CS 104 &#x6807;&#x51C6;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0E; TLS &#x4E00;&#x8D77;&#x4F7F;&#x7528;&#xFF0C;&#x4EE5;&#x5B9E;&#x73B0;&#x5B89;&#x5168;&#x548C;&#x7ECF;&#x8FC7;&#x9A8C;&#x8BC1;&#x7684;&#x8FDE;&#x63A5;&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x4F7F;&#x7528; TLS&#xFF0C;&#x5FC5;&#x987B;&#x914D;&#x7F6E;&#x76F8;&#x5173;&#x7684;&#x53C2;&#x6570;&#x3001;&#x8BC1;&#x4E66;&#x548C;&#x79C1;&#x94A5;&#x3002;</p>
<p>&#x914D;&#x7F6E;&#x5B58;&#x50A8;&#x5728; <em>TLSConfiguration</em> &#x5BF9;&#x8C61;&#x4E2D;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <em>TLSConfiguration_create</em> &#x51FD;&#x6570;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x914D;&#x7F6E;&#x5BF9;&#x8C61;&#x3002;</p>
<p><em>&#x793A;&#x4F8B;&#x5982;&#x4F55;&#x521B;&#x5EFA;&#x652F;&#x6301; TLS &#x7684; CS 104 &#x4ECE;&#x673A;</em></p>
<pre><code class="language-c">TLSConfiguration tlsConfig = TLSConfiguration_create();

TLSConfiguration_setChainValidation(tlsConfig, false);
TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig, true);

TLSConfiguration_setOwnKeyFromFile(tlsConfig, &quot;server-key.pem&quot;, NULL);
TLSConfiguration_setOwnCertificateFromFile(tlsConfig, &quot;server.cer&quot;);
TLSConfiguration_addCACertificateFromFile(tlsConfig, &quot;root.cer&quot;);

TLSConfiguration_addAllowedCertificateFromFile(tlsConfig, &quot;client1.cer&quot;);

/* create a new slave/server instance */
CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig);
</code></pre>
<h2 id="lib60870-c-%E7%89%B9%E5%AE%9A%E4%B8%BB%E9%A2%98">lib60870-C &#x7279;&#x5B9A;&#x4E3B;&#x9898;</h2>
<h3 id="%E8%B0%83%E8%AF%95%E8%BE%93%E5%87%BA">&#x8C03;&#x8BD5;&#x8F93;&#x51FA;</h3>
<p>&#x63A7;&#x5236;&#x53F0;&#x7684;&#x8C03;&#x8BD5;&#x8F93;&#x51FA;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5C06; <em>CONFIG_debug_output</em> &#x8BBE;&#x7F6E;&#x4E3A; 1 &#x6765;&#x542F;&#x7528;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#x542F;&#x7528;&#x8C03;&#x8BD5;&#x8F93;&#x51FA;&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x51FD;&#x6570; <em>Lib60870_enableDebugOutput</em> &#x7981;&#x7528;&#x8C03;&#x8BD5;&#x8F93;&#x51FA;&#x3002;&#x8C03;&#x8BD5;&#x8F93;&#x51FA;&#x51FD;&#x6570;&#x7684;&#x9ED8;&#x8BA4;&#x5B9E;&#x73B0;&#x5C06;&#x6253;&#x5370;&#x5230;&#x63A7;&#x5236;&#x53F0;&#xFF08;&#x4F7F;&#x7528; printf&#xFF09;&#x3002;&#x5982;&#x679C;&#x9700;&#x8981;&#x91CD;&#x5B9A;&#x5411;&#x8F93;&#x51FA;&#xFF0C;&#x6700;&#x7B80;&#x5355;&#x7684;&#x65B9;&#x6CD5;&#x662F;&#x66F4;&#x6539; <em>lib60870_common.c</em> &#x4E2D;&#x8C03;&#x8BD5;&#x8F93;&#x51FA;&#x51FD;&#x6570; <em>lib60870_debug_print</em> &#x7684;&#x5B9E;&#x73B0;&#x3002;</p>
<h3 id="%E5%A4%A7%E7%AB%AF%E5%B9%B3%E5%8F%B0">&#x5927;&#x7AEF;&#x5E73;&#x53F0;</h3>
<p>&#x8BE5;&#x5E93;&#x5305;&#x542B;&#x4E00;&#x4E2A; C &#x5934;&#x6587;&#x4EF6;&#xFF0C;&#x7528;&#x4E8E;&#x5728;&#x4F7F;&#x7528; GCC &#x7F16;&#x8BD1;&#x5668;&#x65F6;&#x786E;&#x5B9A;&#x5E73;&#x53F0;&#x5B57;&#x8282;&#x987A;&#x5E8F;&#xFF08;<em>src/inc/internal/platform_endian.h</em>&#xFF09;&#x3002;&#x8FD9;&#x53D6;&#x51B3;&#x4E8E; C &#x7F16;&#x8BD1;&#x5668;&#x63D0;&#x4F9B;&#x7684;&#x5B9A;&#x4E49;&#x3002;&#x5728;&#x4E00;&#x4E9B;&#x8F83;&#x65E7;&#x7684;&#x5927;&#x7AEF;&#x5E73;&#x53F0;&#x4E0A;&#xFF0C;&#x5982; PowerPC &#x6216; Coldfire&#xFF0C;&#x5BF9;&#x4E0D;&#x540C;&#x7684;&#x7F16;&#x8BD1;&#x5668;&#x53EF;&#x80FD;&#x4F1A;&#x5931;&#x8D25;&#x3002;&#x60A8;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x5728;&#x7F16;&#x8BD1;&#x5E93;&#x4EE3;&#x7801;&#x65F6;&#x5B9A;&#x4E49;</p>
<pre><code class="language-c">PLATFORM_IS_BIGENDIAN 1
</code></pre>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x5F53;&#x5E73;&#x53F0;&#x5B57;&#x8282;&#x5E8F;&#x662F;&#x5927;&#x7AEF;&#x65F6;&#xFF0C;&#x5728; GCC &#x547D;&#x4EE4;&#x884C;&#x4E2D;&#x52A0;&#x5165;</p>
<pre><code>-DPLATFORM_IS_BIGENDIAN=1
</code></pre>
<h3 id="%E5%BA%93%E7%BC%96%E8%AF%91%E6%97%B6%E7%9A%84%E9%85%8D%E7%BD%AE%E9%80%89%E9%A1%B9">&#x5E93;&#x7F16;&#x8BD1;&#x65F6;&#x7684;&#x914D;&#x7F6E;&#x9009;&#x9879;</h3>
<p>&#x4E00;&#x4E9B;&#x914D;&#x7F6E;&#x9009;&#x9879;&#x5728;&#x5E93;&#x4EE3;&#x7801;&#x7684;&#x7F16;&#x8BD1;&#x65F6;&#x662F;&#x56FA;&#x5B9A;&#x7684;&#x3002;&#x8FD9;&#x4E9B;&#x9009;&#x9879;&#x53EF;&#x4EE5;&#x5728;&#x6587;&#x4EF6; <em>lib60870_config.h</em> &#x4E2D;&#x627E;&#x5230;&#x3002;</p>
<p>&#x7F16;&#x8BD1;&#x65F6;&#x9009;&#x9879;&#x5305;&#x62EC;&#x5BF9;&#x7279;&#x5B9A; CS 104 &#x5197;&#x4F59;&#x6A21;&#x5F0F;&#x7684;&#x652F;&#x6301;&#x3001;&#x5BF9;&#x7EBF;&#x7A0B;&#x548C;&#x4FE1;&#x53F7;&#x91CF;&#x7684;&#x652F;&#x6301;&#xFF08;&#x5F53;&#x5E93;&#x4F7F;&#x7528;&#x7EBF;&#x7A0B;&#x65F6;&#x9700;&#x8981;&#xFF09;&#x3001;CS 104 &#x4ECE;&#x673A;&#x7684;&#x6700;&#x5927; TCP &#x8FDE;&#x63A5;&#x6570;&#x7B49;&#x3002;</p>
<h2 id="%E5%8F%82%E8%80%83%E4%BF%A1%E6%81%AF">&#x53C2;&#x8003;&#x4FE1;&#x606F;</h2>
<h3 id="%E6%94%AF%E6%8C%81%E7%9A%84%E6%B6%88%E6%81%AF%E7%B1%BB%E5%9E%8B">&#x652F;&#x6301;&#x7684;&#x6D88;&#x606F;&#x7C7B;&#x578B;</h3>
<p>&#x6B64;&#x5E93;&#x652F;&#x6301;&#x4EE5;&#x4E0B; ASDU (&#x5E94;&#x7528;&#x670D;&#x52A1;&#x6570;&#x636E;&#x5355;&#x5143;) &#x7C7B;&#x578B;&#x3002;</p>
<p><em>IEC 60870-5-101/104 &#x6D88;&#x606F;&#x7C7B;&#x578B;</em></p>
<table>
<thead>
<tr>
<th>&#x6D88;&#x606F;&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
<th>C</th>
<th>C#</th>
</tr>
</thead>
<tbody>
<tr>
<td>M_SP_NA_1(1)</td>
<td>&#x5355;&#x70B9;&#x4FE1;&#x606F; (BOOLEAN)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_SP_TA_1(2)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684;&#x5355;&#x70B9;&#x4FE1;&#x606F; (BOOLEAN)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_DP_NA_1(3)</td>
<td>&#x53CC;&#x70B9;&#x4FE1;&#x606F; (ON/OFF/&#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_DP_TA_1(4)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684;&#x53CC;&#x70B9;&#x4FE1;&#x606F; (ON/OFF/&#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ST_NA_1(5)</td>
<td>&#x6B65;&#x957F;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F; (-64 ... 63, &#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ST_TA_1(6)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684;&#x6B65;&#x957F;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F; (-64 ... 63, &#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_BO_NA_1(7)</td>
<td>32 &#x4F4D;&#x4F4D;&#x4E32; (32 &#x4F4D;&#x4F4D;&#x4E32;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_BO_TA_1(8)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684; 32 &#x4F4D;&#x4F4D;&#x4E32; (32 &#x4F4D;&#x4F4D;&#x4E32;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_NA_1(9)</td>
<td>&#x5F52;&#x4E00;&#x5316;&#x503C; (-1.0 ... +1.0)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_TA_1(10)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684;&#x5F52;&#x4E00;&#x5316;&#x503C; (-1.0 ... +1.0)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_NB_1(11)</td>
<td>&#x6807;&#x5EA6;&#x5316;&#x503C; (-32768 ... +32767)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_TB_1(12)</td>
<td>&#x5E26; CP24Time2A &#x65F6;&#x6807;&#x7684;&#x6807;&#x5EA6;&#x5316;&#x503C; (-32768 ... +32767)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_NC_1(13)</td>
<td>&#x77ED;&#x6D4B;&#x91CF;&#x503C; (FLOAT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_TC_1(14)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684;&#x77ED;&#x6D4B;&#x91CF;&#x503C; (FLOAT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_IT_NA_1(15)</td>
<td>&#x7EFC;&#x5408;&#x7D2F;&#x8BA1;&#x503C; (&#x5E26;&#x8D28;&#x91CF;&#x6307;&#x6807;&#x7684; INT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_IT_TA_1(16)</td>
<td>&#x5E26; CP24Time2a &#x65F6;&#x6807;&#x7684;&#x7EFC;&#x5408;&#x7D2F;&#x8BA1;&#x503C; (&#x5E26;&#x8D28;&#x91CF;&#x6307;&#x6807;&#x7684; INT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_EP_TA_1(17)</td>
<td>&#x7EE7;&#x7535;&#x4FDD;&#x62A4;&#x88C5;&#x7F6E;&#x4E8B;&#x4EF6;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_EP_TB_1(18)</td>
<td>&#x7EE7;&#x7535;&#x4FDD;&#x62A4;&#x88C5;&#x7F6E;&#x6210;&#x7EC4;&#x542F;&#x52A8;&#x4E8B;&#x4EF6;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_EP_TC_1(19)</td>
<td>&#x7EE7;&#x7535;&#x4FDD;&#x62A4;&#x88C5;&#x7F6E;&#x627F;&#x79DF;&#x8F93;&#x51FA;&#x7535;&#x8DEF;&#x4FE1;&#x606F;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_PS_NA_1(20)</td>
<td>&#x5177;&#x6709;&#x72B6;&#x6001;&#x53D8;&#x4F4D;&#x68C0;&#x51FA;&#x7684;&#x6210;&#x7EC4;&#x5355;&#x70B9;&#x4FE1;&#x606F;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_ND_1(21)</td>
<td>&#x4E0D;&#x5E26;&#x54C1;&#x8D28;&#x63CF;&#x8FF0;&#x8BCD;&#x7684;&#x5F52;&#x4E00;&#x5316;&#x6D4B;&#x91CF;&#x503C; (-1.0 ... +1.0)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_SP_TB_1(30)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x5355;&#x70B9;&#x4FE1;&#x606F; (BOOLEAN)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_DP_TB_1(31)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x53CC;&#x70B9;&#x4FE1;&#x606F; (ON/OFF/&#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ST_TB_1(32)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x6B65;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F; (-64 ... 63, &#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_BO_TB_1(33)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684; 32 &#x4F4D;&#x4F4D;&#x4E32; (32 &#x4F4D;&#x4F4D;&#x4E32;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_TD_1(34)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x5F52;&#x4E00;&#x5316;&#x503C; (-1.0 ... +1.0)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_TE_1(35)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x6807;&#x5EA6;&#x5316;&#x503C; (-32768 ... +32767)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_ME_TF_1(36)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x77ED;&#x6D4B;&#x91CF;&#x503C; (FLOAT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_IT_TB_1(37)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x7EFC;&#x5408;&#x7D2F;&#x79EF;&#x91CF; (&#x5E26;&#x8D28;&#x91CF;&#x6307;&#x6807;&#x7684; INT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_EP_TD_1(38)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x7EE7;&#x7535;&#x4FDD;&#x62A4;&#x88C5;&#x7F6E;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_EP_TE_1(39)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x7EE7;&#x7535;&#x4FDD;&#x62A4;&#x88C5;&#x7F6E;&#x6210;&#x7EC4;&#x542F;&#x52A8;&#x4E8B;&#x4EF6;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>M_EP_TF_1(40)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x7EE7;&#x7535;&#x4FDD;&#x62A4;&#x88C5;&#x7F6E;&#x6210;&#x7EC4;&#x8F93;&#x51FA;&#x7535;&#x8DEF;&#x4FE1;&#x606F;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SC_NA_1(45)</td>
<td>&#x5355;&#x70B9;&#x547D;&#x4EE4; (BOOLEAN)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_DC_NA_1(46)</td>
<td>&#x53CC;&#x70B9;&#x547D;&#x4EE4; (ON/OFF/&#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_RC_NA_1(47)</td>
<td>&#x6B65;&#x8C03;&#x8282;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SE_NA_1(48)</td>
<td>&#x8BBE;&#x70B9;&#x547D;&#x4EE4;&#xFF0C;&#x5F52;&#x4E00;&#x5316;&#x503C; (-1.0 ... +1.0)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SE_NB_1(49)</td>
<td>&#x8BBE;&#x70B9;&#x547D;&#x4EE4;&#xFF0C;&#x6807;&#x5EA6;&#x5316;&#x503C; (-32768 ... +32767)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SE_NC_1(50)</td>
<td>&#x8BBE;&#x70B9;&#x547D;&#x4EE4;&#xFF0C;&#x77ED;&#x6D6E;&#x70B9;&#x503C; (FLOAT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_BO_NA_1(51)</td>
<td>&#x4F4D;&#x4E32;&#x547D;&#x4EE4; (32&#x4F4D;&#x4F4D;&#x4E32;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>C_SC_TA_1(58)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x5355;&#x70B9;&#x547D;&#x4EE4; (BOOLEAN)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_DC_TA_1(59)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x53CC;&#x70B9;&#x547D;&#x4EE4; (ON/OFF/&#x77AC;&#x6001;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_RC_TA_1(60)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x6B65;&#x8C03;&#x8282;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SE_TA_1(61)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x8BBE;&#x70B9;&#x547D;&#x4EE4;&#xFF0C;&#x5F52;&#x4E00;&#x5316;&#x503C; (-1.0 ... +1.0)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SE_TB_1(62)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x8BBE;&#x70B9;&#x547D;&#x4EE4;&#xFF0C;&#x6807;&#x5EA6;&#x5316;&#x503C; (-32768 ... +32767)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_SE_TC_1(63)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x8BBE;&#x70B9;&#x547D;&#x4EE4;&#xFF0C;&#x77ED;&#x6D6E;&#x70B9;&#x503C; (FLOAT32)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_BO_TA_1(64)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x4F4D;&#x4E32;&#x547D;&#x4EE4; (32&#x4F4D;&#x4F4D;&#x4E32;)</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>M_EI_NA_1(70)</td>
<td>&#x521D;&#x59CB;&#x5316;&#x7ED3;&#x675F;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>C_IC_NA_1(100)</td>
<td>&#x53EC;&#x5524;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_CI_NA_1(101)</td>
<td>&#x53CD;&#x5411;&#x53EC;&#x5524;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_RD_NA_1(102)</td>
<td>&#x8BFB;&#x6570;&#x636E;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_CS_NA_1(103)</td>
<td>&#x65F6;&#x949F;&#x540C;&#x6B65;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_TS_NA_1(104)</td>
<td>&#x6D4B;&#x8BD5;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_RP_NA_1(105)</td>
<td>&#x91CD;&#x7F6E;&#x8FDB;&#x7A0B;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_CD_NA_1(106)</td>
<td>&#x5EF6;&#x8FDF;&#x91C7;&#x96C6;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>C_TS_TA_1(107)</td>
<td>&#x5E26; CP56Time2a &#x65F6;&#x6807;&#x7684;&#x6D4B;&#x8BD5;&#x547D;&#x4EE4;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>P_ME_NA_1(110)</td>
<td>&#x6D4B;&#x91CF;&#x503C;&#x53C2;&#x6570;&#xFF0C;&#x5F52;&#x4E00;&#x5316;&#x503C;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>P_ME_NB_1(111)</td>
<td>&#x6D4B;&#x91CF;&#x503C;&#x53C2;&#x6570;&#xFF0C;&#x6807;&#x5EA6;&#x5316;&#x503C;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>P_ME_NC_1(112)</td>
<td>&#x6D4B;&#x91CF;&#x503C;&#x53C2;&#x6570;&#xFF0C;&#x77ED;&#x6D6E;&#x70B9;&#x6570;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>P_AC_NA_1(113)</td>
<td>&#x6FC0;&#x6D3B;&#x53C2;&#x6570;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>F_FR_NA_1(120)</td>
<td>&#x6587;&#x4EF6;&#x51C6;&#x5907;&#x5C31;&#x7EEA;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_SR_NA_1(121)</td>
<td>&#x8282;&#x51C6;&#x5907;&#x5C31;&#x7EEA;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_SC_NA_1(122)</td>
<td>&#x53EC;&#x5524;/&#x9009;&#x62E9;&#x76EE;&#x5F55;/&#x6587;&#x4EF6;/&#x8282;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_LS_NA_1(123)</td>
<td>&#x6700;&#x540E;&#x6BB5;/&#x8282;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_AF_NA_1(124)</td>
<td>&#x786E;&#x8BA4;&#x6587;&#x4EF6;/&#x8282;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_SG_NA_1(125)</td>
<td>&#x6587;&#x4EF6;&#x6BB5;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_DR_TA_1(126)</td>
<td>&#x6587;&#x4EF6;&#x76EE;&#x5F55;</td>
<td>+</td>
<td>+</td>
</tr>
<tr>
<td>F_SC_NB_1(127)</td>
<td>&#x67E5;&#x8BE2;&#x65E5;&#x5FD7;</td>
<td>+</td>
<td>+</td>
</tr>
</tbody>
</table>
<h3 id="cs-104-%E7%89%B9%E5%AE%9A%E5%8F%82%E6%95%B0">CS 104 &#x7279;&#x5B9A;&#x53C2;&#x6570;</h3>
<p>&#x4EE5;&#x4E0B;&#x53C2;&#x6570;&#x5B58;&#x50A8;&#x5728; <em>CS104_ConnectionParameters</em> &#x5BF9;&#x8C61;&#x4E2D;.</p>
<p><em>IEC 60870-5-104 &#x53C2;&#x6570;</em></p>
<table>
<thead>
<tr>
<th>&#x53C2;&#x6570;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>k</td>
<td>I &#x683C;&#x5F0F;&#x7684;&#x672A;&#x786E;&#x8BA4; APDU &#x7684;&#x6570;&#x91CF;&#x3002;&#x53D1;&#x4EF6;&#x4EBA;&#x5C06;&#x5728;&#x6536;&#x5230; k &#x6761;&#x672A;&#x7ECF;&#x786E;&#x8BA4;&#x7684; I &#x6D88;&#x606F;&#x540E;&#x505C;&#x6B62;&#x4F20;&#x8F93;&#x3002;</td>
</tr>
<tr>
<td>w</td>
<td>I &#x683C;&#x5F0F;&#x7684;&#x672A;&#x786E;&#x8BA4; APDU &#x7684;&#x6570;&#x91CF;&#x3002;&#x63A5;&#x6536;&#x65B9;&#x5C06;&#x5728; w &#x6761;&#x6D88;&#x606F;&#x540E;&#x786E;&#x8BA4;&#x6700;&#x65B0;&#x6D88;&#x606F;</td>
</tr>
<tr>
<td>t0</td>
<td>&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x8D85;&#x65F6;&#xFF08;&#x79D2;&#xFF09;</td>
</tr>
<tr>
<td>t1</td>
<td>&#x4EE5; I/U &#x683C;&#x5F0F;&#x4F20;&#x8F93;&#x7684; APDU &#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF08;&#x4EE5;&#x79D2;&#x4E3A;&#x5355;&#x4F4D;&#xFF09;&#x3002;&#x5F53;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#x5230;&#x8FBE;&#x524D;&#x62A5;&#x6587;&#x672A;&#x7ECF;&#x786E;&#x8BA4;&#xFF0C;&#x8FDE;&#x63A5;&#x5C06;&#x88AB;&#x5173;&#x95ED;&#x3002;&#x53D1;&#x9001;&#x8005;&#x4F7F;&#x7528;&#x6B64;&#x9879;&#x6765;&#x786E;&#x5B9A;&#x63A5;&#x6536;&#x5668;&#x662F;&#x5426;&#x672A;&#x80FD;&#x786E;&#x8BA4;&#x6D88;&#x606F;&#x3002;</td>
</tr>
<tr>
<td>t2</td>
<td>&#x786E;&#x8BA4;&#x6D88;&#x606F;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF08;&#x79D2;&#xFF09;&#x3002;&#x63A5;&#x6536;&#x5668;&#x4F7F;&#x7528;&#x5B83;&#x6765;&#x786E;&#x5B9A;&#x5FC5;&#x987B;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x786E;&#x8BA4;&#x7684;&#x65F6;&#x95F4;&#x3002;</td>
</tr>
<tr>
<td>t3</td>
<td>&#x5728;&#x8FDE;&#x63A5;&#x7A7A;&#x95F2;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x5F00;&#x59CB;&#x53D1;&#x9001;&#x6D4B;&#x8BD5;&#x62A5;&#x6587;&#x7684;&#x65F6;&#x95F4;</td>
</tr>
</tbody>
</table>
<hr>
<p>&#x82F1;&#x6587;&#x539F;&#x6587;&#xFF1A;<a href="https://github.com/mz-automation/lib60870">https://github.com/mz-automation/lib60870</a><br>
API&#x53C2;&#x8003;&#xFF1A;<a href="https://support.mz-automation.de/doc/lib60870/latest/index.html">https://support.mz-automation.de/doc/lib60870/latest/index.html</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[wsl2 支持 usb 串口]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x8981;&#x6D4B;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#xFF0C;&#x641C;&#x4E86;&#x641C;&#xFF0C;&#x53D1;&#x73B0; WSL2 &#x5DF2;&#x7ECF;&#x6709;&#x4E3B;&#x673A;&#x4E32;&#x53E3;&#x4F7F;&#x7528;&#x65B9;&#x6848;&#x4E86;&#xFF0C;&#x793E;&#x533A;&#x725B;&#x4EBA;&#x771F;&#x4E0D;&#x5C11;&#x3002;&#x7EC8;&#x4E8E;&#x4E0D;&#x7528;&#x6BCF;&#x6B21;&#x4F7F;&#x7528; socat &#x8F6C;&#x53D1;&#x4E86;&#x3002;</p>]]></description><link>https://www.listera.top/wsl2-zhi-chi-usb-chuan-kou/</link><guid isPermaLink="false">63be0730bdae5f07211e61ec</guid><category><![CDATA[wsl]]></category><category><![CDATA[usb]]></category><category><![CDATA[串口]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Wed, 11 Jan 2023 01:01:37 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x6700;&#x8FD1;&#x8981;&#x6D4B;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#xFF0C;&#x641C;&#x4E86;&#x641C;&#xFF0C;&#x53D1;&#x73B0; WSL2 &#x5DF2;&#x7ECF;&#x6709;&#x4E3B;&#x673A;&#x4E32;&#x53E3;&#x4F7F;&#x7528;&#x65B9;&#x6848;&#x4E86;&#xFF0C;&#x793E;&#x533A;&#x725B;&#x4EBA;&#x771F;&#x4E0D;&#x5C11;&#x3002;&#x7EC8;&#x4E8E;&#x4E0D;&#x7528;&#x6BCF;&#x6B21;&#x4F7F;&#x7528; socat &#x8F6C;&#x53D1;&#x4E86;&#x3002;</p>
<p>&#x6CE8;&#xFF1A;<em><strong>&#x4EE5;&#x4E0B; Windows &#x547D;&#x4EE4;&#x9700;&#x8981;&#x7BA1;&#x7406;&#x5458;&#x6743;&#x9650;</strong></em></p>
<hr>
<p>Windows &#x5B89;&#x88C5; USBIPD-WIN &#x9879;&#x76EE;</p>
<pre><code class="language-shell">winget install --interactive --exact dorssel.usbipd-win
</code></pre>
<p>&#x592A;&#x6162;&#xFF0C;&#x4E0B;&#x8F7D;&#x4E0D;&#x4E86;&#xFF0C;&#x8FD8;&#x662F;&#x624B;&#x5DE5;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;&#x5427;&#x3002;&#x3002;<a href="https://github.com/dorssel/usbipd-win/releases/download/v2.4.1/usbipd-win_2.4.1.msi">&#x4E0B;&#x8F7D;&#x5730;&#x5740;</a></p>
<p>WSL2 &#x5B89;&#x88C5; linux-tools/hwdata</p>
<pre><code class="language-bash">sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20
</code></pre>
<p>Windows &#x5217;&#x51FA;&#x6240;&#x6709;&#x8FDE;&#x63A5;&#x7684; USB &#x8BBE;&#x5907;</p>
<pre><code class="language-shell">usbipd wsl list
</code></pre>
<pre><code>BUSID  VID:PID    DEVICE                                                        STATE
1-2    2717:ff40  Redmi 9A                                                      Not attached
1-3    27c6:5125  Goodix Fingerprint USB Device                                 Not attached
1-6    13d3:5488  HD Camera, Camera DFU Device                                  Not attached
1-10   8087:0026  &#x82F1;&#x7279;&#x5C14;(R) &#x65E0;&#x7EBF; Bluetooth(R)                                   Not attached
2-1    0bda:8152  Realtek USB FE Family Controller                              Not attached
2-2    25a4:9311  USB C Video Adaptor                                           Not attached
2-3    1ea7:0064  USB &#x8F93;&#x5165;&#x8BBE;&#x5907;                                                  Not attached
2-4    0403:6001  USB Serial Converter                                          Not attached
</code></pre>
<p>&#x542F;&#x52A8; WSL2</p>
<pre><code>wsl -u ljd
</code></pre>
<p>Windows &#x5173;&#x8054; USB &#x4E32;&#x53E3;&#x5230; WSL2</p>
<pre><code>usbipd wsl attach --busid 2-4
</code></pre>
<p>2-4 &#x4E3A;&#x4E0A;&#x9762;&#x5217;&#x51FA;&#x7684; BUSID&#x3002;&#x5076;&#x5C14;&#x4F1A;&#x9644;&#x52A0;&#x4E0D;&#x4E0A;&#xFF0C;&#x53CD;&#x590D;&#x591A;&#x8BD5;&#x8BD5;&#x3002;</p>
<p>wsl2 &#x4E2D;&#x67E5;&#x770B; usb &#x8BBE;&#x5907;</p>
<pre><code class="language-bash">lsusb
</code></pre>
<pre><code>Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
</code></pre>
<p>&#x67E5;&#x627E; USB &#x8BBE;&#x5907;&#x5BF9;&#x5E94;&#x7684;&#x8BBE;&#x5907;&#x6587;&#x4EF6;</p>
<pre><code class="language-bash">dmesg | grep -5 FT232
</code></pre>
<pre><code>[   17.078734] usb 1-1: new full-speed USB device number 2 using vhci_hcd
[   17.168559] vhci_hcd: vhci_device speed not set
[   17.238554] usb 1-1: SetAddress Request (2) to port 0
[   17.289763] usb 1-1: New USB device found, idVendor=0403, idProduct=6001, bcdDevice= 6.00
[   17.292305] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   17.292748] usb 1-1: Product: FT232R USB UART
[   17.292968] usb 1-1: Manufacturer: FTDI
[   17.293191] usb 1-1: SerialNumber: AB63OS0E
[   17.300507] ftdi_sio 1-1:1.0: FTDI USB Serial Device converter detected
[   17.301155] usb 1-1: Detected FT232RL
[   17.302566] usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0
[   49.581429] hv_balloon: Max. dynamic memory size: 8090 MB
</code></pre>
<p>&#x4E32;&#x53E3;&#x8BBE;&#x5907;&#x8BFB;&#x5199;&#x6743;&#x9650;</p>
<pre><code class="language-bash">sudo chmod a+rw /dev/ttyUSB0
</code></pre>
<p>&#x4F7F;&#x7528;&#x5B8C;&#x6210;&#x540E;&#xFF0C;Windows &#x4E0B;&#x5206;&#x79BB;&#xFF0C;&#x6216;&#x76F4;&#x63A5;&#x7269;&#x7406;&#x65AD;&#x5F00; USB &#x8BBE;&#x5907;</p>
<pre><code>usbipd wsl detach --busid 2-4
</code></pre>
<hr>
<p>&#x65F6;&#x517C;&#x5BB9;&#x65F6;&#x4E0D;&#x517C;&#x5BB9;&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x4EC0;&#x4E48;&#x60C5;&#x51B5;&#x3002;</p>
<p>&#x53C2;&#x8003;<br>
&#x5FAE;&#x8F6F; WSL &#x4F7F;&#x7528;&#x8BF4;&#x660E;&#x300A;<a href="https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb">&#x8FDE;&#x63A5;USB&#x8BBE;&#x5907;</a>&#x300B;<br>
isbipd wiki <a href="https://github.com/dorssel/usbipd-win/wiki/WSL-support">WSL-support</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[platform平台驱动模型 总线-驱动-设备（转）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h3 id="platform-%E6%80%BB%E7%BA%BF">platform &#x603B;&#x7EBF;</h3>
<p>(1)&#x76F8;&#x5BF9;&#x4E8E;usb&#x3001;pci&#x3001;i2c&#x7B49;&#x7269;&#x7406;&#x603B;&#x7EBF;&#x6765;&#x8BF4;&#xFF0C;Linux &#x63D0;&#x51FA;&#x4E86; platform &#x8FD9;&#x4E2A;&#x865A;&#x62DF;&#x603B;&#x7EBF;&#xFF0C;&#x76F8;&#x5E94;&#x7684;&#x5C31;&#x6709; platform_driver &#x548C; platform_device&#x3002;platform&#x603B;&#x7EBF;&#x662F;&#x865A;&#x62DF;&#x7684;</p>]]></description><link>https://www.listera.top/platformping-tai-qu-dong-mo-xing-zong-xian-qu-dong-she-bei-zhuan/</link><guid isPermaLink="false">62ccb2bc44915a7267ba6f96</guid><category><![CDATA[Linux]]></category><category><![CDATA[驱动]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Mon, 11 Jul 2022 23:42:20 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h3 id="platform-%E6%80%BB%E7%BA%BF">platform &#x603B;&#x7EBF;</h3>
<p>(1)&#x76F8;&#x5BF9;&#x4E8E;usb&#x3001;pci&#x3001;i2c&#x7B49;&#x7269;&#x7406;&#x603B;&#x7EBF;&#x6765;&#x8BF4;&#xFF0C;Linux &#x63D0;&#x51FA;&#x4E86; platform &#x8FD9;&#x4E2A;&#x865A;&#x62DF;&#x603B;&#x7EBF;&#xFF0C;&#x76F8;&#x5E94;&#x7684;&#x5C31;&#x6709; platform_driver &#x548C; platform_device&#x3002;platform&#x603B;&#x7EBF;&#x662F;&#x865A;&#x62DF;&#x7684;&#x3001;&#x62BD;&#x8C61;&#x51FA;&#x6765;&#x7684;&#x3002;<br>
(2)CPU&#x4E0E;&#x5916;&#x90E8;&#x901A;&#x4FE1;&#x7684;2&#x79CD;&#x65B9;&#x5F0F;&#xFF1A;&#x5730;&#x5740;&#x603B;&#x7EBF;&#x5F0F;&#x8FDE;&#x63A5;&#x548C;&#x4E13;&#x7528;&#x63A5;&#x53E3;&#x5F0F;&#x8FDE;&#x63A5;&#x3002;&#x5E73;&#x53F0;&#x603B;&#x7EBF;&#x5BF9;&#x5E94;&#x5730;&#x5740;&#x603B;&#x7EBF;&#x5F0F;&#x8FDE;&#x63A5;&#x8BBE;&#x5907;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;SoC&#x5185;&#x90E8;&#x96C6;&#x6210;&#x7684;&#x5404;&#x79CD;&#x5185;&#x90E8;&#x5916;&#x8BBE;&#x3002;</p>
<p>Linux&#x7CFB;&#x7EDF;&#x5185;&#x6838;&#x4F7F;&#x7528;bus_type&#x7ED3;&#x6784;&#x4F53;&#x8868;&#x793A;&#x603B;&#x7EBF;&#xFF0C;&#x6B64;&#x7ED3;&#x6784;&#x4F53;&#x5B9A;&#x4E49;&#x5728;&#x6587;&#x4EF6;include/linux/device.h&#xFF0C;bus_type &#x7ED3;&#x6784;&#x4F53;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c">struct bus_type {
	const char		*name;
	const char		*dev_name;
	struct device		*dev_root;
	struct device_attribute	*dev_attrs;	/* use dev_groups instead */
	const struct attribute_group **bus_groups;
	const struct attribute_group **dev_groups;
	const struct attribute_group **drv_groups;

	int (*match)(struct device *dev, struct device_driver *drv);
	/* match &#x51FD;&#x6570;&#x6709;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF1A;dev &#x548C; drv&#xFF0C;&#x8FD9;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x5206;&#x522B;&#x4E3A; device &#x548C; device_driver &#x7C7B;&#x578B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BBE;&#x5907;&#x548C;&#x9A71;&#x52A8;&#x3002;*/
	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
	int (*probe)(struct device *dev);
	int (*remove)(struct device *dev);
	void (*shutdown)(struct device *dev);

	int (*online)(struct device *dev);
	int (*offline)(struct device *dev);

	int (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);

	const struct dev_pm_ops *pm;

	const struct iommu_ops *iommu_ops;

	struct subsys_private *p;
	struct lock_class_key lock_key;
};
</code></pre>
<p>platform &#x603B;&#x7EBF;&#x662F; bus_type &#x7684;&#x4E00;&#x4E2A;&#x5177;&#x4F53;&#x5B9E;&#x4F8B;&#xFF0C;&#x5B9A;&#x4E49;&#x5728;&#x6587;&#x4EF6;drivers/base/platform.c&#xFF0C;platform &#x603B;&#x7EBF;&#x5B9A;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c">struct bus_type platform_bus_type = {
	.name		= &quot;platform&quot;,
	.dev_groups	= platform_dev_groups,
	.match		= platform_match,
	.uevent		= platform_uevent,
	.pm		= &amp;platform_dev_pm_ops,
};
</code></pre>
<p>platform_match &#x51FD;&#x6570;&#x5B9A;&#x4E49;&#x5728;&#x6587;&#x4EF6; drivers/base/platform.c &#x4E2D;&#xFF0C;&#x51FD;&#x6570;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;<br>
<img src="https://www.listera.top/content/images/2023/03/20201014203322636-1-.png" alt="platform_match" loading="lazy"></p>
<p>&#x7B2C;&#x4E00;&#x79CD;&#x5339;&#x914D;&#x65B9;&#x5F0F;&#xFF0C; OF &#x7C7B;&#x578B;&#x7684;&#x5339;&#x914D;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BBE;&#x5907;&#x6811;&#x91C7;&#x7528;&#x7684;&#x5339;&#x914D;&#x65B9;&#x5F0F;,&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x8282;&#x70B9;&#x7684; compatible &#x5C5E;&#x6027;&#x4F1A;&#x548C; of_match_table&#x8868;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6210;&#x5458;&#x6BD4;&#x8F83;&#xFF0C;&#x67E5;&#x770B;&#x662F;&#x5426;&#x6709;&#x76F8;&#x540C;&#x7684;&#x6761;&#x76EE;&#x3002;<br>
&#x7B2C;&#x4E8C;&#x79CD;&#x5339;&#x914D;&#x65B9;&#x5F0F;&#xFF0C;ACPI &#x5339;&#x914D;&#x65B9;&#x5F0F;&#x3002;<br>
&#x7B2C;&#x4E09;&#x79CD;&#x5339;&#x914D;&#x65B9;&#x5F0F;&#xFF0C;id_table &#x5339;&#x914D;&#xFF0C;&#x6BCF;&#x4E2A;platform_driver &#x7ED3;&#x6784;&#x4F53;&#x6709;&#x4E00;&#x4E2A; id_table &#x6210;&#x5458;&#x53D8;&#x91CF;&#x3002;<br>
&#x7B2C;&#x56DB;&#x79CD;&#x5339;&#x914D;&#x65B9;&#x5F0F;&#xFF0C;&#x5982;&#x679C;&#x7B2C;&#x4E09;&#x79CD;&#x5339;&#x914D;&#x65B9;&#x5F0F;&#x7684; id_table&#x4E0D;&#x5B58;&#x5728;&#x7684;&#x8BDD;&#x5C31;&#x76F4;&#x63A5;&#x6BD4;&#x8F83;&#x9A71;&#x52A8;&#x548C; &#x8BBE;&#x5907;&#x7684; name &#x5B57;&#x6BB5;&#xFF0C;&#x770B;&#x770B;&#x662F;&#x4E0D;&#x662F;&#x76F8;&#x7B49;&#xFF0C;&#x5982;&#x679C;&#x76F8;&#x7B49;&#x7684;&#x8BDD;&#x5C31;&#x5339;&#x914D;&#x6210;&#x529F;&#x3002;</p>
<h3 id="platform-%E9%A9%B1%E5%8A%A8">platform &#x9A71;&#x52A8;</h3>
<pre><code class="language-c">struct platform_driver {
	int (*probe)(struct platform_device *); 
	//&#x4E00;&#x822C;&#x9A71;&#x52A8;&#x7684;&#x63D0;&#x4F9B;&#x8005;&#x4F1A;&#x7F16;&#x5199;probe &#x51FD;&#x6570;&#xFF0C;&#x5F53;&#x9A71;&#x52A8;&#x4E0E;&#x8BBE;&#x5907;&#x5339;&#x914D;&#x6210;&#x529F;&#x4EE5;&#x540E; probe &#x51FD;&#x6570;&#x5C31;&#x4F1A;&#x6267;&#x884C;&#xFF0C;&#x975E;&#x5E38;&#x91CD;&#x8981;&#x7684;&#x51FD;&#x6570;&#xFF01;&#xFF01;
	int (*remove)(struct platform_device *);
	void (*shutdown)(struct platform_device *);
	int (*suspend)(struct platform_device *, pm_message_t state);
	int (*resume)(struct platform_device *);
	struct device_driver driver;
	const struct platform_device_id *id_table;
	//id_table &#x8868;&#xFF0C;id_table &#x662F;&#x4E2A;&#x8868;(&#x4E5F;&#x5C31;&#x662F;&#x6570;&#x7EC4;)&#xFF0C;&#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x7684;&#x7C7B;&#x578B;&#x4E3A; platform_device_id
	bool prevent_deferred_probe;
};
</code></pre>
<p>platform_driver &#x7ED3;&#x6784;&#x4F53;</p>
<pre><code class="language-c">struct platform_device_id { 
	char name[PLATFORM_NAME_SIZE];
	kernel_ulong_t driver_data; 
};
</code></pre>
<p>device_driver &#x7ED3;&#x6784;&#x4F53;</p>
<pre><code class="language-c">struct device_driver {
	const char		*name;
	struct bus_type		*bus;

	struct module		*owner;
	const char		*mod_name;	/* used for built-in modules */

	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */

	const struct of_device_id	*of_match_table;//of_match_table &#x5C31;&#x662F;&#x91C7;&#x7528;&#x8BBE;&#x5907;&#x6811;&#x7684;&#x65F6;&#x5019;&#x9A71;&#x52A8;&#x4F7F;&#x7528;&#x7684;&#x5339;&#x914D;&#x8868;
	const struct acpi_device_id	*acpi_match_table;

	int (*probe) (struct device *dev);
	int (*remove) (struct device *dev);
	void (*shutdown) (struct device *dev);
	int (*suspend) (struct device *dev, pm_message_t state);
	int (*resume) (struct device *dev);
	const struct attribute_group **groups;

	const struct dev_pm_ops *pm;

	struct driver_private *p;
};
</code></pre>
<p>of_device_id &#x7ED3;&#x6784;&#x4F53;&#x4E2D;&#x7684;compatible &#x5C5E;&#x6027;&#x503C;&#x548C; of_match_table &#x4E2D;&#x6BCF;&#x4E2A;&#x9879;&#x76EE;&#x7684; compatible&#x6210;&#x5458;&#x53D8;&#x91CF;&#x8FDB;&#x884C;&#x6BD4;&#x8F83;</p>
<p>&#x5728;&#x7F16;&#x5199; platform &#x9A71;&#x52A8;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9996;&#x5148;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A; platform_driver &#x7ED3;&#x6784;&#x4F53;&#x53D8;&#x91CF;&#xFF0C;&#x7136;&#x540E;&#x5B9E;&#x73B0;&#x7ED3;&#x6784;&#x4F53;&#x4E2D;&#x7684;&#x5404;&#x4E2A;&#x6210;&#x5458;&#x53D8;&#x91CF;&#xFF0C;&#x91CD;&#x70B9;&#x662F;&#x5B9E;&#x73B0;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x4EE5;&#x53CA; probe &#x51FD;&#x6570;&#x3002;&#x5F53;&#x9A71;&#x52A8;&#x548C;&#x8BBE;&#x5907;&#x5339;&#x914D;&#x6210;&#x529F;&#x4EE5;&#x540E; probe&#x51FD;&#x6570;&#x5C31;&#x4F1A;&#x6267;&#x884C;&#xFF0C;&#x5177;&#x4F53;&#x7684;&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x5728; probe &#x51FD;&#x6570;&#x91CC;&#x9762;&#x7F16;&#x5199;&#xFF0C;&#x6BD4;&#x5982;&#x5B57;&#x7B26;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x7B49;&#x7B49;&#x3002;</p>
<p>&#x521D;&#x59CB;&#x5316;&#x597D; platform_driver &#x7ED3;&#x6784;&#x4F53;&#x53D8;&#x91CF;&#x4EE5;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x9A71;&#x52A8;&#x5165;&#x53E3;&#x51FD;&#x6570;&#x91CC;&#x9762;&#x8C03;&#x7528;platform_driver_register &#x51FD;&#x6570;&#x5411; Linux &#x5185;&#x6838;&#x6CE8;&#x518C;&#x4E00;&#x4E2A; platform &#x9A71;&#x52A8;<br>
int platform_driver_register (struct platform_driver *driver)</p>
<p>&#x51FD;&#x6570;&#x53C2;&#x6570;&#x548C;&#x8FD4;&#x56DE;&#x503C;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>driver&#xFF1A;&#x8981;&#x6CE8;&#x518C;&#x7684; platform &#x9A71;&#x52A8;&#x3002;
&#x8FD4;&#x56DE;&#x503C;&#xFF1A;&#x8D1F;&#x6570;&#xFF0C;&#x5931;&#x8D25;&#xFF1B;0&#xFF0C;&#x6210;&#x529F;&#x3002;
</code></pre>
<p>&#x8FD8;&#x9700;&#x8981;&#x5728;&#x9A71;&#x52A8;&#x5378;&#x8F7D;&#x51FD;&#x6570;&#x4E2D;&#x901A;&#x8FC7; platform_driver_unregister &#x51FD;&#x6570;&#x5378;&#x8F7D; platform &#x9A71;&#x52A8;&#xFF0C;</p>
<pre><code class="language-c">void platform_driver_unregister(struct platform_driver *drv)
</code></pre>
<p>&#x51FD;&#x6570;&#x53C2;&#x6570;&#x548C;&#x8FD4;&#x56DE;&#x503C;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>drv&#xFF1A;&#x8981;&#x5378;&#x8F7D;&#x7684; platform &#x9A71;&#x52A8;&#x3002;
&#x8FD4;&#x56DE;&#x503C;&#xFF1A;&#x65E0;&#x3002;
</code></pre>
<p>platform &#x9A71;&#x52A8;&#x6846;&#x67B6;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<pre><code class="language-c">/*xxx_probe &#x51FD;&#x6570;&#xFF0C;&#x5F53;&#x9A71;&#x52A8;&#x548C;&#x8BBE;&#x5907;&#x5339;&#x914D;&#x6210;&#x529F;&#x4EE5;&#x540E;&#x6B64;&#x51FD;&#x6570;&#x5C31;&#x4F1A;&#x6267;&#x884C;&#xFF0C;&#x4EE5;&#x524D;&#x5728;&#x9A71;&#x52A8;&#x5165;&#x53E3; init 
&#x51FD;&#x6570;&#x91CC;&#x9762;&#x7F16;&#x5199;&#x7684;&#x5B57;&#x7B26;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x5C31;&#x5168;&#x90E8;&#x653E;&#x5230;&#x6B64; probe &#x51FD;&#x6570;&#x91CC;&#x9762;&#x3002;
&#x6BD4;&#x5982;&#x6CE8;&#x518C;&#x5B57;&#x7B26;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x3001;&#x6DFB;&#x52A0; cdev&#x3001;&#x521B;&#x5EFA;&#x7C7B;&#x7B49;&#x7B49;&#x3002;*/
static int xxx_probe(struct platform_device *dev)
{
    ......
    cdev_init(&amp;xxxdev.cdev, &amp;xxx_fops); /* &#x6CE8;&#x518C;&#x5B57;&#x7B26;&#x8BBE;&#x5907;&#x9A71;&#x52A8; */
    /* &#x51FD;&#x6570;&#x5177;&#x4F53;&#x5185;&#x5BB9; */
    return 0;
}

/*xxx_remove &#x51FD;&#x6570;&#xFF0C;platform_driver &#x7ED3;&#x6784;&#x4F53;&#x4E2D;&#x7684; remove &#x6210;&#x5458;&#x53D8;&#x91CF;&#xFF0C;&#x5F53;&#x5173;&#x95ED; plat
form&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x7684;&#x65F6;&#x5019;&#x6B64;&#x51FD;&#x6570;&#x5C31;&#x4F1A;&#x6267;&#x884C;&#xFF0C;&#x4EE5;&#x524D;&#x5728;&#x9A71;&#x52A8;&#x5378;&#x8F7D; exit &#x51FD;&#x6570;&#x91CC;&#x9762;&#x8981;&#x505A;&#x7684;&#x4E8B;&#x60C5;
&#x5C31;&#x653E;&#x5230;&#x6B64;&#x51FD;&#x6570;&#x4E2D;&#x6765;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x4F7F;&#x7528; iounmap &#x91CA;&#x653E;&#x5185;&#x5B58;&#x3001;&#x5220;&#x9664; cdev&#xFF0C;&#x6CE8;&#x9500;&#x8BBE;&#x5907;&#x53F7;&#x7B49;&#x7B49;&#x3002;*/
static int xxx_remove(struct platform_device *dev)
{
    ......
    cdev_del(&amp;xxxdev.cdev);/* &#x5220;&#x9664; cdev */
    /* &#x51FD;&#x6570;&#x5177;&#x4F53;&#x5185;&#x5BB9; */
    return 0;
}

/* xxx_of_match &#x5339;&#x914D;&#x8868;&#xFF0C;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x8BBE;&#x5907;&#x6811;&#x7684;&#x8BDD;&#x5C06;&#x901A;&#x8FC7;&#x6B64;&#x5339;&#x914D;&#x8868;&#x8FDB;&#x884C;&#x9A71;&#x52A8;&#x548C;&#x8BBE;&#x5907;&#x7684;&#x5339;&#x914D;&#x3002;
&#x8BBE;&#x7F6E;&#x4E86;&#x4E00;&#x4E2A;&#x5339;&#x914D;&#x9879;&#xFF0C;&#x6B64;&#x5339;&#x914D;&#x9879;&#x7684; compatible &#x503C;&#x4E3A;&#x201C;xxx-gpio&#x201D;&#xFF0C;&#x56E0;&#x6B64;&#x5F53;&#x8BBE;&#x5907;&#x6811;&#x4E2D;
&#x8BBE;&#x5907;&#x8282;&#x70B9;&#x7684; compatible &#x5C5E;&#x6027;&#x503C;&#x4E3A;&#x201C;xxx-gpio&#x201D;&#x7684;&#x65F6;&#x5019;&#x6B64;&#x8BBE;&#x5907;&#x5C31;&#x4F1A;&#x4E0E;&#x6B64;&#x9A71;&#x52A8;&#x5339;&#x914D;&#x3002;
{  Sentinel  }&#x662F;&#x4E00;&#x4E2A;&#x6807;&#x8BB0;&#xFF0C;of_device_id &#x8868;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5339;&#x914D;&#x9879;&#x5FC5;&#x987B;&#x662F;&#x7A7A;&#x7684;&#x3002;*/
static const struct of_device_id xxx_of_match[] = {
    { .compatible = &quot;xxx-gpio&quot; },
    { /* Sentinel */ }
};
 
/*&#x5B9A;&#x4E49;&#x4E00;&#x4E2A; platform_driver &#x7ED3;&#x6784;&#x4F53;&#x53D8;&#x91CF; xxx_driver&#xFF0C;&#x8868;&#x793A; platform &#x9A71;&#x52A8;&#xFF0C;&#x8BBE;&#x7F6E; paltform_driver &#x4E2D;&#x7684; device_driver &#x6210;&#x5458;&#x53D8;&#x91CF;&#x7684; name &#x548C; of_match_table &#x8FD9;&#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#x3002;&#x5176;&#x4E2D;
name &#x5C5E;&#x6027;&#x7528;&#x4E8E;&#x4F20;&#x7EDF;&#x7684;&#x9A71;&#x52A8;&#x4E0E;&#x8BBE;&#x5907;&#x5339;&#x914D;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x68C0;&#x67E5;&#x9A71;&#x52A8;&#x548C;&#x8BBE;&#x5907;&#x7684; name &#x5B57;&#x6BB5;&#x662F;&#x4E0D;&#x662F;&#x76F8;&#x540C;&#x3002;
of_match_table &#x5C5E;&#x6027;&#x5C31;&#x662F;&#x7528;&#x4E8E;&#x8BBE;&#x5907;&#x6811;&#x4E0B;&#x7684;&#x9A71;&#x52A8;&#x4E0E;&#x8BBE;&#x5907;&#x68C0;&#x67E5;&#x3002;&#x5BF9;&#x4E8E;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#xFF0C;&#x5FC5;&#x987B;&#x63D0;&#x4F9B;
&#x6709;&#x8BBE;&#x5907;&#x6811;&#x548C;&#x65E0;&#x8BBE;&#x5907;&#x6811;&#x4E24;&#x79CD;&#x5339;&#x914D;&#x65B9;&#x6CD5;&#x3002;&#x4E00;&#x5F00;&#x59CB;&#x4E24;&#x884C;&#x8BBE;&#x7F6E; probe &#x548C; remove &#x8FD9;&#x4E24;&#x6210;&#x5458;&#x53D8;&#x91CF;&#x3002;*/
static struct platform_driver xxx_device_driver = {
	.probe		= xxx_probe,
	.remove		= xxx_remove,
#ifdef CONFIG_PM
	.suspend	= xxx_suspend,
	.resume		= xxx_resume,
#endif
	.driver		= {
		.name	= &quot;xxx&quot;,
		.of_match_table = xxx_of_match,
	},
};

static int __init xxx_init(void)
{
	int ret = bus_register(&amp;xxx_bus_type);
	if (ret == 0)
		platform_driver_register(&amp;xxx_device_driver);
	return ret;
}

static void __exit xxx_exit(void)
{
	platform_driver_unregister(&amp;xxx_device_driver);
	bus_unregister(&amp;xxx_bus_type);
}
</code></pre>
<h3 id="platform-%E8%AE%BE%E5%A4%87">platform &#x8BBE;&#x5907;</h3>
<p>platform_device &#x8FD9;&#x4E2A;&#x7ED3;&#x6784;&#x4F53;&#x8868;&#x793A; platform &#x8BBE;&#x5907;&#xFF0C;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x8981;&#x6CE8;&#x610F;&#xFF0C;&#x5982;&#x679C;&#x5185;&#x6838;&#x652F;&#x6301;&#x8BBE;&#x5907;&#x6811;&#x7684;&#x8BDD;&#x5C31;&#x4E0D;&#x8981;&#x518D;&#x4F7F;&#x7528; platform_device &#x6765;&#x63CF;&#x8FF0;&#x8BBE;&#x5907;&#x4E86;&#xFF0C;&#x56E0;&#x4E3A;&#x6539;&#x7528;&#x8BBE;&#x5907;&#x6811;&#x53BB;&#x63CF;&#x8FF0;&#x4E86;&#x3002;&#x5F53;&#x7136;&#x4E86;&#xFF0C;&#x4F60;&#x5982;&#x679C;&#x4E00;&#x5B9A;&#x8981;&#x7528; platform_device &#x6765;&#x63CF;&#x8FF0;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#x7684;&#x8BDD;&#x4E5F;&#x662F;&#x53EF;&#x4EE5;&#x7684;&#x3002;</p>
<pre><code class="language-c">struct platform_device {
	const char	*name;
	int		id;
	bool		id_auto;
	struct device	dev;
	u32		num_resources;
	struct resource	*resource;

	const struct platform_device_id	*id_entry;
	char *driver_override; /* Driver name to force a match */

	/* MFD cell pointer */
	struct mfd_cell *mfd_cell;

	/* arch specific additions */
	struct pdev_archdata	archdata;
};
</code></pre>
<p>name &#x8868;&#x793A;&#x8BBE;&#x5907;&#x540D;&#x5B57;&#xFF0C;&#x8981;&#x548C;&#x6240;&#x4F7F;&#x7528;&#x7684; platform &#x9A71;&#x52A8;&#x7684; name &#x5B57;&#x6BB5;&#x76F8;&#x540C;&#xFF0C;&#x5426;&#x5219;&#x7684;&#x8BDD;&#x8BBE;&#x5907;&#x5C31;&#x65E0;&#x6CD5;&#x5339;&#x914D;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x9A71;&#x52A8;&#x3002;&#x6BD4;&#x5982;&#x5BF9;&#x5E94;&#x7684; platform &#x9A71;&#x52A8;&#x7684; name &#x5B57;&#x6BB5;&#x4E3A;&#x201C;xxx-gpio&#x201D;&#xFF0C;&#x90A3;&#x4E48;&#x6B64; name&#x5B57;&#x6BB5;&#x4E5F;&#x8981;&#x8BBE;&#x7F6E;&#x4E3A;&#x201C;xxx-gpio&#x201D;&#x3002;</p>
<p>num_resources &#x8868;&#x793A;&#x8D44;&#x6E90;&#x6570;&#x91CF;&#xFF0C;&#x4E00;&#x822C;&#x4E3A;&#x4E0B;&#x4E00;&#x884C; resource &#x8D44;&#x6E90;&#x7684;&#x5927;&#x5C0F;&#x3002;</p>
<p>resource &#x8868;&#x793A;&#x8D44;&#x6E90;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#xFF0C;&#x6BD4;&#x5982;&#x5916;&#x8BBE;&#x5BC4;&#x5B58;&#x5668;&#x7B49;&#x3002;Linux &#x5185;&#x6838;&#x4F7F;&#x7528; resource&#x7ED3;&#x6784;&#x4F53;&#x8868;&#x793A;&#x8D44;&#x6E90;</p>
<pre><code class="language-c">struct resource {
	resource_size_t start;
	resource_size_t end;
	const char *name;
	unsigned long flags;
	struct resource *parent, *sibling, *child;
};
</code></pre>
<p>start &#x548C; end &#x5206;&#x522B;&#x8868;&#x793A;&#x8D44;&#x6E90;&#x7684;&#x8D77;&#x59CB;&#x548C;&#x7EC8;&#x6B62;&#x4FE1;&#x606F;&#xFF0C;&#x5BF9;&#x4E8E;&#x5185;&#x5B58;&#x7C7B;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x5C31;&#x8868;&#x793A;&#x5185;&#x5B58;&#x8D77;&#x59CB;&#x548C;&#x7EC8;&#x6B62;&#x5730;&#x5740;&#xFF0C;name &#x8868;&#x793A;&#x8D44;&#x6E90;&#x540D;&#x5B57;&#xFF0C;flags &#x8868;&#x793A;&#x8D44;&#x6E90;&#x7C7B;&#x578B;&#xFF0C;&#x53EF;&#x9009;&#x7684;&#x8D44;&#x6E90;&#x7C7B;&#x578B;&#x90FD;&#x5B9A;&#x4E49;&#x5728;&#x4E86;&#x6587;&#x4EF6;include/linux/ioport.h &#x91CC;&#x9762;</p>
<pre><code class="language-c">#define IORESOURCE_BITS		0x000000ff	/* Bus-specific bits */

#define IORESOURCE_TYPE_BITS	0x00001f00	/* Resource type */
#define IORESOURCE_IO		0x00000100	/* PCI/ISA I/O ports */
#define IORESOURCE_MEM		0x00000200
#define IORESOURCE_REG		0x00000300	/* Register offsets */
#define IORESOURCE_IRQ		0x00000400
#define IORESOURCE_DMA		0x00000800
#define IORESOURCE_BUS		0x00001000

#define IORESOURCE_PREFETCH	0x00002000	/* No side effects */
#define IORESOURCE_READONLY	0x00004000
#define IORESOURCE_CACHEABLE	0x00008000
#define IORESOURCE_RANGELENGTH	0x00010000
#define IORESOURCE_SHADOWABLE	0x00020000

#define IORESOURCE_SIZEALIGN	0x00040000	/* size indicates alignment */
#define IORESOURCE_STARTALIGN	0x00080000	/* start field is alignment */

#define IORESOURCE_MEM_64	0x00100000
#define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */

#define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */
#define IORESOURCE_DISABLED	0x10000000
#define IORESOURCE_UNSET	0x20000000	/* No address assigned yet */
#define IORESOURCE_AUTO		0x40000000
#define IORESOURCE_BUSY		0x80000000	/* Driver has marked this resource busy */

/* PnP IRQ specific bits (IORESOURCE_BITS) */
#define IORESOURCE_IRQ_HIGHEDGE		(1&lt;&lt;0)
#define IORESOURCE_IRQ_LOWEDGE		(1&lt;&lt;1)
#define IORESOURCE_IRQ_HIGHLEVEL	(1&lt;&lt;2)
#define IORESOURCE_IRQ_LOWLEVEL		(1&lt;&lt;3)
#define IORESOURCE_IRQ_SHAREABLE	(1&lt;&lt;4)
#define IORESOURCE_IRQ_OPTIONAL 	(1&lt;&lt;5)

/* PnP DMA specific bits (IORESOURCE_BITS) */
#define IORESOURCE_DMA_TYPE_MASK	(3&lt;&lt;0)
#define IORESOURCE_DMA_8BIT		(0&lt;&lt;0)
#define IORESOURCE_DMA_8AND16BIT	(1&lt;&lt;0)
#define IORESOURCE_DMA_16BIT		(2&lt;&lt;0)

#define IORESOURCE_DMA_MASTER		(1&lt;&lt;2)
#define IORESOURCE_DMA_BYTE		(1&lt;&lt;3)
#define IORESOURCE_DMA_WORD		(1&lt;&lt;4)

#define IORESOURCE_DMA_SPEED_MASK	(3&lt;&lt;6)
#define IORESOURCE_DMA_COMPATIBLE	(0&lt;&lt;6)
#define IORESOURCE_DMA_TYPEA		(1&lt;&lt;6)
#define IORESOURCE_DMA_TYPEB		(2&lt;&lt;6)
#define IORESOURCE_DMA_TYPEF		(3&lt;&lt;6)

/* PnP memory I/O specific bits (IORESOURCE_BITS) */
#define IORESOURCE_MEM_WRITEABLE	(1&lt;&lt;0)	/* dup: IORESOURCE_READONLY */
#define IORESOURCE_MEM_CACHEABLE	(1&lt;&lt;1)	/* dup: IORESOURCE_CACHEABLE */
#define IORESOURCE_MEM_RANGELENGTH	(1&lt;&lt;2)	/* dup: IORESOURCE_RANGELENGTH */
#define IORESOURCE_MEM_TYPE_MASK	(3&lt;&lt;3)
#define IORESOURCE_MEM_8BIT		(0&lt;&lt;3)
#define IORESOURCE_MEM_16BIT		(1&lt;&lt;3)
#define IORESOURCE_MEM_8AND16BIT	(2&lt;&lt;3)
#define IORESOURCE_MEM_32BIT		(3&lt;&lt;3)
#define IORESOURCE_MEM_SHADOWABLE	(1&lt;&lt;5)	/* dup: IORESOURCE_SHADOWABLE */
#define IORESOURCE_MEM_EXPANSIONROM	(1&lt;&lt;6)

/* PnP I/O specific bits (IORESOURCE_BITS) */
#define IORESOURCE_IO_16BIT_ADDR	(1&lt;&lt;0)
#define IORESOURCE_IO_FIXED		(1&lt;&lt;1)

/* PCI ROM control bits (IORESOURCE_BITS) */
#define IORESOURCE_ROM_ENABLE		(1&lt;&lt;0)	/* ROM is enabled, same as PCI_ROM_ADDRESS_ENABLE */
#define IORESOURCE_ROM_SHADOW		(1&lt;&lt;1)	/* ROM is copy at C000:0 */
#define IORESOURCE_ROM_COPY		(1&lt;&lt;2)	/* ROM is alloc&apos;d copy, resource field overlaid */
#define IORESOURCE_ROM_BIOS_COPY	(1&lt;&lt;3)	/* ROM is BIOS copy, resource field overlaid */

/* PCI control bits.  Shares IORESOURCE_BITS with above PCI ROM.  */
#define IORESOURCE_PCI_FIXED		(1&lt;&lt;4)	/* Do not move resource */
</code></pre>
<p>&#x6BD4;&#x5982;IORESOURCE_MEM&#x8868;&#x793A;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x662F;&#x5730;&#x5740;&#x8D44;&#x6E90;&#xFF0C;IORESOURCE_IRQ&#x8868;&#x793A;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x662F;&#x4E2D;&#x65AD;&#x8D44;&#x6E90;&#x2026;&#x3002;&#x6709;&#x4E86;&#x8FD9;&#x51E0;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x5B8C;&#x6574;&#x7684;&#x63CF;&#x8FF0;&#x4E00;&#x4E2A;&#x8D44;&#x6E90;&#xFF0C;&#x4F46;&#x5982;&#x679C;&#x6BCF;&#x4E2A;&#x8D44;&#x6E90;&#x90FD;&#x9700;&#x8981;&#x5355;&#x72EC;&#x7BA1;&#x7406;&#x800C;&#x4E0D;&#x662F;&#x7EC4;&#x6210;&#x67D0;&#x79CD;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x663E;&#x7136;&#x662F;&#x4E00;&#x79CD;&#x975E;&#x5E38;&#x611A;&#x8822;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x6240;&#x4EE5;&#x5185;&#x6838;&#x7684;resource&#x7ED3;&#x6784;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x4E09;&#x4E2A;&#x6307;&#x9488;&#xFF1A;parent,sibling,child(24)&#xFF0C;&#x5206;&#x522B;&#x7528;&#x6765;&#x8868;&#x793A;&#x8D44;&#x6E90;&#x7684;&#x7236;&#x8D44;&#x6E90;&#xFF0C;&#x5144;&#x5F1F;&#x8D44;&#x6E90;&#xFF0C;&#x5B50;&#x8D44;&#x6E90;&#xFF0C;&#x8FD9;&#x6837;&#x5185;&#x6838;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6811;&#x7ED3;&#x6784;&#x6765;&#x9AD8;&#x6548;&#x7684;&#x7BA1;&#x7406;&#x5927;&#x91CF;&#x7684;&#x7CFB;&#x7EDF;&#x8D44;&#x6E90;&#xFF0C;linux&#x5185;&#x6838;&#x6709;&#x4E24;&#x79CD;&#x6811;&#x7ED3;&#x6784;&#xFF1A;iomem_resource,ioport_resource&#xFF0C;&#x8FDB;&#x884C;&#x677F;&#x7EA7;&#x5F00;&#x53D1;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x901A;&#x5E38;&#x5C06;&#x4E3B;&#x677F;&#x4E0A;&#x7684;ROM&#x8D44;&#x6E90;&#x653E;&#x5165;iomem_resource&#x6811;&#x7684;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#xFF0C;&#x800C;&#x5C06;&#x7CFB;&#x7EDF;&#x56FA;&#x6709;&#x7684;I/O&#x8D44;&#x6E90;&#x6302;&#x5230;ioport_resource&#x6811;&#x4E0A;&#x3002;<br>
&#x4E24;&#x79CD;&#x5199;&#x6CD5;&#x8868;&#x793A;&#x4E86;&#x5730;&#x5740;&#x8D44;&#x6E90;&#x548C;&#x4E2D;&#x65AD;&#x8D44;&#x6E90;&#xFF0C;&#x5F3A;&#x70C8;&#x63A8;&#x8350;&#x4F7F;&#x7528;DEFINE_RES_XXX&#x7684;&#x7248;&#x672C;&#x3002;</p>
<pre><code class="language-c">//IO&#x5730;&#x5740;&#x8D44;&#x6E90;&#xFF0C;&#x81EA;&#x5DF1;&#x586B;&#x5145;resource&#x7ED3;&#x6784;&#x4F53;+flags&#x5B8F;
struct resource res= {
	.start = 0x10000000,
	.end	 = 0x20000000-1,
	.flags = IORESOURCE_MEM
};
//IO&#x5730;&#x5740;&#x8D44;&#x6E90;&#xFF0C;&#x4F7F;&#x7528;&#x5185;&#x6838;&#x63D0;&#x4F9B;&#x7684;&#x5B9A;&#x4E49;&#x5B8F;
struct resource res = DEFINE_RES_MEM(0x20000000, 1024);
//&#x4E2D;&#x65AD;&#x8D44;&#x6E90;&#xFF0C;&#x81EA;&#x5DF1;&#x586B;&#x5145;resource&#x7ED3;&#x6784;&#x4F53;+flags&#x5B8F;
struct resource res = {	
		.start	= 10,
		.flags	= IORESOURCE_IRQ,
};
//&#x4E2D;&#x65AD;&#x8D44;&#x6E90;&#xFF0C;&#x4F7F;&#x7528;&#x5185;&#x6838;&#x63D0;&#x4F9B;&#x7684;&#x5B9A;&#x4E49;&#x5B8F;
struct resource res = DEFINE_RES_IRQ(11);

struct resource res[] = {
	[0] = {
		.start	= 0x10000000,
		.end	= 0x20000000-1,
		.flags	= IORESOURCE_MEM
	},
	[1] = DEFINE_RES_MEM(0x20000000, 1024),
	[2] = {
		.start	= 10,   //&#x4E2D;&#x65AD;&#x53F7;
		.flags	= IORESOURCE_IRQ|IRQF_TRIGGER_RISING //include/linux/interrupt.h
	},
	[3] = DEFINE_RES_IRQ(11),	
};
</code></pre>
<p>&#x5728;&#x4EE5;&#x524D;&#x4E0D;&#x652F;&#x6301;&#x8BBE;&#x5907;&#x6811;&#x7684;Linux&#x7248;&#x672C;&#x4E2D;&#xFF0C;&#x7528;&#x6237;&#x9700;&#x8981;&#x7F16;&#x5199;platform_device&#x53D8;&#x91CF;&#x6765;&#x63CF;&#x8FF0;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#xFF0C;&#x7136;&#x540E;&#x4F7F;&#x7528; platform_device_register &#x51FD;&#x6570;&#x5C06;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#x6CE8;&#x518C;&#x5230; Linux &#x5185;&#x6838;&#x4E2D;&#xFF0C;&#x6B64;&#x51FD;&#x6570;&#x539F;&#x578B;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<pre><code class="language-c">int platform_device_register(struct platform_device *pdev)
</code></pre>
<p>&#x51FD;&#x6570;&#x53C2;&#x6570;&#x548C;&#x8FD4;&#x56DE;&#x503C;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>pdev&#xFF1A;&#x8981;&#x6CE8;&#x518C;&#x7684; platform &#x8BBE;&#x5907;&#x3002;
&#x8FD4;&#x56DE;&#x503C;&#xFF1A;&#x8D1F;&#x6570;&#xFF0C;&#x5931;&#x8D25;&#xFF1B;0&#xFF0C;&#x6210;&#x529F;&#x3002;
</code></pre>
<p>&#x5982;&#x679C;&#x4E0D;&#x518D;&#x4F7F;&#x7528; platform &#x7684;&#x8BDD;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; platform_device_unregister &#x51FD;&#x6570;&#x6CE8;&#x9500;&#x6389;&#x76F8;&#x5E94;&#x7684; platform&#x8BBE;&#x5907;&#xFF0C;platform_device_unregister &#x51FD;&#x6570;&#x539F;&#x578B;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c">void platform_device_unregister(struct platform_device *pdev)
</code></pre>
<p>&#x51FD;&#x6570;&#x53C2;&#x6570;&#x548C;&#x8FD4;&#x56DE;&#x503C;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>pdev&#xFF1A;&#x8981;&#x6CE8;&#x9500;&#x7684; platform &#x8BBE;&#x5907;&#x3002;
&#x8FD4;&#x56DE;&#x503C;&#xFF1A;&#x65E0;
</code></pre>
<p>platform &#x8BBE;&#x5907;&#x4FE1;&#x606F;&#x6846;&#x67B6;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<pre><code class="language-c">/* &#x5BC4;&#x5B58;&#x5668;&#x5730;&#x5740;&#x5B9A;&#x4E49;*/
#define PERIPH1_REGISTER_BASE (0X20000000) /* &#x5916;&#x8BBE; 1 &#x5BC4;&#x5B58;&#x5668;&#x9996;&#x5730;&#x5740; */ 
#define PERIPH2_REGISTER_BASE (0X020E0068) /* &#x5916;&#x8BBE; 2 &#x5BC4;&#x5B58;&#x5668;&#x9996;&#x5730;&#x5740; */
#define REGISTER_LENGTH 4 5 

/* &#x8D44;&#x6E90; */
static struct resource xxx_resources[] = { 
    [0] = { 
        .start = PERIPH1_REGISTER_BASE,
        .end = (PERIPH1_REGISTER_BASE + REGISTER_LENGTH - 1),
        .flags = IORESOURCE_MEM,
    }, 
    [1] = {
        .start = PERIPH2_REGISTER_BASE,
        .end = (PERIPH2_REGISTER_BASE + REGISTER_LENGTH - 1),
        .flags = IORESOURCE_MEM,
    },
};

/* platform &#x8BBE;&#x5907;&#x7ED3;&#x6784;&#x4F53; */
static struct platform_device xxxdevice = {
    .name = &quot;xxx-gpio&quot;,
    .id = -1,
    .num_resources = ARRAY_SIZE(xxx_resources),
    .resource = xxx_resources,
};
 
/* &#x8BBE;&#x5907;&#x6A21;&#x5757;&#x52A0;&#x8F7D; */
static int __init xxxdevice_init(void)
{
    return platform_device_register(&amp;xxxdevice);
}

/* &#x8BBE;&#x5907;&#x6A21;&#x5757;&#x6CE8;&#x9500; */
static void __exit xxx_resourcesdevice_exit(void)
{
    platform_device_unregister(&amp;xxxdevice);
}

module_init(xxxdevice_init);
module_exit(xxxdevice_exit);
</code></pre>
<hr>
<p>&#x7248;&#x6743;&#x58F0;&#x660E;&#xFF1A;&#x672C;&#x6587;&#x4E3A;CSDN&#x535A;&#x4E3B;&#x300C;monkea123&#x300D;&#x7684;&#x539F;&#x521B;&#x6587;&#x7AE0;&#xFF0C;&#x9075;&#x5FAA;CC 4.0 BY-SA&#x7248;&#x6743;&#x534F;&#x8BAE;&#xFF0C;&#x8F6C;&#x8F7D;&#x8BF7;&#x9644;&#x4E0A;&#x539F;&#x6587;&#x51FA;&#x5904;&#x94FE;&#x63A5;&#x53CA;&#x672C;&#x58F0;&#x660E;&#x3002;<br>
&#x539F;&#x6587;&#x94FE;&#x63A5;&#xFF1A;<a href="https://blog.csdn.net/monkea123/article/details/109082515">https://blog.csdn.net/monkea123/article/details/109082515</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用（转）]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5173;&#x4E0E;&#x8BBE;&#x5907;&#x6811;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x6211;&#x4EEC;&#x5728;Exynos4412 &#x5185;&#x6838;&#x79FB;&#x690D;&#xFF08;&#x516D;&#xFF09;&#x2014;&#x2014; &#x8BBE;&#x5907;&#x6811;&#x89E3;&#x6790; &#x91CC;&#x9762;&#x5DF2;&#x7ECF;&#x5B66;&#x4E60;&#x8FC7;&#xFF0C;&#x4E0B;&#x9762;&#x770B;&#x4E00;&#x4E0B;&#x8BBE;&#x5907;&#x6811;&#x5728;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x5F00;&#x53D1;</p>]]></description><link>https://www.listera.top/linux-she-bei-qu-dong-kai-fa-she-bei-shu-zai-platformshe-bei-qu-dong-zhong-de-shi-yong/</link><guid isPermaLink="false">62ccb1c744915a7267ba6f82</guid><category><![CDATA[Linux]]></category><category><![CDATA[驱动]]></category><dc:creator><![CDATA[lidanger]]></dc:creator><pubDate>Mon, 11 Jul 2022 23:30:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5173;&#x4E0E;&#x8BBE;&#x5907;&#x6811;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x6211;&#x4EEC;&#x5728;Exynos4412 &#x5185;&#x6838;&#x79FB;&#x690D;&#xFF08;&#x516D;&#xFF09;&#x2014;&#x2014; &#x8BBE;&#x5907;&#x6811;&#x89E3;&#x6790; &#x91CC;&#x9762;&#x5DF2;&#x7ECF;&#x5B66;&#x4E60;&#x8FC7;&#xFF0C;&#x4E0B;&#x9762;&#x770B;&#x4E00;&#x4E0B;&#x8BBE;&#x5907;&#x6811;&#x5728;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x5F00;&#x53D1;&#x4E2D;&#x8D77;&#x5230;&#x7684;&#x4F5C;&#x7528;</p>
<p>Device Tree&#x662F;&#x4E00;&#x79CD;&#x63CF;&#x8FF0;&#x786C;&#x4EF6;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x8BBE;&#x5907;&#x6811;&#x6E90;(Device Tree Source)&#x6587;&#x4EF6;&#xFF08;&#x4EE5;.dts&#x7ED3;&#x5C3E;&#xFF09;&#x5C31;&#x662F;&#x7528;&#x6765;&#x63CF;&#x8FF0;&#x76EE;&#x6807;&#x677F;&#x786C;&#x4EF6;&#x4FE1;&#x606F;&#x7684;&#x3002;Device Tree&#x7531;&#x4E00;&#x7CFB;&#x5217;&#x88AB;&#x547D;&#x540D;&#x7684;&#x7ED3;&#x70B9;&#xFF08;node&#xFF09;&#x548C;&#x5C5E;&#x6027;&#xFF08;property&#xFF09;&#x7EC4;&#x6210;&#xFF0C;&#x800C;&#x7ED3;&#x70B9;&#x672C;&#x8EAB;&#x53EF;&#x5305;&#x542B;&#x5B50;&#x7ED3;&#x70B9;&#x3002;&#x6240;&#x8C13;&#x5C5E;&#x6027;&#xFF0C;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x6210;&#x5BF9;&#x51FA;&#x73B0;&#x7684;name&#x548C;value&#x3002;&#x5728;Device Tree&#x4E2D;&#xFF0C;&#x53EF;&#x63CF;&#x8FF0;&#x7684;&#x4FE1;&#x606F;&#x5305;&#x62EC;&#xFF08;&#x539F;&#x5148;&#x8FD9;&#x4E9B;&#x4FE1;&#x606F;&#x5927;&#x591A;&#x88AB;hard code&#x5230;kernel&#x4E2D;&#xFF09;&#x3002;</p>
<h3 id="%E4%B8%80%E3%80%81%E8%AE%BE%E5%A4%87%E6%A0%91%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5">&#x4E00;&#x3001;&#x8BBE;&#x5907;&#x6811;&#x57FA;&#x7840;&#x6982;&#x5FF5;</h3>
<h5 id="1%E3%80%81%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F">1&#x3001;&#x57FA;&#x672C;&#x6570;&#x636E;&#x683C;&#x5F0F;</h5>
<p>device tree&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x8282;&#x70B9;&#x548C;&#x5C5E;&#x6027;&#x6811;&#xFF0C;&#x5C5E;&#x6027;&#x662F;&#x952E;&#x503C;&#x5BF9;&#xFF0C;&#x8282;&#x70B9;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x5C5E;&#x6027;&#x548C;&#x5B50;&#x8282;&#x70B9;&#x3002;&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A;.dts&#x683C;&#x5F0F;&#x7684;&#x7B80;&#x5355;&#x8BBE;&#x5907;&#x6811;&#x3002;</p>
<pre><code>/ {
    node1 {
        a-string-property = &quot;A string&quot;;
        a-string-list-property = &quot;first string&quot;, &quot;second string&quot;;
        a-byte-data-property = [0x01 0x23 0x34 0x56];
        child-node1 {
            first-child-property;
            second-child-property = &lt;1&gt;;
            a-string-property = &quot;Hello, world&quot;;
        };
        child-node2 {
        };
    };
    node2 {
        an-empty-property;
        a-cell-property = &lt;1 2 3 4&gt;; /* each number (cell) is a uint32 */
        child-node1 {
        };
    };
};
</code></pre>
<p>&#x8BE5;&#x6811;&#x5E76;&#x672A;&#x63CF;&#x8FF0;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#xFF0C;&#x4E5F;&#x4E0D;&#x5177;&#x5907;&#x4EFB;&#x4F55;&#x5B9E;&#x9645;&#x610F;&#x4E49;&#xFF0C;&#x4F46;&#x5B83;&#x5374;&#x63ED;&#x793A;&#x4E86;&#x8282;&#x70B9;&#x548C;&#x5C5E;&#x6027;&#x7684;&#x7ED3;&#x6784;&#x3002;&#x5373;&#xFF1A;</p>
<p>a -- &#x4E00;&#x4E2A;&#x7684;&#x6839;&#x8282;&#x70B9;:&apos;/&apos;&#xFF0C;&#x4E24;&#x4E2A;&#x5B50;&#x8282;&#x70B9;&#xFF1A;node1&#x548C;node2&#xFF1B;node1&#x7684;&#x5B50;&#x8282;&#x70B9;&#xFF1A;child-node1&#x548C;child-node2&#xFF0C;&#x4E00;&#x4E9B;&#x5C5E;&#x6027;&#x5206;&#x6563;&#x5728;&#x6811;&#x4E4B;&#x95F4;&#x3002;</p>
<p>b -- &#x5C5E;&#x6027;&#x662F;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x952E;&#x503C;&#x5BF9;&#xFF08;key-value pairs&#xFF09;&#xFF1A;value&#x53EF;&#x4EE5;&#x4E3A;&#x7A7A;&#x4E5F;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x4EFB;&#x610F;&#x7684;&#x5B57;&#x8282;&#x6D41;&#x3002;&#x800C;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x5E76;&#x6CA1;&#x6709;&#x7F16;&#x7801;&#x6210;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x6709;&#x4E00;&#x4E9B;&#x57FA;&#x672C;&#x6570;&#x636E;&#x8868;&#x793A;&#x53EF;&#x4EE5;&#x5728;device tree&#x6E90;&#x6587;&#x4EF6;&#x4E2D;&#x8868;&#x793A;&#x3002;</p>
<p>c -- &#x6587;&#x672C;&#x5B57;&#x7B26;&#x4E32;&#xFF08;null &#x7EC8;&#x6B62;&#xFF09;&#x7528;&#x53CC;&#x5F15;&#x53F7;&#x6765;&#x8868;&#x793A;&#xFF1A;string-property = &quot;a string&quot;</p>
<p>d -- &#x201C;Cells&#x201D;&#x662F;&#x7531;&#x5C16;&#x62EC;&#x53F7;&#x5206;&#x9694;&#x7684;32&#x4F4D;&#x65E0;&#x7B26;&#x53F7;&#x6574;&#x6570;&#xFF1A;cell-property = &lt;0xbeef 123 0xabcd1234&gt;</p>
<p>e -- &#x4E8C;&#x8FDB;&#x5236;&#x6570;&#x636E;&#x662F;&#x7528;&#x65B9;&#x62EC;&#x53F7;&#x5206;&#x9694;&#xFF1A;binary-property = [0x01 0x23 0x45 0x67];</p>
<p>f -- &#x4E0D;&#x540C;&#x683C;&#x5F0F;&#x7684;&#x6570;&#x636E;&#x53EF;&#x4EE5;&#x7528;&#x9017;&#x53F7;&#x8FDE;&#x63A5;&#x5728;&#x4E00;&#x8D77;&#xFF1A;mixed-property = &quot;a string&quot;, [0x01 0x23 0x45 0x67], &lt;0x12345678&gt;;</p>
<p>g -- &#x9017;&#x53F7;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x521B;&#x5EFA;&#x5B57;&#x7B26;&#x4E32;&#x5217;&#x8868;&#xFF1A;string-list = &quot;red fish&quot;, &quot;blue fish&quot;;</p>
<h3 id="%E4%BA%8C%E3%80%81%E8%AE%BE%E5%A4%87%E5%9C%A8device-tree-%E4%B8%AD%E7%9A%84%E6%8F%8F%E8%BF%B0">&#x4E8C;&#x3001;&#x8BBE;&#x5907;&#x5728;device tree &#x4E2D;&#x7684;&#x63CF;&#x8FF0;</h3>
<p>&#x7CFB;&#x7EDF;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x7531;device tree&#x7684;&#x4E00;&#x4E2A;&#x8282;&#x70B9;&#x6765;&#x8868;&#x793A;&#xFF1B;</p>
<h5 id="1%E3%80%81%E8%8A%82%E7%82%B9%E5%91%BD%E5%90%8D">1&#x3001;&#x8282;&#x70B9;&#x547D;&#x540D;</h5>
<p>&#x82B1;&#x4E9B;&#x65F6;&#x95F4;&#x8C08;&#x8C08;&#x547D;&#x540D;&#x4E60;&#x60EF;&#x662F;&#x503C;&#x5F97;&#x7684;&#x3002;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x90FD;&#x5FC5;&#x987B;&#x6709;&#x4E00;&#x4E2A;<name>[@<unit-address>]&#x683C;&#x5F0F;&#x7684;&#x540D;&#x79F0;&#x3002;<name>&#x662F;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;ascii&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x6700;&#x957F;&#x4E3A;31&#x4E2A;&#x5B57;&#x7B26;&#xFF0C;&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;&#x8282;&#x70B9;&#x547D;&#x540D;&#x662F;&#x6839;&#x636E;&#x5B83;&#x4EE3;&#x8868;&#x4EC0;&#x4E48;&#x8BBE;&#x5907;&#x3002;&#x6BD4;&#x5982;&#x8BF4;&#xFF0C;&#x4E00;&#x4E2A;&#x4EE3;&#x8868;3com&#x4EE5;&#x592A;&#x7F51;&#x9002;&#x914D;&#x5668;&#x7684;&#x8282;&#x70B9;&#x5E94;&#x8BE5;&#x547D;&#x540D;&#x4E3A;ethernet&#xFF0C;&#x800C;&#x4E0D;&#x662F;3com509&#x3002;</name></unit-address></name></p>
<p>&#x5982;&#x679C;&#x8282;&#x70B9;&#x63CF;&#x8FF0;&#x7684;&#x8BBE;&#x5907;&#x6709;&#x5730;&#x5740;&#x7684;&#x8BDD;&#xFF0C;&#x5C31;&#x5E94;&#x8BE5;&#x52A0;&#x4E0A;unit-address&#xFF0C;unit-address&#x901A;&#x5E38;&#x662F;&#x7528;&#x6765;&#x8BBF;&#x95EE;&#x8BBE;&#x5907;&#x7684;&#x4E3B;&#x5730;&#x5740;&#xFF0C;&#x5E76;&#x5728;&#x8282;&#x70B9;&#x7684;reg&#x5C5E;&#x6027;&#x4E2D;&#x88AB;&#x5217;&#x51FA;&#x3002;&#x540E;&#x9762;&#x6211;&#x4EEC;&#x5C06;&#x8C08;&#x5230;reg&#x5C5E;&#x6027;&#x3002;</p>
<h5 id="2%E3%80%81%E8%AE%BE%E5%A4%87">2&#x3001;&#x8BBE;&#x5907;</h5>
<p>&#x63A5;&#x4E0B;&#x6765;&#x5C06;&#x4E3A;&#x8BBE;&#x5907;&#x6811;&#x6DFB;&#x52A0;&#x8BBE;&#x5907;&#x8282;&#x70B9;&#xFF1A;</p>
<pre><code>/ {
	compatible = &quot;acme,coyotes-revenge&quot;;
 
	cpus {
		cpu@0 {
			compatible = &quot;arm,cortex-a9&quot;;
		};
		cpu@1 {
            		compatible = &quot;arm,cortex-a9&quot;;
        	};
    	};
 
	serial@101F0000 {
		compatible = &quot;arm,pl011&quot;;
	};
 
	serial@101F2000 {
		compatible = &quot;arm,pl011&quot;;
	};
 
	gpio@101F3000 {
		compatible = &quot;arm,pl061&quot;;
	};
 
	interrupt-controller@10140000 {
		compatible = &quot;arm,pl190&quot;;
	};
 
	spi@10115000 {
		compatible = &quot;arm,pl022&quot;;
	};
	
	external-bus {
		ethernet@0,0 {
			compatible = &quot;smc,smc91c111&quot;;
		};
	
		i2c@1,0 {
			compatible = &quot;acme,a1234-i2c-bus&quot;;
			rtc@58 {
				compatible = &quot;maxim,ds1338&quot;;
			};
        	};
 
		flash@2,0 {
			compatible = &quot;samsung,k8f1315ebm&quot;, &quot;cfi-flash&quot;;
       		 };
   	 };
};
</code></pre>
<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x8BBE;&#x5907;&#x6811;&#x4E2D;&#xFF0C;&#x7CFB;&#x7EDF;&#x4E2D;&#x7684;&#x8BBE;&#x5907;&#x8282;&#x70B9;&#x5DF2;&#x7ECF;&#x6DFB;&#x52A0;&#x8FDB;&#x6765;&#xFF0C;&#x6811;&#x7684;&#x5C42;&#x6B21;&#x7ED3;&#x6784;&#x53CD;&#x6620;&#x4E86;&#x8BBE;&#x5907;&#x5982;&#x4F55;&#x8FDE;&#x5230;&#x7CFB;&#x7EDF;&#x4E2D;&#x3002;&#x5916;&#x90E8;&#x603B;&#x7EBF;&#x4E0A;&#x7684;&#x8BBE;&#x5907;&#x5C31;&#x662F;&#x5916;&#x90E8;&#x603B;&#x7EBF;&#x8282;&#x70B9;&#x7684;&#x5B50;&#x8282;&#x70B9;&#xFF0C;i2c&#x8BBE;&#x5907;&#x662F;i2c&#x603B;&#x7EBF;&#x63A7;&#x5236;&#x8282;&#x70B9;&#x7684;&#x5B50;&#x8282;&#x70B9;&#x3002;&#x603B;&#x7684;&#x6765;&#x8BF4;&#xFF0C;&#x5C42;&#x6B21;&#x7ED3;&#x6784;&#x8868;&#x73B0;&#x7684;&#x662F;&#x4ECE;CPU&#x89C6;&#x89D2;&#x6765;&#x770B;&#x7684;&#x7CFB;&#x7EDF;&#x89C6;&#x56FE;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#x8FD9;&#x68F5;&#x6811;&#x662F;&#x4F9D;&#x7136;&#x662F;&#x65E0;&#x6548;&#x7684;&#x3002;&#x5B83;&#x7F3A;&#x5C11;&#x5173;&#x4E8E;&#x8BBE;&#x5907;&#x4E4B;&#x95F4;&#x7684;&#x8FDE;&#x63A5;&#x4FE1;&#x606F;&#x3002;&#x7A0D;&#x540E;&#x5C06;&#x6DFB;&#x52A0;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#x3002;</p>
<p>&#x8BBE;&#x5907;&#x6811;&#x4E2D;&#x5E94;&#x5F53;&#x6CE8;&#x610F;&#xFF1A;&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x8282;&#x70B9;&#x6709;&#x4E00;&#x4E2A;compatible&#x5C5E;&#x6027;&#x3002;flash&#x8282;&#x70B9;&#x7684;compatible&#x5C5E;&#x6027;&#x6709;&#x4E24;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x3002;&#x8BF7;&#x9605;&#x8BFB;&#x4E0B;&#x4E00;&#x8282;&#x4EE5;&#x4E86;&#x89E3;&#x66F4;&#x591A;&#x5185;&#x5BB9;&#x3002; &#x4E4B;&#x524D;&#x63D0;&#x5230;&#x7684;&#xFF0C;&#x8282;&#x70B9;&#x547D;&#x540D;&#x5E94;&#x5F53;&#x53CD;&#x6620;&#x8BBE;&#x5907;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7279;&#x5B9A;&#x578B;&#x53F7;&#x3002;&#x8BF7;&#x53C2;&#x8003;ePAPR&#x89C4;&#x8303;2.2.2&#x8282;&#x7684;&#x901A;&#x7528;&#x8282;&#x70B9;&#x547D;&#x540D;&#xFF0C;&#x5E94;&#x4F18;&#x5148;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x547D;&#x540D;&#x3002;</p>
<h5 id="3%E3%80%81compatible-%E5%B1%9E%E6%80%A7">3&#x3001;compatible &#x5C5E;&#x6027;</h5>
<p>&#x6811;&#x4E2D;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x4EE3;&#x8868;&#x4E86;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x7684;&#x8282;&#x70B9;&#x90FD;&#x8981;&#x6709;&#x4E00;&#x4E2A;compatible&#x5C5E;&#x6027;&#x3002;compatible&#x662F;OS&#x7528;&#x6765;&#x51B3;&#x5B9A;&#x7ED1;&#x5B9A;&#x5230;&#x8BBE;&#x5907;&#x7684;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x7684;&#x5173;&#x952E;&#x3002;</p>
<p>compatible&#x662F;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x5217;&#x8868;&#x3002;&#x5217;&#x8868;&#x4E2D;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x6307;&#x5B9A;&#x4E86;&quot;<manufacturer>,<model>&quot;&#x683C;&#x5F0F;&#x7684;&#x8282;&#x70B9;&#x4EE3;&#x8868;&#x7684;&#x786E;&#x5207;&#x8BBE;&#x5907;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x4EE3;&#x8868;&#x4E86;&#x4E0E;&#x8BE5;&#x8BBE;&#x5907;&#x517C;&#x5BB9;&#x7684;&#x5176;&#x4ED6;&#x8BBE;&#x5907;&#x3002;&#x4F8B;&#x5982;&#xFF0C;Freescale MPC8349 SoC&#x6709;&#x4E00;&#x4E2A;&#x4E32;&#x53E3;&#x8BBE;&#x5907;&#x5B9E;&#x73B0;&#x4E86;National Semiconductor ns16550&#x5BC4;&#x5B58;&#x5668;&#x63A5;&#x53E3;&#x3002;&#x56E0;&#x6B64;MPC8349&#x4E32;&#x53E3;&#x8BBE;&#x5907;&#x7684;compatible&#x5C5E;&#x6027;&#x4E3A;&#xFF1A;compatible = &quot;fsl,mpc8349-uart&quot;, &quot;ns16550&quot;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#xFF0C;fsl,mpc8349-uart&#x6307;&#x5B9A;&#x4E86;&#x786E;&#x5207;&#x7684;&#x8BBE;&#x5907;&#xFF0C;ns16550&#x8868;&#x660E;&#x5B83;&#x4E0E;National Semiconductor 16550 UART&#x662F;&#x5BC4;&#x5B58;&#x5668;&#x7EA7;&#x517C;&#x5BB9;&#x7684;&#x3002;</model></manufacturer></p>
<p>&#x6CE8;&#xFF1A;&#x7531;&#x4E8E;&#x5386;&#x53F2;&#x539F;&#x56E0;&#xFF0C;ns16550&#x6CA1;&#x6709;&#x5236;&#x9020;&#x5546;&#x524D;&#x7F00;&#xFF0C;&#x6240;&#x6709;&#x65B0;&#x7684;compatible&#x503C;&#x90FD;&#x5E94;&#x4F7F;&#x7528;&#x5236;&#x9020;&#x5546;&#x7684;&#x524D;&#x7F00;&#x3002;&#x8FD9;&#x79CD;&#x505A;&#x6CD5;&#x4F7F;&#x5F97;&#x73B0;&#x6709;&#x7684;&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x7ED1;&#x5B9A;&#x5230;&#x4E00;&#x4E2A;&#x65B0;&#x8BBE;&#x5907;&#x4E0A;&#xFF0C;&#x540C;&#x65F6;&#x4ECD;&#x80FD;&#x552F;&#x4E00;&#x51C6;&#x786E;&#x7684;&#x8BC6;&#x522B;&#x786C;&#x4EF6;&#x3002;</p>
<h5 id="4%E3%80%81%E7%BC%96%E5%9D%80">4&#x3001;&#x7F16;&#x5740;</h5>
<p>&#x53EF;&#x7F16;&#x5740;&#x7684;&#x8BBE;&#x5907;&#x4F7F;&#x7528;&#x4E0B;&#x5217;&#x5C5E;&#x6027;&#x6765;&#x5C06;&#x5730;&#x5740;&#x4FE1;&#x606F;&#x7F16;&#x7801;&#x8FDB;&#x8BBE;&#x5907;&#x6811;&#xFF1A;</p>
<pre><code>reg

#address-cells

#size-cells
</code></pre>
<p>&#x6BCF;&#x4E2A;&#x53EF;&#x5BFB;&#x5740;&#x7684;&#x8BBE;&#x5907;&#x6709;&#x4E00;&#x4E2A;reg&#x5C5E;&#x6027;&#xFF0C;&#x5373;&#x4EE5;&#x4E0B;&#x9762;&#x5F62;&#x5F0F;&#x8868;&#x793A;&#x7684;&#x5143;&#x7EC4;&#x5217;&#x8868;&#xFF1A;</p>
<pre><code>      reg = &lt;address1 length1 [address2 length2] [address3 length3] ... &gt; 
</code></pre>
<p>&#x6BCF;&#x4E2A;&#x5143;&#x7EC4;,&#x3002;&#x6BCF;&#x4E2A;&#x5730;&#x5740;&#x503C;&#x7531;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;32&#x4F4D;&#x6574;&#x6570;&#x5217;&#x8868;&#x7EC4;&#x6210;&#xFF0C;&#x88AB;&#x79F0;&#x505A;cells&#x3002;&#x540C;&#x6837;&#x5730;&#xFF0C;&#x957F;&#x5EA6;&#x503C;&#x53EF;&#x4EE5;&#x662F;cells&#x5217;&#x8868;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4E3A;&#x7A7A;&#x3002;</p>
<p>&#x65E2;&#x7136;address&#x548C;length&#x5B57;&#x6BB5;&#x662F;&#x5927;&#x5C0F;&#x53EF;&#x53D8;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x7236;&#x8282;&#x70B9;&#x7684;#address-cells&#x548C;#size-cells&#x5C5E;&#x6027;&#x7528;&#x6765;&#x8BF4;&#x660E;&#x5404;&#x4E2A;&#x5B50;&#x8282;&#x70B9;&#x6709;&#x591A;&#x5C11;&#x4E2A;cells&#x3002;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x6B63;&#x786E;&#x89E3;&#x91CA;&#x4E00;&#x4E2A;&#x5B50;&#x8282;&#x70B9;&#x7684;reg&#x5C5E;&#x6027;&#x9700;&#x8981;&#x7236;&#x8282;&#x70B9;&#x7684;#address-cells&#x548C;#size-cells&#x503C;&#x3002;</p>
<h5 id="5%E3%80%81%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84%E8%AE%BE%E5%A4%87">5&#x3001;&#x5185;&#x5B58;&#x6620;&#x5C04;&#x8BBE;&#x5907;</h5>
<p>&#x4E0E;CPU&#x8282;&#x70B9;&#x4E2D;&#x7684;&#x5355;&#x4E00;&#x5730;&#x5740;&#x503C;&#x4E0D;&#x540C;&#xFF0C;&#x5185;&#x5B58;&#x6620;&#x5C04;&#x8BBE;&#x5907;&#x4F1A;&#x88AB;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x5B83;&#x80FD;&#x54CD;&#x5E94;&#x7684;&#x5730;&#x5740;&#x8303;&#x56F4;&#x3002;#size-cells&#x7528;&#x6765;&#x8BF4;&#x660E;&#x6BCF;&#x4E2A;&#x5B50;&#x8282;&#x70B9;&#x79CD;reg&#x5143;&#x7EC4;&#x7684;&#x957F;&#x5EA6;&#x5927;&#x5C0F;&#x3002;<br>
&#x5728;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x6BCF;&#x4E2A;&#x5730;&#x5740;&#x503C;&#x662F;1 cell (32&#x4F4D;) &#xFF0C;&#x5E76;&#x4E14;&#x6BCF;&#x4E2A;&#x7684;&#x957F;&#x5EA6;&#x503C;&#x4E5F;&#x4E3A;1 cell&#xFF0C;&#x8FD9;&#x5728;32&#x4F4D;&#x7CFB;&#x7EDF;&#x4E2D;&#x662F;&#x975E;&#x5E38;&#x5178;&#x578B;&#x7684;&#x3002;64&#x4F4D;&#x8BA1;&#x7B97;&#x673A;&#x53EF;&#x4EE5;&#x5728;&#x8BBE;&#x5907;&#x6811;&#x4E2D;&#x4F7F;&#x7528;2&#x4F5C;&#x4E3A;#address-cells&#x548C;#size-cells&#x7684;&#x503C;&#x6765;&#x5B9E;&#x73B0;64&#x4F4D;&#x5BFB;&#x5740;&#x3002;</p>
<pre><code>serial@101f2000 {
	compatible = &quot;arm,pl011&quot;;
	reg = &lt;0x101f2000 0x1000 &gt;;
};
 
gpio@101f3000 {
        compatible = &quot;arm,pl061&quot;;
        reg = &lt;0x101f3000 0x1000
               0x101f4000 0x0010&gt;;
};
 
 
interrupt-controller@10140000 {
        compatible = &quot;arm,pl190&quot;;
        reg = &lt;0x10140000 0x1000 &gt;;
};
</code></pre>
<p>&#x6BCF;&#x4E2A;&#x8BBE;&#x5907;&#x90FD;&#x88AB;&#x5206;&#x914D;&#x4E86;&#x4E00;&#x4E2A;&#x57FA;&#x5730;&#x5740;&#x53CA;&#x8BE5;&#x533A;&#x57DF;&#x5927;&#x5C0F;&#x3002;&#x672C;&#x4F8B;&#x4E2D;&#x7684;GPIO&#x8BBE;&#x5907;&#x5730;&#x5740;&#x88AB;&#x5206;&#x6210;&#x4E24;&#x4E2A;&#x5730;&#x5740;&#x8303;&#x56F4;:0x101f3000<sub>0x101f3fff&#x548C;0x101f4000</sub>0x101f400f&#x3002;</p>
<h3 id="%E4%B8%89%E3%80%81%E8%AE%BE%E5%A4%87%E6%A0%91%E5%9C%A8platform%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8%E8%A7%A3%E6%9E%90">&#x4E09;&#x3001;&#x8BBE;&#x5907;&#x6811;&#x5728;platform&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x5F00;&#x53D1;&#x4E2D;&#x7684;&#x4F7F;&#x7528;&#x89E3;&#x6790;</h3>
<p>&#x6211;&#x4EEC;&#x4ECD;&#x4EE5; Linux &#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x5F00;&#x53D1; &#x2014;&#x2014; platform&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x5E94;&#x7528;&#x5B9E;&#x4F8B;&#x89E3;&#x6790; &#x6587;&#x4E2D;&#x7684;&#x4F8B;&#x5B50;&#x6765;&#x89E3;&#x6790;&#x8BBE;&#x5907;&#x6811;&#x5728;platform&#x8BBE;&#x5907;&#x9A71;&#x52A8;&#x4E2D;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#xFF1B;</p>
<h5 id="1%E3%80%81%E8%AE%BE%E5%A4%87%E6%A0%91%E5%AF%B9platform%E4%B8%ADplatformdevice%E7%9A%84%E6%9B%BF%E6%8D%A2">1&#x3001;&#x8BBE;&#x5907;&#x6811;&#x5BF9;platform&#x4E2D;platform_device&#x7684;&#x66FF;&#x6362;</h5>
<p>&#x5176;&#x5B9E;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;Device Tree &#x662F;&#x7528;&#x6765;&#x63CF;&#x8FF0;&#x8BBE;&#x5907;&#x4FE1;&#x606F;&#x7684;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x5728;&#x8BBE;&#x5907;&#x6811;&#x4E2D;&#x662F;&#x4EE5;&#x8282;&#x70B9;&#x7684;&#x5F62;&#x5F0F;&#x8868;&#x73B0;&#x51FA;&#x6765;&#xFF1B;&#x800C;&#x5728;&#x4E0A;&#x9762;&#x7684; platform &#x8BBE;&#x5907;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5229;&#x7528;platform_device &#x6765;&#x63CF;&#x8FF0;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x4E00;&#x4E0B;&#x4E8C;&#x8005;&#x7684;&#x5BF9;&#x6BD4;</p>
<pre><code>fs4412-beep{
         compatible = &quot;fs4412,beep&quot;;
         reg = &lt; 0x114000a0 0x4  0x139D0000 0x14 &gt;;
};
</code></pre>
<p>a -- fs4412-beep &#x4E3A;&#x8282;&#x70B9;&#x540D;&#xFF0C;&#x7B26;&#x5408;&#x54B1;&#x4EEC;&#x524D;&#x9762;&#x63D0;&#x5230;&#x7684;&#x8282;&#x70B9;&#x547D;&#x540D;&#x89C4;&#x8303;;<br>
&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x540D;&#x5B57;&#x53EF;&#x4EE5;&#x77E5;&#x9053;&#xFF0C;&#x8BE5;&#x8282;&#x70B9;&#x63CF;&#x8FF0;&#x7684;&#x8BBE;&#x5907;&#x662F;beep, &#x8BBE;&#x5907;&#x540D;&#x662F;fs4412-beep&#xFF1B;</p>
<p>b -- compatible = &quot;fs4412,beep&quot;; compatible &#x5C5E;&#x6027;, &#x5373;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#xFF1B;<br>
&#x524D;&#x9762;&#x63D0;&#x5230;&#xFF0C; &#x6240;&#x6709;&#x65B0;&#x7684;compatible&#x503C;&#x90FD;&#x5E94;&#x4F7F;&#x7528;&#x5236;&#x9020;&#x5546;&#x7684;&#x524D;&#x7F00;&#xFF0C;&#x8FD9;&#x91CC;&#x662F;<br>
fs4412;</p>
<p>c --  reg = &lt; 0x114000a0 0x4  0x139D0000 0x14 &gt;;<br>
reg&#x5C5E;&#x6027;&#x6765;&#x5C06;&#x5730;&#x5740;&#x4FE1;&#x606F;&#x7F16;&#x7801;&#x8FDB;&#x8BBE;&#x5907;&#x6811;&#xFF0C;&#x8868;&#x793A;&#x8BE5;&#x8BBE;&#x5907;&#x7684;&#x5730;&#x5740;&#x8303;&#x56F4;;&#x8FD9;&#x91CC;&#x662F;&#x6211;&#x4EEC;&#x7528;&#x5230;&#x7684;&#x5BC4;&#x5B58;&#x5668;&#x53CA;&#x504F;&#x79FB;&#x91CF;&#xFF1B;</p>
<pre><code>static struct  resource beep_resource[] =
{
    [0] = {
        .start = 0x114000a0,
        .end = 0x114000a0+0x4,
        .flags = IORESOURCE_MEM,
    },
    [1] = {
        .start = 0x139D0000,
        .end = 0x139D0000+0x14,
        .flags = IORESOURCE_MEM,
    },
};
static struct platform_device hello_device=
{
    .name = &quot;bigbang&quot;,// &#x6CA1;&#x7528;&#x4E86;
    .id = -1,
    .dev.release = hello_release,
    .num_resources = ARRAY_SIZE(beep_resource ),
    .resource = beep_resource,
};
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8BBE;&#x5907;&#x6811;&#x4E2D;&#x7684;&#x8BBE;&#x5907;&#x8282;&#x70B9;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x66FF;&#x4EE3;&#x6389;platform_device&#x3002;</p>
<h5 id="2%E3%80%81%E6%9C%89%E4%BA%86%E8%AE%BE%E5%A4%87%E6%A0%91%EF%BC%8C%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0device-%E4%B8%8E-driver-%E7%9A%84%E5%8C%B9%E9%85%8D%EF%BC%9F">2&#x3001;&#x6709;&#x4E86;&#x8BBE;&#x5907;&#x6811;&#xFF0C;&#x5982;&#x4F55;&#x5B9E;&#x73B0;device &#x4E0E; driver &#x7684;&#x5339;&#x914D;&#xFF1F;</h5>
<p>&#x6211;&#x4EEC;&#x5728;&#x4E0A;&#x4E00;&#x7BC7;&#x8FD8;&#x6709; platform_device &#x4E2D;&#xFF0C;&#x662F;&#x5229;&#x7528; .name &#x6765;&#x5B9E;&#x73B0;device&#x4E0E;driver&#x7684;&#x5339;&#x914D;&#x7684;&#xFF0C;&#x4F46;&#x73B0;&#x5728;&#x8BBE;&#x5907;&#x6811;&#x66FF;&#x6362;&#x6389;&#x4E86;device&#xFF0C;&#x90A3;&#x6211;&#x4EEC;&#x5C06;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x4E8C;&#x8005;&#x7684;&#x5339;&#x914D;&#x5462;&#xFF1F;&#x6709;&#x4E86;&#x8BBE;&#x5907;&#x6811;&#x540E;&#xFF0C;platform&#x6BD4;&#x8F83;&#x7684;&#x540D;&#x5B57;&#x5B58;&#x5728;&#x54EA;&#xFF1F;</p>
<p>&#x6211;&#x4EEC;&#x5148;&#x770B;&#x4E00;&#x4E0B;&#x539F;&#x6765;&#x662F;&#x5982;&#x4F55;&#x5339;&#x914D;&#x7684; &#xFF0C;platform_bus_type &#x4E0B;&#x6709;&#x4E2A;match&#x6210;&#x5458;&#xFF0C;platform_match &#x5B9A;&#x4E49;&#x5982;&#x4E0B;</p>
<pre><code class="language-c">static int platform_match(struct device *dev, struct device_driver *drv)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct platform_driver *pdrv = to_platform_driver(drv);
 
	/* Attempt an OF style match first */
	if (of_driver_match_device(dev, drv))
		return 1;
 
	/* Then try ACPI style match */
	if (acpi_driver_match_device(dev, drv))
		return 1;
 
	/* Then try to match against the id table */
	if (pdrv-&gt;id_table)
		return platform_match_id(pdrv-&gt;id_table, pdev) != NULL;
 
	/* fall-back to driver name match */
	return (strcmp(pdev-&gt;name, drv-&gt;name) == 0);
}
</code></pre>
<p>&#x5176;&#x4E2D;&#x53C8;&#x8C03;&#x7528;&#x4E86;of_driver_match_device(dev, drv) &#xFF0C;&#x5176;&#x5B9A;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c">static inline int of_driver_match_device(struct device *dev,
					 const struct device_driver *drv)
{
	return of_match_device(drv-&gt;of_match_table, dev) != NULL;
}
</code></pre>
<p>&#x5176;&#x8C03;&#x7528;of_match_device(drv-&gt;of_match_table, dev) &#xFF0C;&#x7EE7;&#x7EED;&#x8FFD;&#x8E2A;&#x4E0B;&#x53BB;&#xFF0C;&#x6CE8;&#x610F;&#x8FD9;&#x91CC;&#x7684;&#x53C2;&#x6570; drv-&gt;of_match_table</p>
<pre><code class="language-c">const struct of_device_id *of_match_device(const struct of_device_id *matches,
					   const struct device *dev)
{
	if ((!matches) || (!dev-&gt;of_node))
		return NULL;
	return of_match_node(matches, dev-&gt;of_node);
}
EXPORT_SYMBOL(of_match_device);
</code></pre>
<p>&#x53C8;&#x8C03;&#x7528; of_match_node(matches, dev-&gt;of_node)  &#xFF0C;&#x5176;&#x4E2D;matches &#x662F; struct of_device_id &#x7C7B;&#x578B;&#x7684;</p>
<pre><code class="language-c">/**
 * of_match_node - Tell if an device_node has a matching of_match structure
 *	@matches:	array of of device match structures to search in
 *	@node:		the of device structure to match against
 *
 *	Low level utility function used by device matching.
 */
const struct of_device_id *of_match_node(const struct of_device_id *matches,
					 const struct device_node *node)
{
	const struct of_device_id *match;
	unsigned long flags;
 
	raw_spin_lock_irqsave(&amp;devtree_lock, flags);
	match = __of_match_node(matches, node);
	raw_spin_unlock_irqrestore(&amp;devtree_lock, flags);
	return match;
}
EXPORT_SYMBOL(of_match_node);
</code></pre>
<p>&#x627E;&#x5230; match = __of_match_node(matches, node); &#x6CE8;&#x610F;&#x7740;&#x91CC;&#x7684;node&#x662F;struct device_node &#x7C7B;&#x578B;&#x7684;</p>
<pre><code class="language-c">const struct of_device_id *__of_match_node(const struct of_device_id *matches,
					   const struct device_node *node)
{
	const struct of_device_id *best_match = NULL;
	int score, best_score = 0;
 
	if (!matches)
		return NULL;
 
	for (; matches-&gt;name[0] || matches-&gt;type[0] || matches-&gt;compatible[0]; matches++) {
		score = __of_device_is_compatible(node, matches-&gt;compatible,
						  matches-&gt;type, matches-&gt;name);
		if (score &gt; best_score) {
			best_match = matches;
			best_score = score;
		}
	}
 
	return best_match;
}
</code></pre>
<p>&#x7EE7;&#x7EED;&#x8FFD;&#x8E2A;&#x4E0B;&#x53BB;</p>
<pre><code class="language-c">static int __of_device_is_compatible(const struct device_node *device,
				     const char *compat, const char *type, const char *name)
{
	struct property *prop;
	const char *cp;
	int index = 0, score = 0;
 
	/* Compatible match has highest priority */
	if (compat &amp;&amp; compat[0]) {
		prop = __of_find_property(device, &quot;compatible&quot;, NULL);
		for (cp = of_prop_next_string(prop, NULL); cp;
		     cp = of_prop_next_string(prop, cp), index++) {
			if (of_compat_cmp(cp, compat, strlen(compat)) == 0) {
				score = INT_MAX/2 - (index &lt;&lt; 2);
				break;
			}
		}
		if (!score)
			return 0;
	}
 
	/* Matching type is better than matching name */
	if (type &amp;&amp; type[0]) {
		if (!device-&gt;type || of_node_cmp(type, device-&gt;type))
			return 0;
		score += 2;
	}
 
	/* Matching name is a bit better than not */
	if (name &amp;&amp; name[0]) {
		if (!device-&gt;name || of_node_cmp(name, device-&gt;name))
			return 0;
		score++;
	}
 
	return score;
}
</code></pre>
<p>&#x770B;&#x8FD9;&#x53E5; prop = __of_find_property(device, &quot;compatible&quot;, NULL);<br>
&#x53EF;&#x4EE5;&#x53D1;&#x5148;&#x8FFD;&#x6EAF;&#x5230;&#x5E95;&#xFF0C;&#x662F;&#x5229;&#x7528;&quot;compatible&quot;&#x6765;&#x5339;&#x914D;&#x7684;&#xFF0C;&#x5373;&#x8BBE;&#x5907;&#x6811;&#x52A0;&#x8F7D;&#x4E4B;&#x540E;&#xFF0C;&#x5185;&#x6838;&#x4F1A;&#x81EA;&#x52A8;&#x628A;&#x8BBE;&#x5907;&#x6811;&#x8282;&#x70B9;&#x8F6C;&#x6362;&#x6210; platform_device&#x8FD9;&#x79CD;&#x683C;&#x5F0F;&#xFF0C;&#x540C;&#x65F6;&#x628A;&#x540D;&#x5B57;&#x653E;&#x5230;of_node&#x8FD9;&#x4E2A;&#x5730;&#x65B9;&#x3002;</p>
<h3 id="platformdriver-%E9%83%A8%E5%88%86">platform_driver &#x90E8;&#x5206;</h3>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x539F;&#x6765;&#x662F;&#x5229;&#x7528;platform_driver &#x4E0B;&#x7684; struct driver &#x7ED3;&#x6784;&#x4F53;&#x4E2D;&#x7684; name &#x6210;&#x5458;&#x6765;&#x5339;&#x914D;&#x7684;&#xFF0C;&#x770B;&#x4E00;&#x4E0B; struct driver &#x7ED3;&#x6784;&#x4F53;&#x7684;&#x5B9A;&#x4E49;&#xFF1A;</p>
<pre><code class="language-c">struct device_driver {
	const char		*name;
	struct bus_type		*bus;
 
	struct module		*owner;
	const char		*mod_name;	/* used for built-in modules */
 
	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */
 
	const struct of_device_id	*of_match_table;
	const struct acpi_device_id	*acpi_match_table;
 
	int (*probe) (struct device *dev);
	int (*remove) (struct device *dev);
	void (*shutdown) (struct device *dev);
	int (*suspend) (struct device *dev, pm_message_t state);
	int (*resume) (struct device *dev);
	const struct attribute_group **groups;
 
	const struct dev_pm_ops *pm;
 
	struct driver_private *p;
}
</code></pre>
<p>&#x6210;&#x5458;&#x4E2D;&#x6709;const struct of_device_id *of_match_table; &#x662F;struct of_device_id &#x7C7B;&#x578B;&#xFF0C;&#x5B9A;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c">/*
 * Struct used for matching a device
 */
struct of_device_id
{
	char	name[32];
	char	type[32];
	char	compatible[128];
	const void *data;
};
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x5176;&#x4F5C;&#x7528;&#x5C31;&#x662F;&#x4E3A;&#x4E86;&#x5339;&#x914D;&#x4E00;&#x4E2A;&#x8BBE;&#x5907;&#x3002;&#x6211;&#x4EEC;&#x6240;&#x8981;&#x505A;&#x7684;&#x5C31;&#x662F;&#x5BF9; char compatible[128] &#x7684;&#x586B;&#x5145;&#xFF1B;&#x8BBE;&#x5907;&#x6811;&#x52A0;&#x8F7D;&#x4E4B;&#x540E;&#xFF0C;&#x5185;&#x6838;&#x4F1A;&#x81EA;&#x52A8;&#x628A;&#x8BBE;&#x5907;&#x6811;&#x8282;&#x70B9;&#x8F6C;&#x6362;&#x6210; platform_device&#x8FD9;&#x79CD;&#x683C;&#x5F0F;&#xFF0C;&#x540C;&#x65F6;&#x628A;&#x540D;&#x5B57;&#x653E;&#x5230;of_node&#x8FD9;&#x4E2A;&#x5730;&#x65B9;&#x3002;</p>
<h5 id="3%E3%80%81%E5%9F%BA%E4%BA%8E%E8%AE%BE%E5%A4%87%E6%A0%91%E7%9A%84driver%E7%9A%84%E7%BB%93%E6%9E%84%E4%BD%93%E7%9A%84%E5%A1%AB%E5%85%85">3&#x3001;&#x57FA;&#x4E8E;&#x8BBE;&#x5907;&#x6811;&#x7684;driver&#x7684;&#x7ED3;&#x6784;&#x4F53;&#x7684;&#x586B;&#x5145;</h5>
<p>&#x5339;&#x914D;&#x7684;&#x65B9;&#x5F0F;&#x53D1;&#x751F;&#x4E86;&#x6539;&#x53D8;&#xFF0C;&#x90A3;&#x6211;&#x4EEC;&#x7684;platform_driver &#x4E5F;&#x8981;&#x4FEE;&#x6539;&#x4E86;</p>
<p>&#x57FA;&#x4E8E;&#x8BBE;&#x5907;&#x6811;&#x7684;driver&#x7684;&#x7ED3;&#x6784;&#x4F53;&#x7684;&#x586B;&#x5145;&#xFF1A;</p>
<pre><code class="language-c">static struct of_device_id beep_table[] = {
    {.compatible = &quot;fs4412,beep&quot;},
};
static struct platform_driver beep_driver=
{
    .probe = beep_probe,
    .remove = beep_remove,
    .driver={
        .name = &quot;bigbang&quot;,
        .of_match_table = beep_table,
    },
};
</code></pre>
<p>&#x539F;&#x6765;&#x7684;driver&#x662F;&#x8FD9;&#x6837;&#x7684;&#xFF0C;&#x53EF;&#x4EE5;&#x5BF9;&#x6BD4;&#x4E00;&#x4E0B;</p>
<pre><code class="language-c">static struct platform_driver beep_driver=
{
    .driver.name = &quot;bigbang&quot;,
    .probe = beep_probe,
    .remove = beep_remove,
};
</code></pre>
<h5 id="4%E3%80%81%E8%AE%BE%E5%A4%87%E6%A0%91%E7%BC%96%E8%AF%91">4&#x3001;&#x8BBE;&#x5907;&#x6811;&#x7F16;&#x8BD1;</h5>
<p>&#x6211;&#x4EEC;&#x5728; arch/arm/boot/dts/exynos4412-fs4412.dts &#x4E2D;&#x6DFB;&#x52A0;</p>
<pre><code class="language-c">fs4412-beep{
         compatible = &quot;fs4412,beep&quot;;
         reg = &lt;0x114000a0 0x4 0x139D0000 0x14&gt;;
};
</code></pre>
<p>&#x5C31;&#x53EF;&#x4EE5;&#x7F16;&#x8BD1;&#x8BBE;&#x5907;&#x6811;&#x4E86;<br>
make dtbs  &#x5728;&#x5185;&#x6838;&#x6839;&#x76EE;&#x5F55;</p>
<pre><code class="language-bash">vim arch/arm/boot/dts/exynos4412-fs4412.dts
sudo cp  arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x5C06;&#x8BBE;&#x5907;&#x6811;&#x4E0B;&#x8F7D;&#x5230;0x42000000&#x5904;&#xFF0C;&#x5E76;&#x52A0;&#x8F7D;&#x9A71;&#x52A8; insmod driver.ko, &#x6D4B;&#x8BD5;&#x4E0B;&#x9A71;&#x52A8;&#x3002;</p>
<hr>
<p>&#x7248;&#x6743;&#x58F0;&#x660E;&#xFF1A;&#x672C;&#x6587;&#x4E3A;CSDN&#x535A;&#x4E3B;&#x300C;zqixiao_09&#x300D;&#x7684;&#x539F;&#x521B;&#x6587;&#x7AE0;&#xFF0C;&#x9075;&#x5FAA;CC 4.0 BY-SA&#x7248;&#x6743;&#x534F;&#x8BAE;&#xFF0C;&#x8F6C;&#x8F7D;&#x8BF7;&#x9644;&#x4E0A;&#x539F;&#x6587;&#x51FA;&#x5904;&#x94FE;&#x63A5;&#x53CA;&#x672C;&#x58F0;&#x660E;&#x3002;<br>
&#x539F;&#x6587;&#x94FE;&#x63A5;&#xFF1A;<a href="https://blog.csdn.net/zqixiao_09/article/details/50889458">https://blog.csdn.net/zqixiao_09/article/details/50889458</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>