{"@attributes":{"version":"2.0"},"channel":{"title":"ioxera's blog","link":"https:\/\/ioxera.github.io\/","description":"Recent content on ioxera's blog","generator":"Hugo","language":"zh-cn","lastBuildDate":"Mon, 20 Nov 2023 20:27:36 +0000","item":[{"title":"\u8bed\u6cd5\u5206\u6790","link":"https:\/\/ioxera.github.io\/docs\/%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90\/","pubDate":"Mon, 20 Nov 2023 20:27:36 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90\/","description":"<p>\u5bf9\u4e8e\u6587\u6cd5G(S)\u7684\u975e\u7ec8\u7ed3\u7b26\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>A<\/mi><mo>\u2192<\/mo><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mn>2<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>n<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">A \\rightarrow \\alpha_1|\\alpha_2|...|\\alpha_n<\/annotation><\/semantics><\/math><\/span>\n\n\n\uff0c\u5b9a\u4e49\uff1a<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>F<\/mi><mi>I<\/mi><mi>R<\/mi><mi>S<\/mi><mi>T<\/mi><mo stretchy=\"false\">(<\/mo><mi>A<\/mi><mo stretchy=\"false\">)<\/mo><mo>=<\/mo><mo stretchy=\"false\">{<\/mo><mi>a<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>i<\/mi><\/msub><mover><mo><mo>\u21d2<\/mo><\/mo><mo lspace=\"0em\" rspace=\"0em\">\u2217<\/mo><\/mover><mi>a<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mo separator=\"true\">,<\/mo><mi>a<\/mi><mo>\u2208<\/mo><msub><mi>V<\/mi><mi>T<\/mi><\/msub><mo stretchy=\"false\">}<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">FIRST(A) = \\{a|\\alpha_i \\mathop{\\Rightarrow}\\limits^{\\ast} a..., a \\in V_T\\}<\/annotation><\/semantics><\/math><\/span>\n\n\n<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>F<\/mi><mi>O<\/mi><mi>L<\/mi><mi>L<\/mi><mi>O<\/mi><mi>W<\/mi><mo stretchy=\"false\">(<\/mo><mi>A<\/mi><mo stretchy=\"false\">)<\/mo><mo>=<\/mo><mo stretchy=\"false\">{<\/mo><mi>a<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><mi>S<\/mi><mover><mo><mo>\u21d2<\/mo><\/mo><mo lspace=\"0em\" rspace=\"0em\">\u2217<\/mo><\/mover><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi>A<\/mi><mi>a<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mo separator=\"true\">,<\/mo><mi>a<\/mi><mo>\u2208<\/mo><msub><mi>V<\/mi><mi>T<\/mi><\/msub><mo stretchy=\"false\">}<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">FOLLOW(A) = \\{a|S\\mathop{\\Rightarrow}\\limits^{\\ast}...Aa..., a \\in V_T\\}<\/annotation><\/semantics><\/math><\/span>\n\n\n<\/p>\n<h2 id=\"\u7531\u4e0a\u81f3\u4e0b\u5206\u6790\">\u7531\u4e0a\u81f3\u4e0b\u5206\u6790<a class=\"anchor\" href=\"#%e7%94%b1%e4%b8%8a%e8%87%b3%e4%b8%8b%e5%88%86%e6%9e%90\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u4ece\u6587\u6cd5\u7684\u5f00\u59cb\u7b26\u53f7\u51fa\u53d1\uff0c\u53cd\u590d\u4f7f\u7528\u5404\u79cd\u4ea7\u751f\u5f0f\uff0c\u5bfb\u627e\u201c\u5339\u914d\u201d\u7684\u63a8\u5bfc\uff0c\u81ea\u9876\u5411\u4e0b\u5206\u6790\u4e5f\u53ef\u4ee5\u770b\u4f5c\u662f\u4ece\u5f00\u59cb\u7b26\u53f7\u51fa\u53d1\uff0c\u5bfb\u627e\u8f93\u5165\u4e32\u7684\u6700\u5de6\u63a8\u5bfc\u8fc7\u7a0b\u3002\u81ea\u9876\u5411\u4e0b\u8bed\u6cd5\u5206\u6790\u7684\u5173\u952e\u95ee\u9898\u662f\u5bf9\u4e8e\u975e\u7ec8\u7ed3\u7b26\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>A<\/mi><mo>\u2192<\/mo><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mn>2<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>n<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">A \\rightarrow \\alpha_1|\\alpha_2|...|\\alpha_n<\/annotation><\/semantics><\/math><\/span>\n\n\n\uff0c\u5e94\u8be5\u9009\u62e9\u54ea\u4e2a\u4ea7\u751f\u5f0f\u3002<\/p>\n<p>\u63a8\u5bfc\uff1a\u6839\u636e\u6587\u6cd5\u7684\u4ea7\u751f\u5f0f\u89c4\u5219\uff0c\u628a\u4e32\u4e2d\u51fa\u73b0\u7684\u4ea7\u751f\u5f0f\u5de6\u90e8\u7b26\u53f7\u66ff\u6362\u6210\u53f3\u90e8\u7b26\u53f7\u3002<\/p>\n<p>\u5206\u6790\u65b9\u6cd5\uff1a\u9012\u5f52\u4e0b\u964d\u5206\u6790\u6cd5\uff0c\u9884\u6d4b\u5206\u6790\u6cd5<\/p>\n<h3 id=\"\u9012\u5f52\u4e0b\u964d\u5206\u6790\u6cd5\">\u9012\u5f52\u4e0b\u964d\u5206\u6790\u6cd5<a class=\"anchor\" href=\"#%e9%80%92%e5%bd%92%e4%b8%8b%e9%99%8d%e5%88%86%e6%9e%90%e6%b3%95\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u5206\u6790\u7a0b\u5e8f\u7531\u4e00\u7ec4\u5b50\u7a0b\u5e8f\u7ec4\u6210\uff0c\u5bf9\u4e8e\u6bcf\u4e2a\u8bed\u6cd5\u5355\u4f4d\uff08\u975e\u7ec8\u7ed3\u7b26\uff09\u6784\u9020\u4e00\u4e2a\u76f8\u5e94\u7684\u5b50\u7a0b\u5e8f\uff0c\u8bc6\u522b\u5bf9\u5e94\u7684\u8bed\u6cd5\u5355\u4f4d\uff0c\u901a\u8fc7\u5b50\u7a0b\u5e8f\u95f4\u7684\u76f8\u4e92\u8c03\u7528\u5b9e\u73b0\u5bf9\u8f93\u5165\u4e32\u7684\u8bc6\u522b\u3002<br>\nvoid A(){<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"1em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\quad<\/annotation><\/semantics><\/math><\/span>\n\n\n\u9009\u62e9\u4e00\u4e2aA\u7684\u4ea7\u751f\u5f0f\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>A<\/mi><mo>\u2192<\/mo><msub><mi>X<\/mi><mn>1<\/mn><\/msub><msub><mi>X<\/mi><mn>2<\/mn><\/msub><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><msub><mi>X<\/mi><mi>n<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">A \\rightarrow X_1X_2...X_n<\/annotation><\/semantics><\/math><\/span>\n\n\n<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"1em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\quad<\/annotation><\/semantics><\/math><\/span>\n\n\nfor(i=1 to k){<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"2em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\qquad<\/annotation><\/semantics><\/math><\/span>\n\n\nif(\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>X<\/mi><mi>i<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">X_i<\/annotation><\/semantics><\/math><\/span>\n\n\n\u662f\u4e00\u4e2a\u975e\u7ec8\u7ed3\u7b26)\u8c03\u7528\u8fc7\u7a0b\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>X<\/mi><mi>i<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">X_i<\/annotation><\/semantics><\/math><\/span>\n\n\n;<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"2em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\qquad<\/annotation><\/semantics><\/math><\/span>\n\n\nelse if(\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>X<\/mi><mi>i<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">X_i<\/annotation><\/semantics><\/math><\/span>\n\n\n\u7b49\u4e8e\u5f53\u524d\u8f93\u5165\u7b26\u53f7a)\u8bfb\u5165\u4e0b\u4e00\u4e2a\u8f93\u5165\u7b26\u53f7;<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"2em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\qquad<\/annotation><\/semantics><\/math><\/span>\n\n\nelse \u4e0d\u5339\u914d\u5f53\u524d\u5019\u9009\u5f0f\uff0c\u5c1d\u8bd5\u4e0b\u4e00\u4e2a<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"1em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\quad<\/annotation><\/semantics><\/math><\/span>\n\n\n}<br>\n}<\/p>\n<p>\u9012\u5f52\u4e0b\u964d\u5206\u6790\u5b58\u5728\u4ee5\u4e0b\u95ee\u9898\uff1a<\/p>\n<ul>\n<li><strong>\u6587\u6cd5\u5de6\u9012\u5f52<\/strong><\/li>\n<\/ul>\n<p>\u76f4\u63a5\u5de6\u9012\u5f52\u6d88\u9664\uff1a<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>P<\/mi><mo>\u2192<\/mo><mi>P<\/mi><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi>P<\/mi><msub><mi>\u03b1<\/mi><mn>2<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><mi>P<\/mi><msub><mi>\u03b1<\/mi><mi>m<\/mi><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b2<\/mi><mn>1<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b2<\/mi><mn>2<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b2<\/mi><mi>n<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">P \\rightarrow P\\alpha_1|P\\alpha_2|...|P\\alpha_m|\\beta_1|\\beta_2|...|\\beta_n<\/annotation><\/semantics><\/math><\/span>\n\n\n<br>\n\u53d8\u6362\u4e3a\uff1a<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>P<\/mi><mo>\u2192<\/mo><msub><mi>\u03b2<\/mi><mn>1<\/mn><\/msub><msup><mi>P<\/mi><mo mathvariant=\"normal\" lspace=\"0em\" rspace=\"0em\">\u2032<\/mo><\/msup><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b2<\/mi><mn>2<\/mn><\/msub><msup><mi>P<\/mi><mo mathvariant=\"normal\" lspace=\"0em\" rspace=\"0em\">\u2032<\/mo><\/msup><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b2<\/mi><mi>n<\/mi><\/msub><mi>P<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">P \\rightarrow \\beta_1P&#x27;|\\beta_2P&#x27;|...|\\beta_nP<\/annotation><\/semantics><\/math><\/span>\n\n\n<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msup><mi>P<\/mi><mo mathvariant=\"normal\" lspace=\"0em\" rspace=\"0em\">\u2032<\/mo><\/msup><mo>\u2192<\/mo><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><msup><mi>P<\/mi><mo mathvariant=\"normal\" lspace=\"0em\" rspace=\"0em\">\u2032<\/mo><\/msup><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mn>2<\/mn><\/msub><msup><mi>P<\/mi><mo mathvariant=\"normal\" lspace=\"0em\" rspace=\"0em\">\u2032<\/mo><\/msup><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>m<\/mi><\/msub><msup><mi>P<\/mi><mo mathvariant=\"normal\" lspace=\"0em\" rspace=\"0em\">\u2032<\/mo><\/msup><mi mathvariant=\"normal\">\u2223<\/mi><mi>\u03b5<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">P&#x27; \\rightarrow \\alpha_1P&#x27;|\\alpha_2P&#x27;|...|\\alpha_m P&#x27;|\\varepsilon<\/annotation><\/semantics><\/math><\/span>\n\n\n<\/p>\n<p>\u95f4\u63a5\u5de6\u9012\u5f52\u6d88\u9664\uff1a<\/p>\n<ol>\n<li>\u628a\u6587\u6cd5G\u7684\u6240\u6709\u975e\u7ec8\u7ed3\u7b26\u6309\u4efb\u610f\u4e00\u79cd\u987a\u5e8f\u6392\u5217\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>P<\/mi><mn>1<\/mn><\/msub><mo separator=\"true\">,<\/mo><msub><mi>P<\/mi><mn>2<\/mn><\/msub><mo separator=\"true\">,<\/mo><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mo separator=\"true\">,<\/mo><msub><mi>P<\/mi><mi>n<\/mi><\/msub><mo separator=\"true\">;<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">P_1,P_2,...,P_n;<\/annotation><\/semantics><\/math><\/span>\n\n\n<\/li>\n<li>FOR i=1 TO n DO<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"1em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\quad<\/annotation><\/semantics><\/math><\/span>\n\n\n FOR j=1 TO i-1 DO<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"2em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\qquad<\/annotation><\/semantics><\/math><\/span>\n\n\n \u628a\u5f62\u5982\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>P<\/mi><mi>i<\/mi><\/msub><mo>\u2192<\/mo><msub><mi>P<\/mi><mi>j<\/mi><\/msub><mi>\u03b3<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">P_i \\rightarrow P_j \\gamma<\/annotation><\/semantics><\/math><\/span>\n\n\n\u7684\u89c4\u5219\u6539\u5199\u6210\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>P<\/mi><mi>i<\/mi><\/msub><mo>\u2192<\/mo><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><mi>\u03b3<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mn>2<\/mn><\/msub><mi>\u03b3<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>k<\/mi><\/msub><mi>\u03b3<\/mi><mo separator=\"true\">;<\/mo><\/mrow><annotation encoding=\"application\/x-tex\">P_i \\rightarrow \\alpha_1 \\gamma|\\alpha_2 \\gamma|...|\\alpha_k \\gamma;<\/annotation><\/semantics><\/math><\/span>\n\n\n(\u5176\u4e2d\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>P<\/mi><mi>j<\/mi><\/msub><mo>\u2192<\/mo><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mn>2<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>k<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">P_j \\rightarrow \\alpha_1|\\alpha_2|...|\\alpha_k<\/annotation><\/semantics><\/math><\/span>\n\n\n\u662f\u5173\u4e8e\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>P<\/mi><mi>j<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">P_j<\/annotation><\/semantics><\/math><\/span>\n\n\n\u7684\u6240\u6709\u89c4\u5219)<br>\n\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mspace width=\"1em\"\/><\/mrow><annotation encoding=\"application\/x-tex\">\\quad<\/annotation><\/semantics><\/math><\/span>\n\n\n \u6d88\u9664\u5173\u4e8e\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><msub><mi>P<\/mi><mi>i<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">P_i<\/annotation><\/semantics><\/math><\/span>\n\n\n\u89c4\u5219\u7684\u76f4\u63a5\u5de6\u9012\u5f52<\/li>\n<li>\u5316\u7b80\u75312\u6240\u5f97\u7684\u6587\u6cd5\uff0c\u53bb\u9664\u4ece\u5f00\u59cb\u7b26\u53f7\u51fa\u53d1\u6c38\u8fdc\u65e0\u6cd5\u5230\u8fbe\u7684\u975e\u7ec8\u7ed3\u7b26\u7684\u4ea7\u751f\u89c4\u5219\u3002<\/li>\n<\/ol>\n<ul>\n<li><strong>\u5019\u9009\u5f0f\u5339\u914d\u56de\u6eaf<\/strong><\/li>\n<\/ul>\n<p>\u5bf9\u4e8e\u6587\u6cd5G(S)\u4e2d\u7684\u4efb\u4f55\u975e\u7ec8\u7ed3\u7b26\n <span class=\"katex\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>A<\/mi><mo>\u2192<\/mo><msub><mi>\u03b1<\/mi><mn>1<\/mn><\/msub><mi mathvariant=\"normal\">\u2223<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">.<\/mi><mi mathvariant=\"normal\">\u2223<\/mi><msub><mi>\u03b1<\/mi><mi>n<\/mi><\/msub><\/mrow><annotation encoding=\"application\/x-tex\">A\\rightarrow\\alpha_1|...|\\alpha_n<\/annotation><\/semantics><\/math><\/span>\n\n\n\uff0c\u4fee\u6539\u6587\u6cd5\u4f7f\u5176\u6ee1\u8db3\u4ee5\u4e0b\u6761\u4ef6\u4ee5\u6d88\u9664\u56de\u6eaf\u3002<\/p>"},{"title":"\u4f7f\u7528Codeql\u8fdb\u884c\u6c61\u70b9\u8ddf\u8e2a","link":"https:\/\/ioxera.github.io\/docs\/%E4%BD%BF%E7%94%A8codeql%E8%BF%9B%E8%A1%8C%E6%B1%A1%E7%82%B9%E8%B7%9F%E8%B8%AA\/","pubDate":"Wed, 26 Oct 2022 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E4%BD%BF%E7%94%A8codeql%E8%BF%9B%E8%A1%8C%E6%B1%A1%E7%82%B9%E8%B7%9F%E8%B8%AA\/","description":"<h2 id=\"codeql-\u7b80\u4ecb\">Codeql \u7b80\u4ecb<a class=\"anchor\" href=\"#codeql-%e7%ae%80%e4%bb%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p>CodeQL \u662f\u5f00\u53d1\u4eba\u5458\u7528\u6765\u81ea\u52a8\u6267\u884c\u5b89\u5168\u68c0\u67e5\u4ee5\u53ca\u5b89\u5168\u7814\u7a76\u4eba\u5458\u7528\u6765\u6267\u884c\u53d8\u4f53\u5206\u6790\u7684\u5206\u6790\u5f15\u64ce\u3002<\/p>\n<p>\u5728 CodeQL \u4e2d\uff0c\u4ee3\u7801\u88ab\u89c6\u4e3a\u6570\u636e\u3002\u5b89\u5168\u6f0f\u6d1e\u3001\u9519\u8bef\u548c\u5176\u4ed6\u9519\u8bef\u88ab\u5efa\u6a21\u4e3a\u53ef\u4ee5\u4ece\u4ee3\u7801\u4e2d\u63d0\u53d6\u7684\u6570\u636e\u5e93\u6267\u884c\u7684\u67e5\u8be2\u3002\u53ef\u4ee5\u8fd0\u884c\u7531 GitHub \u7814\u7a76\u4eba\u5458\u548c\u793e\u533a\u8d21\u732e\u8005\u7f16\u5199\u7684\u6807\u51c6 CodeQL \u67e5\u8be2\uff0c\u6216\u8005\u7f16\u5199\u81ea\u5df1\u7684\u67e5\u8be2\u4ee5\u7528\u4e8e\u81ea\u5b9a\u4e49\u5206\u6790\u3002\u53d1\u73b0\u6f5c\u5728\u9519\u8bef\u7684\u67e5\u8be2\u76f4\u63a5\u5728\u6e90\u6587\u4ef6\u4e2d\u7a81\u51fa\u663e\u793a\u7ed3\u679c\u3002<\/p>\n<h2 id=\"ql\u8bed\u8a00\u7b80\u4ecb\">QL\u8bed\u8a00\u7b80\u4ecb<a class=\"anchor\" href=\"#ql%e8%af%ad%e8%a8%80%e7%ae%80%e4%bb%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p>QL \u662f\u4e00\u79cd\u58f0\u660e\u5f0f\u7684\u3001\u9762\u5411\u5bf9\u8c61\u7684\u67e5\u8be2\u8bed\u8a00\uff0c\u7ecf\u8fc7\u4f18\u5316\u53ef\u4ee5\u6709\u6548\u5206\u6790\u5206\u5c42\u6570\u636e\u7ed3\u6784\uff0c\u7279\u522b\u662f\u8868\u793a\u8f6f\u4ef6\u7ec4\u4ef6\u7684\u6570\u636e\u5e93\u3002<\/p>\n<p>QL \u7684\u8bed\u6cd5\u7c7b\u4f3c\u4e8e SQL\uff0c\u4f46 QL \u7684\u8bed\u4e49\u57fa\u4e8e Datalog\uff0c\u4e00\u79cd\u7ecf\u5e38\u7528\u4f5c\u67e5\u8be2\u8bed\u8a00\u7684\u58f0\u660e\u5f0f\u903b\u8f91\u7f16\u7a0b\u8bed\u8a00\u3002\u8fd9\u4f7f\u5f97 QL \u4e3b\u8981\u662f\u4e00\u79cd\u903b\u8f91\u8bed\u8a00\uff0cQL \u4e2d\u7684\u6240\u6709\u64cd\u4f5c\u90fd\u662f\u903b\u8f91\u64cd\u4f5c\u3002\u6b64\u5916\uff0cQL \u7ee7\u627f\u4e86 Datalog \u7684\u9012\u5f52\u8c13\u8bcd\uff0c\u5e76\u589e\u52a0\u4e86\u5bf9\u805a\u5408\u7684\u652f\u6301\uff0c\u5373\u4f7f\u662f\u590d\u6742\u7684\u67e5\u8be2\u4e5f\u53d8\u5f97\u7b80\u6d01\u660e\u3002\u4f8b\u5982\uff0c\u8003\u8651\u4e00\u4e2a\u5305\u542b\u4eba\u7684\u7236\u5b50\u5173\u7cfb\u7684\u6570\u636e\u5e93\u3002\u5982\u679c\u6211\u4eec\u60f3\u627e\u5230\u4e00\u4e2a\u4eba\u7684\u540e\u4ee3\u6570\u91cf\uff0c\u901a\u5e38\u6211\u4eec\u4f1a\uff1a<\/p>\n<ol>\n<li>\u67e5\u627e\u7ed9\u5b9a\u4eba\u7684\u540e\u4ee3\uff0c\u5373\u5b69\u5b50\u6216\u5b69\u5b50\u7684\u540e\u4ee3\u3002<\/li>\n<li>\u8ba1\u7b97\u4f7f\u7528\u4e0a\u4e00\u6b65\u627e\u5230\u7684\u540e\u4ee3\u6570\u3002<\/li>\n<\/ol>\n<p>\u5f53\u4f60\u7528 QL \u7f16\u5199\u8fd9\u4e2a\u8fc7\u7a0b\u65f6\uff0c\u5b83\u975e\u5e38\u7c7b\u4f3c\u4e8e\u4e0a\u9762\u7684\u7ed3\u6784\u3002\u8bf7\u6ce8\u610f\uff0c\u6211\u4eec\u4f7f\u7528\u9012\u5f52\u6765\u67e5\u627e\u7ed9\u5b9a\u4eba\u7684\u6240\u6709\u540e\u4ee3\uff0c\u5e76\u4f7f\u7528\u805a\u5408\u6765\u8ba1\u7b97\u540e\u4ee3\u7684\u6570\u91cf\u3002\u7531\u4e8e\u8bed\u8a00\u7684\u58f0\u660e\u6027\u8d28\uff0c\u5728\u4e0d\u6dfb\u52a0\u4efb\u4f55\u8fc7\u7a0b\u7ec6\u8282\u7684\u60c5\u51b5\u4e0b\u5c06\u8fd9\u4e9b\u6b65\u9aa4\u8f6c\u6362\u4e3a\u6700\u7ec8\u67e5\u8be2\u662f\u53ef\u80fd\u7684\u3002QL \u4ee3\u7801\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre tabindex=\"0\"><code class=\"language-ql\" data-lang=\"ql\">Person getADescendant(Person p) {\n result = p.getAChild() or\n result = getADescendant(p.getAChild())\n}\n\nint getNumberOfDescendants(Person p) {\n result = count(getADescendant(p))\n}<\/code><\/pre><p>\u4ee5\u4e0b\u662f\u901a\u7528\u7f16\u7a0b\u8bed\u8a00\u548c QL \u4e4b\u95f4\u5728\u6982\u5ff5\u548c\u529f\u80fd\u4e0a\u7684\u4e00\u4e9b\u663e\u8457\u5dee\u5f02\uff1a<\/p>\n<ul>\n<li>QL \u6ca1\u6709\u4efb\u4f55\u547d\u4ee4\u5f0f\u529f\u80fd\uff0c\u4f8b\u5982\u53d8\u91cf\u8d4b\u503c\u6216\u6587\u4ef6\u7cfb\u7edf\u64cd\u4f5c\u3002<\/li>\n<li>QL \u5bf9\u5143\u7ec4\u96c6\u8fdb\u884c\u64cd\u4f5c\uff0c\u67e5\u8be2\u53ef\u4ee5\u88ab\u89c6\u4e3a\u5b9a\u4e49\u67e5\u8be2\u7ed3\u679c\u7684\u4e00\u7ec4\u590d\u6742\u7684\u64cd\u4f5c\u5e8f\u5217\u3002<\/li>\n<li>QL \u57fa\u4e8e\u96c6\u5408\u7684\u8bed\u4e49\u4f7f\u5f97\u5904\u7406\u503c\u96c6\u5408\u53d8\u5f97\u975e\u5e38\u81ea\u7136\uff0c\u800c\u4e0d\u5fc5\u62c5\u5fc3\u5982\u4f55\u6709\u6548\u5730\u5b58\u50a8\u3001\u7d22\u5f15\u548c\u904d\u5386\u5b83\u4eec\u3002<\/li>\n<li>\u5728\u9762\u5411\u5bf9\u8c61\u7684\u7f16\u7a0b\u8bed\u8a00\u4e2d\uff0c\u5b9e\u4f8b\u5316\u4e00\u4e2a\u7c7b\u6d89\u53ca\u901a\u8fc7\u5206\u914d\u7269\u7406\u5185\u5b58\u6765\u4fdd\u5b58\u8be5\u7c7b\u5b9e\u4f8b\u7684\u72b6\u6001\u6765\u521b\u5efa\u4e00\u4e2a\u5bf9\u8c61\u3002\u5728 QL \u4e2d\uff0c\u7c7b\u53ea\u662f\u63cf\u8ff0\u5df2\u5b58\u5728\u503c\u96c6\u7684\u903b\u8f91\u5c5e\u6027\u3002<\/li>\n<\/ul>\n<p>QL\u8bed\u8a00\u7684\u5177\u4f53\u5b9a\u4e49\u8bf7\u53c2\u9605<a href=\"https:\/\/codeql.github.com\/docs\/ql-language-reference\/\">\u5b98\u65b9\u6587\u6863<\/a>\u3002<\/p>\n<h2 id=\"\u57fa\u672c\u7684\u67e5\u8be2\u7ed3\u6784\">\u57fa\u672c\u7684\u67e5\u8be2\u7ed3\u6784<a class=\"anchor\" href=\"#%e5%9f%ba%e6%9c%ac%e7%9a%84%e6%9f%a5%e8%af%a2%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u4f7f\u7528 CodeQL \u7f16\u5199\u7684\u67e5\u8be2\u5177\u6709\u6587\u4ef6\u6269\u5c55\u540d &ldquo;.ql&rdquo;\uff0c\u5e76\u5305\u542b\u4e00\u4e2a select \u5b50\u53e5\u3002\u8bb8\u591a\u73b0\u6709\u67e5\u8be2\u5305\u62ec\u989d\u5916\u7684\u53ef\u9009\u4fe1\u606f\uff0c\u5e76\u5177\u6709\u4ee5\u4e0b\u7ed3\u6784\uff1a<\/p>"},{"title":"\u72ec\u7acb\u7684debuginfo\u6587\u4ef6","link":"https:\/\/ioxera.github.io\/docs\/%E7%8B%AC%E7%AB%8B%E7%9A%84debuginfo%E6%96%87%E4%BB%B6\/","pubDate":"Tue, 24 Aug 2021 16:10:33 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E7%8B%AC%E7%AB%8B%E7%9A%84debuginfo%E6%96%87%E4%BB%B6\/","description":"<h2 id=\"\u524d\u8a00\">\u524d\u8a00<a class=\"anchor\" href=\"#%e5%89%8d%e8%a8%80\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5728\u4f7f\u7528gcc\u7f16\u8bd1\u6e90\u7801\u65f6\u53ef\u4ee5\u4f7f\u7528<code>-g<\/code>\u9009\u9879\u5728\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e2d\u4fdd\u7559\u8c03\u8bd5\u4fe1\u606f\uff0c\u628a\u4e8c\u8fdb\u5236\u6587\u4ef6\u548c\u8c03\u8bd5\u4fe1\u606f\u5408\u5e76\u5728\u540c\u4e00\u4e2a\u6587\u4ef6\u4e2d\u5e26\u6765\u7684\u4e00\u4e2a\u663e\u8457\u95ee\u9898\u662f\u6587\u4ef6\u6216\u5e93\u7684SIZE\u589e\u5927\uff0c\u5bf9\u4e8e\u4e0d\u5173\u5fc3\u8c03\u8bd5\u7684\u666e\u901a\u7528\u6237\u6765\u8bf4\uff0c\u8c03\u8bd5\u4fe1\u606f\u662f\u4e0d\u5fc5\u8981\u7684\uff0c\u4e14\u5728\u7cfb\u7edf\u5b89\u88c5\u548c\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u663e\u8457\u589e\u52a0\u4e86\u5b89\u88c5\u65f6\u95f4\u53ca\u78c1\u76d8\u7a7a\u95f4\u5360\u7528\u3002<\/p>\n<p>\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u53ef\u4ee5\u628a\u8c03\u8bd5\u4fe1\u606f\u4ece\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e2d\u5265\u79bb\u51fa\u6765\u4fdd\u5b58\u5728\u5355\u72ec\u7684\u6587\u4ef6\u4e2d\uff0c\u67d0\u4e9blinux\u53d1\u884c\u7248\uff08redhat\u7cfb\u5217,debian\u7cfb\u5217\u7b49\uff09\u5c06\u8fd9\u4e9bdebuginfo\u6587\u4ef6\u6253\u5305\u6210\u72ec\u7acb\u8f6f\u4ef6\u5305\u3002<\/p>\n<h2 id=\"\u751f\u6210debuginfo\u6587\u4ef6\">\u751f\u6210debuginfo\u6587\u4ef6<a class=\"anchor\" href=\"#%e7%94%9f%e6%88%90debuginfo%e6%96%87%e4%bb%b6\" aria-label=\"Link\"><\/a><\/h2>\n<p>GNU<code>binutils<\/code>\u5de5\u5177\u5305\u5305\u542b\u4e00\u4e2a<code>objcopy<\/code>\u5b9e\u7528\u7a0b\u5e8f\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u751f\u6210\u5355\u72ec\u7684\u53ef\u6267\u884c\/\u8c03\u8bd5\u4fe1\u606f\u6587\u4ef6\u5bf9\uff0c\u8fd9\u4e9b\u547d\u4ee4\u4ece<code>a.out<\/code>\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u5220\u9664\u4e86\u8c03\u8bd5\u4fe1\u606f\uff0c\u5e76\u5c06\u5176\u653e\u5165<code>a.out.deubug<\/code>\u6587\u4ef6\u4e2d\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span># objcopy --only-keep-debug a.out a.out.debug\n<\/span><\/span><span style=\"display:flex;\"><span># strip -g a.out<\/span><\/span><\/code><\/pre><\/div><p>\u5728\u751f\u6210debuginfo\u72ec\u7acb\u6587\u4ef6\u4ee5\u540e\uff0c\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u65b9\u5f0f\u4e4b\u4e00\u6216\u540c\u65f6\u4f7f\u7528\uff0c\u521b\u5efa\u4e8c\u8fdb\u5236\u6587\u4ef6\u548cdebuginfo\u6587\u4ef6\u7684\u5173\u8054\uff1a<\/p>\n<ul>\n<li>debug link\u65b9\u5f0f\u5728\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e2d\u6dfb\u52a0\u4e86\u4e00\u4e2a<code>.gnu_debuglink<\/code>\u8282\uff0c\u6b64\u8282\u5fc5\u987b\u5305\u542b\u5220\u9664\u4e86\u524d\u5bfc\u76ee\u5f55\u7684debuginfo\u6587\u4ef6\u540d\u79f0\u548c\u4e00\u4e2a\u56db\u5b57\u8282\u7684CRC\u6821\u9a8c\u548c<\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span># objcopy --add-gnu-debuglink=a.out.debug a.out\n<\/span><\/span><span style=\"display:flex;\"><span># objdump -s -j .gnu_debuglink .\/a.out \n<\/span><\/span><span style=\"display:flex;\"><span>.\/a.out\uff1a \u6587\u4ef6\u683c\u5f0f elf64-x86-64\n<\/span><\/span><span style=\"display:flex;\"><span>Contents of section .gnu_debuglink:\n<\/span><\/span><span style=\"display:flex;\"><span>0000 612e6f75 742e6465 62756700 5f2e5ac3 a.out.debug._.Z.<\/span><\/span><\/code><\/pre><\/div><ul>\n<li>\u4f7f\u7528<code>ld--Build ID<\/code>\u6216GCC\u5bf9\u5e94\u7684<code>gcc -Wl\uff0c--build-ID<\/code>\u5c06Build ID\u5d4c\u5165\u5230\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u7684<code>.note.gnu.build-id<\/code>\u8282\u4e2d\u3002\u7136\u540e\u6309\u7167\u4e0b\u6587\u7684\u641c\u7d22\u89c4\u5219\u5c06debuginfo\u6587\u4ef6\u590d\u5236\u5230\u6307\u5b9a\u8def\u5f84\u4e0b\uff0c\u5e76\u6309build-id\u8fdb\u884c\u91cd\u547d\u540d<\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span># readelf -n .\/a.out\n<\/span><\/span><span style=\"display:flex;\"><span>...\n<\/span><\/span><span style=\"display:flex;\"><span>Displaying notes found in: .note.gnu.build-id\n<\/span><\/span><span style=\"display:flex;\"><span>\u6240\u6709\u8005 Data size Description\n<\/span><\/span><span style=\"display:flex;\"><span>GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)\n<\/span><\/span><span style=\"display:flex;\"><span> Build ID: 5806c3389c3265d80ae315eba818ac8d2dc61a06\n<\/span><\/span><span style=\"display:flex;\"><span>...<\/span><\/span><\/code><\/pre><\/div><p>gdb\u652f\u6301\u4e24\u79cd\u6307\u5b9adebuginfo\u6587\u4ef6\u7684\u65b9\u6cd5\uff1a<\/p>"},{"title":"\u4f7f\u7528busybox\u6784\u5efa\u6700\u5c0frootfs","link":"https:\/\/ioxera.github.io\/docs\/%E4%BD%BF%E7%94%A8busybox%E6%9E%84%E5%BB%BA%E6%9C%80%E5%B0%8Frootfs\/","pubDate":"Tue, 10 Aug 2021 12:09:47 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E4%BD%BF%E7%94%A8busybox%E6%9E%84%E5%BB%BA%E6%9C%80%E5%B0%8Frootfs\/","description":"<h2 id=\"\u524d\u8a00\">\u524d\u8a00<a class=\"anchor\" href=\"#%e5%89%8d%e8%a8%80\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5728\u8fdb\u884clinux kernel\u6f0f\u6d1e\u5206\u6790\u8fc7\u7a0b\u4e2d\u9700\u8981\u5bf9kernel\u8fdb\u884c\u8c03\u8bd5\uff0c\u867d\u7136\u53ef\u501f\u52a9virtualbox\\vmware\u7b49\u865a\u62df\u673a\u8f6f\u4ef6\u8fd0\u884c\u67d0\u4e2a\u53d1\u884c\u7248\uff0c\u4f46\u5bf9\u53d1\u884c\u7248\u66f4\u6362kernel\u5e76\u4e0d\u65b9\u4fbf\uff0c\u67d0\u4e9b\u53d1\u884c\u7248\u5e76\u4e0d\u63d0\u4f9bdebuginfo\u6216\u5e26\u6709kgdb\u8865\u4e01\u7684\u8c03\u8bd5\u7248kernel\uff0c\u4e14\u5b58\u5728\u53d1\u884c\u7248\u6307\u5b9alibc\u5e93\u548c\u4e0d\u540c\u7248\u672ckernel\u7684\u517c\u5bb9\u95ee\u9898\u3002<\/p>\n<p>\u4f7f\u7528qemu\u8c03\u8bd5\u53ef\u4ee5\u7075\u6d3b\u66f4\u6362kernel\u7248\u672c\u53carootfs\uff0c\u4e14qemu\u81ea\u5e26\u7684gdb stub\u53ef\u4ee5\u8c03\u8bd5\u65e0kgdb\u8865\u4e01\u7684kernel\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u4f7f\u7528<code>Ramdisk<\/code>\u53ef\u4ee5\u907f\u514dkernel\u5bf9\u4e0d\u540c\u6587\u4ef6\u7cfb\u7edf\u7684\u517c\u5bb9\u6027\u95ee\u9898\uff0c\u5177\u6709\u6781\u9ad8\u7684\u7075\u6d3b\u6027\u3002\u672c\u6587\u4e3b\u8981\u6784\u5efa\u4e00\u4e2a\u53ef\u4ee5\u517c\u5bb9\u591a\u79cdkernel\u7248\u672c\u7684\u6700\u5c0frootfs\u3002<\/p>\n<h2 id=\"\u73af\u5883\u51c6\u5907\">\u73af\u5883\u51c6\u5907<a class=\"anchor\" href=\"#%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87\" aria-label=\"Link\"><\/a><\/h2>\n<p>CentOS: 7.9<br>\nglibc: 2.17<br>\ngcc: 4.8.5<br>\nbusybox: 1.32.1<\/p>\n<p>\u5728\u4f4e\u7248\u672ckernel\u4e0a\u8fd0\u884c\u9ad8\u7248glibc\u4f1a\u63d0\u793a<code>KERNEL TOO OLD<\/code>\u9519\u8bef\uff0c\u9009\u62e9\u4e00\u4e2a\u5408\u9002\u7248\u672c\u7684glibc\u53ef\u4ee5\u63d0\u9ad8\u5bf9\u4e0d\u540ckernel\u7248\u672c\u7684\u517c\u5bb9\u6027\uff0c\u514d\u53bb\u591a\u6b21\u5236\u4f5crootfs\u7684\u9ebb\u70e6\u3002\u7ecf\u8fc7\u6d4b\u8bd5\u53d1\u73b02.17\u7248\u672c\u7684glibc\u5bf92.6.32\uff5e5.10\u7248\u672c\u7684kernel\u5177\u6709\u826f\u597d\u7684\u517c\u5bb9\u6027\uff0c<\/p>\n<h2 id=\"\u7f16\u8bd1busybox\">\u7f16\u8bd1busybox<a class=\"anchor\" href=\"#%e7%bc%96%e8%af%91busybox\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5b89\u88c5\u7f16\u8bd1\u5957\u4ef6\u53ca\u4f9d\u8d56<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span># yum groupinstall &#34;Development Tools&#34;\n<\/span><\/span><span style=\"display:flex;\"><span># yum install ncurses-devel\n<\/span><\/span><span style=\"display:flex;\"><span># yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel\n<\/span><\/span><span style=\"display:flex;\"><span># yum install glibc_static<\/span><\/span><\/code><\/pre><\/div><p>\u914d\u7f6e\u53ca\u7f16\u8bd1busybox<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span>$ make defconfig\n<\/span><\/span><span style=\"display:flex;\"><span>$ make menuconfig\n<\/span><\/span><span style=\"display:flex;\"><span> \/* select Busybox Settings\n<\/span><\/span><span style=\"display:flex;\"><span> then General Configuration\n<\/span><\/span><span style=\"display:flex;\"><span> then exec prefers applets\n<\/span><\/span><span style=\"display:flex;\"><span> then Build Options\n<\/span><\/span><span style=\"display:flex;\"><span> then Build Busybox as a static binary\n<\/span><\/span><span style=\"display:flex;\"><span> exit back to top level menu\n<\/span><\/span><span style=\"display:flex;\"><span> select Linux System Utilities\n<\/span><\/span><span style=\"display:flex;\"><span> then mdev\n<\/span><\/span><span style=\"display:flex;\"><span> select Shells\n<\/span><\/span><span style=\"display:flex;\"><span> then Standalone shell\n<\/span><\/span><span style=\"display:flex;\"><span> exit back to top level menu\n<\/span><\/span><span style=\"display:flex;\"><span> exit and save new configuration\n<\/span><\/span><span style=\"display:flex;\"><span> *\/\n<\/span><\/span><span style=\"display:flex;\"><span>$ make\n<\/span><\/span><span style=\"display:flex;\"><span>$ make install<\/span><\/span><\/code><\/pre><\/div><p><code>make defconfig<\/code>\u914d\u7f6e\u9009\u9879\u63d0\u4f9b\u4e86\u6700\u5927\u901a\u7528\u517c\u5bb9\u6027\u3002<br>\n<code>standalone shell mode<\/code>\u4f7fbusybox\u7684\u5185\u7f6e\u547d\u4ee4shell\uff0c\u76f4\u63a5\u8fd0\u884cbusybox\u7684\u5185\u90e8\u5c0f\u7a0b\u5e8f\uff0c\u800c\u4e0d\u67e5\u627e\u8be5\u540d\u79f0\u7684\u5916\u90e8\u7a0b\u5e8f\u3002<br>\n<code>Build Busybox as a static binary<\/code>\u7531\u4e8e\u53ea\u9700\u8981busybox\u63d0\u4f9b\u7684\u529f\u80fd\uff0c\u56e0\u6b64\u5728\u6b64\u5904\u4f7f\u7528\u9759\u6001\u94fe\u63a5\u5e93\uff0c\u7701\u53bb\u8bbe\u7f6eglibc\u73af\u5883\u7684\u9ebb\u70e6\u3002<br>\n<code>make install<\/code>\u4f1a\u5c06\u7f16\u8bd1\u597d\u7684\u7a0b\u5e8f\u5b89\u88c5\u5230\u6e90\u7801\u6839\u76ee\u5f55\u7684<code>_install<\/code>\u6587\u4ef6\u5939\u5185\u3002<\/p>"},{"title":"ikuai\u8f6f\u8def\u7531\u7cfb\u7edf-\u56fa\u4ef6\u89e3\u5bc6","link":"https:\/\/ioxera.github.io\/docs\/ikuai%E8%BD%AF%E8%B7%AF%E7%94%B1%E7%B3%BB%E7%BB%9F-%E5%9B%BA%E4%BB%B6%E8%A7%A3%E5%AF%86\/","pubDate":"Fri, 15 Jan 2021 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/ikuai%E8%BD%AF%E8%B7%AF%E7%94%B1%E7%B3%BB%E7%BB%9F-%E5%9B%BA%E4%BB%B6%E8%A7%A3%E5%AF%86\/","description":"<h2 id=\"ikuai\u7b80\u4ecb\">ikuai\u7b80\u4ecb<a class=\"anchor\" href=\"#ikuai%e7%ae%80%e4%bb%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p>ikuai\u662f\u56fd\u5185\u4e00\u5bb6\u63d0\u4f9b\u5546\u4e1a\u7ec4\u7f51\u89e3\u51b3\u65b9\u6848\u7684\u5382\u5bb6\uff0c\u786c\u4ef6\u4ea7\u54c1\u4e3b\u8981\u6709\u4ea4\u6362\u673a\u3001\u8def\u7531\u3001\u7f51\u6865\u3001\u5ba4\u5185\u5916AP\u7b49\uff0c\u8f6f\u4ef6\u4ea7\u54c1\u4e3b\u8981\u662fikuai\u8f6f\u8def\u7531\u7cfb\u7edf\u53caikuai\u4e91\u3002ikuai\u4ea7\u54c1\u5728\u5c0f\u578b\u4f01\u4e1a\u3001\u5b66\u6821\u3001\u5199\u5b57\u697c\u3001\u5546\u573a\u3001\u9152\u5e97\u3001\u533b\u9662\u3001\u5546\u4e1a\u4f11\u95f2\u573a\u6240\u6709\u5e7f\u6cdb\u7684\u5e94\u7528\u3002<\/p>\n<p>\u56e0\u4e3a\u60f3\u770b\u4e00\u4e0b\u8fd9\u4e2a\u5728\u793e\u4f1a\u4e0a\u5e94\u7528\u5e7f\u6cdb\u7684\u5382\u5bb6\u7684\u4ea7\u54c1\u7684\u5b89\u5168\u6027\u505a\u7684\u600e\u4e48\u6837\uff0c\u9042\u6709\u6b64\u6587\u3002<\/p>\n<h2 id=\"\u56fa\u4ef6\u5206\u6790\">\u56fa\u4ef6\u5206\u6790<a class=\"anchor\" href=\"#%e5%9b%ba%e4%bb%b6%e5%88%86%e6%9e%90\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5728\u8fdb\u884c\u6b64\u6b21\u5206\u6790\u65f6ikuai\u8f6f\u8def\u7531\u7cfb\u7edf\u7684\u6700\u65b0\u7248\u672c\u4e3a3.4.6,\u5b98\u7f51\u63d0\u4f9b\u6765ikuai\u8f6f\u8def\u7531\u7cfb\u7edfISO\u3001IMG\u3001GHOST\u3001BIN\u56db\u79cd\u955c\u50cf\uff0c\u4e14\u4e3b\u8981\u652f\u6301x86\u67b6\u6784\u3002\u8fd9\u91cc\u76f4\u63a5\u4ece\u5b98\u7f51\u4e0b\u8f7dISO\u955c\u50cf\uff0c\u5e76\u5728virtualbox\u865a\u62df\u673a\u4e2d\u8fdb\u884c\u5b89\u88c5\u3002\u5b89\u88c5\u6210\u529f\u540e\u5c06ikuai\u8def\u7531\u5668\u7cfb\u7edf\u7684\u78c1\u76d8\u6302\u8f7d\u5230\u5176\u4ed6\u7684linux\u7cfb\u7edf\u4e0a\uff08\u8fd9\u91cc\u4f7f\u7528ubuntu\u7cfb\u7edf\uff09\uff0c\u53ef\u4ee5\u770b\u5230ikuai\u7cfb\u7edf\u7684\u5206\u533a\u548c\u5206\u533a\u5185\u7684\u6587\u4ef6<\/p>\n<p><img src=\"assets\/%e6%88%aa%e5%9b%be_2021-01-15_13-10-54.png\" alt=\"ikuai\u7cfb\u7edf\u5206\u533a\" \/><\/p>\n<p>ikuai\u7cfb\u7edf\u5171\u6709\u4e09\u4e2a\u5206\u533a\uff08\u4e00\u4e2a\u542f\u52a8\u5206\u533a\u3001\u4e00\u4e2a\u914d\u7f6e\u5b58\u50a8\u5206\u533a\u3001\u4e00\u4e2a\u6570\u636e\u5b58\u50a8\u5206\u533a\uff09\uff0c\u5176\u4e2d\u542f\u52a8\u5206\u533a\u7684boot\u6587\u4ef6\u5939\u5185\u5b58\u50a8\u4e86\u5185\u6838\u6587\u4ef6vmlinuz\uff0cinitrd\u6587\u4ef6rootfs\uff0c\u53cagrub\u7684\u542f\u52a8\u6587\u4ef6\u3002grub.cfg\u6587\u4ef6\u5982\u4e0b\uff1a<\/p>\n<p><img src=\"assets\/%e6%88%aa%e5%9b%be_2021-01-15_13-19-34.png\" alt=\"grub.cfg\" \/><\/p>\n<p>grub.cfg\u4e2d\u6307\u5b9a\u4e86\u5185\u6838\u542f\u52a8\u7684\u53c2\u6570\uff0c<code>root=\/dev\/ram0<\/code> \u8bf4\u660eikuai\u7cfb\u7edf\u4f7f\u7528\u4e86ramfs\u6765\u4f5c\u4e3a\u7cfb\u7edf\u7684root\u76ee\u5f55\u6587\u4ef6\u7cfb\u7edf\uff0c\u5e76\u628a <code>\/boot\/rootfs<\/code> \u4f5c\u4e3ainitrd\u76f4\u63a5\u52a0\u8f7d\u5230ramfs\u4e2d\u3002\u5728\u7b2c\u4e8c\u4e2a\u542f\u52a8\u9879\u4e2d\u6307\u5b9a\u4e86\u4e32\u53e3ttyS0\u6765\u6253\u5370\u7ec8\u7aef\u4fe1\u606f\uff0c\u6ce2\u7279\u7387\u4e3a115200\u3002\u8fd9\u91cc\u4e3a\u4e86\u53ef\u4ee5\u5728\u542f\u52a8\u65f6\u4e34\u65f6\u7f16\u8f91\u542f\u52a8\u9879\uff0c\u4fee\u6539timeout\u8bbe\u7f6e\u4e3a-1,\u8ba9grub\u6682\u505c\u5728\u542f\u52a8\u9879\u9009\u62e9\u9875\u9762\u4e0a\u3002<\/p>\n<p><img src=\"assets\/%e6%88%aa%e5%9b%be_2021-01-15_13-30-05.png\" alt=\"vmlinuz and rootfs info\" \/><\/p>\n<p>\u67e5\u770bvmlinuz\u548crootfs\u7684\u6587\u4ef6\u7c7b\u578b\u53ef\u4ee5\u770b\u5230\u5185\u6838\u7248\u672c\u4e3a3.18.67\uff0c\u6253\u5305\u4e3abzImage\u683c\u5f0f\uff0c\u7f16\u8bd1\u4eba\u5458\u662fdaxiong\u540c\u5b66\uff0c\u7f16\u8bd1\u65f6\u95f4\u662f2020\u5e7411\u670828\u65e5\u3002rootfs\u662f\u4e00\u4e2a\u6570\u636e\u6587\u4ef6\uff0c\u770b\u4e0d\u5230\u6587\u4ef6\u683c\u5f0f\u4fe1\u606f\uff0c\u731c\u6d4b\u5382\u5546\u4e3a\u4e86\u4fdd\u62a4\u81ea\u5df1\u7684\u77e5\u8bc6\u4ea7\u6743\uff0c\u628arootfs\u7ed9\u52a0\u5bc6\u4e86\u3002<\/p>\n<p>\u6253\u5f00\u865a\u62df\u673a\u7684\u4e32\u53e3\u914d\u7f6e\uff0c\u4e3a\u865a\u62df\u673a\u6dfb\u52a0\u4e00\u4e2a\u4e32\u53e3\uff0c\u5728grub\u4e0a\u9009\u62e9\u7b2c\u4e8c\u4e2a\u5e26\u6709\u4e32\u53e3\u53c2\u6570\u7684\u542f\u52a8\u9879\uff0c\u6309e\u952e\u7f16\u8f91\u542f\u52a8\u9879\uff0c\u5728linux\u547d\u4ee4\u4e0a\u589e\u52a0 <code>init=\/bin\/sh<\/code> \u53c2\u6570\uff1a<\/p>\n<p><img src=\"assets\/%e6%88%aa%e5%9b%be_2021-01-15_13-50-28.png\" alt=\"grub cmd\" \/><\/p>\n<p>\u5728host\u673a\u5668\u4e0a\u6267\u884c <code>socat -d -d \/tmp\/serial PTY<\/code> \u521b\u5efa\u4e00\u4e2a\u548c\u865a\u62df\u673a\u4e32\u53e3\u901a\u4fe1\u7684\u4e32\u53e3\u8bbe\u5907\u6587\u4ef6 <code>\/dev\/pts\/1<\/code>\uff0c<code>\/tmp\/serial<\/code> \u4e3a\u865a\u62df\u673a\u4e32\u53e3\u914d\u7f6e\u4e2d\u6307\u5b9a\u7684\u672c\u5730socket\u6587\u4ef6\u3002\u5728\u53e6\u4e00\u4e2a\u7ec8\u7aef\u4e2d\u6267\u884c <code>minicom -b 115200 -D \/dev\/pts\/1<\/code> \u8fde\u63a5\u865a\u62df\u673a\u7684\u4e32\u53e3\uff0c\u865a\u62df\u673a\u542f\u52a8\u8fc7\u7a0b\u4e2d\u7684\u5185\u6838\u4fe1\u606f\u5c31\u901a\u8fc7\u4e32\u53e3\u6253\u5370\u5230minicom\u4e2d\u4e86\u3002\u5728minicom\u4e2d\u67e5\u770b\u865a\u62df\u673a\u7684\u5185\u6838\u542f\u52a8\u4fe1\u606f\u53ca\u6839\u6587\u4ef6\u7cfb\u7edf\u7ed3\u6784\uff1a<\/p>\n<p><img src=\"assets\/%e6%88%aa%e5%9b%be_2021-01-15_14-11-21.png\" alt=\"kernel log and rootfs struction\" \/><\/p>\n<p>\u5728\u5185\u6838\u65e5\u5fd7\u4e2d\u7684\u6700\u540e\u51e0\u884c\u4e2d\u53ef\u4ee5\u770b\u5230RAMDISK\u6587\u4ef6\u7cfb\u7edf\u7684\u52a0\u8f7d\u8bb0\u5f55<\/p>\n<pre tabindex=\"0\"><code>RAMDISK: xz image found at block 0\nEXT4-fs (ram0): mounted filesystem without journal. Opts: (null)\nVFS: Mounted root (ext4 filesystem) readonly on device 1:0.<\/code><\/pre><p>\u4ece\u8fd9\u51e0\u6761\u8bb0\u5f55\u57fa\u672c\u53ef\u4ee5\u65ad\u5b9arootfs\u6587\u4ef6\u5e94\u8be5\u662f\u4e00\u4e2axz\u538b\u7f29\u65b9\u5f0f\u6253\u5305\u7684ext4\u955c\u50cf\u6587\u4ef6\u3002\u5185\u6838\u65e5\u5fd7\u8d77\u59cb\u9636\u6bb5\u8fd8\u8bb0\u5f55\u4e86kernel\u7684\u53c2\u6570\u548cinitrd\u7684\u7c7b\u578b\u4fe1\u606f\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u81ea\u5df1\u67e5\u770b\u3002<\/p>"},{"title":"MikroTik RouterOS < 6.38.4 (x86) \u8fdc\u7a0b\u4ee3\u7801\u6267\u884c\u6f0f\u6d1e\u5206\u6790","link":"https:\/\/ioxera.github.io\/docs\/mikrotik-routeros--6.38.4-x86-%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90\/","pubDate":"Tue, 03 Apr 2018 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/mikrotik-routeros--6.38.4-x86-%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90\/","description":"<h2 id=\"\u524d\u8a00\">\u524d\u8a00<a class=\"anchor\" href=\"#%e5%89%8d%e8%a8%80\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u300aVault 7\u300b\u662f\u7531\u7ef4\u57fa\u89e3\u5bc6\u4ece2017\u5e743\u67087\u65e5\u5f00\u59cb\uff0c\u53d1\u5e03\u7684\u4e00\u7cfb\u5217\u6587\u4ef6\u3002\u5176\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u4e86\u7f8e\u56fd\u4e2d\u592e\u60c5\u62a5\u5c40(Central Intelligence Agency)\u6267\u884c\u7535\u5b50\u76d1\u89c6\u548c\u7f51\u7edc\u6218\u7684\u7ec6\u8282\u6d3b\u52a8\u548c\u80fd\u529b\u3002Chimay Red\u662fVault 7\u4e2d\u6cc4\u6f0f\u7684CIA Hacking Tools\u4e2d\u5305\u542b\u7684\u4e00\u4e2a\u7528\u4e8eexploit\u8fd0\u884cRouter OS\u7684MikroTik(MT) \u8def\u7531\u5668\u7684\u4e00\u4e2a\u5de5\u5177\uff0c\u6b64\u5de5\u5177\u53ef\u7528\u6765\u5411MT\u8def\u7531\u5668\u4e0a\u4f20HIVE\uff08Vault7\u4e2d\u6cc4\u6f0f\u51fa\u7684\u4e00\u4e2aCIA\u8fdc\u7a0b\u63a7\u5236\u5de5\u5177\uff09\u6216\u8005shellcode\u7b49payload\u3002Vault7\u6cc4\u9732\u7684\u6587\u6863\u4e2d\u53ea\u5305\u542b\u4e86<a href=\"https:\/\/wikileaks.org\/ciav7p1\/cms\/page_16384604.html\">\u5de5\u5177\u7684\u4f7f\u7528\u624b\u518c<\/a>\uff0c\u4f46\u6b64\u5de5\u5177\u5e76\u672a\u516c\u5f00\u3002BigNerd95\u5728github\u4e0a\u7684<a href=\"https:\/\/github.com\/BigNerd95\/Chimay-Red\">Chiamy Red\u9879\u76ee<\/a>\u6839\u636eRouterOS\u7684\u8865\u4e01\u5bf9Chimay Red\u4e2d\u4f7f\u7528\u7684\u6f0f\u6d1e\u8fdb\u884c\u4e86\u63ed\u9732\u5e76\u7ed9\u51fa\u4e86EXP\u3002<\/p>\n<p>\u672c\u6587\u4e3b\u8981\u662f\u5bf9BigNerd95\u7684Chiamy Red\u9879\u76ee\u4e2d\u4f7f\u7528\u7684 Stack Clash Remote Code Execution\u6f0f\u6d1e\u53ca\u7ed9\u51fa\u7684exp\u8fdb\u884c\u5206\u6790\u3002 \u73af\u5883\u642d\u5efa\u53ca\u4f7f\u7528\u7684\u6f0f\u6d1e\u5177\u4f53\u53ef\u53c2\u8003<a href=\"https:\/\/github.com\/BigNerd95\/Chimay-Red\/blob\/36faf04e9ffb224811e0ac074a62126fdca7a92f\/docs\/ChimayRed.pdf\">\u8fd9\u91cc<\/a>\u3002\u6b64\u6f0f\u6d1e\u5b58\u5728\u4e8eRouterOS 6.38.4\u7248\u672c\u4ee5\u4e0b\uff0c\u5728<a href=\"https:\/\/mikrotik.com\/download\/changelogs\/current-release-tree\">6.38.5\u7248\u672c<\/a>\u4e2d\u88ab\u4fee\u8865\u3002<\/p>\n<h2 id=\"\u6f0f\u6d1e\u5206\u6790\">\u6f0f\u6d1e\u5206\u6790<a class=\"anchor\" href=\"#%e6%bc%8f%e6%b4%9e%e5%88%86%e6%9e%90\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u4eceBigNerd95\u7ed9\u51fa\u7684\u6587\u6863\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u77e5\u9053\u6b64\u6f0f\u6d1e\u5b58\u5728\u4e8ewww\u4e8c\u8fdb\u5236\u6587\u4ef6\u4e2d\u7684Request::readPostData\u51fd\u6570\u4e2d\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528Chiamy Red\u9879\u76ee\u4e2d\u7684getROSbin.py\u5de5\u5177\u4eceRouterOS\u955c\u50cf\u4e2d\u63d0\u53d6www\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u547d\u4ee4\u5982\u4e0b\uff1a<br>\n<code>$ .\/tools\/getROSbin.py 6.38.4 x86 \/nova\/bin\/www www_binary<\/code><br>\n\u4f7f\u7528IDA\u67e5\u770bRequest::readPostData\u51fd\u6570 :<br>\n<img src=\"assets\/1.png\" alt=\"\" \/><br>\n\u53ef\u4ee5\u770b\u5230\uff0c\u8be5\u51fd\u6570\u5148\u4f7f\u7528Headers::getHeader\u51fd\u6570\u83b7\u53d6content_length\u5b57\u6bb5\u7684\u503c\uff0c\u7136\u540e\u5e76\u672a\u5bf9\u503c\u8fdb\u884c\u5224\u65ad\u5c31\u4f20\u5165\u4e86alloca\u51fd\u6570\uff0c\u968f\u540e\u4f7f\u7528istream:read\u51fd\u6570\u5c06content_len_velue\u957f\u5ea6\u7684\u6570\u636e\u8bfb\u53d6\u5230\u4e86\u5f53\u524d\u51fd\u6570\u7684\u6808\u5e27\u4e2d\u3002<\/p>\n<p>alloca\u51fd\u6570\u5177\u4f53\u8fdb\u884c\u7684\u64cd\u4f5c\u5982\u4e0b\u56fe:<br>\n<img src=\"assets\/2.png\" alt=\"\" \/><br>\nalloca\u51fd\u6570\u5c06content_len_velue\u8fdb\u884c\u5bf9\u9f50\u4e4b\u540e\uff0c\u5728\u5f53\u524d\u6808\u5e27\u4e0a\u5206\u914d\u4e86\u5bf9\u5e94\u5927\u5c0f\u7684\u7a7a\u95f4\uff0c\u8fd9\u5c06\u5141\u8bb8\u6211\u4eec\u76f4\u63a5\u63a7\u5236\u5f53\u524d\u6808\u5e27\u7684\u6808\u9876\u4f4d\u7f6e\u3002<\/p>\n<p>\u5982\u679c\u6211\u4eec\u4f20\u5165content_length\u7684\u503c\u4e3a2147483648[-2147483648]\u52304294967295[-1]\u4e4b\u95f4\u7684\u4efb\u610f\u503c\uff0c\u5219\u6808\u9876\u6307\u9488\u5c06\u4e0d\u662f\u5411\u4e0a\u589e\u957f\u800c\u662f\u5411\u4e0b\u79fb\u52a8\u6307\u5411\u5df2\u4f7f\u7528\u7684\u6808\u533a\u4f4d\u7f6e\uff0c\u7136\u540eistream::read\u4f1a\u4ecesocket\u8bfb\u53d6content_len_velue\u957f\u5ea6\u7684\u6570\u636e\u5230\u5f53\u524d\u6808\u9876\u6307\u5b9a\u7684\u7f13\u51b2\u533a\u5185\uff0c\u8fd9\u5c06\u5f15\u8d77\u6808\u7c89\u788e\u3002\u5e76\u4e14\u7531\u4e8eistream::read\u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570\u7c7b\u578b\u4e3auint\uff0cistream::read\u4f1a\u8bfb\u53d6\u81f3\u5c112147483648\u5b57\u8282\u7684\u6570\u636e\u5230\u6808\u4e0a\uff0c\u8fd9\u5f88\u660e\u663e\u4f1a\u8d85\u51fa\u5f53\u524d\u6808\u5e95\uff0c\u5728istream::read\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u751f\u6210\u4e00\u4e2aSEGFAULT\u9519\u8bef\u3002\u73b0\u5728\u770b\u6765\u8fd9\u4f3c\u4e4e\u662f\u4e00\u4e2a\u4e0d\u53ef\u6267\u884c\u4ee3\u7801\u7684\u6f0f\u6d1e\uff0c\u90a3\u4e48\u5982\u4f55\u624d\u80fd\u8fbe\u5230\u4ee3\u7801\u6267\u884c\u7684\u76ee\u7684\u5462\uff1f<\/p>\n<p>\u53ef\u4ee5\u5148\u770b\u4e00\u4e0bChiamy Red\u9879\u76ee\u4e2d\u7684exp\u662f\u600e\u4e48\u5199\u7684\u3002\u5982\u4e0b\u56fe\uff0c\u5148\u521b\u5efa\u4e24\u4e2asocket\uff0c\u5206\u522b\u5411\u4e24\u4e2asocket\u53d1\u9001\u4e86\u6307\u5b9a\u4e86content_length\u7684post header\u6570\u636e\uff0c\u5e76\u5411s1\u53d1\u9001\u4e86n\u4e2a\u2018A\u2019\u548cpayload\uff0c\u7136\u540e\u5c06s2\u5173\u95ed\u3002\u4ece\u6ce8\u91ca\u4e5f\u53ef\u770b\u51fa\uff0c\u5176\u5229\u7528\u65b9\u5f0f\u548c\u7ebf\u7a0b\u6808\u6709\u5173\u3002<br>\n<img src=\"assets\/3.png\" alt=\"\" \/><br>\n\u518d\u6765\u770b\u770bRequest::readPostData\u51fd\u6570\u662f\u5728\u54ea\u91cc\u88ab\u8c03\u7528\u7684\uff0c\u4f7f\u7528IDA\u67e5\u770bRequest::readPostData\u7684\u4ea4\u53c9\u5f15\u7528\u53d1\u73b0www\u4e2d\u6ca1\u6709\u5f15\u7528\u6b64\u51fd\u6570\u7684\u4f4d\u7f6e\u3002\u73b0\u5728\u6211\u4eec\u52a8\u6001\u8c03\u8bd5\u4e0b\uff0c\u770b\u770b\u6b64\u51fd\u6570\u5728\u54ea\u91cc\u88ab\u8c03\u7528\u3002telnet\u8fde\u63a5\u4e0aRouterOS,\u628aRouterOS\u7684ALSR\u4fdd\u62a4\u5173\u95ed\u6389\uff0c\u7136\u540ekill\u6389www\u8fdb\u7a0b\u4e4b\u540e\u7cfb\u7edf\u4f1a\u81ea\u52a8\u91cd\u542fwww\u7a0b\u5e8f\uff08\u4ee5\u4e0b\u6240\u6709\u56fe\u7247\u4e3a\u591a\u6b21\u8c03\u8bd5www\u7a0b\u5e8f\u6240\u622a\u56fe\u50cf\uff0c\u6240\u4ee5\u8fdb\u7a0b\u53f7\u4f1a\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u5e76\u4e0d\u5f71\u54cd\u6211\u4eec\u7684\u5206\u6790\uff09<br>\n<img src=\"assets\/4.png\" alt=\"\" \/><br>\n\u4f7f\u7528gdbserver\u9644\u52a0\u5230www\u8fdb\u7a0b\u4e0a\uff0c\u4f7f\u7528gdb\u8fdc\u7a0b\u8c03\u8bd5\u3002<br>\n<img src=\"assets\/5.png\" alt=\"\" \/><br>\n<img src=\"assets\/6.png\" alt=\"\" \/><br>\n\u6211\u4eec\u628a\u65ad\u70b9\u4e0b\u5728\u8c03\u7528alloca\u51fd\u6570\u5904<br>\n<img src=\"assets\/7.png\" alt=\"\" \/><br>\n\u7136\u540e\u4f7f\u7528Chiamy Red\u9879\u76ee\u4e2d\u7684exp\u628apayload\u6253\u5230\u76ee\u6807\u4e0a<br>\n<img src=\"assets\/8.png\" alt=\"\" \/><br>\n\u53ef\u4ee5\u770b\u5230\u6709\u4e24\u4e2a\u65b0\u7ebf\u7a0b\u88ab\u521b\u5efa\uff0c\u5e76\u4e14\u5728\u7ebf\u7a0b2\u4e2d\u89e6\u53d1\u4e86\u65ad\u70b9\uff0c\u8bf4\u660eRequest::readPostData\u51fd\u6570\u662f\u5728\u65b0\u7ebf\u7a0b\u4e2d\u88ab\u8c03\u7528\u7684\uff0c\u5e76\u4e14\u6808\u9876\u5bc4\u5b58\u5668\u6307\u54110x77d86180<br>\n<img src=\"assets\/9.png\" alt=\"\" \/><br>\n\u6211\u4eec\u770b\u4e00\u4e0b0x77d86180\u5728\u5185\u5b58\u7a7a\u95f4\u7684\u54ea\u4e2a\u4f4d\u7f6e<br>\n<img src=\"assets\/10.png\" alt=\"\" \/><br>\n\u53ef\u4ee5\u770b\u52300x77d86180\u5e76\u4e0d\u4f4d\u4e8e\u8fdb\u7a0b\u5185\u5b58\u7a7a\u95f4\u7684\u6808\u533a\uff0c\u800c\u662f\u4f4d\u4e8e\u5e93\u6587\u4ef6\u52a0\u8f7d\u533a\u57df\u4e2d\u7684\u4e00\u6bb5\u7a7a\u95f2\u5185\u5b58\u7a7a\u95f4\u4e2d\uff0c\u5e76\u4e14\u6211\u4eec\u53ef\u4ee5\u8ba1\u7b97\u51fa\u5206\u914d\u7ed9\u7ebf\u7a0b2\u7684\u7ebf\u7a0b\u6808\u5185\u5b58\u5927\u5c0f\u4e3a0x77d87000-0x77d68000=0x1f000=124kb,\u7ee7\u7eed\u8fd0\u884cwww\u53d1\u73b0\u5728\u7ebf\u7a0b3\u4e2d\u65ad\u70b9\u53c8\u88ab\u89e6\u53d1\u4e86\u4e00\u6b21\uff0c\u4e14\u6b64\u6b21\u7684\u6808\u9876\u5bc4\u5b58\u5668\u6307\u54110x77d66180\uff0c\u53ef\u4ee5\u770b\u5230\u7ebf\u7a0b3\u7684\u7ebf\u7a0b\u6808\u4f4d\u4e8e\u7ebf\u7a0b2\u7684\u7ebf\u7a0b\u6808\u7684\u4e0a\u65b9\u4e14\u5927\u5c0f\u540c\u4e3a0x77d67000-0x77d48000=0x1f000=124kb,\u4e2d\u95f4\u76f8\u96940x77d68000-0x77d67000=0x1000=4kb\u7684\u4fdd\u62a4\u533a\u3002<br>\n<img src=\"assets\/11.png\" alt=\"\" \/><br>\n\u73b0\u5728\u7ebf\u7a0b\u6808\u5728\u5185\u5b58\u7a7a\u95f4\u4e2d\u7684\u5e03\u5c40\u6e05\u695a\u4e86\u3002\u73b0\u5728\u4ece\u65b0\u5f00\u542f\u8c03\u8bd5\uff0c\u5728alloca\u8c03\u7528\u5904\u4e0b\u65ad\u70b9\uff0ccontinue\u5e76\u4e14\u91cd\u65b0\u6253\u4e0apayload\uff0c\u7a0b\u5e8f\u4e2d\u65ad\u5728\u7ebf\u7a0b2\u7684alloca\u8c03\u7528\u5904\uff0c\u5411\u4e0b\u5355\u6b653\u6761\u6307\u4ee4<br>\n<img src=\"assets\/12.png\" alt=\"\" \/><br>\n\u6b64\u65f6\u7ebf\u7a0b3\u4e2d\u7684\u65ad\u70b9\u88ab\u89e6\u53d1\uff0c\u5e76\u4e14\u8c03\u8bd5\u7ebf\u7a0b\u5207\u6362\u5230\u4e86\u7ebf\u7a0b3,\u56e0\u4e3a\u6211\u4eec\u73b0\u5728\u8981\u8c03\u8bd5\u7ebf\u7a0b2,\u6240\u4ee5\u5148\u628a\u7ebf\u7a0b3\u6682\u505c\uff0c\u8bbe\u7f6egdb\u7684\u8c03\u5ea6\u5668\u9501\u5230on\u72b6\u6001\uff0c\u7136\u540e\u5207\u6362\u56de\u7ebf\u7a0b2\u7ee7\u7eed\u8c03\u8bd5<br>\n<img src=\"assets\/13.png\" alt=\"\" \/><br>\n\u5355\u6b65\u5230sub %eax,%esp\u6307\u4ee4\u5904\u67e5\u770b\u5f53\u524desp\u7684\u503c\u4e3a0x77d86180\uff0c\u5bf9\u7167\u8fdb\u7a0b\u7684\u5185\u5b58\u7a7a\u95f4\u5e03\u5c40\uff0c\u53ef\u4ee5\u770b\u5230\u73b0\u5728esp\u4f9d\u7136\u6307\u5411\u7ebf\u7a0b2\u7684\u7ebf\u7a0b\u6808\u5185\uff0c\u5355\u6b65\u6b65\u8fc7sub\u6307\u4ee4\uff0c\u7136\u540e\u518d\u6b21\u67e5\u770besp\u7684\u503c\u4e3a0x77d5d170\uff0c\u73b0\u5728esp\u5df2\u7ecf\u6307\u5411\u7ebf\u7a0b3\u7684\u7ebf\u7a0b\u6808\u5185\u4e86<br>\n<img src=\"assets\/14.png\" alt=\"\" \/><br>\n<img src=\"assets\/15.png\" alt=\"\" \/><br>\n\u7ee7\u7eed\u5411\u4e0b\u8fd0\u884c\u5230istream::read\u51fd\u6570\u8c03\u7528\u5904\uff0c\u67e5\u770b\u6808\u4e2d\u51fd\u6570\u7684\u53c2\u6570\uff0c\u53ef\u4ee5\u770b\u5230read\u51fd\u6570\u4f1a\u8bfb\u53d60x29000\u5b57\u8282\u7684\u6570\u636e\u52300x77d5d170\u5904\uff0c\u6b63\u597d\u662f\u521a\u624dalloca\u51fd\u6570\u8c03\u6574\u8fc7\u7684\u6808\u9876\u4f4d\u7f6e 0x77d5d170<br>\n<img src=\"assets\/16.png\" alt=\"\" \/><br>\n\u7ee7\u7eed\u5355\u6b65\u6b65\u8fc7read\u51fd\u6570\uff0c\u91cd\u65b0\u67e5\u770b0x77d5d170\u5904\u6709\u4ec0\u4e48\u6570\u636e\uff0c\u53d1\u73b0\u6b64\u4f4d\u7f6e\u7684\u6570\u636e\u5e76\u6ca1\u6709\u66f4\u65b0\uff0cread\u51fd\u6570\u8bfb\u53d6\u5931\u8d25\u4e86\uff0c\u6211\u4eec\u5148\u628a\u8fd9\u4e2a\u95ee\u9898\u6682\u65f6\u653e\u5728\u8fd9\u91cc\uff0c\u7ee7\u7eed\u6211\u4eec\u4e0b\u9762\u7684\u8c03\u8bd5\uff0c\u56e0\u4e3a\u6211\u4eec\u4e3b\u8981\u5173\u6ce8\u5730\u5740\u504f\u79fb\u91cf<br>\n<img src=\"assets\/17.png\" alt=\"\" \/><br>\n\u67e5\u770b\u4e0bexp\u811a\u672c\u90fd\u5411s1\u53d1\u9001\u4e86\u4ec0\u4e48\u6570\u636e\uff0c\u6ce8\u610f\u5230\u53d1\u5f80s1\u7684\u6570\u636e\u90e8\u5206\u662f\u5206\u4e24\u6b21\u53d1\u9001\u7684\uff0c\u4e24\u6b21\u53d1\u9001\u671f\u95f4\u5411s2\u53d1\u9001\u4e86\u6784\u9020\u7684http\u5934\uff0c\u73b0\u5728\u6211\u4eec\u6765\u8ba1\u7b97\u4e00\u4e0b\u5411s1\u53d1\u9001\u4e86n\u4e2a\u2018A\u2019\u4e4b\u540e\uff0cread\u51fd\u6570\u4f1a\u8bfb\u53d6\u5230\u591a\u5c11\u4e2a\u2018A\u2019,\u7531\u811a\u672c\u7684\u5b8f\u5b9a\u4e49\u53ef\u4ee5\u8ba1\u7b97\u51faSKIP_SPACE-ALIGN_SIZE-ADDRESS_SIZE=0xfec,read\u51fd\u6570\u5728\u8bfb\u53d60xfec\u4e2a\u2018A\u2019\u4e4b\u540e\uff0cedi\u5bc4\u5b58\u5668\u6307\u5411\u7684\u4f4d\u7f6e\u57280x77d5d170+0xfec=0x77d5e15c\uff0c\u6ce8\u610fread\u518d\u5f80\u540e\u8bfb\u53d6\u7684\u6570\u636e\u5c31\u662fshellcode\u4e86\uff0c\u5c31\u662f\u8bf40x77d5e15c\u662fshellcode\u7684\u8d77\u59cb\u4f4d\u7f6e\uff0c\u5e76\u4e14\u6b64\u4f4d\u7f6e\u4f4d\u4e8e\u7ebf\u7a0b3\u7684\u7ebf\u7a0b\u6808\u5185<br>\n<img src=\"assets\/18.png\" alt=\"\" \/><br>\n\u73b0\u5728\u5207\u6362\u5230\u7ebf\u7a0b3,\u7ee7\u7eed\u8c03\u8bd5\uff0c\u770b\u770b0x77d5e15c\u5728\u7ebf\u7a0b3\u7684\u7ebf\u7a0b\u6808\u4e2d\u626e\u6f14\u4e86\u4ec0\u4e48\u89d2\u8272<br>\n<img src=\"assets\/19.png\" alt=\"\" \/><br>\n\u7ebf\u7a0b3\u7684\u6808\u9876\u5728\u7ecf\u8fc7\u8c03\u6574\u4e4b\u540e\u6307\u54110x77d5e170\u5904\uff0c\u6b64\u5904\u5df2\u7ecf\u79bb0x77d5e15c\u4e0d\u8fdc\u4e86\u3002\u7ee7\u7eed\u8fd0\u884c\u5230read\u51fd\u6570\u7684\u8c03\u7528\u5904\uff0c\u67e5\u770b\u6808\u4e2d\u7684\u6570\u636e\uff0c\u53d1\u73b0\u6b64\u65f6\u6808\u9876\u6307\u9488\u6307\u54110x77d5e160\u5904\uff0c\u79bb0x77d5e15c\u53ea\u6709\u56db\u4e2a\u5b57\u8282\uff0c\u5728\u8c03\u7528call read\u6307\u4ee4\u540e\u5c06read\u51fd\u6570\u7684\u8fd4\u56de\u5730\u5740\u5b58\u50a8\u52300x77d5e15c\u7684\u4f4d\u7f6e\uff0c\u521a\u624d\u5206\u6790\u52300x77d5e15c\u662fshellcode\u7684\u8d77\u59cb\u5730\u5740\uff0c\u6b64\u5904\u53ef\u4ee5\u52ab\u6301read\u51fd\u6570\u7684\u8fd4\u56de\u5730\u5740\u8fbe\u5230\u4efb\u610f\u4ee3\u7801\u6267\u884c\u7684\u76ee\u7684\u3002\u7531\u4e8e\u7ebf\u7a0b3\u7684read\u51fd\u6570\u4f1a\u54110x77d5e170\u5904\u5199\u5165\u6570\u636e\uff0c\u6b64\u5904\u5185\u5b58\u7a7a\u95f4\u4e5f\u662f\u5b58\u50a8shellcode\u7684\u7a7a\u95f4\uff0c\u56e0\u6b64\uff0c\u4e0d\u80fd\u5411s2\u53d1\u9001\u4efb\u4f55\u6570\u636ehttp\u534f\u8bae\u7684\u6570\u636e\u90e8\u5206\uff0c\u5426\u5219\u5c06\u4f1a\u8d4b\u76d6shellcode\uff0cChiamy Red\u9879\u76ee\u4e2dexp\u7684\u4f5c\u8005\u4f7f\u7528close(s2)\u7684\u65b9\u5f0f\u6765\u8ba9\u7ebf\u7a0b3\u4e2d\u7684read\u51fd\u6570\u8fd4\u56de\uff0c\u4ee5\u8fd0\u884cshellcode\u3002<br>\n<img src=\"assets\/20.png\" alt=\"\" \/><br>\n\u5173\u4e8e\u8c03\u8bd5\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u7684read\u51fd\u6570\u8bfb\u53d6\u5931\u8d25\u7684\u95ee\u9898\uff0c\u53ef\u80fd\u662f\u7531\u4e8e\u4e2d\u65ad\u7684\u65f6\u95f4\u592a\u957f\u5bfc\u81f4socket\u8d85\u65f6\u5f15\u8d77\u7684\uff0c\u76f4\u63a5\u628a\u65ad\u70b9\u4e0b\u5728read\u51fd\u6570\u8c03\u7528\u4e0b\u9762\uff0c\u76f4\u63a5run\u81f3\u65ad\u70b9\u5904\uff0c\u5c31\u80fd\u770b\u5230read\u51fd\u6570\u8bfb\u53d6\u6210\u529f\u4e86\u3002<\/p>"},{"title":"05. linux\u6587\u4ef6\u7cfb\u7edf\u4e0e\u8bbe\u5907\u6a21\u578b","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/05.-linux%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%8E%E8%AE%BE%E5%A4%87%E6%A8%A1%E5%9E%8B\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/05.-linux%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%8E%E8%AE%BE%E5%A4%87%E6%A8%A1%E5%9E%8B\/","description":"<h1 id=\"\u6587\u4ef6\u7cfb\u7edf\u4e0e\u8bbe\u5907\u9a71\u52a8\u4e4b\u95f4\u7684\u5173\u7cfb\">\u6587\u4ef6\u7cfb\u7edf\u4e0e\u8bbe\u5907\u9a71\u52a8\u4e4b\u95f4\u7684\u5173\u7cfb<a class=\"anchor\" href=\"#%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e4%b8%8e%e8%ae%be%e5%a4%87%e9%a9%b1%e5%8a%a8%e4%b9%8b%e9%97%b4%e7%9a%84%e5%85%b3%e7%b3%bb\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/Pasted%20image%2020251106114222.png\" alt=\"Pasted image 20251106114222\" \/><\/p>\n<ul>\n<li>VFS\u4e0e\u6587\u4ef6\u7cfb\u7edf\u4e4b\u95f4\u7684\u63a5\u53e3\u662ffile_operations\u7ed3\u6784\u4f53<\/li>\n<li>\u5bf9\u4e8e\u5757\u8bbe\u5907\u9a71\u52a8\uff0c\u4e0a\u5c42\u6709\u6587\u4ef6\u7cfb\u7edf\u62bd\u8c61\u5c42\uff0c\u5757\u8bbe\u5907\u9a71\u52a8\u770b\u4e0d\u5230file_operations\u3002\u5757\u8bbe\u5907\u53ef\u4ee5\u901a\u8fc7\u6587\u4ef6\u7cfb\u7edf\u7684\u63a5\u53e3\u8fdb\u884c\u6587\u4ef6\u8bbf\u95ee\uff0cfile_operations\u7684\u5b9e\u73b0\u5728\u6587\u4ef6\u7cfb\u7edf\u5185\u3002\u4e5f\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u8bbe\u5907\u6587\u4ef6\u8bbf\u95ee\u88f8\u8bbe\u5907(\u4f8b\u5982<code>dd if=\/dev\/sdb1 of=sdb1.img<\/code>)\uff0c\u6b64\u65f6\u901a\u8fc7\u5185\u6838\u5b9e\u73b0\u7684def_blk_fops\uff08fs\/block_dev.c)\u8fd9\u4e2afile_operations\u7ed3\u6784\u8fdb\u884c\u8bbf\u95ee\uff0c\u4e0d\u8d70\u6587\u4ef6\u7cfb\u7edf\u3002<\/li>\n<li>\u5bf9\u4e8e\u5b57\u7b26\u8bbe\u5907\uff0c\u7531\u4e8e\u6ca1\u6709\u6587\u4ef6\u7cfb\u7edf\u7684\u62bd\u8c61\uff0c\u6240\u4ee5file_operations\u63a5\u53e3\u9700\u8981\u7531\u8bbe\u5907\u9a71\u52a8\u63d0\u4f9b\u3002<\/li>\n<\/ul>\n<h1 id=\"file\u7ed3\u6784\u4f53\u548cinode\u7ed3\u6784\u4f53\">file\u7ed3\u6784\u4f53\u548cinode\u7ed3\u6784\u4f53<a class=\"anchor\" href=\"#file%e7%bb%93%e6%9e%84%e4%bd%93%e5%92%8cinode%e7%bb%93%e6%9e%84%e4%bd%93\" aria-label=\"Link\"><\/a><\/h1>\n<p>file\u7ed3\u6784\u4f53\u4ee3\u8868\u4e00\u4e2a\u6253\u5f00\u7684\u6587\u4ef6\uff0c\u7cfb\u7edf\u4e2d\u6bcf\u4e2a\u6253\u5f00\u7684\u6587\u4ef6\u5728\u5185\u6838\u7a7a\u95f4\u90fd\u6709\u4e00\u4e2a\u5173\u8054\u7684struct file\u3002\u5b83\u7531\u5185\u6838\u5728\u6253\u5f00\u6587\u4ef6\u65f6\u521b\u5efa\uff0c\u5e76\u4f20\u9012\u7ed9\u5728\u6587\u4ef6\u4e0a\u8fdb\u884c\u64cd\u4f5c\u7684\u4efb\u4f55\u51fd\u6570\u3002\u5728\u6587\u4ef6\u7684\u6240\u6709\u5b9e\u4f8b\u90fd\u5173\u95ed\u540e\uff0c\u5185\u6838\u91ca\u653e\u8fd9\u4e2a\u6570\u636e\u7ed3\u6784\u3002\u5728\u5185\u6838\u548c\u9a71\u52a8\u6e90\u4ee3\u7801\u4e2d\uff0cstruct file\u7684\u6307\u9488\u901a\u5e38\u88ab\u547d\u540d\u4e3afile\u6216filp\uff08\u5373file pointer\uff09\u3002<\/p>\n<p>VFS inode\u7ed3\u6784\u4f53\u5305\u542b\u6587\u4ef6\u8bbf\u95ee\u6743\u9650\u3001\u5c5e\u4e3b\u3001\u7ec4\u3001\u5927\u5c0f\u3001\u751f\u6210\u65f6\u95f4\u3001\u8bbf\u95ee\u65f6\u95f4\u3001\u6700\u540e\u4fee\u6539\u65f6\u95f4\u7b49\u4fe1\u606f\uff0c\u5bf9\u4e8e\u8bbe\u5907\u6587\u4ef6\uff0c\u5185\u90e8\u5305\u542b\u8bbe\u5907\u7ed3\u6784\u4f53\u6307\u9488\uff0c\u8bbe\u5907\u53f7\uff0c\u53ca\u8bbe\u5907\u6587\u4ef6\u7684\u5176\u4ed6\u5c5e\u6027\u4fe1\u606f\u3002\u5b83\u662fLinux\u7ba1\u7406\u6587\u4ef6\u7cfb\u7edf\u7684\u6700\u57fa\u672c\u5355\u4f4d\uff0c\u4e5f\u662f\u6587\u4ef6\u7cfb\u7edf\u8fde\u63a5\u4efb\u4f55\u5b50\u76ee\u5f55\u3001\u6587\u4ef6\u7684\u6865\u6881\u3002<\/p>\n<h1 id=\"sysfs\u6587\u4ef6\u7cfb\u7edf\u4e0elinux\u8bbe\u5907\u6a21\u578b\">sysfs\u6587\u4ef6\u7cfb\u7edf\u4e0elinux\u8bbe\u5907\u6a21\u578b<a class=\"anchor\" href=\"#sysfs%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e4%b8%8elinux%e8%ae%be%e5%a4%87%e6%a8%a1%e5%9e%8b\" aria-label=\"Link\"><\/a><\/h1>\n<p>linux2.6\u5f15\u5165\u4e86sysfs\u865a\u62df\u6587\u4ef6\u7cfb\u7edf\uff0csysfs\u628a\u8fde\u63a5\u5728\u7cfb\u7edf\u4e0a\u7684\u8bbe\u5907\u548c\u603b\u7ebf\u7ec4\u7ec7\u6210\u4e3a\u4e00\u4e2a\u5206\u7ea7\u7684\u6587\u4ef6\u7cfb\u7edf\uff0c\u5b83\u4eec\u53ef\u4ee5\u7531\u7528\u6237\u7a7a\u95f4\u5b58\u53d6\uff0c\u5411\u7528\u6237\u7a7a\u95f4\u5bfc\u51fa\u5185\u6838\u6570\u636e\u7ed3\u6784\u4ee5\u53ca\u5b83\u4eec\u7684\u5c5e\u6027\uff0c\u5c55\u793a\u8bbe\u5907\u9a71\u52a8\u6a21\u578b\u4e2d\u5404\u7ec4\u4ef6\u7684\u5c42\u6b21\u5173\u7cfb\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>\/sys\/bus\/ <span style=\"color:#75715e\"># \u603b\u7ebf\u9a71\u52a8\u76ee\u5f55,\u5185\u90e8\u7684\u8bbe\u5907\u76ee\u5f55\u94fe\u63a5\u5230\/sys\/devices\/\u4e2d<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\/sys\/device\/ <span style=\"color:#75715e\"># \u6240\u6709\u8bbe\u5907\u76ee\u5f55<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\/sys\/class\/ <span style=\"color:#75715e\"># \u5177\u6709\u5171\u540c\u7279\u6027\u7684\u8bbe\u5907\uff0c\u5185\u90e8\u7684\u8bbe\u5907\u76ee\u5f55\u94fe\u63a5\u5230\/sys\/device\/\u4e2d<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u5728linux\u5185\u6838\u4e2d\uff0c\u5206\u522b\u4f7f\u7528bus_type\u3001device_driver\u548cdevice\u6765\u63cf\u8ff0\u603b\u7ebf\u3001\u9a71\u52a8\u548c\u8bbe\u5907\uff0c\u8fd93\u4e2a\u7ed3\u6784\u4f53\u5b9a\u4e49\u4e8einclude\/linux\/device.h\u4e2d\u3002device_driver\u548cdevice\u901a\u5e38\u88ab\u5305\u542b\u5728\u5177\u4f53\u7684\u9a71\u52a8\u548c\u8bbe\u5907\u7ed3\u6784\u4f53\u4e2d\u4f5c\u4e3a\u5176\u6210\u5458\u3002<\/p>\n<p>device_driver\u548cdevice\u5206\u522b\u8868\u793a\u9a71\u52a8\u548c\u8bbe\u5907\uff0c\u800c\u8fd9\u4e24\u8005\u90fd\u5fc5\u987b\u4f9d\u9644\u4e8e\u4e00\u79cd\u603b\u7ebf\uff0c\u56e0\u6b64\u90fd\u5305\u542bstruct bus_type\u6307\u9488\u3002\u5728Linux\u5185\u6838\u4e2d\uff0c\u8bbe\u5907\u548c\u9a71\u52a8\u662f\u5206\u5f00\u6ce8\u518c\u7684\uff0c\u901a\u8fc7bus_type\u7684match\u56de\u8c03\u51fd\u6570\u5c06\u4e24\u8005\u5339\u914d\u5728\u4e00\u8d77\uff0c\u4e00\u65e6\u5339\u914d\u6210\u529f\uff0cdevice_driver\u4e2d\u7684probe\u56de\u8c03\u51fd\u6570\u5c31\u88ab\u6267\u884c\u3002<\/p>\n<p>\u603b\u7ebf\u3001\u9a71\u52a8\u548c\u8bbe\u5907\u6700\u7ec8\u90fd\u4f1a\u843d\u5b9e\u4e3asysfs\u4e2d\u76841\u4e2a\u76ee\u5f55\uff0c\u5b83\u4eec\u53ef\u770b\u505a\u662fkobject\u7684\u6d3e\u751f\u7c7b\uff0ckobject\u53ef\u770b\u4f5c\u662f\u6240\u6709\u603b\u7ebf\u3001\u8bbe\u5907\u548c\u9a71\u52a8\u7684\u62bd\u8c61\u57fa\u7c7b\u30021\u4e2akobject\u5bf9\u5e94sysfs\u4e2d\u76841\u4e2a\u76ee\u5f55\uff0c\u603b\u7ebf\u3001\u8bbe\u5907\u548c\u9a71\u52a8\u4e2d\u7684\u5404\u4e2aattribute(attribute\u3001bus_attribute\u3001driver_attribute\u548cdevice_attribute)\u5219\u76f4\u63a5\u843d\u5b9e\u4e3asysfs\u4e2d\u76841\u4e2a\u6587\u4ef6\uff0cattribute\u4f1a\u4f34\u968f\u7740show\u548cstore\u8fd9\u4e24\u4e2a\u56de\u8c03\u51fd\u6570\uff0c\u5206\u522b\u7528\u4e8e\u8bfb\u5199\u8be5attribute\u5bf9\u5e94\u7684sysfs\u6587\u4ef6\u3002<\/p>\n<h1 id=\"devfs\u4e0eudev\">devfs\u4e0eudev<a class=\"anchor\" href=\"#devfs%e4%b8%8eudev\" aria-label=\"Link\"><\/a><\/h1>\n<p>devfs\u7528\u4e8e\u8bbe\u5907\u9a71\u52a8\u7a0b\u5e8f\u81ea\u4e3b\u7ba1\u7406\u8bbe\u5907\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u79f0\u7531\u9a71\u52a8\u7a0b\u5e8f\u6307\u5b9a\uff0c\u5e94\u7528\u5c42\u65e0\u6cd5\u81ea\u7531\u547d\u540d\u3002\u7531linux2.4\u5185\u6838\u5f15\u5165\uff0c\u4e8elinux2.6\u5185\u6838\u4e2d\u88ab\u5220\u9664\uff0c\u73b0\u7531\u5e94\u7528\u5c42\u7684udev\u53d6\u4ee3\u5b83\u3002<\/p>\n<p>udev\u5de5\u4f5c\u5728\u5e94\u7528\u5c42\uff0c\u5b9e\u73b0\u4e86\u8bbe\u5907\u6587\u4ef6\u7ba1\u7406\u673a\u5236\u4e0e\u7b56\u7565\u7684\u5206\u79bb\u3002udev\u4f9d\u9760\u63a5\u6536\u5185\u6838\u53d1\u9001\u7684\u70ed\u63d2\u62d4\u4e8b\u4ef6\u5de5\u4f5c\uff0c\u70ed\u63d2\u62d4\u65f6\u8bbe\u5907\u4fe1\u606f\u7531\u5185\u6838\u901a\u8fc7netlink\u5957\u63a5\u5b57\u53d1\u9001uevent\u4e8b\u4ef6\u5230\u5e94\u7528\u5c42\uff0cudev\u63a5\u6536uevent\u5e76\u6839\u636e\u8bbe\u5907\u4fe1\u606f\u5339\u914d\u7b56\u7565\uff0c\u5728\/dev\u4e0b\u521b\u5efa\u5bf9\u5e94\u7684\u8bbe\u5907\u6587\u4ef6\u3002\u5bf9\u4e8e\u975e\u70ed\u63d2\u62d4\u8bbe\u5907\uff0c\u5728sysfs\u6587\u4ef6\u7cfb\u7edf\u4e0b\u7684\u8bbe\u5907\u6587\u4ef6\u5939\u4e2d\u90fd\u6709\u4e00\u4e2auevent\u5c5e\u6027\u6587\u4ef6(\u4f8b\u5982<code>\/sys\/module\/psmouse\/uevent<\/code>)\uff0c\u5411\u6b64\u6587\u4ef6\u4e2d\u5199\u5165<code>add<\/code>\u53ef\u4ee4\u5185\u6838\u91cd\u65b0\u53d1\u9001uevent\u4fe1\u606f\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \u67e5\u770b\u5b9e\u65f6\u6355\u83b7\u7684uevent\u4fe1\u606f<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>udevadm monitor --kernel --udev --property\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \u67e5\u770b\u5177\u4f53\u8bbe\u5907\u7684\u53ef\u7528uevent\u4fe1\u606f<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>udevadm info -a -p \/sys\/devices\/platform\/serial8250\/tty\/ttyS0\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \u67e5\u770b\/dev\u4e0b\u7684\u8bbe\u5907\u6587\u4ef6\u5bf9\u5e94\/sys\/\u4e0b\u7684\u54ea\u4e2a\u8bbe\u5907<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>udevadm info -q path -n \/dev\/&lt;NAME&gt;<\/span><\/span><\/code><\/pre><\/div><p>udev\u89c4\u5219\u5728\/etc\/udev\/rules.d\/\u76ee\u5f55\u4e0b\u914d\u7f6e\uff0c\u5206\u4e3a\u5339\u914d\u90e8\u5206\u548c\u8d4b\u503c\u90e8\u5206\uff0c\u5339\u914d\u5173\u952e\u5b57\u5305\u62ec\uff1aACTION\uff08\u884c\u4e3a\uff09\u3001KERNEL\uff08\u5339\u914d\u5185\u6838\u8bbe\u5907\u540d\uff09\u3001BUS\uff08\u5339\u914d\u603b\u7ebf\u7c7b\u578b\uff09\u3001SUBSYSTEM\uff08\u5339\u914d\u5b50\u7cfb\u7edf\u540d\uff09\u3001ATTR\uff08\u5c5e\u6027\uff09\u7b49\uff0c\u8d4b\u503c\u5173\u952e\u5b57\u5305\u62ec\uff1aNAME\uff08\u521b\u5efa\u7684\u8bbe\u5907\u6587\u4ef6\u540d\uff09\u3001SYMLINK\uff08\u7b26\u53f7\u521b\u5efa\u94fe\u63a5\u540d\uff09\u3001OWNER\uff08\u8bbe\u7f6e\u8bbe\u5907\u7684\u6240\u6709\u8005\uff09\u3001GROUP\uff08\u8bbe\u7f6e\u8bbe\u5907\u7684\u7ec4\uff09\u3001IMPORT\uff08\u8c03\u7528\u5916\u90e8\u7a0b\u5e8f\uff09\u3001MODE\uff08\u8282\u70b9\u8bbf\u95ee\u6743\u9650\uff09\u7b49\u3002\u5982\u4e0b\u89c4\u5219\u6839\u636e\u5339\u914d\u90e8\u5206\u521b\u5efa\/dev\/eth1\u8bbe\u5907\u6587\u4ef6\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-sh\" data-lang=\"sh\"><span style=\"display:flex;\"><span>SUBSYSTEM<span style=\"color:#f92672\">==<\/span><span style=\"color:#e6db74\">&#34;net&#34;<\/span>, ACTION<span style=\"color:#f92672\">==<\/span><span style=\"color:#e6db74\">&#34;add&#34;<\/span>, DRIVERS<span style=\"color:#f92672\">==<\/span><span style=\"color:#e6db74\">&#34; *&#34;<\/span>, ATTR<span style=\"color:#f92672\">{<\/span>address<span style=\"color:#f92672\">}==<\/span><span style=\"color:#e6db74\">&#34;08:00:27:35:be:ff&#34;<\/span>, ATTR<span style=\"color:#f92672\">{<\/span>dev_id<span style=\"color:#f92672\">}==<\/span><span style=\"color:#e6db74\">&#34;0x0&#34;<\/span>, ATTR<span style=\"color:#f92672\">{<\/span>type<span style=\"color:#f92672\">}==<\/span><span style=\"color:#e6db74\">&#34;1&#34;<\/span>, KERNEL<span style=\"color:#f92672\">==<\/span><span style=\"color:#e6db74\">&#34;eth*&#34;<\/span>, NAME<span style=\"color:#f92672\">=<\/span><span style=\"color:#e6db74\">&#34;eth1&#34;<\/span><\/span><\/span><\/code><\/pre><\/div>"},{"title":"07. linux\u5185\u6838\u4e2d\u7684\u5e76\u53d1\u63a7\u5236","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/07.-linux%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/07.-linux%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6\/","description":"<h1 id=\"\u5e76\u53d1\u5bfc\u81f4\u7684\u7ade\u6001\u6761\u4ef6\">\u5e76\u53d1\u5bfc\u81f4\u7684\u7ade\u6001\u6761\u4ef6<a class=\"anchor\" href=\"#%e5%b9%b6%e5%8f%91%e5%af%bc%e8%87%b4%e7%9a%84%e7%ab%9e%e6%80%81%e6%9d%a1%e4%bb%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/Pasted%20image%2020251107193324.png\" alt=\"Pasted image 20251107193324\" \/><\/p>\n<ul>\n<li>SMP\u60c5\u51b5\u4e0b\u591a\u6838\u95f4\u8fdb\u7a0b\u4e0e\u8fdb\u7a0b\u3001\u8fdb\u7a0b\u4e0e\u4e2d\u65ad\u7684\u5e76\u53d1\uff0c\u53ef\u80fd\u4ea7\u751f\u6838\u95f4\u7ade\u6001\u6761\u4ef6\u3002<\/li>\n<li>\u5355cpu\u60c5\u51b5\u4e0b\uff0c\u8fdb\u7a0b\u62a2\u5360\u3001\u8fdb\u7a0b\u88ab\u4e2d\u65ad\u6253\u65ad\u3001\u4e2d\u65ad\u5d4c\u5957(2.6.35\u7248\u672c\u4ee5\u540e\u53d6\u6d88\u4e86\u4e2d\u65ad\u5d4c\u5957)\uff0c\u53ef\u80fd\u4ea7\u751f\u5e76\u53d1\u7ade\u6001\u6761\u4ef6\u3002<\/li>\n<\/ul>\n<p>\u89e3\u51b3\u7ade\u6001\u95ee\u9898\u7684\u9014\u5f84\u662f\u4fdd\u8bc1\u5bf9\u5171\u4eab\u8d44\u6e90\u7684\u4e92\u65a5\u8bbf\u95ee\uff0c\u8bbf\u95ee\u5171\u4eab\u8d44\u6e90\u7684\u4ee3\u7801\u533a\u57df\u79f0\u4e3a\u4e34\u754c\u533a\uff08Critical Sections\uff09\uff0c\u4e34\u754c\u533a\u9700\u8981\u88ab\u4ee5\u67d0\u79cd\u4e92\u65a5\u673a\u5236\u52a0\u4ee5\u4fdd\u62a4\u3002\u4e2d\u65ad\u5c4f\u853d\u3001\u539f\u5b50\u64cd\u4f5c\u3001\u81ea\u65cb\u9501\u3001\u4fe1\u53f7\u91cf\u3001\u4e92\u65a5\u4f53\u7b49\u662fLinux\u8bbe\u5907\u9a71\u52a8\u4e2d\u53ef\u91c7\u7528\u7684\u4e92\u65a5\u9014\u5f84\u3002<\/p>\n<h1 id=\"\u7f16\u8bd1\u4e71\u5e8f\u548c\u6267\u884c\u4e71\u5e8f\u5bfc\u81f4\u7684\u7ade\u6001\u6761\u4ef6\">\u7f16\u8bd1\u4e71\u5e8f\u548c\u6267\u884c\u4e71\u5e8f\u5bfc\u81f4\u7684\u7ade\u6001\u6761\u4ef6<a class=\"anchor\" href=\"#%e7%bc%96%e8%af%91%e4%b9%b1%e5%ba%8f%e5%92%8c%e6%89%a7%e8%a1%8c%e4%b9%b1%e5%ba%8f%e5%af%bc%e8%87%b4%e7%9a%84%e7%ab%9e%e6%80%81%e6%9d%a1%e4%bb%b6\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"\u7f16\u8bd1\u4e71\u5e8f\">\u7f16\u8bd1\u4e71\u5e8f<a class=\"anchor\" href=\"#%e7%bc%96%e8%af%91%e4%b9%b1%e5%ba%8f\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u7f16\u8bd1\u65b9\u9762\uff0c\u5982\u4e0b\u7ebf\u4ee3\u7801\u7684\u7a0bA\u7f16\u8bd1\u7ed3\u679c\u6307\u4ee4\u987a\u5e8f\u53ef\u80fd\u662fgp\u7684\u8d4b\u503c\u6307\u4ee4\u53d1\u751f\u5728a\u3001b\u3001c\u7684\u8d4b\u503c\u4e4b\u524d\uff0c\u5bf9\u4e8e\u7ebf\u7a0bB\u6765\u8bf4\u8fd9\u53ef\u80fd\u662f\u4e0d\u7b26\u5408\u9884\u671f\u7684\uff0c\u7ebf\u7a0bB\u8bbf\u95ee\u5230\u7684a,b,c\u7684\u503c\u53ef\u80fd\u4e0d\u662f1,2,3\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u7ebf\u7a0bA\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>p<span style=\"color:#f92672\">-&gt;<\/span>a<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">1<\/span><span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>p<span style=\"color:#f92672\">-&gt;<\/span>b<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">2<\/span><span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>p<span style=\"color:#f92672\">-&gt;<\/span>c<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">3<\/span><span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>gp<span style=\"color:#f92672\">=<\/span>p<span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u7ebf\u7a0bB\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>p <span style=\"color:#f92672\">=<\/span> gp;\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> (p <span style=\"color:#f92672\">!=<\/span> NULL) {\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">do_something_with<\/span>(p<span style=\"color:#f92672\">-&gt;<\/span>a, p<span style=\"color:#f92672\">-&gt;<\/span>b, p<span style=\"color:#f92672\">-&gt;<\/span>c);\n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><p>\u89e3\u51b3\u7f16\u8bd1\u4e71\u5e8f\u95ee\u9898\uff0c\u9700\u8981\u901a\u8fc7barrier\uff08\uff09\u7f16\u8bd1\u5c4f\u969c\u8fdb\u884c\u3002\u6211\u4eec\u53ef\u4ee5\u5728\u4ee3\u7801\u4e2d\u8bbe\u7f6ebarrier\uff08\uff09\u5c4f\u969c\uff0c\u8fd9\n\u4e2a\u5c4f\u969c\u53ef\u4ee5\u963b\u6321\u7f16\u8bd1\u5668\u7684\u4f18\u5316\u3002\u5bf9\u4e8e\u4e0a\u8ff0\u7ebf\u7a0bA\u7684\u4ee3\u7801\uff0c\u52a0\u4e0abarrier()\u540e\u7684\u7ed3\u679c\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>p<span style=\"color:#f92672\">-&gt;<\/span>a<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">1<\/span><span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>p<span style=\"color:#f92672\">-&gt;<\/span>b<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">2<\/span><span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>p<span style=\"color:#f92672\">-&gt;<\/span>c<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">3<\/span><span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">barrier<\/span>();\n<\/span><\/span><span style=\"display:flex;\"><span>gp<span style=\"color:#f92672\">=<\/span>p<span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"\u6267\u884c\u4e71\u5e8f\">\u6267\u884c\u4e71\u5e8f<a class=\"anchor\" href=\"#%e6%89%a7%e8%a1%8c%e4%b9%b1%e5%ba%8f\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u6267\u884c\u4e71\u5e8f\u662f\u6307\u5373\u4fbf\u7f16\u8bd1\u7684\u4e8c\u8fdb\u5236\u6307\u4ee4\u7684\u987a\u5e8f\u6309\u7167\u201cp-&gt;a=1\uff1bp-&gt;b=2\uff1bp-&gt;c=3\uff1bgp=p\uff1b\u201d\u6392\u653e\uff0c\u5728\u5904\u7406\u5668\u4e0a\u6267\u884c\u65f6\uff0c\u540e\u53d1\u5c04\u7684\u6307\u4ee4\u8fd8\u662f\u53ef\u80fd\u5148\u6267\u884c\u5b8c\uff0c\u8fd9\u662f\u5904\u7406\u5668\u7684\u201c\u4e71\u5e8f\u6267\u884c\uff08Out-of-Order Execution\uff09\u201d\u7b56\u7565\u3002\u5bf9\u4e8eSMP\u7684\u60c5\u51b5\uff0cCPU 1\u4e0a\u7684\u4e71\u5e8f\u6267\u884c\u5bf9\u4e8eCPU 0\u662f\u4e0d\u53ef\u89c1\u7684\uff0c\u5982\u4e0b\u4ee3\u7801\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ cpu 0\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">while<\/span> (f <span style=\"color:#f92672\">==<\/span> <span style=\"color:#ae81ff\">0<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>print x;\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ cpu 1\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>x <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">42<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span>f <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">1<\/span>;<\/span><\/span><\/code><\/pre><\/div><p>\u7531\u4e8ecpu\u7684\u4e71\u5e8f\u6267\u884c\u7b56\u7565\uff0ccpu 1\u4e0d\u4fdd\u8bc1<code>x=42<\/code>\u4e00\u5b9a\u5728<code>f=1<\/code>\u524d\u6267\u884c\uff0c\u6267\u884c\u65f6\u53ef\u80fd<code>f=1<\/code>\u5148\u6267\u884c\uff0c\u8fd9\u4e00\u4e71\u5e8f\u5bf9cpu-0\u662f\u4e0d\u53ef\u89c1\u7684\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u6253\u5370\u7684x\u503c\u53ef\u80fd\u4e0d\u662f42\u3002\u89e3\u51b3\u6b64\u95ee\u9898\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u7684DMB\u6307\u4ee4\uff0cDMB\u6307\u4ee4\u4fdd\u8bc1<code>f=1<\/code>\u6267\u884c\u524d\uff0c<code>x=42<\/code>\u7684\u8d4b\u503c\u64cd\u4f5c\u4e00\u5b9a\u4f1a\u5b8c\u6210\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ cpu 1\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>x <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">42<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">__asm__<\/span>(<span style=\"color:#e6db74\">&#34;dmb;&#34;<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>f <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">1<\/span>;<\/span><\/span><\/code><\/pre><\/div><p>\u5904\u7406\u5668\u4e3a\u4e86\u89e3\u51b3\u591a\u6838\u95f4\u4e00\u4e2a\u6838\u7684\u5185\u5b58\u884c\u4e3a\u5bf9\u53e6\u5916\u4e00\u4e2a\u6838\u4e0d\u53ef\u89c1\u7684\u95ee\u9898\uff0c\u5f15\u5165\u4e86\u4e00\u4e9b\u5185\u5b58\u5c4f\u969c\u7684\u6307\u4ee4\u3002\u8b6c\n\u5982\uff0cARM\u5904\u7406\u5668\u7684\u5c4f\u969c\u6307\u4ee4\u5305\u62ec\uff1a<\/p>\n<ul>\n<li>DMB\uff08\u6570\u636e\u5185\u5b58\u5c4f\u969c\uff09\uff1a\u5728DMB\u4e4b\u540e\u7684\u663e\u5f0f\u5185\u5b58\u8bbf\u95ee\u6267\u884c\u524d\uff0c\u4fdd\u8bc1\u6240\u6709\u5728DMB\u6307\u4ee4\u4e4b\u524d\u7684\u5185\u5b58\u8bbf\u95ee\u5b8c\u6210\uff1b<\/li>\n<li>DSB\uff08\u6570\u636e\u540c\u6b65\u5c4f\u969c\uff09\uff1a\u7b49\u5f85\u6240\u6709\u5728DSB\u6307\u4ee4\u4e4b\u524d\u7684\u6307\u4ee4\u5b8c\u6210\uff08\u4f4d\u4e8e\u6b64\u6307\u4ee4\u524d\u7684\u6240\u6709\u663e\u5f0f\u5185\u5b58\u8bbf\u95ee\u5747\u5b8c\u6210\uff0c\u4f4d\u4e8e\u6b64\u6307\u4ee4\u524d\u7684\u6240\u6709\u7f13\u5b58\u3001\u8df3\u8f6c\u9884\u6d4b\u548cTLB\u7ef4\u62a4\u64cd\u4f5c\u5168\u90e8\u5b8c\u6210\uff09\uff1b<\/li>\n<li>ISB\uff08\u6307\u4ee4\u540c\u6b65\u5c4f\u969c\uff09\uff1aFlush\u6d41\u6c34\u7ebf\uff0c\u4f7f\u5f97\u6240\u6709ISB\u4e4b\u540e\u6267\u884c\u7684\u6307\u4ee4\u90fd\u662f\u4ece\u7f13\u5b58\u6216\u5185\u5b58\u4e2d\u83b7\u5f97\u7684\u3002<\/li>\n<\/ul>\n<p>Linux\u5185\u6838\u7684\u81ea\u65cb\u9501\u3001\u4e92\u65a5\u4f53\u7b49\u4e92\u65a5\u903b\u8f91\uff0c\u9700\u8981\u7528\u5230\u4e0a\u8ff0\u6307\u4ee4\uff1a\u5728\u8bf7\u6c42\u83b7\u5f97\u9501\u65f6\uff0c\u8c03\u7528\u5c4f\u969c\u6307\u4ee4\uff1b\u5728\u89e3\u9501\u65f6\uff0c\u4e5f\u9700\u8981\u8c03\u7528\u5c4f\u969c\u6307\u4ee4\uff0c\u5982\u4e0b\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4e92\u65a5\u903b\u8f91\uff0c\u5185\u5b58\u5c4f\u969c\u6307\u4ee4\u4fdd\u8bc1\u591a\u6838\u95f4\u6b63\u786e\u7684\u5185\u5b58\u8bbf\u95ee\u903b\u8f91\uff1a<\/p>"},{"title":"08. linux\u963b\u585eio\u3001\u975e\u963b\u585eio\u3001\u5f02\u6b65io","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/08.-linux%E9%98%BB%E5%A1%9Eio%E9%9D%9E%E9%98%BB%E5%A1%9Eio%E5%BC%82%E6%AD%A5io\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/08.-linux%E9%98%BB%E5%A1%9Eio%E9%9D%9E%E9%98%BB%E5%A1%9Eio%E5%BC%82%E6%AD%A5io\/","description":"<h1 id=\"\u963b\u585eio\u4e0e\u7b49\u5f85\u961f\u5217\">\u963b\u585eio\u4e0e\u7b49\u5f85\u961f\u5217<a class=\"anchor\" href=\"#%e9%98%bb%e5%a1%9eio%e4%b8%8e%e7%ad%89%e5%be%85%e9%98%9f%e5%88%97\" aria-label=\"Link\"><\/a><\/h1>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u58f0\u660e\u548c\u521d\u59cb\u7b49\u5f85\u961f\u5217\u5934\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">wait_queue_head_t<\/span> my_queue;\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">init_waitqueue_head<\/span>(<span style=\"color:#f92672\">&amp;<\/span>my_queue);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">DECLARE_WAIT_QUEUE_HEAD<\/span> (name) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u5b9a\u4e49\u7b49\u5f85\u961f\u5217\u5143\u7d20\uff0c\u5e76\u7ed1\u5b9a\u5230\u6307\u5b9a\u8fdb\u7a0b\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">DECLARE_WAITQUEUE<\/span>(name, tsk)\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u6dfb\u52a0\/\u79fb\u9664\u961f\u5217\u5143\u7d20\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">add_wait_queue<\/span>(<span style=\"color:#66d9ef\">wait_queue_head_t<\/span> <span style=\"color:#f92672\">*<\/span>q, <span style=\"color:#66d9ef\">wait_queue_t<\/span> <span style=\"color:#f92672\">*<\/span>wait);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">remove_wait_queue<\/span>(<span style=\"color:#66d9ef\">wait_queue_head_t<\/span> <span style=\"color:#f92672\">*<\/span>q, <span style=\"color:#66d9ef\">wait_queue_t<\/span> <span style=\"color:#f92672\">*<\/span>wait);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u4e0b\u5217\u5b8f\u68c0\u67e5condition\u662f\u5426\u6ee1\u8db3\uff0c\u963b\u585e\u5e76\u7b49\u5f85\u88ab\u5524\u9192\uff0c\u5524\u9192\u65f6\u68c0\u67e5condition\u662f\u5426\u6ee1\u8db3\uff0c\u4e0d\u6ee1\u8db3\u7ee7\u7eed\u963b\u585e\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u53ea\u9700\u58f0\u660e\u7b49\u5f85\u961f\u5217\u5934\uff0c\u7136\u540e\u76f4\u63a5\u8c03\u7528\u4e0b\u5217\u5b8f\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">wait_event<\/span>(queue, condition)\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">wait_event_interruptible<\/span>(queue, condition)\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">wait_event_timeout<\/span>(queue, condition, timeout)\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">wait_event_interruptible_timeout<\/span>(queue, condition, timeout)\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u5524\u9192\u6307\u5b9a\u961f\u5217\u4e2d\u5143\u7d20\u7ed1\u5b9a\u7684\u8fdb\u7a0b\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">wake_up<\/span>(<span style=\"color:#66d9ef\">wait_queue_head_t<\/span> <span style=\"color:#f92672\">*<\/span>queue);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">wake_up_interruptible<\/span>(<span style=\"color:#66d9ef\">wait_queue_head_t<\/span> <span style=\"color:#f92672\">*<\/span>queue);<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/Pasted%20image%2020251109123130.png\" alt=\"Pasted image 20251109123130\" \/><\/p>\n<h1 id=\"\u975e\u963b\u585eio\u4e0eselectpollepoll\u8f6e\u8be2\">\u975e\u963b\u585eio\u4e0eselect,poll,epoll\u8f6e\u8be2<a class=\"anchor\" href=\"#%e9%9d%9e%e9%98%bb%e5%a1%9eio%e4%b8%8eselectpollepoll%e8%bd%ae%e8%af%a2\" aria-label=\"Link\"><\/a><\/h1>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ app\u8bbe\u7f6e\u975e\u963b\u585eflag\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>oflags <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">fcntl<\/span>(FILENO, F_GETFL);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">fcntl<\/span>(FILENO, F_SETFL, oflags <span style=\"color:#f92672\">|<\/span> O_NONBLOCK);<\/span><\/span><\/code><\/pre><\/div><p>\u4f7f\u7528\u975e\u963b\u585eI\/O\u7684\u5e94\u7528\u7a0b\u5e8f\u901a\u5e38\u4f1a\u4f7f\u7528select\/poll\/epoll\u7cfb\u7edf\u8c03\u7528\u67e5\u8be2\u662f\u5426\u53ef\u5bf9\u8bbe\u5907\u8fdb\u884c\u65e0\u963b\u585e\u7684\u8bbf\u95ee\u3002\u7cfb\u7edf\u8c03\u7528\u6700\u7ec8\u4f1a\u4f7f\u8bbe\u5907\u9a71\u52a8\u4e2d\u7684poll\u51fd\u6570\u88ab\u6267\u884c\u3002\u65f6\u5e8f\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7528\u6237\u8fdb\u7a0b\u8c03\u7528<\/span> select<span style=\"color:#f92672\">\/<\/span>poll<span style=\"color:#f92672\">\/<\/span>epoll\u7cfb\u7edf\u8c03\u7528\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u5185\u6838\u8c03\u7528\u9a71\u52a8\u7684<\/span> poll <span style=\"color:#960050;background-color:#1e0010\">\u65b9\u6cd5<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u9a71\u52a8\u8c03\u7528<\/span> <span style=\"color:#a6e22e\">poll_wait<\/span>()<span style=\"color:#960050;background-color:#1e0010\">\u6ce8\u518c\u7b49\u5f85\u961f\u5217\uff0c\u5e76\u5224\u65ad\u662f\u5426\u6709\u4e8b\u4ef6<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u5185\u6838\u5c06\u8fdb\u7a0b\u52a0\u5165\u7b49\u5f85\u961f\u5217<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u65e0\u4e8b\u4ef6\u65f6\u7528\u6237\u8fdb\u7a0b\u5728\u5185\u6838\u4e2d\u4f11\u7720\u7b49\u5f85<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u4e8b\u4ef6\u53d1\u751f<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u9a71\u52a8\u8c03\u7528<\/span> <span style=\"color:#a6e22e\">wake_up_interruptible<\/span>()\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u5185\u6838\u5524\u9192\u4f11\u7720\u7684\u8fdb\u7a0b<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u5185\u6838\u518d\u6b21\u8c03\u7528\u9a71\u52a8\u7684<\/span> poll <span style=\"color:#960050;background-color:#1e0010\">\u65b9\u6cd5\uff0c\u6b64\u65f6<\/span>poll_wait\u4e0d\u4f1a\u518d\u6b21\u6ce8\u518c\u7b49\u5f85\u961f\u5217\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u9a71\u52a8\u8fd4\u56de\u4e8b\u4ef6\u63a9\u7801<\/span> (<span style=\"color:#960050;background-color:#1e0010\">\u5982<\/span> POLLIN)\n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#960050;background-color:#1e0010\">\u2193<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>select<span style=\"color:#f92672\">\/<\/span>poll<span style=\"color:#f92672\">\/<\/span>epoll <span style=\"color:#960050;background-color:#1e0010\">\u7cfb\u7edf\u8c03\u7528\u8fd4\u56de\uff0c\u7528\u6237\u8fdb\u7a0b\u5904\u7406\u4e8b\u4ef6<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"selectpollepoll\u51fd\u6570-\u4e0e-io-\u6a21\u5f0f\u7684\u7ec4\u5408\">select\/poll\/epoll\u51fd\u6570 \u4e0e I\/O \u6a21\u5f0f\u7684\u7ec4\u5408<a class=\"anchor\" href=\"#selectpollepoll%e5%87%bd%e6%95%b0-%e4%b8%8e-io-%e6%a8%a1%e5%bc%8f%e7%9a%84%e7%bb%84%e5%90%88\" aria-label=\"Link\"><\/a><\/h3>\n<table>\n\t<thead>\n\t\t\t<tr>\n\t\t\t\t\t<th>\u7ec4\u5408\u65b9\u5f0f<\/th>\n\t\t\t\t\t<th>poll \u8d85\u65f6<\/th>\n\t\t\t\t\t<th>fd \u6a21\u5f0f<\/th>\n\t\t\t\t\t<th>\u884c\u4e3a\u7279\u70b9<\/th>\n\t\t\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t\t\t<tr>\n\t\t\t\t\t<td><code>poll(fds, n, -1)<\/code><\/td>\n\t\t\t\t\t<td>\u963b\u585e\u76f4\u5230\u4e8b\u4ef6\u5524\u9192<\/td>\n\t\t\t\t\t<td>\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u4f20\u7edf\u963b\u585e\u6a21\u5f0f\uff0c\u963b\u585e\u4e00\u4e2afd\uff0c\u5269\u4e0b\u7684\u90fd\u6ca1\u6cd5\u5904\u7406<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><code>poll(fds, n, -1)<\/code><\/td>\n\t\t\t\t\t<td>\u963b\u585e\u76f4\u5230\u4e8b\u4ef6\u5524\u9192<\/td>\n\t\t\t\t\t<td>\u975e\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u4e8b\u4ef6\u9a71\u52a8\uff0cread\u4e0d\u963b\u585e<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><code>poll(fds, n, 0)<\/code><\/td>\n\t\t\t\t\t<td>\u4e0d\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u4f20\u7edf\u963b\u585e\u6a21\u5f0f\uff0c\u963b\u585e\u4e00\u4e2afd\uff0c\u5269\u4e0b\u7684\u90fd\u6ca1\u6cd5\u5904\u7406<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><code>poll(fds, n, 0)<\/code><\/td>\n\t\t\t\t\t<td>\u4e0d\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u975e\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u771f\u6b63\u7684\u975e\u963b\u585e\u8f6e\u8be2\uff0c\u5fd9\u8f6e\u8be2\uff0c\u6d6a\u8d39CPU<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><code>poll(fds, n, 100)<\/code><\/td>\n\t\t\t\t\t<td>100ms\u8d85\u65f6<\/td>\n\t\t\t\t\t<td>\u975e\u963b\u585e<\/td>\n\t\t\t\t\t<td>\u4e8b\u4ef6\u9a71\u52a8+\u8d85\u65f6\u5904\u7406<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>\u5982\u4e0a\u6240\u793a\uff0c\u6b63\u786e\u7684\u4e8b\u4ef6\u9a71\u52a8io\u7ec4\u5408\u53ea\u6709\u4e24\u4e2a\u3002<\/td>\n\t\t\t\t\t<td><\/td>\n\t\t\t\t\t<td><\/td>\n\t\t\t\t\t<td><\/td>\n\t\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<h2 id=\"file_operations\u4e2d\u7684poll\u56de\u8c03\u51fd\u6570\">file_operations\u4e2d\u7684poll\u56de\u8c03\u51fd\u6570<a class=\"anchor\" href=\"#file_operations%e4%b8%ad%e7%9a%84poll%e5%9b%9e%e8%b0%83%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#a6e22e\">int<\/span>(<span style=\"color:#f92672\">*<\/span>poll)(<span style=\"color:#66d9ef\">struct<\/span> file <span style=\"color:#f92672\">*<\/span> filp, <span style=\"color:#66d9ef\">struct<\/span> poll_table<span style=\"color:#f92672\">*<\/span> wait);<\/span><\/span><\/code><\/pre><\/div><p>\u6b64\u56de\u8c03\u5e94\u5b8c\u6210\u5982\u4e0b\u4e24\u9879\u5de5\u4f5c\uff1a\n1\uff09\u5bf9\u53ef\u80fd\u5f15\u8d77\u8bbe\u5907\u6587\u4ef6\u72b6\u6001\u53d8\u5316\u7684\u7b49\u5f85\u961f\u5217\u8c03\u7528poll_wait\uff08\uff09\u51fd\u6570\uff0c\u5c06\u5bf9\u5e94\u7684\u7b49\u5f85\u961f\u5217\u5934\u90e8\u6dfb\u52a0\u5230poll_table\u4e2d\u3002\n2\uff09\u8fd4\u56de\u8bbe\u5907\u8d44\u6e90\u7684\u53ef\u83b7\u53d6\u72b6\u6001\uff0c\u5373POLLIN\u3001POLLOUT\u3001POLLPRI\u3001POLLERR\u3001POLLNVAL\u7b49\u5b8f\u7684\u201c\u4f4d\u6216\u201d\u7ed3\u679c\u3002<\/p>"},{"title":"10. linux\u5185\u6838\u4e2d\u65ad\u4e0e\u5b9a\u65f6\u5668","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/10.-linux%E5%86%85%E6%A0%B8%E4%B8%AD%E6%96%AD%E4%B8%8E%E5%AE%9A%E6%97%B6%E5%99%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/10.-linux%E5%86%85%E6%A0%B8%E4%B8%AD%E6%96%AD%E4%B8%8E%E5%AE%9A%E6%97%B6%E5%99%A8\/","description":"<p>linux\u4e2d\u7684\u4e2d\u65ad\u4e0d\u53ef\u5d4c\u5957\u3002\u4e3a\u4e86\u5728\u4e2d\u65ad\u6267\u884c\u65f6\u95f4\u5c3d\u91cf\u77ed\u548c\u4e2d\u65ad\u5904\u7406\u9700\u5b8c\u6210\u7684\u5de5\u4f5c\u91cf\u5927\u4e4b\u95f4\u627e\u5230\u4e00\u4e2a\u5e73\u8861\u70b9\uff0cLinux\u5c06\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\u5206\u89e3\u4e3a\u4e24\u4e2a\u534a\u90e8\uff1a\u4e0a\u534a\u90e8\uff08Top Half\uff09\u548c\u4e0b\u534a\u90e8\uff08BottomHalf\uff09\u3002\u4e0a\u534a\u90e8\u5728\u5173\u4e2d\u65ad\u72b6\u6001\u4e0b\u5904\u7406\u7d27\u6025\u7684\u4e8b\u60c5\uff0c\u4e0b\u534a\u90e8\u5728\u5f00\u4e2d\u65ad\u4e0b\u5904\u7406\u975e\u7d27\u6025\u4e8b\u52a1\uff0c\u53ef\u4ee5\u88ab\u5176\u4ed6\u4e2d\u65ad\u6253\u65ad\uff0c\u5904\u7406\u5b8c\u5176\u4ed6\u4e2d\u65ad\u7684\u4e0a\u534a\u90e8\u540e\uff0c\u7ee7\u7eed\u56de\u6765\u6267\u884c\u4e4b\u524d\u6ca1\u6267\u884c\u5b8c\u7684\u4e0b\u534a\u90e8\u3002\n<img src=\"assets\/Pasted%20image%2020251214144205.png\" alt=\"Pasted image 20251214144205\" \/>\n<img src=\"assets\/Pasted%20image%2020251214144220.png\" alt=\"Pasted image 20251214144220\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u7533\u8bf7\u4e2d\u65ad\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">request_irq<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq, <span style=\"color:#66d9ef\">irq_handler_t<\/span> handler, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> flags,<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ devm_\u5f00\u5934\u7684API\u7533\u8bf7\u7684\u8d44\u6e90\u662f\u5185\u6838\u81ea\u52a8\u7ba1\u7406\u7684\uff0c\u65e0\u9700\u663e\u5f0f\u91ca\u653e\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">devm_request_irq<\/span>(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq, <span style=\"color:#66d9ef\">irq_handler_t<\/span> handler,<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> irqflags, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>devname, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev_id);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u91ca\u653e\u4e2d\u65ad\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">free_irq<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq,<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev_id);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u4e2d\u65ad\u6e90\u5c4f\u853d\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">disable_irq<\/span>(<span style=\"color:#66d9ef\">int<\/span> irq); <span style=\"color:#75715e\">\/\/ \u7b49\u5f85\u6307\u5b9a\u4e2d\u65ad\u5904\u7406\u5b8c\u6bd5\u8fd4\u56de\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">disable_irq_nosync<\/span>(<span style=\"color:#66d9ef\">int<\/span> irq); <span style=\"color:#75715e\">\/\/ \u7acb\u5373\u8fd4\u56de\uff0c\u4e0d\u4f1a\u7b49\u5f85\u6307\u5b9a\u4e2d\u65ad\u5904\u7406\u5b8c\u6bd5\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">enable_irq<\/span>(<span style=\"color:#66d9ef\">int<\/span> irq);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u5c4f\u853d\u548c\u6062\u590d\u672cCPU\u6838\u7684\u6240\u6709\u4e2d\u65ad,local_\u5f00\u5934\u7684\u65b9\u6cd5\u4f5c\u7528\u8303\u56f4\u4e3a\u672cCPU\u6838\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define local_irq_save(flags) ...\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">local_irq_disable<\/span>(<span style=\"color:#66d9ef\">void<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define local_irq_restore(flags) ...\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">local_irq_enable<\/span>(<span style=\"color:#66d9ef\">void<\/span>);<\/span><\/span><\/code><\/pre><\/div><h1 id=\"\u4e0b\u534a\u90e8bottomhalf\">\u4e0b\u534a\u90e8\uff08BottomHalf\uff09<a class=\"anchor\" href=\"#%e4%b8%8b%e5%8d%8a%e9%83%a8bottomhalf\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u4e0b\u534a\u90e8\u6709\u591a\u79cd\u5b9e\u73b0\u673a\u5236\uff0cLinux \u4e2d\u65ad\u4e0b\u534a\u90e8\u53d1\u5c55\u65f6\u95f4\u7ebf\uff1a<\/p>\n<ul>\n<li>Linux 2.2 (1999) \u2192 BH\uff08Bottom Halves\uff09- 2.2 \u7248\u672c\u7684\u4e0b\u534a\u90e8\uff0c\u5df2\u5b8c\u5168\u79fb\u9664<\/li>\n<li>Linux 2.3 (2000) \u2192 Tasklets - \u4e0d\u63a8\u8350\u65b0\u4ee3\u7801\u4f7f\u7528\uff0c\u4f46\u6709\u5927\u91cf\u9057\u7559\u9a71\u52a8\u4f7f\u7528<\/li>\n<li>Linux 2.5 (2002) \u2192 Softirqs - \u5185\u6838\u6838\u5fc3\u57fa\u7840\u8bbe\u65bd\uff0c\u4ecd\u5728\u6d3b\u8dc3\u4f7f\u7528\uff0c\u9a71\u52a8\u4e00\u822c\u4e0d\u76f4\u63a5\u7528<\/li>\n<li>Linux 2.6.17 (2006) \u2192 Threaded IRQs - \u53ef\u7ebf\u7a0b\u5316\u7684\u4e2d\u65ad\u5904\u7406\uff0c\u4e2d\u65ad\u5904\u7406\u7684\u73b0\u4ee3\u65b9\u6848<\/li>\n<li>Linux 3.14 (2014) \u2192 Workqueues \u91cd\u6784 - \u5f53\u524d\u6700\u63a8\u8350\u7684\u901a\u7528\u5ef6\u8fdf\u6267\u884c\u673a\u5236<\/li>\n<li>\u81f3\u4eca \u2192 \u591a\u79cd\u673a\u5236\u5e76\u5b58\uff0c\u5404\u6709\u9002\u7528\u573a\u666f<\/li>\n<\/ul>\n<table>\n\t<thead>\n\t\t\t<tr>\n\t\t\t\t\t<th>\u673a\u5236<\/th>\n\t\t\t\t\t<th>\u6267\u884c\u4e0a\u4e0b\u6587<\/th>\n\t\t\t\t\t<th>\u53ef\u5426\u7761\u7720<\/th>\n\t\t\t\t\t<th>\u5e76\u53d1\u6027<\/th>\n\t\t\t\t\t<th>\u63a8\u8350\u7a0b\u5ea6<\/th>\n\t\t\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t\t\t<tr>\n\t\t\t\t\t<td><strong>Softirqs<\/strong><\/td>\n\t\t\t\t\t<td>\u8f6f\u4e2d\u65ad\u4e0a\u4e0b\u6587<\/td>\n\t\t\t\t\t<td>\u4e0d\u53ef\u7761\u7720<\/td>\n\t\t\t\t\t<td>\u540c\u7c7b\u578b\u4e32\u884c<\/td>\n\t\t\t\t\t<td>\u5185\u6838\u6838\u5fc3\u4f7f\u7528<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><strong>Tasklets<\/strong><\/td>\n\t\t\t\t\t<td>\u8f6f\u4e2d\u65ad\u4e0a\u4e0b\u6587<\/td>\n\t\t\t\t\t<td>\u4e0d\u53ef\u7761\u7720<\/td>\n\t\t\t\t\t<td>\u540c\u7c7b\u578b\u4e32\u884c<\/td>\n\t\t\t\t\t<td>\u4e0d\u63a8\u8350\u65b0\u4ee3\u7801<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><strong>Workqueues<\/strong><\/td>\n\t\t\t\t\t<td>\u8fdb\u7a0b\u4e0a\u4e0b\u6587<\/td>\n\t\t\t\t\t<td>\u53ef\u4ee5\u7761\u7720\uff0c\u91ca\u653e\u65f6\u4f7f\u7528\u5b8c\u6210\u91cf\u540c\u6b65<\/td>\n\t\t\t\t\t<td>\u4e32\u884c\uff0c\u53ef\u624b\u52a8\u521b\u5efa\u5185\u6838\u7ebf\u7a0b\u72ec\u7acb\u8fd0\u884c<\/td>\n\t\t\t\t\t<td>\u63a8\u8350\u7528\u4e8e\u7b80\u5355\u4efb\u52a1<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td><strong>Threaded IRQs<\/strong><\/td>\n\t\t\t\t\t<td>\u8fdb\u7a0b\u4e0a\u4e0b\u6587<\/td>\n\t\t\t\t\t<td>\u53ef\u4ee5\u7761\u7720\uff0c\u91ca\u653e\u65f6\u4f7f\u7528\u5b8c\u6210\u91cf\u540c\u6b65<\/td>\n\t\t\t\t\t<td>\u6bcf\u4e2aIRQ\u8fd0\u884c\u4e00\u4e2a\u72ec\u7acb\u7ebf\u7a0b<\/td>\n\t\t\t\t\t<td>\u63a8\u8350\u7528\u4e8e\u8017\u65f6\u4efb\u52a1<\/td>\n\t\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<h2 id=\"softirq\">softirq<a class=\"anchor\" href=\"#softirq\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u9a71\u52a8\u4e0d\u5b9c\u76f4\u63a5\u4f7f\u7528softirq<\/p>"},{"title":"11-1. linux\u5185\u6838\u5185\u5b58\u7ba1\u7406","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/11-1.-linux%E5%86%85%E6%A0%B8%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/11-1.-linux%E5%86%85%E6%A0%B8%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86\/","description":"<h1 id=\"mmu\u5185\u5b58\u7ba1\u7406\u5355\u5143\">MMU\uff08\u5185\u5b58\u7ba1\u7406\u5355\u5143\uff09<a class=\"anchor\" href=\"#mmu%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e5%8d%95%e5%85%83\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u9ad8\u6027\u80fd\u5904\u7406\u5668\u4e00\u822c\u4f1a\u63d0\u4f9b\u4e00\u4e2a\u5185\u5b58\u7ba1\u7406\u5355\u5143\uff08MMU\uff09\uff0c\u8be5\u5355\u5143\u8f85\u52a9\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u884c\u5185\u5b58\u7ba1\u7406\uff0c\u63d0\u4f9b\u865a\u62df\u5730\u5740\u548c\u7269\u7406\u5730\u5740\u7684\u6620\u5c04\u3001\u5185\u5b58\u8bbf\u95ee\u6743\u9650\u4fdd\u62a4\u548cCache\u7f13\u5b58\u63a7\u5236\u7b49\u786c\u4ef6\u652f\u6301\u3002<\/p>\n<h2 id=\"mmu\u64cd\u4f5c\u539f\u7406\">MMU\u64cd\u4f5c\u539f\u7406<a class=\"anchor\" href=\"#mmu%e6%93%8d%e4%bd%9c%e5%8e%9f%e7%90%86\" aria-label=\"Link\"><\/a><\/h2>\n<p>arm, powerPC, mips\u7b49\u67b6\u6784\u5904\u7406\u5668\u90fd\u6709\u5982\u4e0b\u7c7b\u4f3c\u7684MMU\u673a\u5236\u3002\u5177\u4f53\u7684MMU\u7ba1\u7406\u5668\u53c2\u8003\u67b6\u6784\u624b\u518c\u3002\n1\uff09TLB\uff08Translation Lookaside Buffer\uff09\uff1a\u5373\u8f6c\u6362\u65c1\u8def\u7f13\u5b58\uff0cTLB\u662fMMU\u7684\u6838\u5fc3\u90e8\u4ef6\uff0c\u5b83\u7f13\u5b58\u5c11\u91cf\u7684\u865a\u62df\u5730\u5740\u4e0e\u7269\u7406\u5730\u5740\u7684\u8f6c\u6362\u5173\u7cfb\uff0c\u662f\u8f6c\u6362\u8868\u7684Cache\uff0c\u56e0\u6b64\u4e5f\u7ecf\u5e38\u88ab\u79f0\u4e3a\u201c\u5feb\u8868\u201d\u3002\n2\uff09TTW\uff08Translation Table walk\uff09\uff1a\u5373\u8f6c\u6362\u8868\u6f2b\u6e38\uff0c\u5f53TLB\u4e2d\u6ca1\u6709\u7f13\u51b2\u5bf9\u5e94\u7684\u5730\u5740\u8f6c\u6362\u5173\u7cfb\u65f6\uff0c\u9700\u8981\u901a\u8fc7\u5bf9\u5185\u5b58\u4e2d\u8f6c\u6362\u8868\uff08\u5927\u591a\u6570\u5904\u7406\u5668\u7684\u8f6c\u6362\u8868\u4e3a\u591a\u7ea7\u9875\u8868\uff0c\u5982\u56fe11.2\u6240\u793a\uff09\u7684\u8bbf\u95ee\u6765\u83b7\u5f97\u865a\u62df\u5730\u5740\u548c\u7269\u7406\u5730\u5740\u7684\u5bf9\u5e94\u5173\u7cfb\u3002TTW\u6210\u529f\u540e\uff0c\u7ed3\u679c\u5e94\u5199\u5165TLB\u4e2d\u3002<\/p>\n<p><img src=\"assets\/Pasted%20image%2020251111162835.png\" alt=\"Pasted image 20251111162835\" \/>\n<img src=\"assets\/Pasted%20image%2020251111162856.png\" alt=\"Pasted image 20251111162856\" \/><\/p>\n<h1 id=\"linux\u5185\u5b58\u6620\u5c04\u5e03\u5c40\">linux\u5185\u5b58\u6620\u5c04\u5e03\u5c40<a class=\"anchor\" href=\"#linux%e5%86%85%e5%ad%98%e6%98%a0%e5%b0%84%e5%b8%83%e5%b1%80\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5728Linux\u7cfb\u7edf\u4e2d\uff0c\u8fdb\u7a0b\u76844GB\u5185\u5b58\u7a7a\u95f4\u88ab\u5206\u4e3a\u4e24\u4e2a\u90e8\u5206\u2014\u2014\u7528\u6237\u7a7a\u95f4(0<del>3G)\u4e0e\u5185\u6838\u7a7a\u95f4(3<\/del>4G)\u3002\u6bcf\u4e2a\u8fdb\u7a0b\u7684\u7528\u6237\u7a7a\u95f4\u90fd\u662f\u5b8c\u5168\u72ec\u7acb\u3001\u4e92\u4e0d\u76f8\u5e72\u7684\uff0c\u7528\u6237\u8fdb\u7a0b\u5404\u81ea\u6709\u4e0d\u540c\u7684\u9875\u8868\u3002\u800c\u5185\u6838\u7a7a\u95f4\u662f\u7531\u5185\u6838\u8d1f\u8d23\u6620\u5c04\uff0c\u5b83\u5e76\u4e0d\u4f1a\u8ddf\u7740\u8fdb\u7a0b\u6539\u53d8\uff0c\u662f\u56fa\u5b9a\u7684\u3002\u5185\u6838\u7a7a\u95f4\u7684\u865a\u62df\u5730\u5740\u5230\u7269\u7406\u5730\u5740\u6620\u5c04\u662f\u88ab\u6240\u6709\u8fdb\u7a0b\u5171\u4eab\u7684\uff0c\u5185\u6838\u7684\u865a\u62df\u7a7a\u95f4\u72ec\u7acb\u4e8e\u5176\u4ed6\u7a0b\u5e8f\u3002\n<img src=\"assets\/Pasted%20image%2020251111163515.png\" alt=\"Pasted image 20251111163515\" \/>\n32\u4f4dARM Linux\u7684\u5185\u6838\u7a7a\u95f4\u5730\u5740\u6620\u5c04\u4e0ex86\u4e0d\u592a\u4e00\u6837\uff0c\u5185\u6838\u6587\u6863<code>Documentation\/arm\/memory.txt<\/code>\u7ed9\u51fa\u4e86ARM Linux\u7684\u5185\u5b58\u6620\u5c04\u60c5\u51b5\u3002\n<img src=\"assets\/Pasted%20image%2020251111163603.png\" alt=\"Pasted image 20251111163603\" \/>\n\u5bf9\u4e8e\u5185\u6838\u7269\u7406\u5185\u5b58\u6620\u5c04\u533a\u7684\u865a\u62df\u5185\u5b58\uff08\u5373\u4eceDMA\u548c\u5e38\u89c4\u533a\u57df\u6620\u5c04\u8fc7\u6765\u7684\uff09\uff0c\u4f7f\u7528virt_to_phys\uff08\uff09\u53ef\u4ee5\u5b9e\u73b0\u5185\u6838\u865a\u62df\u5730\u5740\u8f6c\u5316\u4e3a\u7269\u7406\u5730\u5740\u3002phys_to_virt\uff08\uff09\u5c06\u7269\u7406\u5730\u5740\u8f6c\u5316\u4e3a\u5185\u6838\u865a\u62df\u5730\u5740\u3002virt_to_phys\uff08\uff09\u548cphys_to_virt\uff08\uff09\u65b9\u6cd5\u4ec5\u9002\u7528\u4e8eDMA\u548c\u5e38\u89c4\u533a\u57df\uff0c\u9ad8\u7aef\u5185\u5b58\u7684\u865a\u62df\u5730\u5740\u4e0e\u7269\u7406\u5730\u5740\u4e4b\u95f4\u4e0d\u5b58\u5728\u5982\u6b64\u7b80\u5355\u7684\u6362\u7b97\u5173\u7cfb\u3002\n\u5bf9\u4e8e\u5927\u591a\u6570\u73b0\u4ee3\u5d4c\u5165\u5f0f\u5904\u7406\u5668\u800c\u8a00\uff0cDMA\u64cd\u4f5c\u53ef\u4ee5\u5728\u6574\u4e2a\u5e38\u89c4\u5185\u5b58\u533a\u57df\u8fdb\u884c\uff0c\u56e0\u6b64DMA\u533a\u57df\u5c31\u76f4\u63a5\u8986\u76d6\u4e86\u5e38\u89c4\u5185\u5b58\u3002<\/p>\n<h1 id=\"linux\u5185\u5b58\u7ba1\u7406\">linux\u5185\u5b58\u7ba1\u7406<a class=\"anchor\" href=\"#linux%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"buddy\u5185\u5b58\u5206\u914d\u5668\">buddy\u5185\u5b58\u5206\u914d\u5668<a class=\"anchor\" href=\"#buddy%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e5%99%a8\" aria-label=\"Link\"><\/a><\/h2>\n<p>DMA\u3001\u5e38\u89c4\u3001\u9ad8\u7aef\u5185\u5b58\u8fd93\u4e2a\u533a\u57df\u90fd\u91c7\u7528buddy\u7b97\u6cd5\u8fdb\u884c\u7ba1\u7406\uff0c\u628a\u7a7a\u95f2\u7684\u9875\u9762\u4ee52^n\u4e3a\u5355\u4f4d\u8fdb\u884c\u7ba1\u7406\uff0c\u56e0\u6b64Linux\u6700\u5e95\u5c42\u7684\u5185\u5b58\u7533\u8bf7\u90fd\u662f\u4ee52^n\u4e3a\u5355\u4f4d\u7684\u3002\u4e0b\u5217\u51fd\u6570\u53ef\u4ee5\u4f7f\u7528buddy\u7b97\u6cd5\u5206\u914d\u5185\u5b58\u9875\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">__get_free_pages<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> flags, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> order); <span style=\"color:#75715e\">\/\/ \u5206\u914d2^order\u4e2a\u9875\uff0c\u4e0d\u6e05\u96f6\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> <span style=\"color:#a6e22e\">get_zeroed_page<\/span>(<span style=\"color:#66d9ef\">gfp_t<\/span> gfp_mask); <span style=\"color:#75715e\">\/\/ \u5206\u914d\u4e00\u4e2a\u9875\uff0c\u5e76\u6e05\u96f6\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">__free_pages<\/span>(<span style=\"color:#66d9ef\">struct<\/span> page <span style=\"color:#f92672\">*<\/span>page, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> order); <span style=\"color:#75715e\">\/\/ \u91ca\u653e\u5206\u914d\u7684\u9875\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u4e0a\u8ff0\u51fd\u6570\u5728\u5b9e\u73b0\u4e2d\u8c03\u7528\u4e86<code>alloc_page<\/code>\u51fd\u6570\u8fdb\u884c\u7a7a\u95f4\u5206\u914d\uff0calloc_pages\uff08\uff09\u65e2\u53ef\u4ee5\u5728\u5185\u6838\u7a7a\u95f4\u5206\u914d\uff0c\u4e5f\u53ef\u4ee5\u5728\u7528\u6237\u7a7a\u95f4\u5206\u914d\uff0c\u53c2\u6570\u542b\u4e49\u4e0e__get_free_pages\uff08\uff09\u7c7b\u4f3c\uff0c\u4f46\u5b83\u8fd4\u56de\u5206\u914d\u7684\u7b2c\u4e00\u4e2a\u9875\u7684\u63cf\u8ff0\u7b26\u800c\u975e\u9996\u5730\u5740\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> page <span style=\"color:#f92672\">*<\/span> <span style=\"color:#a6e22e\">alloc_pages<\/span>(<span style=\"color:#66d9ef\">int<\/span> gfp_mask, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> order);<\/span><\/span><\/code><\/pre><\/div><p>\u4f7f\u7528GFP_KERNEL\u6807\u5fd7\u7533\u8bf7\u5185\u5b58\u65f6\uff0c\u82e5\u6682\u65f6\u4e0d\u80fd\u6ee1\u8db3\uff0c\u5219\u8fdb\u7a0b\u4f1a\u7761\u7720\u7b49\u5f85\u9875\uff0c\u5373\u4f1a\u5f15\u8d77\u963b\u585e\uff0c\u56e0\u6b64\u4e0d\u80fd\u5728\u4e2d\u65ad\u4e0a\u4e0b\u6587\u6216\u6301\u6709\u81ea\u65cb\u9501\u7684\u65f6\u5019\u4f7f\u7528GFP_KERNE\u7533\u8bf7\u5185\u5b58\u3002\u7531\u4e8e\u5728\u4e2d\u65ad\u5904\u7406\u51fd\u6570\u3001tasklet\u548c\u5185\u6838\u5b9a\u65f6\u5668\u7b49\u975e\u8fdb\u7a0b\u4e0a\u4e0b\u6587\u4e2d\u4e0d\u80fd\u963b\u585e\uff0c\u6240\u4ee5\u6b64\u65f6\u9a71\u52a8\u5e94\u5f53\u4f7f\u7528GFP_ATOMIC\u6807\u5fd7\u6765\u7533\u8bf7\u5185\u5b58\u3002\u5f53\u4f7f\u7528GFP_ATOMIC\u6807\u5fd7\u7533\u8bf7\u5185\u5b58\u65f6\uff0c\u82e5\u4e0d\u5b58\u5728\u7a7a\u95f2\u9875\uff0c\u5219\u4e0d\u7b49\u5f85\uff0c\u76f4\u63a5\u8fd4\u56de\u3002\n\u5176\u4ed6\u7684\u7533\u8bf7\u6807\u5fd7\u8fd8\u5305\u62ec:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>GFP_KERNEL<span style=\"color:#960050;background-color:#1e0010\">\uff08\u7528\u6765\u4e3a\u5185\u6838\u7a7a\u95f4\u9875\u5206\u914d\u5185\u5b58\uff0c\u53ef\u80fd\u963b\u585e\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>GFP_USER<span style=\"color:#960050;background-color:#1e0010\">\uff08\u7528\u6765\u4e3a\u7528\u6237\u7a7a\u95f4\u9875\u5206\u914d\u5185\u5b58\uff0c\u53ef\u80fd\u963b\u585e\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>GFP_ATOMIC<span style=\"color:#960050;background-color:#1e0010\">\uff08\u4e0d\u5b58\u5728\u7a7a\u95f2\u9875\u5219\u76f4\u63a5\u8fd4\u56de\uff0c\u4e0d\u963b\u585e\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>GFP_HIGHUSER<span style=\"color:#960050;background-color:#1e0010\">\uff08\u7c7b\u4f3c<\/span>GFP_USER<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u4f46\u662f\u5b83\u4ece\u9ad8\u7aef\u5185\u5b58\u5206\u914d\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>GFP_DMA<span style=\"color:#960050;background-color:#1e0010\">\uff08\u4ece<\/span>DMA\u533a\u57df\u5206\u914d\u5185\u5b58<span style=\"color:#960050;background-color:#1e0010\">\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>GFP_NOIO<span style=\"color:#960050;background-color:#1e0010\">\uff08\u4e0d\u5141\u8bb8\u4efb\u4f55<\/span>I<span style=\"color:#f92672\">\/<\/span>O\u521d\u59cb\u5316<span style=\"color:#960050;background-color:#1e0010\">\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>GFP_NOFS<span style=\"color:#960050;background-color:#1e0010\">\uff08\u4e0d\u5141\u8bb8\u8fdb\u884c\u4efb\u4f55\u6587\u4ef6\u7cfb\u7edf\u8c03\u7528\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_HIGHMEM<span style=\"color:#960050;background-color:#1e0010\">\uff08\u6307\u793a\u5206\u914d\u7684\u5185\u5b58\u53ef\u4ee5\u4f4d\u4e8e\u9ad8\u7aef\u5185\u5b58\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_COLD<span style=\"color:#960050;background-color:#1e0010\">\uff08\u8bf7\u6c42\u4e00\u4e2a\u8f83\u957f\u65f6\u95f4\u4e0d\u8bbf\u95ee\u7684\u9875\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_NOWARN<span style=\"color:#960050;background-color:#1e0010\">\uff08\u5f53\u4e00\u4e2a\u5206\u914d\u65e0\u6cd5\u6ee1\u8db3\u65f6\uff0c\u963b\u6b62\u5185\u6838\u53d1\u51fa\u8b66\u544a\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_HIGH<span style=\"color:#960050;background-color:#1e0010\">\uff08\u9ad8\u4f18\u5148\u7ea7\u8bf7\u6c42\uff0c\u5141\u8bb8\u83b7\u5f97\u88ab\u5185\u6838\u4fdd\u7559\u7ed9\u7d27\u6025\u72b6\u51b5\u4f7f\u7528\u7684\u6700\u540e\u7684\u5185\u5b58\u9875\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_REPEAT<span style=\"color:#960050;background-color:#1e0010\">\uff08\u5206\u914d\u5931\u8d25\uff0c\u5219\u5c3d\u529b\u91cd\u590d\u5c1d\u8bd5\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_NOFAIL<span style=\"color:#960050;background-color:#1e0010\">\uff08\u6807\u5fd7\u53ea\u8bb8\u7533\u8bf7\u6210\u529f\uff0c\u4e0d\u63a8\u8350\uff09<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>__GFP_NORETRY<span style=\"color:#960050;background-color:#1e0010\">\uff08\u82e5\u7533\u8bf7\u4e0d\u5230\uff0c\u5219\u7acb\u5373\u653e\u5f03\uff09<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"slab\u5185\u5b58\u5206\u914d\u5668\">slab\u5185\u5b58\u5206\u914d\u5668<a class=\"anchor\" href=\"#slab%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e5%99%a8\" aria-label=\"Link\"><\/a><\/h2>\n<p>slab\u5206\u914d\u5668\u5efa\u7acb\u5728buddy\u5206\u914d\u5668\u57fa\u7840\u4e0a\uff0cslab\u5c06\u4ecebuddy\u7533\u8bf7\u7684\u9875\u8fdb\u884c\u4e8c\u6b21\u7ba1\u7406\uff0c\u4ee5\u83b7\u53d6\u5408\u9002\u5927\u5c0f\u7684\u5185\u5b58\u3002\u5728\u64cd\u4f5c\u7cfb\u7edf\u7684\u8fd0\u4f5c\u8fc7\u7a0b\u4e2d\uff0c\u7ecf\u5e38\u4f1a\u6d89\u53ca\u5927\u91cf\u5bf9\u8c61\u7684\u91cd\u590d\u751f\u6210\u3001\u4f7f\u7528\u548c\u91ca\u653e\u5185\u5b58\u95ee\u9898\u3002\u5728Linux\u7cfb\u7edf\u4e2d\u6240\u7528\u5230\u7684\u5bf9\u8c61\uff0c\u6bd4\u8f83\u5178\u578b\u7684\u4f8b\u5b50\u662finode\u3001task_struct\u7b49\u3002\u5982\u679c\u6211\u4eec\u80fd\u591f\u7528\u5408\u9002\u7684\u65b9\u6cd5\u4f7f\u5f97\u5bf9\u8c61\u5728\u524d\u540e\u4e24\u6b21\u88ab\u4f7f\u7528\u65f6\u5206\u914d\u5728\u540c\u4e00\u5757\u5185\u5b58\u6216\u540c\u4e00\u7c7b\u5185\u5b58\u7a7a\u95f4\u4e14\u4fdd\u7559\u4e86\u57fa\u672c\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5c31\u53ef\u4ee5\u5927\u5927\u63d0\u9ad8\u6548\u7387\uff0cslab\u7b97\u6cd5\u5c31\u662f\u9488\u5bf9\u4e0a\u8ff0\u7279\u70b9\u8bbe\u8ba1\u7684\u3002\nslab\u53ef\u4ee5\u9ad8\u6548\u5206\u914d\u56fa\u5b9a\u5927\u5c0f\u7684\u5bf9\u8c61\uff0c\u51cf\u5c11\u5185\u5b58\u788e\u7247\uff0c\u63d0\u9ad8\u7f13\u5b58\u547d\u4e2d\u7387\uff0c\u4f46\u5728\u5185\u5b58\u7d27\u5f20\u7684\u65f6\u5019kmem_cache_alloc\u53ef\u80fd\u4f1a\u5206\u914d\u5931\u8d25\u5e76\u8fd4\u56deNULL\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u7761\u7720\uff08\u53d6\u51b3\u4e86\u4f20\u5165\u7684flag\uff09\u3002<\/p>"},{"title":"11-2. linux IO\u7aef\u53e3\u548cIO\u5185\u5b58\u8bbf\u95ee","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/11-2.-linux-io%E7%AB%AF%E5%8F%A3%E5%92%8Cio%E5%86%85%E5%AD%98%E8%AE%BF%E9%97%AE\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/11-2.-linux-io%E7%AB%AF%E5%8F%A3%E5%92%8Cio%E5%86%85%E5%AD%98%E8%AE%BF%E9%97%AE\/","description":"<p>\u5728X86\u5904\u7406\u5668\u4e2d\u5b58\u5728\u7740I\/O\u7a7a\u95f4\u7684\u6982\u5ff5\uff0c\u5b83\u901a\u8fc7\u7279\u5b9a\u7684\u6307\u4ee4in\u3001out\u6765\u8bbf\u95ee\u3002\u7aef\u53e3\u53f7\u6807\u8bc6\u4e86\u5916\u8bbe\u7684\u5bc4\u5b58\u5668\u5730\u5740\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>IN <span style=\"color:#960050;background-color:#1e0010\">\u7d2f\u52a0\u5668<\/span>, {<span style=\"color:#960050;background-color:#1e0010\">\u7aef\u53e3\u53f7\u2502<\/span>DX}\n<\/span><\/span><span style=\"display:flex;\"><span>OUT {<span style=\"color:#960050;background-color:#1e0010\">\u7aef\u53e3\u53f7\u2502<\/span>DX},<span style=\"color:#960050;background-color:#1e0010\">\u7d2f\u52a0\u5668<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u76ee\u524d\uff0c\u5927\u591a\u6570\u5d4c\u5165\u5f0f\u5fae\u63a7\u5236\u5668\uff08\u5982ARM\u3001PowerPC\u7b49\uff09\u4e2d\u5e76\u4e0d\u63d0\u4f9bI\/O\u7a7a\u95f4\uff0c\u800c\u4ec5\u5b58\u5728\u5185\u5b58\u7a7a\u95f4\u3002\u5185\u5b58\u7a7a\u95f4\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u5730\u5740\u3001\u6307\u9488\u6765\u8bbf\u95ee\uff0c\u7a0b\u5e8f\u53ca\u5728\u7a0b\u5e8f\u8fd0\u884c\u4e2d\u4f7f\u7528\u7684\u53d8\u91cf\u548c\u5176\u4ed6\u6570\u636e\u90fd\u5b58\u5728\u4e8e\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u5373\u4fbf\u662f\u5728X86\u5904\u7406\u5668\u4e2d\uff0c\u867d\u7136\u63d0\u4f9b\u4e86I\/O\u7a7a\u95f4\uff0c\u5982\u679c\u7531\u6211\u4eec\u81ea\u5df1\u8bbe\u8ba1\u7535\u8def\u677f\uff0c\u5916\u8bbe\u4ecd\u7136\u53ef\u4ee5\u53ea\u6302\u63a5\u5728\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u6b64\u65f6\uff0cCPU\u53ef\u4ee5\u50cf\u8bbf\u95ee\u4e00\u4e2a\u5185\u5b58\u5355\u5143\u90a3\u6837\u8bbf\u95ee\u5916\u8bbeI\/O\u7aef\u53e3\uff0c\u800c\u4e0d\u9700\u8981\u8bbe\u7acb\u4e13\u95e8\u7684I\/O\u6307\u4ee4\u3002\u56e0\u6b64\uff0c\u5185\u5b58\u7a7a\u95f4\u662f\u5fc5\u9700\u7684\uff0c\u800cI\/O\u7a7a\u95f4\u662f\u53ef\u9009\u7684\u3002<\/p>\n<p>\u8bbe\u5907\u901a\u5e38\u4f1a\u63d0\u4f9b\u4e00\u7ec4\u5bc4\u5b58\u5668\u6765\u63a7\u5236\u8bbe\u5907\u3001\u8bfb\u5199\u8bbe\u5907\u548c\u83b7\u53d6\u8bbe\u5907\u72b6\u6001\uff0c\u5373\u63a7\u5236\u5bc4\u5b58\u5668\u3001\u6570\u636e\u5bc4\u5b58\u5668\u548c\u72b6\u6001\u5bc4\u5b58\u5668\u3002\u8fd9\u4e9b\u5bc4\u5b58\u5668\u53ef\u80fd\u4f4d\u4e8eI\/O\u7a7a\u95f4\u4e2d\uff0c\u4e5f\u53ef\u80fd\u4f4d\u4e8e\u5185\u5b58\u7a7a\u95f4\u4e2d\u3002\u5f53\u4f4d\u4e8eI\/O\u7a7a\u95f4\u65f6\uff0c\u901a\u5e38\u88ab\u79f0\u4e3aI\/O\u7aef\u53e3\uff1b\u5f53\u4f4d\u4e8e\u5185\u5b58\u7a7a\u95f4\u65f6\uff0c\u5bf9\u5e94\u7684\u5185\u5b58\u7a7a\u95f4\u88ab\u79f0\u4e3aI\/O\u5185\u5b58\u3002<\/p>\n<h1 id=\"io\u7aef\u53e3\u8bbf\u95ee\">IO\u7aef\u53e3\u8bbf\u95ee<a class=\"anchor\" href=\"#io%e7%ab%af%e5%8f%a3%e8%ae%bf%e9%97%ae\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/Pasted%20image%2020251112170633.png\" alt=\"Pasted image 20251112170633\" \/><\/p>\n<h2 id=\"io\u7aef\u53e3\u7533\u8bf7\">IO\u7aef\u53e3\u7533\u8bf7<a class=\"anchor\" href=\"#io%e7%ab%af%e5%8f%a3%e7%94%b3%e8%af%b7\" aria-label=\"Link\"><\/a><\/h2>\n<p>IO\u7aef\u53e3\u5728\u8bbf\u95ee\u524d\u9700\u5411linux\u5185\u6838\u7684\u8d44\u6e90\u7ba1\u7406\u7533\u8bf7\u533a\u57df\u6240\u6709\u6743\uff0c\u4ee5\u9632\u6b62\u8d44\u6e90\u51b2\u7a81\uff0c\u4fdd\u8bc1\u8d44\u6e90\u7684\u72ec\u5360\u4f7f\u7528\u6743\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> resource <span style=\"color:#f92672\">*<\/span><span style=\"color:#a6e22e\">request_region<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> first, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> n, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define devm_request_mem_region(dev,start,n,name) ...\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">release_region<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> start, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> n);<\/span><\/span><\/code><\/pre><\/div><h2 id=\"io\u7aef\u53e3\u8bfb\u5199\">IO\u7aef\u53e3\u8bfb\u5199<a class=\"anchor\" href=\"#io%e7%ab%af%e5%8f%a3%e8%af%bb%e5%86%99\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u8bfb\u5199\u5b57\u8282(8\u4f4d\u5bbd)\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#a6e22e\">inb<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">outb<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">char<\/span> byte, <span style=\"color:#66d9ef\">unsigned<\/span> port);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u8bfb\u5199\u5b57(16\u4f4d\u5bbd)\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#a6e22e\">inw<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">outw<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">short<\/span> word, <span style=\"color:#66d9ef\">unsigned<\/span> port);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u8bfb\u5199\u957f\u5b57(32\u4f4d\u5bbd)\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#a6e22e\">inl<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">outl<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> longword, <span style=\"color:#66d9ef\">unsigned<\/span> port);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u8bfb\u5199\u4e00\u4e32\u5b57\u8282\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">insb<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> count);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">outsb<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> count);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u8bfb\u5199\u4e00\u4e32\u5b57\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">insw<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> count);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">outsw<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> count);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u8bfb\u5199\u4e00\u4e32\u957f\u5b57\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">insl<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> count);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">outsl<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> port, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> count);<\/span><\/span><\/code><\/pre><\/div><h1 id=\"io\u5185\u5b58\u8bbf\u95ee\">IO\u5185\u5b58\u8bbf\u95ee<a class=\"anchor\" href=\"#io%e5%86%85%e5%ad%98%e8%ae%bf%e9%97%ae\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/Pasted%20image%2020251112170645.png\" alt=\"Pasted image 20251112170645\" \/><\/p>"},{"title":"12. linux\u9a71\u52a8\u7684\u8f6f\u4ef6\u67b6\u6784","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/12.-linux%E9%A9%B1%E5%8A%A8%E7%9A%84%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/12.-linux%E9%A9%B1%E5%8A%A8%E7%9A%84%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84\/","description":"<p>\u5728Linux\u8bbe\u5907\u9a71\u52a8\u6a21\u578b\u4e2d\uff0c\u9700\u5173\u5fc3\u603b\u7ebf\u3001\u8bbe\u5907\u548c\u9a71\u52a8\u8fd93\u4e2a\u5b9e\u4f53\uff0c\u603b\u7ebf\u5c06\u8bbe\u5907\u548c\u9a71\u52a8\u7ed1\u5b9a\u3002class\u7c7b\u4e3a\u5e95\u5c42\u9a71\u52a8\u5728\u7528\u6237\u7a7a\u95f4\u63d0\u4f9b\u4e86\u8de8\u6240\u6709\u8bbe\u5907\u7c7b\u578b\u7684\u7edf\u4e00\u62bd\u8c61\uff0c\u6309\u529f\u80fd\u800c\u975e\u6280\u672f\u5b9e\u73b0\u5206\u7ec4\u3002<\/p>\n<pre tabindex=\"0\"><code>\u865a\u62df\u6587\u4ef6\u7cfb\u7edf\uff08VFS\uff09(\/dev\/xxx, \/sys\/class\/, socket\u63a5\u53e3)\n\t\t\u2191 \u6587\u4ef6\u7cfb\u7edf\u63a5\u53e3file_operations\/SOCKET\/class\u7c7b\n\u5b57\u7b26\u8bbe\u5907\/\u5757\u8bbe\u5907\/\u7f51\u7edc\u8bbe\u5907 (\u5185\u6838\u6280\u672f\u5206\u7c7b\uff0c\u4f5c\u4e3a\u5e94\u7528\u5c42\u548c\u5e95\u5c42\u9a71\u52a8\u7684\u63a5\u53e3)\n\t\t\u2191 \u6ce8\u518c\u5e76\u5b9e\u73b0\u63a5\u53e3\ninput\/rtc\/leds\/keys\/gpio\/pwm\/framebuffer\/tty\/misc \u7b49\u529f\u80fd\u5b50\u7cfb\u7edf\u5c42(\u5e95\u5c42\u8bbe\u5907\u88ab\u62bd\u8c61\u6210\u4e0d\u540c\u7c7b\u522b\uff0c\u4f9b\u4e0a\u5c42\u4f7f\u7528\uff0c\u53ef\u9009)\n\t\t\u2191 \u6ce8\u518c\u5e76\u5b9e\u73b0\u63a5\u53e3\nspi\/i2c\/usb \u8bbe\u5907\u9a71\u52a8\uff08\u5ba2\u6237\u7aef\u9a71\u52a8\uff0c\u5177\u4f53\u8bbe\u5907\u7684\u9a71\u52a8,\u53ef\u9009\uff09\n\t \u2191 API\nspi\/i2c\/usb \u6838\u5fc3\u5c42\uff08\u4f5c\u4e3a\u5ba2\u6237\u7aef\u9a71\u52a8\u548c\u4e3b\u673a\u9a71\u52a8\u8fde\u63a5\u7684\u6865\u6881\uff0c\u63d0\u4f9b\u6570\u636e\u7ed3\u6784\u548c\u7f16\u7a0b\u6846\u67b6\uff0c\u53ef\u9009\uff09\n\t\t\u2191 \u6ce8\u518c\u5e76\u5b9e\u73b0\u63a5\u53e3\nspi\/i2c\/usb \u603b\u7ebf\u63a7\u5236\u5668\u9a71\u52a8\uff08\u4e3b\u673a\u9a71\u52a8\uff0c\u83b7\u53d6\u63a5\u53e3\u5e76\u8bbe\u7f6e\u5bc4\u5b58\u5668\uff0c\u4f7f\u7528platform\u865a\u62df\u603b\u7ebf\u6846\u67b6\u5b9e\u73b0\uff09\n\t\t\u2191 \u63a5\u53e3\u5177\u4f53\u8fde\u63a5\u5b9a\u4e49\n \u8bbe\u5907\u5b9a\u4e49\/DTS<\/code><\/pre><h1 id=\"platform\u8bbe\u5907\u9a71\u52a8\u6846\u67b6\">platform\u8bbe\u5907\u9a71\u52a8\u6846\u67b6<a class=\"anchor\" href=\"#platform%e8%ae%be%e5%a4%87%e9%a9%b1%e5%8a%a8%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u4e00\u4e2a\u73b0\u5b9e\u7684Linux\u8bbe\u5907\u548c\u9a71\u52a8\u901a\u5e38\u90fd\u9700\u8981\u6302\u63a5\u5728\u4e00\u79cd\u603b\u7ebf\u4e0a\uff0c\u5bf9\u4e8e\u672c\u8eab\u4f9d\u9644\u4e8ePCI\u3001USB\u3001I2C\u3001SPI\u7b49\u7684\u8bbe\u5907\u800c\u8a00\uff0c\u8fd9\u81ea\u7136\u4e0d\u662f\u95ee\u9898\uff0c\u4f46\u662f\u5728\u5d4c\u5165\u5f0f\u7cfb\u7edf\u91cc\u9762\uff0c\u5728SoC\u5185\u90e8\u96c6\u6210\u7684I 2C\u3001RTC\u3001LCD\u3001\u770b\u95e8\u72d7\u7b49\u63a7\u5236\u5668\u3001\u6302\u63a5\u5728SoC\u5185\u5b58\u7a7a\u95f4\u7684\u5916\u8bbe\u7b49\u5374\u4e0d\u4f9d\u9644\u4e8e\u6b64\u7c7b\u603b\u7ebf\u3002\u57fa\u4e8e\u8fd9\u4e00\u80cc\u666f\uff0cLinux\u53d1\u660e\u4e86\u4e00\u79cd\u865a\u62df\u7684\u603b\u7ebf\uff0c\u79f0\u4e3aplatform\u603b\u7ebf\uff0c\u76f8\u5e94\u7684\u8bbe\u5907\u79f0\u4e3aplatform_device\uff0c\u800c\u9a71\u52a8\u79f0\u4e3aplatform_driver\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> platform_driver {\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>probe)(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>remove)(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>shutdown)(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>suspend)(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span><span style=\"color:#66d9ef\">pm_message_t<\/span> state);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>resume)(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device_driver driver;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> platform_device_id <span style=\"color:#f92672\">*<\/span>id_table;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> prevent_deferred_probe;\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p>\u76f4\u63a5\u586b\u5145platform_driver\u7684suspend\uff08\uff09\u3001resume\uff08\uff09\u505a\u7535\u6e90\u7ba1\u7406\u56de\u8c03\u7684\u65b9\u6cd5\u76ee\u524d\u5df2\u7ecf\u8fc7\u65f6\uff0c\u8f83\u597d\u7684\u505a\u6cd5\u662f\u5b9e\u73b0platform_driver\u7684device_driver\u4e2d\u7684dev_pm_ops\u7ed3\u6784\u4f53\u6210\u5458\u3002device_driver\u63cf\u8ff0\u4e86\u5404\u79cdxxx_driver\uff08xxx\u662f\u603b\u7ebf\u540d\uff09\u5728\u9a71\u52a8\u610f\u4e49\u4e0a\u7684\u4e00\u4e9b\u5171\u6027\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> bus_type platform_bus_type <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>\t.name <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;platform&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.dev_groups <span style=\"color:#f92672\">=<\/span> platform_dev_groups,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.match <span style=\"color:#f92672\">=<\/span> platform_match,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.uevent <span style=\"color:#f92672\">=<\/span> platform_uevent,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.pm <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">&amp;<\/span>platform_dev_pm_ops,\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p>bus_type\u7684\u5b9e\u4f8bplatform_bus_type\u5c06platform_device\u548cplatform_driver\u7ed1\u5b9a\u5230\u4e00\u8d77\uff0c\u5728platform_device\u548cplatform_driver\u6ce8\u518c\u7684\u65f6\u5019\uff0cplatform_match\u51fd\u6570\u88ab\u8c03\u7528\u4ee5\u5339\u914dplatform_device\u548cplatform_driver\u3002<\/p>"},{"title":"13. \u5757\u8bbe\u5907\u9a71\u52a8","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/13.-%E5%9D%97%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/13.-%E5%9D%97%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8\/","description":"<p>\u5757\u8bbe\u5907\u53ef\u4ee5\u968f\u673a\u8bbf\u95ee\uff0c\u5bf9\u4e8eI\/O\u8bf7\u6c42\u6709\u5bf9\u5e94\u7684\u7f13\u51b2\u533a\uff0c\u56e0\u6b64\u5b83\u4eec\u53ef\u4ee5\u9009\u62e9\u4ee5\u4ec0\u4e48\u987a\u5e8f\u8fdb\u884c\u54cd\u5e94\u3002\u5757I\/O\u8c03\u5ea6\u5c42\u8d1f\u8d23\u8fdb\u884c\u6392\u5e8f\u548c\u5408\u5e76\uff0cI\/O\u8c03\u5ea6\u5c42\u7684\u57fa\u672c\u76ee\u7684\u662f\u5c06\u8bf7\u6c42\u6309\u7167\u5b83\u4eec\u5bf9\u5e94\u5728\u5757\u8bbe\u5907\u4e0a\u7684\u6247\u533a\u53f7\u8fdb\u884c\u6392\u5217\uff0c\u4ee5\u51cf\u5c11\u78c1\u5934\u7684\u79fb\u52a8\uff0c\u63d0\u9ad8\u6548\u7387\u3002\n<img src=\"assets\/Pasted%20image%2020251119194523.png\" alt=\"Pasted image 20251119194523\" \/><\/p>\n<h1 id=\"\u5757\u8bbe\u5907\u9a71\u52a8\u7ed3\u6784\">\u5757\u8bbe\u5907\u9a71\u52a8\u7ed3\u6784<a class=\"anchor\" href=\"#%e5%9d%97%e8%ae%be%e5%a4%87%e9%a9%b1%e5%8a%a8%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5728\u5757\u8bbe\u5907\u9a71\u52a8\u4e2d\uff0c\u6709\u4e00\u4e2a\u7c7b\u4f3c\u4e8e\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\u4e2dfile_operations\u7ed3\u6784\u4f53\u7684block_device_operations\u7ed3\u6784\u4f53\uff0c\u5b83\u662f\u5bf9\u5757\u8bbe\u5907\u64cd\u4f5c\u7684\u96c6\u5408\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> block_device_operations {\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>open) (<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">fmode_t<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>release) (<span style=\"color:#66d9ef\">struct<\/span> gendisk <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">fmode_t<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>rw_page)(<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">sector_t<\/span>, <span style=\"color:#66d9ef\">struct<\/span> page <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">int<\/span> rw);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>ioctl) (<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">fmode_t<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>compat_ioctl) (<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">fmode_t<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>); <span style=\"color:#75715e\">\/\/ \u4e00\u4e2a64\u4f4d\u7cfb\u7edf\u5185\u768432\u4f4d\u8fdb\u7a0b\u8c03\u7528\u7684\u662fcompat_ioctl\uff08\uff09\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>direct_access) (<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">sector_t<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">**<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#a6e22e\">int<\/span> (<span style=\"color:#f92672\">*<\/span>check_events) (<span style=\"color:#66d9ef\">struct<\/span> gendisk <span style=\"color:#f92672\">*<\/span>disk, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> clearing); <span style=\"color:#75715e\">\/\/ \u76d1\u6d4b\u53ef\u79fb\u52a8\u8bbe\u5907\u4ecb\u8d28\u53d8\u52a8\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* -&gt;media_changed() is DEPRECATED, use -&gt;check_events() instead *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>media_changed) (<span style=\"color:#66d9ef\">struct<\/span> gendisk <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>unlock_native_capacity) (<span style=\"color:#66d9ef\">struct<\/span> gendisk <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>revalidate_disk) (<span style=\"color:#66d9ef\">struct<\/span> gendisk <span style=\"color:#f92672\">*<\/span>); <span style=\"color:#75715e\">\/\/ \u53ef\u79fb\u52a8\u8bbe\u5907\u4ecb\u8d28\u53d8\u52a8\u65f6\u8fdb\u884c\u521d\u59cb\u5316\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>getgeo)(<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">struct<\/span> hd_geometry <span style=\"color:#f92672\">*<\/span>); <span style=\"color:#75715e\">\/\/ \u83b7\u53d6hd_geometry\u7ed3\u6784\u4f53\u5305\u542b\u7684\u78c1\u5934\u3001\u6247\u533a\u3001\u67f1\u9762\u7b49\u4fe1\u606f\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* this callback is with swap_lock and sometimes page table lock held *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>swap_slot_free_notify) (<span style=\"color:#66d9ef\">struct<\/span> block_device <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> module <span style=\"color:#f92672\">*<\/span>owner;\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><h2 id=\"gendisk\u7ed3\u6784\">gendisk\u7ed3\u6784<a class=\"anchor\" href=\"#gendisk%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5728Linux\u5185\u6838\u4e2d\uff0c\u4f7f\u7528gendisk\uff08\u901a\u7528\u78c1\u76d8\uff09\u7ed3\u6784\u4f53\u6765\u8868\u793a\u4e00\u4e2a\u72ec\u7acb\u7684\u78c1\u76d8\u8bbe\u5907\uff08\u6216\u5206\u533a\uff09\u3002<\/p>"},{"title":"15. I2C\u9a71\u52a8\u6846\u67b6","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/15.-i2c%E9%A9%B1%E5%8A%A8%E6%A1%86%E6%9E%B6\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/15.-i2c%E9%A9%B1%E5%8A%A8%E6%A1%86%E6%9E%B6\/","description":"<p>I2C\u9a71\u52a8\u75313\u90e8\u5206\u7ec4\u6210\uff0c\u5373I2C\u6838\u5fc3\u3001I2C\u603b\u7ebf\u9a71\u52a8\u548cI2C\u8bbe\u5907\u9a71\u52a8\u3002<\/p>\n<ul>\n<li>I2C\u6838\u5fc3\u63d0\u4f9b\u4e86I2C\u603b\u7ebf\u9a71\u52a8\u548c\u8bbe\u5907\u9a71\u52a8\u7684\u6ce8\u518c\u3001\u6ce8\u9500\u65b9\u6cd5\uff0cI2C\u901a\u4fe1\u65b9\u6cd5\uff08\u5373Algorithm\uff09\u4e0a\u5c42\u4e0e\u5177\u4f53\u9002\u914d\u5668\u65e0\u5173\u7684\u4ee3\u7801\u4ee5\u53ca\u63a2\u6d4b\u8bbe\u5907\u3001\u68c0\u6d4b\u8bbe\u5907\u5730\u5740\u7684\u4e0a\u5c42\u4ee3\u7801\u7b49\u3002<\/li>\n<li>I2C\u603b\u7ebf\u9a71\u52a8\uff08\u4e5f\u79f0\u4e3b\u673a\u9a71\u52a8\uff09\u4e3b\u8981\u5305\u542bI2C\u9002\u914d\u5668\u6570\u636e\u7ed3\u6784i2c_adapter\u3001I2C\u9002\u914d\u5668\u7684Algorithm\u6570\u636e\u7ed3\u6784i2c_algorithm\u548c\u63a7\u5236I2C\u9002\u914d\u5668\u4ea7\u751f\u901a\u4fe1\u4fe1\u53f7\u7684\u51fd\u6570\u3002<\/li>\n<li>I2C\u8bbe\u5907\u9a71\u52a8\uff08\u4e5f\u79f0\u4e3a\u5ba2\u6237\u9a71\u52a8\uff09\u662f\u5bf9I2C\u786c\u4ef6\u4f53\u7cfb\u7ed3\u6784\u4e2d\u8bbe\u5907\u7aef\u7684\u5b9e\u73b0\uff0c\u8bbe\u5907\u4e00\u822c\u6302\u63a5\u5728\u53d7CPU\u63a7\u5236\u7684I2C\u603b\u7ebf\u63a7\u5236\u5668\u4e0a\uff0c\u901a\u8fc7I2C\u603b\u7ebf\u63a7\u5236\u5668\u4e0eCPU\u4ea4\u6362\u6570\u636e\u3002I2C\u8bbe\u5907\u9a71\u52a8\u4e3b\u8981\u5305\u542b\u6570\u636e\u7ed3\u6784i2c_driver\u548ci2c_client\uff0c\n<img src=\"assets\/Pasted%20image%2020251128155718.png\" alt=\"Pasted image 20251128155718\" \/><\/li>\n<\/ul>\n<h2 id=\"i2c\u6838\u5fc3\">I2C\u6838\u5fc3<a class=\"anchor\" href=\"#i2c%e6%a0%b8%e5%bf%83\" aria-label=\"Link\"><\/a><\/h2>\n<p>i2c-core.c\u8fd9\u4e2a\u6587\u4ef6\u5b9e\u73b0\u4e86I2C\u6838\u5fc3\u7684\u529f\u80fd\u4ee5\u53ca<code>\/proc\/bus\/i2c-*<\/code>\u63a5\u53e3\u3002<\/p>\n<h2 id=\"i2c\u603b\u7ebf\u9a71\u52a8\">I2C\u603b\u7ebf\u9a71\u52a8<a class=\"anchor\" href=\"#i2c%e6%80%bb%e7%ba%bf%e9%a9%b1%e5%8a%a8\" aria-label=\"Link\"><\/a><\/h2>\n<ul>\n<li>\u63d0\u4f9bI2C\u9002\u914d\u5668\u7684\u786c\u4ef6\u9a71\u52a8\uff0c\u63a2\u6d4b\u3001\u521d\u59cb\u5316I2C\u9002\u914d\u5668\uff08\u5982\u7533\u8bf7I2C\u7684I\/O\u5730\u5740\u548c\u4e2d\u65ad\u53f7\uff09\u3001\u9a71\u52a8CPU\u63a7\n\u5236\u7684I2C\u9002\u914d\u5668\u4ece\u786c\u4ef6\u4e0a\u4ea7\u751f\u5404\u79cd\u4fe1\u53f7\u4ee5\u53ca\u5904\u7406I2C\u4e2d\u65ad\u7b49\u3002<\/li>\n<li>\u63d0\u4f9bI2C\u9002\u914d\u5668\u7684Algorithm\uff0c\u7528\u5177\u4f53\u9002\u914d\u5668\u7684xxx_xfer\uff08\uff09\u51fd\u6570\u586b\u5145i2c_algorithm\u7684master_xfer\u6307\u9488\uff0c\u5e76\u628ai2c_algorithm\u6307\u9488\u8d4b\u503c\u7ed9i2c_adapter\u7684algo\u6307\u9488\u3002<\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> i2c_adapter {\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> module <span style=\"color:#f92672\">*<\/span>owner;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> class; <span style=\"color:#75715e\">\/* classes to allow probing for *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> i2c_algorithm <span style=\"color:#f92672\">*<\/span>algo; <span style=\"color:#75715e\">\/* the algorithm to access the bus *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>algo_data;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* data fields that are valid for all devices *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> rt_mutex bus_lock;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> timeout; <span style=\"color:#75715e\">\/* in jiffies *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> retries;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device dev; <span style=\"color:#75715e\">\/* the adapter device *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> nr;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">char<\/span> name[<span style=\"color:#ae81ff\">48<\/span>];\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> completion dev_released;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> mutex userspace_clients_lock;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> list_head userspace_clients;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> i2c_bus_recovery_info <span style=\"color:#f92672\">*<\/span>bus_recovery_info;\n<\/span><\/span><span style=\"display:flex;\"><span>};\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">1<\/span><span style=\"color:#66d9ef\">struct<\/span> i2c_algorithm {\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">2<\/span> <span style=\"color:#75715e\">\/* If an adapter algorithm can&#39;t do I2C-level access, set master_xfer\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">3 to NULL. If an adapter algorithm can do SMBus access, set\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">4 smbus_xfer. If set to NULL, the SMBus protocol is simulated\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">5 using common I2C messages *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">6<\/span> <span style=\"color:#75715e\">\/* master_xfer should return the number of messages successfully\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">7 processed, or a negative value on error *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">8<\/span> <span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>master_xfer)(<span style=\"color:#66d9ef\">struct<\/span> i2c_adapter <span style=\"color:#f92672\">*<\/span>adap, <span style=\"color:#66d9ef\">struct<\/span> i2c_msg <span style=\"color:#f92672\">*<\/span>msgs,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">9<\/span> <span style=\"color:#66d9ef\">int<\/span> num);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">10<\/span> <span style=\"color:#a6e22e\">int<\/span> (<span style=\"color:#f92672\">*<\/span>smbus_xfer) (<span style=\"color:#66d9ef\">struct<\/span> i2c_adapter <span style=\"color:#f92672\">*<\/span>adap, u16 addr,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">11<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">short<\/span> flags, <span style=\"color:#66d9ef\">char<\/span> read_write,\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">12<\/span> u8 command, <span style=\"color:#66d9ef\">int<\/span> size, <span style=\"color:#66d9ef\">union<\/span> i2c_smbus_data <span style=\"color:#f92672\">*<\/span>data);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">13<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">14<\/span> <span style=\"color:#75715e\">\/* To determine what the adapter supports *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">15<\/span> <span style=\"color:#a6e22e\">u32<\/span> (<span style=\"color:#f92672\">*<\/span>functionality) (<span style=\"color:#66d9ef\">struct<\/span> i2c_adapter <span style=\"color:#f92672\">*<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">16<\/span>};\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">i2c_add_adapter<\/span>(<span style=\"color:#66d9ef\">struct<\/span> i2c_adapter <span style=\"color:#f92672\">*<\/span>adap);\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">i2c_del_adapter<\/span>(<span style=\"color:#66d9ef\">struct<\/span> i2c_adapter <span style=\"color:#f92672\">*<\/span>adap);<\/span><\/span><\/code><\/pre><\/div><p>i2c_adapter\u5bf9\u5e94\u4e8e\u7269\u7406\u4e0a\u7684\u4e00\u4e2a\u63a7\u5236\u5668\uff0c\u800ci2c_algorithm\u5bf9\u5e94\u4e00\u5957\u901a\u4fe1\u65b9\u6cd5\u3002i2c_algorithm\u4e2d\u7684\u5173\u952e\u51fd\u6570master_xfer\u7528\u4e8e\u4ea7\u751fI2C\u8bbf\u95ee\u5468\u671f\u9700\u8981\u7684\u4fe1\u53f7\uff0c\u4ee5i2c_msg\uff08\u5373I2C\u6d88\u606f\uff09\u4e3a\u5355\u4f4d\uff0c\u5176\u4e2d\u7684\u6210\u5458\u8868\u660e\u4e86I2C\u7684\u4f20\u8f93\u5730\u5740\u3001\u65b9\u5411\u3001\u7f13\u51b2\u533a\u3001\u7f13\u51b2\u533a\u957f\u5ea6\u7b49\u4fe1\u606f\u3002<\/p>"},{"title":"20 \u82af\u7247\u7ea7\u79fb\u690d\u9700\u8981\u7684\u9a71\u52a8","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/20-%E8%8A%AF%E7%89%87%E7%BA%A7%E7%A7%BB%E6%A4%8D%E9%9C%80%E8%A6%81%E7%9A%84%E9%A9%B1%E5%8A%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/20-%E8%8A%AF%E7%89%87%E7%BA%A7%E7%A7%BB%E6%A4%8D%E9%9C%80%E8%A6%81%E7%9A%84%E9%A9%B1%E5%8A%A8\/","description":"<h1 id=\"\u5185\u6838\u8282\u62cd\u9a71\u52a8\">\u5185\u6838\u8282\u62cd\u9a71\u52a8<a class=\"anchor\" href=\"#%e5%86%85%e6%a0%b8%e8%8a%82%e6%8b%8d%e9%a9%b1%e5%8a%a8\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5f53\u524dLinux\u591a\u91c7\u7528\u65e0\u8282\u62cd\u65b9\u6848\uff0c\u5e76\u652f\u6301\u9ad8\u7cbe\u5ea6\u5b9a\u65f6\u5668\uff0c\u5185\u6838\u7684\u914d\u7f6e\u4e00\u822c\u4f1a\u4f7f\u80fdNO_HZ\uff08\u5373\u65e0\u8282\u62cd\uff0c\u6216\u8005\u8bf4\u52a8\u6001\u8282\u62cd\uff09\u548cHIGH_RES_TIMERS\u3002\u65e0\u8282\u62cd\u5e76\u4e0d\u662f\u8bf4\u7cfb\u7edf\u4e2d\u6ca1\u6709\u65f6\u949f\u8282\u62cd\uff0c\u800c\u662f\u8bf4\u8fd9\u4e2a\u8282\u62cd\u4e0d\u518d\u50cf\u4ee5\u524d\u90a3\u6837\u5468\u671f\u6027\u5730\u4ea7\u751f\u3002<\/p>\n<p>SoC\u5e95\u5c42\u7684\u5b9a\u65f6\u5668\u88ab\u5b9e\u73b0\u4e3a\u4e00\u4e2aclock_event_device\u548cclocksource\u5f62\u5f0f\u7684\u9a71\u52a8\u3002\u5728clock_event_device\u7ed3\u6784\u4f53\u4e2d\uff0c\u5b9e\u73b0\u5176set_mode\uff08\uff09\u548cset_next_event\uff08\uff09\u6210\u5458\u51fd\u6570\uff1b\u5728clocksource\u7ed3\u6784\u4f53\u4e2d\uff0c\u4e3b\u8981\u5b9e\u73b0read\uff08\uff09\u6210\u5458\u51fd\u6570\u3002\u800c\u5728\u5b9a\u65f6\u5668\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\u4e2d\u8c03\u7528clock_event_device\u7684event_handler\uff08\uff09\u6210\u5458\u51fd\u6570\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">irqreturn_t<\/span> <span style=\"color:#a6e22e\">xxx_timer_interrupt<\/span>(<span style=\"color:#66d9ef\">int<\/span> irq, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev_id)\n<\/span><\/span><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> clock_event_device <span style=\"color:#f92672\">*<\/span>ce <span style=\"color:#f92672\">=<\/span> dev_id;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/\/ event_handler\uff08\uff09\u6210\u5458\u51fd\u6570\u7684\u5177\u4f53\u5de5\u4f5c\u662fLinux\u5185\u6838\u6839\u636eLinux\u5185\u6838\u914d\u7f6e\u548c\u8fd0\u884c\u60c5\u51b5\u81ea\u884c\u8bbe\u7f6e\u7684\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\tce<span style=\"color:#f92672\">-&gt;<\/span><span style=\"color:#a6e22e\">event_handler<\/span>(ce);\n<\/span><\/span><span style=\"display:flex;\"><span>\t\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> IRQ_HANDLED;\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* read 64-bit timer counter *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">cycle_t<\/span> <span style=\"color:#a6e22e\">xxx_timer_read<\/span>(<span style=\"color:#66d9ef\">struct<\/span> clocksource <span style=\"color:#f92672\">*<\/span>cs)\n<\/span><\/span><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>\tu64 cycles;\n<\/span><\/span><span style=\"display:flex;\"><span>\t\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* read the 64-bit timer counter *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\tcycles <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">readl_relaxed<\/span>(xxx_timer_base <span style=\"color:#f92672\">+<\/span> LATCHED_HI);\n<\/span><\/span><span style=\"display:flex;\"><span>\tcycles<span style=\"color:#f92672\">=<\/span>(cycles<span style=\"color:#f92672\">&lt;&lt;<\/span><span style=\"color:#ae81ff\">32<\/span>)<span style=\"color:#f92672\">|<\/span><span style=\"color:#a6e22e\">readl_relaxed<\/span>(xxx_timer_base <span style=\"color:#f92672\">+<\/span> LATCHED_LO);\n<\/span><\/span><span style=\"display:flex;\"><span>\t\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> cycles;\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">xxx_timer_set_next_event<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> delta,<span style=\"color:#66d9ef\">struct<\/span> clock_event_device <span style=\"color:#f92672\">*<\/span>ce)\n<\/span><\/span><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> now, next;\n<\/span><\/span><span style=\"display:flex;\"><span>\tnow <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">readl_relaxed<\/span>(xxx_timer_base <span style=\"color:#f92672\">+<\/span> LATCHED_LO);\n<\/span><\/span><span style=\"display:flex;\"><span>\tnext <span style=\"color:#f92672\">=<\/span> now <span style=\"color:#f92672\">+<\/span> delta;\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">writel_relaxed<\/span>(next, xxx_timer_base <span style=\"color:#f92672\">+<\/span> SIRFSOC_TIMER_MATCH_0);\n<\/span><\/span><span style=\"display:flex;\"><span>\t...\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">xxx_timer_set_mode<\/span>(<span style=\"color:#66d9ef\">enum<\/span> clock_event_mode mode, <span style=\"color:#66d9ef\">struct<\/span> clock_event_device <span style=\"color:#f92672\">*<\/span>ce)\n<\/span><\/span><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">switch<\/span> (mode) {\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">case<\/span> CLOCK_EVT_MODE_PERIODIC:\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#960050;background-color:#1e0010\">\u2026<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">case<\/span> CLOCK_EVT_MODE_ONESHOT:\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#960050;background-color:#1e0010\">\u2026<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">case<\/span> CLOCK_EVT_MODE_SHUTDOWN:\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#960050;background-color:#1e0010\">\u2026<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">case<\/span> CLOCK_EVT_MODE_UNUSED:\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">case<\/span> CLOCK_EVT_MODE_RESUME:\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">break<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span>\t}\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">struct<\/span> clock_event_device xxx_clockevent <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>\t.name <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;xxx_clockevent&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t.rating <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">200<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.features <span style=\"color:#f92672\">=<\/span> CLOCK_EVT_FEAT_ONESHOT,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.set_mode <span style=\"color:#f92672\">=<\/span> xxx_timer_set_mode,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.set_next_event <span style=\"color:#f92672\">=<\/span> xxx_timer_set_next_event,\n<\/span><\/span><span style=\"display:flex;\"><span>};\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">struct<\/span> clocksource xxx_clocksource <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>\t.name <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;xxx_clocksource&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t.rating <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">200<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.mask <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">CLOCKSOURCE_MASK<\/span>(<span style=\"color:#ae81ff\">64<\/span>),\n<\/span><\/span><span style=\"display:flex;\"><span>\t.flags <span style=\"color:#f92672\">=<\/span> CLOCK_SOURCE_IS_CONTINUOUS,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.read <span style=\"color:#f92672\">=<\/span> xxx_timer_read,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.suspend <span style=\"color:#f92672\">=<\/span> xxx_clocksource_suspend,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.resume <span style=\"color:#f92672\">=<\/span> xxx_clocksource_resume,\n<\/span><\/span><span style=\"display:flex;\"><span>};\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">struct<\/span> irqaction xxx_timer_irq <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>\t.name <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;xxx_tick&#34;<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t.flags <span style=\"color:#f92672\">=<\/span> IRQF_TIMER,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.irq <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">0<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.handler <span style=\"color:#f92672\">=<\/span> xxx_timer_interrupt,\n<\/span><\/span><span style=\"display:flex;\"><span>\t.dev_id <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">&amp;<\/span>xxx_clockevent,\n<\/span><\/span><span style=\"display:flex;\"><span>};\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">void<\/span> __init <span style=\"color:#a6e22e\">xxx_clockevent_init<\/span>(<span style=\"color:#66d9ef\">void<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">clockevents_calc_mult_shift<\/span>(<span style=\"color:#f92672\">&amp;<\/span>xxx_clockevent, CLOCK_TICK_RATE, <span style=\"color:#ae81ff\">60<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/\/ \u8bbe\u7f6exxx_timer_set_next_event\u53c2\u6570delta\u80fd\u63a5\u53d7\u7684\u503c\u8303\u56f4\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\txxx_clockevent.max_delta_ns <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">clockevent_delta2ns<\/span>(<span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">2<\/span>, <span style=\"color:#f92672\">&amp;<\/span>xxx_clockevent);\n<\/span><\/span><span style=\"display:flex;\"><span>\txxx_clockevent.min_delta_ns <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">clockevent_delta2ns<\/span>(<span style=\"color:#ae81ff\">2<\/span>, <span style=\"color:#f92672\">&amp;<\/span>xxx_clockevent);\n<\/span><\/span><span style=\"display:flex;\"><span>\t\n<\/span><\/span><span style=\"display:flex;\"><span>\txxx_clockevent.cpumask <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">cpumask_of<\/span>(<span style=\"color:#ae81ff\">0<\/span>);\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">clockevents_register_device<\/span>(<span style=\"color:#f92672\">&amp;<\/span>xxx_clockevent);\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* initialize the kernel jiffy timer source *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">void<\/span> __init <span style=\"color:#a6e22e\">xxx_timer_init<\/span>(<span style=\"color:#66d9ef\">void<\/span>)\n<\/span><\/span><span style=\"display:flex;\"><span>{\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#960050;background-color:#1e0010\">\u2026<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">BUG_ON<\/span>(<span style=\"color:#a6e22e\">clocksource_register_hz<\/span>(<span style=\"color:#f92672\">&amp;<\/span>xxx_clocksource, CLOCK_TICK_RATE));\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">BUG_ON<\/span>(<span style=\"color:#a6e22e\">setup_irq<\/span>(xxx_timer_irq.irq, <span style=\"color:#f92672\">&amp;<\/span>xxx_timer_irq));\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">xxx_clockevent_init<\/span>();\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> sys_timer xxx_timer <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span>\t.init <span style=\"color:#f92672\">=<\/span> xxx_timer_init,\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p>\u8fd9\u4e9b\u51fd\u6570\u7684\u7ed3\u5408\u4f7f\u5f97ARM Linux\u5185\u6838\u5e95\u5c42\u6240\u9700\u8981\u7684\u65f6\u949f\u5f97\u4ee5\u8fd0\u884c\u3002\u4e0b\u9762\u4e3e\u4e00\u4e2a\u5178\u578b\u7684\u573a\u666f\uff0c\u5047\u5b9a\u5b9a\u65f6\u5668\u7684\u6676\u632f\u65f6\u949f\u9891\u7387\u4e3a1MHz\uff08\u5373\u8ba1\u6570\u5668\u6bcf\u52a01\u7b49\u4e8e1\u03bcs\uff09\uff0c\u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7nanosleep\uff08\uff09API\u7761\u7720100\u03bcs\uff0c\u5185\u6838\u4f1a\u636e\u6b64\u6362\u7b97\u51fa\u4e0b\u4e00\u6b21\u5b9a\u65f6\u5668\u4e2d\u65ad\u7684delta\u503c\u4e3a100\uff0c\u5e76\u95f4\u63a5\u8c03\u7528xxx_timer_set_next_event\uff08\uff09\u53bb\u8bbe\u7f6e\u786c\u4ef6\u8ba9\u5176\u5728100\u03bcs\u540e\u4ea7\u751f\u4e2d\u65ad\u3002100\u03bcs\u540e\uff0c\u4e2d\u65ad\u4ea7\u751f\uff0cxxx_timer_interrupt\uff08\uff09\u88ab\u8c03\u7528\uff0cevent_handler\uff08\uff09\u4f1a\u95f4\u63a5\u5524\u9192\u7761\u7720\u7684\u8fdb\u7a0b\u5e76\u5bfc\u81f4nanosleep\uff08\uff09\u51fd\u6570\u8fd4\u56de\uff0c\u4ece\u800c\u8ba9\u7528\u6237\u8fdb\u7a0b\u7ee7\u7eed\u3002<\/p>"},{"title":"arm\u67b6\u6784\u4e0b\u7684\u5f02\u5e38\u5411\u91cf\u8868","link":"https:\/\/ioxera.github.io\/docs\/linux_qa\/arm%E6%9E%B6%E6%9E%84%E4%B8%8B%E7%9A%84%E5%BC%82%E5%B8%B8%E5%90%91%E9%87%8F%E8%A1%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/linux_qa\/arm%E6%9E%B6%E6%9E%84%E4%B8%8B%E7%9A%84%E5%BC%82%E5%B8%B8%E5%90%91%E9%87%8F%E8%A1%A8\/","description":"<p>Linux \u5185\u6838\u5728 ARM\uff0832 \u4f4d\uff09\u4e0e ARM64\uff08AArch64\uff09\u4e0b\u5f02\u5e38\u5411\u91cf\u8868\u7684\u5b9a\u4e49\u4e0e\u5b89\u88c5\u6d41\u7a0b\u5b8c\u5168\u4e0d\u540c\uff0c\u4e0b\u9762\u5206\u5f00\u8bb2\u6e05\u695a <strong>\u5b9a\u4e49\u4f4d\u7f6e<\/strong>\u3001<strong>\u5b89\u88c5\u8fc7\u7a0b<\/strong>\u3001<strong>\u5173\u952e\u6587\u4ef6\u4e0e\u5bc4\u5b58\u5668<\/strong>\u3002<\/p>\n<hr>\n<h2 id=\"\u4e00arm-32-bitarcharm\">\u4e00\u3001ARM 32-bit\uff08arch\/arm\uff09<a class=\"anchor\" href=\"#%e4%b8%80arm-32-bitarcharm\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"1-\u5f02\u5e38\u5411\u91cf\u8868\u5b9a\u4e49\u5728\u54ea\u91cc\">1. \u5f02\u5e38\u5411\u91cf\u8868\u5b9a\u4e49\u5728\u54ea\u91cc\uff1f<a class=\"anchor\" href=\"#1-%e5%bc%82%e5%b8%b8%e5%90%91%e9%87%8f%e8%a1%a8%e5%ae%9a%e4%b9%89%e5%9c%a8%e5%93%aa%e9%87%8c\" aria-label=\"Link\"><\/a><\/h3>\n<p><strong>\u6838\u5fc3\u6587\u4ef6\uff1a<\/strong><\/p>\n<ul>\n<li><code>arch\/arm\/kernel\/entry-armv.S<\/code><\/li>\n<\/ul>\n<p><strong>\u5411\u91cf\u8868\u6bb5\u4e0e\u7b26\u53f7\uff1a<\/strong><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-asm\" data-lang=\"asm\"><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">.section<\/span> <span style=\"color:#66d9ef\">.vectors<\/span>, <span style=\"color:#e6db74\">&#34;ax&#34;<\/span>, %progbits <span style=\"color:#75715e\">@ \u4e13\u95e8\u7684\u5411\u91cf\u6bb5\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>.L__vectors_start:\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_rst<\/span>\t\t<span style=\"color:#75715e\">@ \u590d\u4f4d\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_und<\/span>\t\t<span style=\"color:#75715e\">@ \u672a\u5b9a\u4e49\u6307\u4ee4\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">ldr<\/span>)\t<span style=\"color:#66d9ef\">pc<\/span>, <span style=\"color:#66d9ef\">.L__vectors_start<\/span> <span style=\"color:#960050;background-color:#1e0010\">+<\/span> <span style=\"color:#ae81ff\">0x1000<\/span> <span style=\"color:#75715e\">@ SWI\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_pabt<\/span>\t\t<span style=\"color:#75715e\">@ \u9884\u53d6\u4e2d\u6b62\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_dabt<\/span>\t\t<span style=\"color:#75715e\">@ \u6570\u636e\u4e2d\u6b62\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_addrexcptn<\/span>\t<span style=\"color:#75715e\">@ \u5730\u5740\u5f02\u5e38\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_irq<\/span>\t\t<span style=\"color:#75715e\">@ IRQ\u4e2d\u65ad\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">W<\/span>(<span style=\"color:#66d9ef\">b<\/span>)\t<span style=\"color:#66d9ef\">vector_fiq<\/span>\t\t<span style=\"color:#75715e\">@ FIQ\u4e2d\u65ad\n<\/span><\/span><\/span><span style=\"display:flex;\"><span>.L__vectors_end:<\/span><\/span><\/code><\/pre><\/div><ul>\n<li>\u94fe\u63a5\u811a\u672c\u6307\u5b9a\u4f4d\u7f6e\uff1a<code>arch\/arm\/kernel\/vmlinux.lds.S<\/code><\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>__vectors_start <span style=\"color:#f92672\">=<\/span> .;\n<\/span><\/span><span style=\"display:flex;\"><span>.vectors <span style=\"color:#ae81ff\">0xffff0000<\/span> <span style=\"color:#f92672\">:<\/span> <span style=\"color:#a6e22e\">AT<\/span>(__vectors_start) {\n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#f92672\">*<\/span>(.vectors)\n<\/span><\/span><span style=\"display:flex;\"><span>}\n<\/span><\/span><span style=\"display:flex;\"><span>__vectors_end <span style=\"color:#f92672\">=<\/span> .;<\/span><\/span><\/code><\/pre><\/div><p><strong>\u865a\u62df\u5730\u5740\uff1a<\/strong><\/p>\n<ul>\n<li>Linux 32 \u4f4d ARM \u56fa\u5b9a\u4f7f\u7528 <strong>\u9ad8\u7aef\u5411\u91cf 0xffff0000<\/strong>\uff08CP15 c1 V \u4f4d = 1\uff09<\/li>\n<\/ul>\n<h3 id=\"2-arm-32-\u5f02\u5e38\u5411\u91cf\u8868\u5982\u4f55\u5b89\u88c5\u542f\u52a8\u6d41\u7a0b\">2. ARM 32 \u5f02\u5e38\u5411\u91cf\u8868\u5982\u4f55\u5b89\u88c5\uff08\u542f\u52a8\u6d41\u7a0b\uff09<a class=\"anchor\" href=\"#2-arm-32-%e5%bc%82%e5%b8%b8%e5%90%91%e9%87%8f%e8%a1%a8%e5%a6%82%e4%bd%95%e5%ae%89%e8%a3%85%e5%90%af%e5%8a%a8%e6%b5%81%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h3>\n<p><strong>\u9636\u6bb5 1\uff1a\u6c47\u7f16\u65e9\u671f\uff08head.S\uff09<\/strong><\/p>\n<ul>\n<li>\u8bbe\u7f6e CP15 c1 \u5bc4\u5b58\u5668\uff0c\u5c06 V \u4f4d\uff08bit13\uff09\u7f6e 1 \u2192 \u542f\u7528 <strong>0xffff0000 \u9ad8\u7aef\u5411\u91cf<\/strong><\/li>\n<\/ul>\n<p><strong>\u9636\u6bb5 2\uff1aC \u8bed\u8a00\u521d\u59cb\u5316\uff08setup_arch\uff09<\/strong><\/p>"},{"title":"CPU\u6027\u80fd\u74f6\u9888\u5206\u6790","link":"https:\/\/ioxera.github.io\/docs\/linux_qa\/cpu%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88%E5%88%86%E6%9E%90\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/linux_qa\/cpu%E6%80%A7%E8%83%BD%E7%93%B6%E9%A2%88%E5%88%86%E6%9E%90\/","description":"<h1 id=\"cpu\u6027\u80fd\u6307\u6807\">CPU\u6027\u80fd\u6307\u6807<a class=\"anchor\" href=\"#cpu%e6%80%a7%e8%83%bd%e6%8c%87%e6%a0%87\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"cpu\u4f7f\u7528\u7387\">CPU\u4f7f\u7528\u7387<a class=\"anchor\" href=\"#cpu%e4%bd%bf%e7%94%a8%e7%8e%87\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u63cf\u8ff0CPU\u7684\u7e41\u5fd9\u7a0b\u5ea6\uff0c\u6db5\u76d6\u7528\u6237\u6001\u3001\u7cfb\u7edf\u6001\u3001\u7b49\u5f85I\/O\u53ca\u4e2d\u65ad\u5904\u7406\u7b49\u573a\u666f\uff0c\u662f\u6700\u76f4\u89c2\u7684\u8d1f\u503a\u6307\u6807\u3002\n- <strong>\u7528\u6237CPU<\/strong>\uff1a\u6307\u8fd0\u884c\u7528\u6237\u5e94\u7528\u7a0b\u5e8f\u7684\u65f6\u95f4\u5360\u6bd4\u3002\u6570\u503c\u9ad8\u610f\u5473\u7740\u5e94\u7528\u7a0b\u5e8f\u7e41\u5fd9\uff0c\u662f\u6392\u67e5\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u70b9\u3002\n- <strong>\u7cfb\u7edfCPU<\/strong>\uff1a\u81ea\u5185\u6838\u6001\u8fd0\u884c\u7684\u65f6\u95f4\u5360\u6bd4\uff0c\u5904\u7406\u7cfb\u7edf\u8c03\u7528\u7b49\u3002\u6570\u503c\u9ad8\u901a\u5e38\u6307\u5411\u9a71\u52a8\u6216\u7cfb\u7edf\u670d\u52a1\u7684\u74f6\u9888\u3002\n- <strong>IO\u7b49\u5f85<\/strong>\uff1a\u6307CPU\u7b49\u5f85IO\u64cd\u4f5c\u5b8c\u6210\u7684\u65f6\u95f4\u3002\u9ad8\u503c\u8bf4\u660e\u7cfb\u7edf\u6709\u5927\u91cfIO\u8bf7\u6c42\u6392\u961f\uff0c\u9700\u6392\u67e5\u78c1\u76d8\u6216\u7f51\u7edc\u74f6\u9888\u3002\n- <strong>\u8f6f\u786c\u4e2d\u65ad<\/strong>\uff1a\u5904\u7406\u786c\u4ef6\u6216\u8f6f\u4ef6\u5f02\u6b65\u65f6\u95f4\u7684\u65f6\u95f4\u3002\u9ad8\u503c\u901a\u5e38\u610f\u5473\u7740\u6b63\u5728\u5904\u7406\u5927\u91cf\u7f51\u7edc\u5305\u63a5\u53d7\u6216\u78c1\u76d8IO\u5b8c\u6210\u4e8b\u4ef6\u3002<\/p>\n<h2 id=\"\u5e73\u5747\u8d1f\u8f7d\">\u5e73\u5747\u8d1f\u8f7d<a class=\"anchor\" href=\"#%e5%b9%b3%e5%9d%87%e8%b4%9f%e8%bd%bd\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u63cf\u8ff0\u7cfb\u7edf\u7e41\u5fd9\u7a0b\u5ea6\uff0c\u6307\u5355\u4f4d\u65f6\u95f4\u5185\u5904\u4e8e\u53ef\u8fd0\u884c\u6216\u4e0d\u53ef\u4e2d\u65ad\u72b6\u6001\u7684\u5e73\u5747\u8fdb\u7a0b\u6570\u3002\u82e5\u6570\u503c\u6301\u7eed\u9ad8\u4e8e\u903b\u8f91CPU\u6838\u5fc3\u6570\uff0c\u5219\u8868\u660e\u7cfb\u7edf\u8d1f\u8f7d\u8fc7\u91cd\u3002\u901a\u5e38\u5173\u6ce8\u8fc7\u53bb1\u5206\u949f\u30015\u5206\u949f\u548c15\u5206\u949f\u7684\u6570\u503c\u53d8\u5316\u3002<\/p>\n<h2 id=\"\u4e0a\u4e0b\u6587\u5207\u6362\">\u4e0a\u4e0b\u6587\u5207\u6362<a class=\"anchor\" href=\"#%e4%b8%8a%e4%b8%8b%e6%96%87%e5%88%87%e6%8d%a2\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u63cf\u8ff0CPU\u8c03\u5ea6\u9891\u7e41\u7a0b\u5ea6\uff0c\u64cd\u4f5c\u7cfb\u7edf\u8c03\u5ea6\u57fa\u7840\uff0c\u6d89\u53ca\u8fdb\u7a0b\u72b6\u6001\u7684\u4fdd\u5b58\u4e0e\u6062\u590d\u3002\u5206\u4e3a\u81ea\u613f\u4e0e\u975e\u81ea\u613f\u5207\u6362\u3002\u8fc7\u591a\u7684\u975e\u81ea\u613f\u5207\u6362\u901a\u5e38\u610f\u5473\u7740CPU\u8d44\u6e90\u7d27\u5f20\uff0c\u4f1a\u5e26\u6765\u989d\u5916\u7684\u7cfb\u7edf\u5f00\u9500\u3002<\/p>\n<h2 id=\"cpu\u7f13\u5b58\u547d\u4e2d\u7387\">CPU\u7f13\u5b58\u547d\u4e2d\u7387<a class=\"anchor\" href=\"#cpu%e7%bc%93%e5%ad%98%e5%91%bd%e4%b8%ad%e7%8e%87\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u73b0\u4ee3CPU\u591a\u7ea7\u7f13\u5b58\u7684\u5173\u952e\u6307\u6807\u3002\u547d\u4e2d\u7387\u8d8a\u9ad8\uff0c\u5185\u5b58\u8bbf\u95ee\u5ef6\u8fdf\u8d8a\u4f4e\uff0c\u7a0b\u5e8f\u6267\u884c\u6548\u7387\u8d8a\u9ad8\u3002<\/p>\n<h1 id=\"cpu\u6027\u80fd\u5206\u6790\u5de5\u5177\">CPU\u6027\u80fd\u5206\u6790\u5de5\u5177<a class=\"anchor\" href=\"#cpu%e6%80%a7%e8%83%bd%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u7cfb\u7edfCPU\u4f7f\u7528\u7387\uff1a<code>vmstat, mpstat, top, sar<\/code>\n\u8fdb\u7a0bCPU\u4f7f\u7528\u7387\uff1a<code>top, pidstat, ps<\/code>\n\u5e73\u5747\u8d1f\u8f7d\uff1a <code>uptime, top<\/code>\n\u4e0a\u4e0b\u6587\u5207\u6362\uff1a <code>vmstat(\u7cfb\u7edf), pidstat -w(\u8fdb\u7a0b)<\/code>\n\u4e2d\u65ad\u4e0e\u8f6f\u4e2d\u65ad\uff1a<code>top, vmstat, \/proc\/interrupts<\/code>\n\u6df1\u5ea6\u4e8b\u4ef6\u5256\u6790\uff1a<code>perf<\/code>\uff08\u5f3a\u5927\u7684\u5168\u80fd\u5206\u6790\u5de5\u5177\uff0c\u6027\u80fd\u8ffd\u8e2a\u53ca\u706b\u7130\u56fe\uff09\uff0c<code>execsnoop<\/code> (\u80fd\u591f\u5b9e\u65f6\u76d1\u63a7\u8fdb\u7a0b\u521b\u5efa\u548c\u6267\u884c\u60c5\u51b5\uff0c\u7279\u522b\u9002\u5408\u6355\u6349\u90a3\u4e9b\u96be\u4ee5\u7528\u4f20\u7edf\u5de5\u5177\u68c0\u6d4b\u5230\u7684\u77ed\u671f\u8fdb\u7a0b)<\/p>\n<h1 id=\"cpu\u6027\u80fd\u8bca\u65ad\u6d41\u7a0b\">CPU\u6027\u80fd\u8bca\u65ad\u6d41\u7a0b<a class=\"anchor\" href=\"#cpu%e6%80%a7%e8%83%bd%e8%af%8a%e6%96%ad%e6%b5%81%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u6838\u5fc3\u601d\u8def\uff1a\u73b0\u8c61\u89c2\u5bdf-&gt;\u7f29\u5c0f\u8303\u56f4-&gt;\u5b9a\u4f4d\u6e90\u5934-&gt;\u6df1\u5ea6\u5256\u6790\u3002\u4ece\u73b0\u8c61\u5230\u672c\u8d28\uff0c\u5c42\u5c42\u9012\u8fdb\u3002<\/p>\n<ol>\n<li>\n<p><strong>\u5224\u65ad\u5168\u5c40\u72b6\u6001<\/strong>\n<code>top<\/code>\uff1a\u63d0\u4f9b\u7cfb\u7edf\u6982\u89c8\u3001\u8fdb\u7a0b\u72b6\u6001\u548cCPU\u4f7f\u7528\u7387\u7b49\u6838\u5fc3\u6307\u6807\uff0c\u53d1\u73b0\u5f02\u5e38\u6307\u6807\uff0c\u4f5c\u4e3a\u5206\u6790\u8d77\u70b9\u3002<\/p>\n<\/li>\n<li>\n<p><strong>\u5224\u65ad\u95ee\u9898\u51fa\u5728\u7cfb\u7edf\u5c42\u9762\u8fd8\u662f\u8fdb\u7a0b\u5c42\u9762\uff0c\u5b9a\u4f4d\u5230\u5177\u4f53\u7684\u8fdb\u7a0b\u3001\u7ebf\u7a0b\uff0c\u6216\u8bc6\u522b\u51faIO\u3001\u4e2d\u65ad\u7b49\u7cfb\u7edf\u7ea7\u74f6\u9888<\/strong>\n<code>vmstat<\/code>\uff08\u7cfb\u7edf\u89c6\u89d2\uff09\uff1a\u63d0\u4f9b\u8fdb\u7a0b\u3001\u5185\u5b58\u3001IO\u3001\u4e0a\u4e0b\u6587\u5207\u6362\u548c\u4e2d\u65ad\u7684\u6574\u4f53\u4fe1\u606f\uff0c\u4ece\u5168\u5c40\u5224\u65ad\u7cfb\u7edf\u72b6\u6001\u3002\n<code>pidstat<\/code>\uff08\u8fdb\u7a0b\u89c6\u89d2\uff09\uff1a\u7cbe\u786e\u5c55\u793a\u6bcf\u4e2a\u8fdb\u7a0b\u548c\u53bf\u57ce\u7684CPU\u3001\u5185\u5b58\u548c\u4e0a\u4e0b\u6587\u5207\u6362\u60c5\u51b5\uff0c\u5b9a\u4f4d\u5177\u4f53\u8fdb\u7a0b\u95ee\u9898\u3002<\/p>\n<\/li>\n<li>\n<p><strong>\u6df1\u5ea6\u5256\u6790<\/strong>\n<code>perf<\/code>\uff1a\u5bf9CPU\u4e8b\u4ef6\u3001\u7f13\u5b58\u547d\u4e2d\u7387\u3001\u6307\u4ee4\u9891\u7387\u8fdb\u884c\u91c7\u6837\uff0c\u6df1\u5165\u8fdb\u7a0b\u5185\u90e8\u627e\u5230\u6027\u80fd\u70ed\u70b9\u4ee3\u7801\uff0c\u5b9e\u73b0\u7cbe\u51c6\u74f6\u9888\u5b9a\u4f4d\u3002\n<code>execsnoop<\/code>\uff1a\u7528\u4e8e\u5b9e\u65f6\u76d1\u63a7\u7cfb\u7edf\u4e2d\u77ed\u751f\u547d\u5468\u671f\u8fdb\u7a0b\u7684\u6267\u884c\uff0c\u5bf9\u4e8e\u4e00\u95ea\u800c\u8fc7\u7684\u77ed\u65f6\u8fdb\u7a0b\u5bfc\u81f4\u7684CPU\u5f02\u5e38\uff0c\u80fd\u7cbe\u51c6\u6355\u6349\u6267\u884c\u75d5\u8ff9\uff0c\u662f\u6392\u67e5\u6b64\u7c7b\u9690\u853d\u95ee\u9898\u7684\u5229\u5668\u3002<\/p>\n<\/li>\n<\/ol>\n<h1 id=\"\u5206\u6790\u793a\u4f8b\">\u5206\u6790\u793a\u4f8b<a class=\"anchor\" href=\"#%e5%88%86%e6%9e%90%e7%a4%ba%e4%be%8b\" aria-label=\"Link\"><\/a><\/h1>\n<ul>\n<li>\u573a\u666f\u4e00\uff1a\u7528\u6237CPU\u4f7f\u7528\u7387\u9ad8\n\u4f7f\u7528pidstat\u5b9a\u4f4d\u9ad8\u6d88\u8017\u8fdb\u7a0b\uff0c\u7ed3\u5408perf top\u5206\u6790\u8c03\u7528\u94fe\uff0c\u7cbe\u51c6\u9501\u5b9a\u70ed\u70b9\u51fd\u6570\u3002<\/li>\n<li>\u573a\u666f\u4e8c\uff1a\u7cfb\u7edfCPU\u4f7f\u7528\u7387\u9ad8\n\u901a\u8fc7vmstat\u6392\u67e5\u4e0a\u4e0b\u6587\u5207\u6362\u4e0e\u4e2d\u65ad\uff0c\u7ed3\u5408\/proc\/softirqs\u6df1\u5165\u5206\u6790\u5185\u6838\u6001\u884c\u4e3a\u3002<\/li>\n<li>\u573a\u666f\u4e09\uff1aiowait\u8fc7\u9ad8\n\u5229\u7528dstat\u6216sar\u533a\u5206\u78c1\u76d8\u4e0e\u7f51\u7edcIO\u74f6\u9888\uff0c\u8fdb\u800c\u8ffd\u8e2a\u81ea\u5177\u4f53\u7684\u963b\u585e\u8fdb\u7a0b\u3002<\/li>\n<li>\u573a\u666f\u56db\uff1a\u8f6f\u4e2d\u65ad\u9891\u7e41\n\u67e5\u770b\/proc\/softirqs\u786e\u8ba4\u4e2d\u65ad\u7c7b\u578b\uff08\u5982\u7f51\u7edc\u63a5\u6536\uff09\uff0c \u9488\u5bf9\u6027\u5206\u6790\u5b50\u7cfb\u7edf\u6027\u80fd\u3002<\/li>\n<\/ul>"},{"title":"Framebuffer\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/framebuffer%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/framebuffer%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-\u5f15\u5165framebuffer\">1 \u5f15\u5165Framebuffer<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5framebuffer\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u88f8\u673a LCD \u9a71\u52a8\u7f16\u5199\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n<ol>\n<li>\u521d\u59cb\u5316 I.MX6U \u7684 eLCDIF \u63a7\u5236\u5668\uff0c\u5c4f\u5e55\u5bbd(width)\u3001\u9ad8(height)\u3001<code>hspw\u3001 hbp\u3001hfp\u3001vspw\u3001vbp \u548c vfp<\/code>\u00a0\u7b49\u4fe1\u606f\u3002<\/li>\n<li>\u521d\u59cb\u5316 LCD \u50cf\u7d20\u65f6\u949f\u3002<\/li>\n<li>\u8bbe\u7f6e RGBLCD \u663e\u5b58\u5c5e\u6027\u3002<\/li>\n<li>\u5e94\u7528\u7a0b\u5e8f\u76f4\u63a5\u901a\u8fc7\u64cd\u4f5c\u663e\u5b58\u6765\u64cd\u4f5c LCD\uff0c\u5b9e\u73b0\u5728 LCD \u4e0a\u663e\u793a\u5b57\u7b26\u3001\u56fe\u7247\u7b49\u4fe1\u606f\u3002<\/li>\n<\/ol>\n<p>\u540c\u7406linux\u7cfb\u7edf\u4e0b\u4e5f\u662f\u5e0c\u671b\u5e94\u7528\u7a0b\u5e8f\u6765\u76f4\u63a5\u64cd\u4f5c\u4e00\u5757\u5185\u5b58\u6765\u5b9e\u73b0\u5b9e\u73b0\u5728 LCD \u4e0a\u663e\u793a\u5b57\u7b26\u3001\u56fe\u7247\u7b49\u4fe1\u606f\uff0cFramebuffer\u5c31\u662f\u7528\u6765\u5e72\u8fd9\u4ef6\u4e8b\u7684\u3002<code>Framebuffer<\/code>\u00a0\u7ffb\u8bd1\u8fc7\u6765\u5c31\u662f\u5e27\u7f13\u51b2\uff0c\u7b80\u79f0\u00a0<code>fb<\/code>\u3002<\/p>\n<p>\u4f5c\u7528\uff1a\u628a\u663e\u793a\u8bbe\u5907\u63cf\u8ff0\u6210\u4e00\u4e2a\u7f13\u51b2\u533a\uff0c\u5141\u8bb8\u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7\u5e27\u7f13\u51b2\u5b9a\u4e49\u597d\u7684\u63a5\u53e3\u8bbf\u95ee\u8fd9\u4e9b\u56fe\u5f62\u8bbe\u5907\uff0c\u4ece\u800c\u4e0d\u7528\u5173\u5fc3\u5177\u4f53\u7684\u786c\u4ef6\u7ec6\u8282\u3002<\/p>\n<p>\u56e0\u6b64\u9700\u8981\u5728\u5e95\u5c42<code>framebuffer\u6846\u67b6<\/code>\u53bb\u5bf9\u63a5\u5177\u4f53\u7684\u663e\u793a\u8bbe\u5907\uff0c\u663e\u793a\u8bbe\u5907\u63a7\u5236\u5668\u3002<\/p>\n<h1 id=\"2-framebuffer\u9a71\u52a8\u4ecb\u7ecd\">2 Framebuffer\u9a71\u52a8\u4ecb\u7ecd<a class=\"anchor\" href=\"#2-framebuffer%e9%a9%b1%e5%8a%a8%e4%bb%8b%e7%bb%8d\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"21-framebuffer\u8bbe\u5907\u8282\u70b9\">2.1 Framebuffer\u8bbe\u5907\u8282\u70b9<a class=\"anchor\" href=\"#21-framebuffer%e8%ae%be%e5%a4%87%e8%8a%82%e7%82%b9\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5f53\u6211\u4eec\u7f16\u5199\u597d LCD \u9a71\u52a8\u4ee5\u540e\u4f1a\u751f\u6210\u4e00\u4e2a\u540d\u4e3a<code>\/dev\/fbX(X=0~n)<\/code>\u7684\u8bbe\u5907\uff0c\u5e94\u7528\u7a0b\u5e8f\u901a \u8fc7\u8bbf\u95ee<code>\/dev\/fbX<\/code>\u00a0\u8fd9\u4e2a\u8bbe\u5907\u5c31\u53ef\u4ee5\u8bbf\u95ee LCD\u3002<\/p>\n<p><img src=\"assets\/a276d3d584f21eb13ea079985d897d25_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"22-framebuffer\u6846\u67b6\">2.2 Framebuffer\u6846\u67b6<a class=\"anchor\" href=\"#22-framebuffer%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/8cc622a9abdb1a78f3a2e4651e379202_MD5.webp\" alt=\"img\" \/><\/p>\n<ul>\n<li><code>drivers\/video\/fbmem.c<\/code>\uff1a\u4e3b\u8981\u4efb\u52a1\u662f\u521b\u5efa<code>graphics\u7c7b<\/code>\u3001\u6ce8\u518cFB\u7684\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\uff08\u4e3b\u8bbe\u5907\u53f7\u662f29\uff09\u3001\u63d0\u4f9b<code>register_framebuffer<\/code>\u63a5\u53e3\u7ed9\u5177\u4f53framebuffer\u9a71\u52a8\u7f16\u5199\u7740\u6765\u6ce8\u518cfb\u8bbe\u5907\u7684\u3002<\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define FB_MAJOR\t\t29 <\/span><span style=\"color:#75715e\">\/* \/dev\/fb* framebuffers *\/<\/span><\/span><\/span><\/code><\/pre><\/div><ul>\n<li>\n<p><code>drivers\/video\/fbsys.c<\/code>\uff1a\u662f<code>fbmem.c<\/code>\u5f15\u51fa\u6765\u7684\uff0c\u5904\u7406fb\u5728<code>\/sys\/class\/graphics\/fb0<\/code>\u76ee\u5f55\u4e0b\u7684\u4e00\u4e9b\u5c5e\u6027\u6587\u4ef6\u7684\u3002<\/p>\n<\/li>\n<li>\n<p><code>xxx_fb.c<\/code>: \u5177\u4f53\u7684\u663e\u793a\u8bbe\u5907\u63a7\u5236\u5668\u9a71\u52a8\u4ee3\u7801\uff0cdts\u63cf\u8ff0\u5bf9\u5e94\u7684\u663e\u793a\u8bbe\u5907\uff0c\u63a7\u5236\u5668\u53bb\u9a71\u52a8\u663e\u793a\u8bbe\u5907\u3002<\/p>\n<\/li>\n<\/ul>\n<h2 id=\"23-framebuffer\u6570\u636e\u7ed3\u6784\">2.3 Framebuffer\u6570\u636e\u7ed3\u6784<a class=\"anchor\" href=\"#23-framebuffer%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"231-fb_info\">2.3.1 fb_info<a class=\"anchor\" href=\"#231-fb_info\" aria-label=\"Link\"><\/a><\/h3>\n<p>fb_info\u7ed3\u6784\u4f53\u8bb0\u5f55\u4e86\u5e27\u7f13\u51b2\u8bbe\u5907\u7684\u5168\u90e8\u4fe1\u606f\uff0c\u5305\u62ec\u8bbe\u5907\u7684\u8bbe\u7f6e\u53c2\u6570\u3001\u72b6\u6001\u4ee5\u53ca\u64cd\u4f5c\u51fd\u6570\u6307\u9488\uff0c\u5bf9\u4e8e\u6bcf\u4e00\u4e2a\u5e27\u7f13\u51b2\u8bbe\u5907\u90fd\u5fc5\u987b\u5bf9\u5e94\u4e00\u4e2afb_info\u7ed3\u6784\u4f53\u5b9e\u4f8b\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> fb_info { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">atomic_t<\/span> count; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> node; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> flags; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> mutex lock; <span style=\"color:#75715e\">\/* \u4e92\u65a5\u9501 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> mutex mm_lock; <span style=\"color:#75715e\">\/* \u4e92\u65a5\u9501\uff0c\u7528\u4e8e fb_mmap \u548c smem_*\u57df*\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_var_screeninfo var; <span style=\"color:#75715e\">\/* \u5f53\u524d\u53ef\u53d8\u53c2\u6570 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_fix_screeninfo fix; <span style=\"color:#75715e\">\/* \u5f53\u524d\u56fa\u5b9a\u53c2\u6570 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_monspecs monspecs; <span style=\"color:#75715e\">\/* \u5f53\u524d\u663e\u793a\u5668\u7279\u6027 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> work_struct queue; <span style=\"color:#75715e\">\/* \u5e27\u7f13\u51b2\u4e8b\u4ef6\u961f\u5217 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_pixmap pixmap; <span style=\"color:#75715e\">\/* \u56fe\u50cf\u786c\u4ef6\u6620\u5c04 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_pixmap sprite; <span style=\"color:#75715e\">\/* \u5149\u6807\u786c\u4ef6\u6620\u5c04 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_cmap cmap; <span style=\"color:#75715e\">\/* \u5f53\u524d\u8c03\u8272\u677f *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> list_head modelist; <span style=\"color:#75715e\">\/* \u5f53\u524d\u6a21\u5f0f\u5217\u8868 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_videomode <span style=\"color:#f92672\">*<\/span>mode; <span style=\"color:#75715e\">\/* \u5f53\u524d\u89c6\u9891\u6a21\u5f0f *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#960050;background-color:#1e0010\">#<\/span>ifdef CONFIG_FB_BACKLIGHT <span style=\"color:#75715e\">\/* \u5982\u679c LCD \u652f\u6301\u80cc\u5149\u7684\u8bdd *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* assigned backlight device *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* set before framebuffer registration, \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\tremove after unregister *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> backlight_device <span style=\"color:#f92672\">*<\/span>bl_dev; <span style=\"color:#75715e\">\/* \u80cc\u5149\u8bbe\u5907 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* Backlight level curve *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> mutex bl_curve_mutex; \n<\/span><\/span><span style=\"display:flex;\"><span>\tu8 bl_curve[FB_BACKLIGHT_LEVELS]; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#960050;background-color:#1e0010\">#<\/span>endif \n<\/span><\/span><span style=\"display:flex;\"><span>\t... \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> fb_ops <span style=\"color:#f92672\">*<\/span>fbops; <span style=\"color:#75715e\">\/* \u5e27\u7f13\u51b2\u64cd\u4f5c\u51fd\u6570\u96c6 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>device; <span style=\"color:#75715e\">\/* \u7236\u8bbe\u5907 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev; <span style=\"color:#75715e\">\/* \u5f53\u524d fb \u8bbe\u5907 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> class_flag; <span style=\"color:#75715e\">\/* \u79c1\u6709 sysfs \u6807\u5fd7 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t... \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">char<\/span> __iomem <span style=\"color:#f92672\">*<\/span>screen_base; <span style=\"color:#75715e\">\/* \u865a\u62df\u5185\u5b58\u57fa\u5730\u5740(\u5c4f\u5e55\u663e\u5b58) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> screen_size; <span style=\"color:#75715e\">\/* \u865a\u62df\u5185\u5b58\u5927\u5c0f(\u5c4f\u5e55\u663e\u5b58\u5927\u5c0f) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>pseudo_palette; <span style=\"color:#75715e\">\/* \u4f2a 16 \u4f4d\u8c03\u8272\u677f *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><h4 id=\"2311-fb_ops\">2.3.1.1 fb_ops<a class=\"anchor\" href=\"#2311-fb_ops\" aria-label=\"Link\"><\/a><\/h4>\n<p>\u5e27\u7f13\u51b2\u64cd\u4f5c\u51fd\u6570\u96c6,\u5305\u542bopen,release,read,write\u7b49\u64cd\u4f5c\u51fd\u6570\u3002<\/p>"},{"title":"gpio\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/gpio%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/gpio%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-gpio-\u5b50\u7cfb\u7edf\">1 gpio \u5b50\u7cfb\u7edf<a class=\"anchor\" href=\"#1-gpio-%e5%ad%90%e7%b3%bb%e7%bb%9f\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5982\u679c\u00a0<code>pinctrl<\/code>\u00a0\u5b50\u7cfb\u7edf\u5c06\u4e00\u4e2a PIN \u590d\u7528\u4e3a GPIO \u7684\u8bdd\uff0c\u90a3\u4e48\u63a5\u4e0b\u6765\u8981\u7528\u5230 gpio \u5b50\u7cfb\u7edf\u4e86\u3002gpio \u5b50\u7cfb\u7edf\u7528\u4e8e\u521d\u59cb\u5316 GPIO \u5e76\u4e14\u63d0\u4f9b\u76f8\u5e94\u7684 API \u51fd\u6570\uff0c\u6bd4\u5982\u8bbe\u7f6e GPIO\u4e3a\u8f93\u5165\u8f93\u51fa\uff0c\u8bbe\u7f6e\u8bfb\u53d6 GPIO \u7684\u503c\u7b49\u3002<\/p>\n<p>gpio \u5b50\u7cfb\u7edf\u7684\u4e3b\u8981\u76ee\u7684\u5c31\u662f\u65b9\u4fbf\u9a71\u52a8\u5f00\u53d1\u8005\u4f7f\u7528 gpio\uff0c\u9a71\u52a8\u5f00\u53d1\u8005\u5728\u8bbe\u5907\u6811\u4e2d\u6dfb\u52a0 gpio \u76f8\u5173\u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u5728\u9a71\u52a8\u7a0b\u5e8f\u4e2d\u4f7f\u7528 gpio \u5b50\u7cfb\u7edf\u63d0\u4f9b\u7684 API\u51fd\u6570\u6765\u64cd\u4f5c GPIO\uff0cLinux \u5185\u6838\u5411\u9a71\u52a8\u5f00\u53d1\u8005\u5c4f\u853d\u6389\u4e86 GPIO \u7684\u8bbe\u7f6e\u8fc7\u7a0b\uff0c\u6781\u5927\u7684\u65b9\u4fbf\u4e86\u9a71\u52a8\u5f00\u53d1\u8005\u4f7f\u7528 GPIO\u3002<\/p>\n<h1 id=\"2-gpio\u5b50\u7cfb\u7edf\u67b6\u6784\">2 gpio\u5b50\u7cfb\u7edf\u67b6\u6784<a class=\"anchor\" href=\"#2-gpio%e5%ad%90%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84\" aria-label=\"Link\"><\/a><\/h1>\n<p>Linux\u7684GPIO\u5b50\u7cfb\u7edf\u9a71\u52a8\u6846\u67b6\u7531\u4e09\u4e2a\u4e3b\u8981\u90e8\u5206\u7ec4\u6210\uff1a\n\u2460 GPIO\u63a7\u5236\u5668\u9a71\u52a8\u7a0b\u5e8f\n\u2461gpio lib\u9a71\u52a8\u7a0b\u5e8f\n\u2462GPIO\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\u7a0b\u5e8f\n<img src=\"assets\/a10f51c5e772b85d7fb6a11d10fcfb88_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"20-gpio\u63a7\u5236\u5668\u6e90\u7801\u5206\u6790\">2.0 gpio\u63a7\u5236\u5668\u6e90\u7801\u5206\u6790<a class=\"anchor\" href=\"#20-gpio%e6%8e%a7%e5%88%b6%e5%99%a8%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90\" aria-label=\"Link\"><\/a><\/h2>\n<p><code>drivers\/gpio\/gpio-mxc.c<\/code>\u00a0\u5c31\u662f I.MX6ULL\u7684 GPIO \u63a7\u5236\u5668\u9a71\u52a8\u6587\u4ef6\uff0c\u5728\u6b64\u6587\u4ef6\u4e2d\u6709\u5982\u4e0b\u6240\u793a<code>of_device_id<\/code>\u00a0\u5339\u914d\u8868:<br>\n<img src=\"assets\/071410937e8296b1093692b827439c24_MD5.webp\" alt=\"img\" \/>\n\u5bf9\u7167<code>imx6ull.dtsi<\/code>\u7684gpio\u63a7\u5236\u5668\u53ef\u4ee5\u770b\u5230\u80fd\u5339\u914d\uff1a<br>\n<img src=\"assets\/d751d981e98e5885c4dfa163d59af93f_MD5.webp\" alt=\"img\" \/>\n\u6253\u5f00<code>drivers\/gpio\/gpio-mxc.c<\/code>\uff1a<br>\n<img src=\"assets\/7d0b6b806f1f0755572ce8d3fed23f47_MD5.webp\" alt=\"img\" \/>\nprobe\u51fd\u6570\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">mxc_gpio_probe<\/span>(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span>pdev){ \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device_node <span style=\"color:#f92672\">*<\/span>np <span style=\"color:#f92672\">=<\/span> pdev<span style=\"color:#f92672\">-&gt;<\/span>dev.of_node; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> mxc_gpio_port <span style=\"color:#f92672\">*<\/span>port; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> resource <span style=\"color:#f92672\">*<\/span>iores; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> irq_base <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> err; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">mxc_gpio_get_hw<\/span>(pdev); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tport <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">devm_kzalloc<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, <span style=\"color:#66d9ef\">sizeof<\/span>(<span style=\"color:#f92672\">*<\/span>port), GFP_KERNEL); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#f92672\">!<\/span>port) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#f92672\">-<\/span>ENOMEM; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tiores <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">platform_get_resource<\/span>(pdev, IORESOURCE_MEM, <span style=\"color:#ae81ff\">0<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>base <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">devm_ioremap_resource<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, iores); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#a6e22e\">IS_ERR<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>base)) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#a6e22e\">PTR_ERR<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>base); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>irq_high <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">platform_get_irq<\/span>(pdev, <span style=\"color:#ae81ff\">1<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>irq <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">platform_get_irq<\/span>(pdev, <span style=\"color:#ae81ff\">0<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (port<span style=\"color:#f92672\">-&gt;<\/span>irq <span style=\"color:#f92672\">&lt;<\/span> <span style=\"color:#ae81ff\">0<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">return<\/span> port<span style=\"color:#f92672\">-&gt;<\/span>irq; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* the controller clock is optional *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>clk <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">devm_clk_get<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, NULL); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#a6e22e\">IS_ERR<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>clk)) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\tport<span style=\"color:#f92672\">-&gt;<\/span>clk <span style=\"color:#f92672\">=<\/span> NULL; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\terr <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">clk_prepare_enable<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>clk); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (err) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">dev_err<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, <span style=\"color:#e6db74\">&#34;Unable to enable clock.<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">return<\/span> err; \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">pm_runtime_set_active<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">pm_runtime_enable<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span>\terr <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">pm_runtime_get_sync<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (err <span style=\"color:#f92672\">&lt;<\/span> <span style=\"color:#ae81ff\">0<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">goto<\/span> out_pm_dis; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* disable the interrupt and clear the status *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">writel<\/span>(<span style=\"color:#ae81ff\">0<\/span>, port<span style=\"color:#f92672\">-&gt;<\/span>base <span style=\"color:#f92672\">+<\/span> GPIO_IMR); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">writel<\/span>(<span style=\"color:#f92672\">~<\/span><span style=\"color:#ae81ff\">0<\/span>, port<span style=\"color:#f92672\">-&gt;<\/span>base <span style=\"color:#f92672\">+<\/span> GPIO_ISR); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (mxc_gpio_hwtype <span style=\"color:#f92672\">==<\/span> IMX21_GPIO) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#75715e\">\/* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t\t * Setup one handler for all GPIO interrupts. Actually setting \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t\t * the handler is needed only once, but doing it for every port \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t\t * is more robust and easier. \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t\t *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">irq_set_chained_handler<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>irq, mx2_gpio_irq_handler); \n<\/span><\/span><span style=\"display:flex;\"><span>\t} <span style=\"color:#66d9ef\">else<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#75715e\">\/* setup one handler for each entry *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">irq_set_chained_handler_and_data<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>irq, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t\t mx3_gpio_irq_handler, port); \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">if<\/span> (port<span style=\"color:#f92672\">-&gt;<\/span>irq_high <span style=\"color:#f92672\">&gt;<\/span> <span style=\"color:#ae81ff\">0<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#75715e\">\/* setup handler for GPIO 16 to 31 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#a6e22e\">irq_set_chained_handler_and_data<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>irq_high, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t\t\t mx3_gpio_irq_handler, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t\t\t port); \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\terr <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">bgpio_init<\/span>(<span style=\"color:#f92672\">&amp;<\/span>port<span style=\"color:#f92672\">-&gt;<\/span>gc, <span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, <span style=\"color:#ae81ff\">4<\/span>, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t port<span style=\"color:#f92672\">-&gt;<\/span>base <span style=\"color:#f92672\">+<\/span> GPIO_PSR, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t port<span style=\"color:#f92672\">-&gt;<\/span>base <span style=\"color:#f92672\">+<\/span> GPIO_DR, NULL, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t port<span style=\"color:#f92672\">-&gt;<\/span>base <span style=\"color:#f92672\">+<\/span> GPIO_GDIR, NULL, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t BGPIOF_READ_OUTPUT_REG_SET); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (err) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">goto<\/span> out_bgio; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#a6e22e\">of_property_read_bool<\/span>(np, <span style=\"color:#e6db74\">&#34;gpio_ranges&#34;<\/span>)) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\tport<span style=\"color:#f92672\">-&gt;<\/span>gpio_ranges <span style=\"color:#f92672\">=<\/span> true; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">else<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\tport<span style=\"color:#f92672\">-&gt;<\/span>gpio_ranges <span style=\"color:#f92672\">=<\/span> false; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>gc.request <span style=\"color:#f92672\">=<\/span> mxc_gpio_request; \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>gc.free <span style=\"color:#f92672\">=<\/span> mxc_gpio_free; \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>gc.parent <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev; \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>gc.to_irq <span style=\"color:#f92672\">=<\/span> mxc_gpio_to_irq; \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>gc.base <span style=\"color:#f92672\">=<\/span> (pdev<span style=\"color:#f92672\">-&gt;<\/span>id <span style=\"color:#f92672\">&lt;<\/span> <span style=\"color:#ae81ff\">0<\/span>) <span style=\"color:#f92672\">?<\/span> <span style=\"color:#a6e22e\">of_alias_get_id<\/span>(np, <span style=\"color:#e6db74\">&#34;gpio&#34;<\/span>) <span style=\"color:#f92672\">*<\/span> <span style=\"color:#ae81ff\">32<\/span> <span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t pdev<span style=\"color:#f92672\">-&gt;<\/span>id <span style=\"color:#f92672\">*<\/span> <span style=\"color:#ae81ff\">32<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\terr <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">devm_gpiochip_add_data<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, <span style=\"color:#f92672\">&amp;<\/span>port<span style=\"color:#f92672\">-&gt;<\/span>gc, port); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (err) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">goto<\/span> out_bgio; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tirq_base <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">irq_alloc_descs<\/span>(<span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">1<\/span>, <span style=\"color:#ae81ff\">0<\/span>, <span style=\"color:#ae81ff\">32<\/span>, <span style=\"color:#a6e22e\">numa_node_id<\/span>()); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (irq_base <span style=\"color:#f92672\">&lt;<\/span> <span style=\"color:#ae81ff\">0<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\terr <span style=\"color:#f92672\">=<\/span> irq_base; \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">goto<\/span> out_bgio; \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tport<span style=\"color:#f92672\">-&gt;<\/span>domain <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">irq_domain_add_legacy<\/span>(np, <span style=\"color:#ae81ff\">32<\/span>, irq_base, <span style=\"color:#ae81ff\">0<\/span>, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t <span style=\"color:#f92672\">&amp;<\/span>irq_domain_simple_ops, NULL); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#f92672\">!<\/span>port<span style=\"color:#f92672\">-&gt;<\/span>domain) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\terr <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">-<\/span>ENODEV; \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">goto<\/span> out_irqdesc_free; \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* gpio-mxc can be a generic irq chip *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\terr <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">mxc_gpio_init_gc<\/span>(port, irq_base, <span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (err <span style=\"color:#f92672\">&lt;<\/span> <span style=\"color:#ae81ff\">0<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">goto<\/span> out_irqdomain_remove; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">list_add_tail<\/span>(<span style=\"color:#f92672\">&amp;<\/span>port<span style=\"color:#f92672\">-&gt;<\/span>node, <span style=\"color:#f92672\">&amp;<\/span>mxc_gpio_ports); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">platform_set_drvdata<\/span>(pdev, port); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">pm_runtime_put<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>out_pm_dis: \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">pm_runtime_disable<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">clk_disable_unprepare<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>clk); \n<\/span><\/span><span style=\"display:flex;\"><span>out_irqdomain_remove: \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">irq_domain_remove<\/span>(port<span style=\"color:#f92672\">-&gt;<\/span>domain); \n<\/span><\/span><span style=\"display:flex;\"><span>out_irqdesc_free: \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">irq_free_descs<\/span>(irq_base, <span style=\"color:#ae81ff\">32<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>out_bgio: \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">dev_info<\/span>(<span style=\"color:#f92672\">&amp;<\/span>pdev<span style=\"color:#f92672\">-&gt;<\/span>dev, <span style=\"color:#e6db74\">&#34;%s failed with errno %d<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, __func__, err); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> err; \n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><h3 id=\"201-probe\u5206\u6790\">2.0.1 probe\u5206\u6790<a class=\"anchor\" href=\"#201-probe%e5%88%86%e6%9e%90\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u91cc\u9762\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u7ed3\u6784\u4f53<code>mxc_gpio_port<\/code>\u00a0\u5c31\u662f\u5bf9\u00a0<code>I.MX6ULL GPIO<\/code>\u00a0\u7684\u62bd\u8c61\u3002<code>mxc_gpio_port<\/code>\u00a0\u7ed3\u6784\u4f53\u5b9a\u4e49\u5982\u4e0b\uff1a<br>\n<img src=\"assets\/7ceb14c8d64f39df5577510f913dde5e_MD5.webp\" alt=\"img\" \/>\n<code>mxc_gpio_probe<\/code>\u53c8\u4f1a\u7ee7\u7eed\u8c03\u7528<code>mxc_gpio_get_hw<\/code>\u83b7\u53d6gpio\u7684\u786c\u4ef6\u76f8\u5173\u6570\u636e\uff0c\u4e5f\u5c31\u662fgpio\u7ec4\uff0cgpio1\uff0cgpio2\u7b49\u3002<\/p>"},{"title":"I2C\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/i2c%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/i2c%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-linux-i2c-\u9a71\u52a8\u6846\u67b6\">1 Linux I2C \u9a71\u52a8\u6846\u67b6<a class=\"anchor\" href=\"#1-linux-i2c-%e9%a9%b1%e5%8a%a8%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/2fa3e01e1dbc6628aa31a3d4d172e70b_MD5.webp\" alt=\"img\" \/>\n\u7531\u4e0a\u5230\u4e0b\u5206\u4e3a3\u5c42\u7ed3\u6784\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>i2c\u8bbe\u5907\u9a71\u52a8\u5c42: <span style=\"color:#960050;background-color:#1e0010\">\u4f5c\u4e3a<\/span>client\u4f7f\u7528\u8005\u4f7f\u7528i2c\u5b50\u7cfb\u7edf<span style=\"color:#960050;background-color:#1e0010\">\u3002\u63d0\u4f9b\u64cd\u4f5c\u63a5\u53e3\u7ed9\u5e94\u7528\u5c42\uff0c\u4e0e\u5e94\u7528\u5c42\u4ea4\u4e92\u6570\u636e\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>I2C\u6838\u5fc3\u5c42<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u63d0\u4f9b<\/span>transfer send recv\u51fd\u6570<span style=\"color:#960050;background-color:#1e0010\">\u3002\u628a<\/span>client\u8bbe\u5907\u6302\u8f7d\u5230I2C\u603b\u7ebf\u4e0a<span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u7ef4\u62a4<\/span>i2c driver\u548ci2c client <span style=\"color:#960050;background-color:#1e0010\">\u94fe\u8868<\/span> <span style=\"color:#960050;background-color:#1e0010\">\uff0c\u5b9e\u73b0<\/span>i2c_client\u548ci2c_driver\u5339\u914d<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>I2C\u9002\u914d\u5668\u5c42<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u5e95\u5c42<\/span>SOC I2C\u63a7\u5236\u5668\u9a71\u52a8<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u5b9e\u73b0<\/span>i2c\u65f6\u5e8f<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u5b9e\u73b0<\/span>i2c\u603b\u7ebf\u53d1\u9001\u548c\u63a5\u6536\u6570\u636e\u7684\u65b9\u6cd5<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u76ee\u5f55\u7ed3\u6784\u4f4d\u4e8edrivers\/i2c\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>robin.lee<span style=\"color:#960050;background-color:#1e0010\">@<\/span>WORKSTATION5:<span style=\"color:#f92672\">\/<\/span>media<span style=\"color:#f92672\">\/<\/span>robin.lee<span style=\"color:#f92672\">\/<\/span>zip<span style=\"color:#f92672\">\/<\/span>A2<span style=\"color:#f92672\">\/<\/span>linux_5<span style=\"color:#ae81ff\">.10<\/span><span style=\"color:#f92672\">\/<\/span>drivers<span style=\"color:#f92672\">\/<\/span>i2c<span style=\"color:#960050;background-color:#1e0010\">$<\/span> ls \n<\/span><\/span><span style=\"display:flex;\"><span>algos i2c<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span>acpi.c i2c<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span>of.c i2c<span style=\"color:#f92672\">-<\/span>dev.c i2c<span style=\"color:#f92672\">-<\/span>slave<span style=\"color:#f92672\">-<\/span>testunit.c Kconfig \n<\/span><\/span><span style=\"display:flex;\"><span>busses i2c<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span>base.c i2c<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span>slave.c i2c<span style=\"color:#f92672\">-<\/span>mux.c i2c<span style=\"color:#f92672\">-<\/span>smbus.c Makefile \n<\/span><\/span><span style=\"display:flex;\"><span>i2c<span style=\"color:#f92672\">-<\/span>boardinfo.c i2c<span style=\"color:#f92672\">-<\/span>core.h i2c<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span>smbus.c i2c<span style=\"color:#f92672\">-<\/span>slave<span style=\"color:#f92672\">-<\/span>eeprom.c i2c<span style=\"color:#f92672\">-<\/span>stub.c muxes<\/span><\/span><\/code><\/pre><\/div><h1 id=\"2-\u6570\u636e\u7ed3\u6784\">2 \u6570\u636e\u7ed3\u6784<a class=\"anchor\" href=\"#2-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"21-\u63a7\u5236\u5668\u76f8\u5173\">2.1 \u63a7\u5236\u5668\u76f8\u5173<a class=\"anchor\" href=\"#21-%e6%8e%a7%e5%88%b6%e5%99%a8%e7%9b%b8%e5%85%b3\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"211-i2c_adapter-\u63a7\u5236\u5668\">2.1.1 i2c_adapter-\u63a7\u5236\u5668<a class=\"anchor\" href=\"#211-i2c_adapter-%e6%8e%a7%e5%88%b6%e5%99%a8\" aria-label=\"Link\"><\/a><\/h3>\n<p>I2C \u9002\u914d\u5668\uff0c\u4e5f\u5c31\u662f SOC \u7684 I2C \u63a7\u5236\u5668\u3002<code>i2c_adapter<\/code>\u00a0\u7ed3\u6784\u4f53\u5b9a\u4e49\u5728\u00a0<code>include\/linux\/i2c.h<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> * i2c_adapter is the structure used to identify a physical i2c bus along \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> * with the access algorithms necessary to access it. \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> i2c_adapter { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> module <span style=\"color:#f92672\">*<\/span>owner; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> class;\t\t <span style=\"color:#75715e\">\/* classes to allow probing for *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> i2c_algorithm <span style=\"color:#f92672\">*<\/span>algo; <span style=\"color:#75715e\">\/* the algorithm to access the bus *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>algo_data; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* data fields that are valid for all devices\t*\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> rt_mutex bus_lock; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> timeout;\t\t\t<span style=\"color:#75715e\">\/* in jiffies *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> retries; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device dev;\t\t<span style=\"color:#75715e\">\/* the adapter device *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> nr; <span style=\"color:#75715e\">\/\/\u603b\u7ebf\u7684\u7f16\u53f7 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">char<\/span> name[<span style=\"color:#ae81ff\">48<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> completion dev_released; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> mutex userspace_clients_lock; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> list_head userspace_clients; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> i2c_bus_recovery_info <span style=\"color:#f92672\">*<\/span>bus_recovery_info; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> i2c_adapter_quirks <span style=\"color:#f92672\">*<\/span>quirks; \n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><table>\n\t<thead>\n\t\t\t<tr>\n\t\t\t\t\t<th>\u53d8\u91cf\u540d<\/th>\n\t\t\t\t\t<th>\u89e3\u91ca<\/th>\n\t\t\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t\t\t<tr>\n\t\t\t\t\t<td>class<\/td>\n\t\t\t\t\t<td>\u9002\u914d\u5668\u7684\u7c7b\u7c7b\u578b\uff0c\u5728\u4e00\u4e9b\u53e3I2C\u8bbe\u5907\u9a71\u52a8\u4e2d\u4f1a\u68c0\u67e5\u8be5\u6210\u5458\uff0c\u4ee5\u5224\u65ad\u8bbe\u5907\u80fd\u5426\u88ab\u8be5\u9002\u914d\u5668\u64cd\u4f5c<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>algo<\/td>\n\t\t\t\t\t<td>\u6307\u5411\u8be5\u9002\u914d\u5668\u901a\u4fe1\u65b9\u6cd5\u63cf\u8ff0\u7ed3\u6784\u7684\u6307\u9488\uff0c\u5c31\u662f\u8be5\u9002\u914d\u5668\u5177\u4f53\u64cd\u4f5cI2C\u63a7\u5236\u5668\u7684\u51fd\u6570<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>algo_data<\/td>\n\t\t\t\t\t<td>\u6307\u5411\u901a\u4fe1\u65b9\u6cd5\u6570\u636e\u7684\u6307\u9488\uff0c\u8be5\u6210\u5458\u4e0d\u4f1a\u88abI2C\u6838\u5fc3\u5c42\u4fee\u6539\uff0c\u4ec5\u4f9b\u5177\u4f53\u7684 i2c_algorithm\u4f7f\u7528<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>timeout<\/td>\n\t\t\t\t\t<td>\u4f20\u8f93\u8d85\u65f6\u65f6\u95f4<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>retries<\/td>\n\t\t\t\t\t<td>\u4f20\u8f93\u8d85\u65f6\u7684\u91cd\u8bd5\u6b21\u6570<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>name<\/td>\n\t\t\t\t\t<td>\u9002\u914d\u5668\u540d\u79f0\uff0c\u8be5\u540d\u79f0\u53ef\u4ee5\u901a\u8fc7<code>sys\/bus\/i2c\/devices\/i2c-x\/name<\/code>\u00a0(x=0,1,2 \u2026 \uff09\u6765\u8bbf\u95ee<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>nr<\/td>\n\t\t\t\t\t<td>\u603b\u7ebf\u7f16\u53f7\uff08\u4e5f\u662f\u9002\u914d\u5668\u7f16\u53f7\uff09\uff0c\u540c\u65f6\u5bf9\u5e94\u8bbe\u5907\u8282\u70b9<code>\uff0fdev\/i2c-x<\/code>\u00a0(x=0,1,2 \u2026\uff09\u4e2d\u7684 x<\/td>\n\t\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<h3 id=\"212-i2c_algorithm-\u901a\u4fe1\u65b9\u6cd5\">2.1.2 i2c_algorithm-\u901a\u4fe1\u65b9\u6cd5<a class=\"anchor\" href=\"#212-i2c_algorithm-%e9%80%9a%e4%bf%a1%e6%96%b9%e6%b3%95\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u5bf9\u4e8e\u4e00\u4e2a I2C \u9002\u914d\u5668\uff0c\u80af\u5b9a\u8981\u5bf9\u5916\u63d0\u4f9b\u8bfb \u5199 API \u51fd\u6570\uff0c\u8bbe\u5907\u9a71\u52a8\u7a0b\u5e8f\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e9b API \u51fd\u6570\u6765\u5b8c\u6210\u8bfb\u5199\u64cd\u4f5c\u3002<code>i2c_algorithm<\/code>\u00a0\u5c31\u662f I2C \u9002 \u914d\u5668\u4e0e IIC \u8bbe\u5907\u8fdb\u884c\u901a\u4fe1\u7684\u65b9\u6cd5\u3002\u5305\u62ec<code>transfer send recv<\/code>\u7b49\u51fd\u6570<code>\u3002i2c_algorithm<\/code>\u00a0\u7ed3\u6784\u4f53\u5b9a\u4e49\u5728\u00a0<code>include\/linux\/i2c.h<\/code><\/p>"},{"title":"IIO\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/iio%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/iio%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-\u5f15\u5165iio-\u5b50\u7cfb\u7edf\">1 \u5f15\u5165IIO \u5b50\u7cfb\u7edf<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5iio-%e5%ad%90%e7%b3%bb%e7%bb%9f\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u968f\u7740\u624b\u673a\u3001\u7269\u8054\u7f51\u3001\u5de5\u4e1a\u7269\u8054\u7f51\u548c\u53ef\u7a7f\u6234\u8bbe\u5907\u7684\u7206\u53d1\uff0c\u4f20\u611f\u5668\u7684\u9700\u6c42\u8d8a\u6765\u8d8a\u591a\u3002\u6bd4\u5982\u624b\u673a\u6216\u8005\u624b\u73af\u91cc\u9762\u7684\u52a0\u901f\u5ea6\u8ba1\u3001\u5149\u4f20\u611f\u5668\u3001\u9640\u87ba\u4eea\u3001\u6c14\u538b\u8ba1\u3001\u78c1\u529b\u8ba1\u7b49\uff0c\u8fd9\u4e9b\u4f20\u611f\u5668\u672c\u8d28\u4e0a\u90fd\u662f ADC\u3002\u8fd9\u4e9b\u4f20\u611f\u5668\u5bf9\u5916\u901a\u8fc7 IIC \u6216\u8005 SPI \u63a5\u53e3\u6765\u53d1\u9001ADC\u8f6c\u6362\u540e\u7684\u539f\u59cb\u6570\u636e\u3002<\/p>\n<p>Linux \u5185\u6838\u4e3a\u4e86\u7ba1\u7406\u8fd9\u4e9b\u65e5\u76ca\u589e\u591a\u7684 ADC \u7c7b\u4f20\u611f\u5668\uff0c\u7279\u5730\u63a8\u51fa\u4e86 IIO \u5b50\u7cfb\u7edf\u3002<\/p>\n<p><code>IIO<\/code>\u00a0\u5168\u79f0\u662f\u00a0<code>Industrial I\/O<\/code>\uff0c\u7ffb\u8bd1\u8fc7\u6765\u5c31\u662f\u5de5\u4e1a I\/O\uff0c\u5e38\u7528\u7684\u9640\u87ba\u4eea\u3001\u52a0\u901f\u5ea6\u8ba1\u3001\u7535\u538b\/\u7535\u6d41\u6d4b\u91cf\u82af\u7247\u3001\u5149\u7167\u4f20\u611f\u5668\u3001\u538b\u529b\u4f20\u611f\u5668\u7b49\u5185\u90e8\u90fd\u662f\u6709\u4e2a ADC\uff0c\u5185\u90e8 ADC \u5c06\u539f\u59cb\u7684 \u6a21\u62df\u6570\u636e\u8f6c\u6362\u4e3a\u6570\u5b57\u91cf\uff0c\u7136\u540e\u901a\u8fc7\u5176\u4ed6\u7684\u901a\u4fe1\u63a5\u53e3\uff0c\u6bd4\u5982 IIC\u3001SPI \u7b49\u4f20\u8f93\u7ed9 SOC\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u5f53\u4f7f\u7528\u7684\u4f20\u611f\u5668\u672c\u8d28\u662f ADC\u5668\u4ef6\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u4f18\u5148\u8003\u8651\u4f7f\u7528 IIO \u9a71\u52a8\u6846\u67b6\u3002<\/p>\n<h1 id=\"2-iio-\u5b50\u7cfb\u7edf\u9a71\u52a8\u6846\u67b6\">2 IIO \u5b50\u7cfb\u7edf\u9a71\u52a8\u6846\u67b6<a class=\"anchor\" href=\"#2-iio-%e5%ad%90%e7%b3%bb%e7%bb%9f%e9%a9%b1%e5%8a%a8%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/f676bb7904e657c6850c218816b0dbb9_MD5.png\" alt=\"img\" \/><\/p>\n<ul>\n<li><strong>IIO sysfs<\/strong>\u5bf9\u7528\u6237\u7a7a\u95f4\u63d0\u4f9bIIO\u8bbe\u5907\u8bbf\u95ee\u548c\u914d\u7f6e\u3002<\/li>\n<li><strong>IIO Core<\/strong>\u63d0\u4f9bIIO\u8bbe\u5907\u3001<code>IIO Trigger\u3001IIO Buffer<\/code>\u5206\u914d\u3001\u521d\u59cb\u5316\u3001\u6ce8\u518c\u7b49\u5de5\u4f5c\u3002\n<ul>\n<li><code>industrialio-core.c<\/code><\/li>\n<li><code>industrialio-buffer.c<\/code><\/li>\n<li><code>industrialio-event.c<\/code><\/li>\n<\/ul>\n<\/li>\n<li><strong>IIO Driver<\/strong>\u4e0d\u540cIIO\u8bbe\u5907\u7684\u9a71\u52a8\u7a0b\u5e8f\u3002<\/li>\n<\/ul>\n<h1 id=\"3-\u6570\u636e\u7ed3\u6784\">3 \u6570\u636e\u7ed3\u6784<a class=\"anchor\" href=\"#3-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"31-iio_dev-iio\u8bbe\u5907\">3.1 iio_dev-iio\u8bbe\u5907<a class=\"anchor\" href=\"#31-iio_dev-iio%e8%ae%be%e5%a4%87\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> iio_dev { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> id; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> module <span style=\"color:#f92672\">*<\/span>driver_module; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> modes;<span style=\"color:#75715e\">\/\/\u8bbe\u5907\u652f\u6301\u7684\u6a21\u5f0f \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> currentmode;<span style=\"color:#75715e\">\/\/\u8868\u793a\u8bbe\u5907\u5f53\u524d\u6a21\u5f0f \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> device dev; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> iio_event_interface <span style=\"color:#f92672\">*<\/span>event_interface; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> iio_buffer <span style=\"color:#f92672\">*<\/span>buffer;<span style=\"color:#75715e\">\/\/\u7f13\u51b2\u533a \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> list_head buffer_list;<span style=\"color:#75715e\">\/\/\u5f53\u524d\u5339\u914d\u7684\u7f13\u51b2\u533a\u5217\u8868 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> scan_bytes; <span style=\"color:#75715e\">\/\/\u6355\u83b7\u5230\uff0c\u5e76\u4e14\u63d0\u4f9b\u7ed9\u7f13\u51b2\u533a\u7684\u5b57\u8282\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> mutex mlock; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> <span style=\"color:#f92672\">*<\/span>available_scan_masks;<span style=\"color:#75715e\">\/\/\u626b\u63cf\u4f4d\u63a9\u7801\uff0c\u4f7f\u7528\u89e6\u53d1\u7f13\u51b2\u533a\u7684\u65f6\u5019\u53ef\u4ee5\u901a\u8fc7 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/\u8bbe\u7f6e\u63a9\u7801\u6765\u786e\u5b9a\u4f7f\u80fd\u54ea\u4e9b\u901a\u9053\uff0c\u4f7f\u80fd\u4ee5\u540e\u7684\u901a\u9053\u4f1a\u5c06\u6355\u83b7\u5230\u7684\u6570\u636e\u53d1\u9001\u5230 IIO \u7f13\u51b2\u533a \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">unsigned<\/span> masklength; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> <span style=\"color:#f92672\">*<\/span>active_scan_mask;<span style=\"color:#75715e\">\/\/\u7f13\u51b2\u533a\u5df2\u7ecf\u5f00\u542f\u7684\u901a\u9053\u63a9\u7801 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">bool<\/span> scan_timestamp; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">unsigned<\/span> scan_index_timestamp;<span style=\"color:#75715e\">\/\/\u626b\u63cf\u65f6\u95f4\u6233\uff0c\u5982\u679c\u4f7f\u80fd\u4ee5\u540e\u4f1a\u5c06\u6355\u83b7\u65f6\u95f4\u6233\u653e\u5230\u7f13\u51b2\u533a\u91cc\u9762 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> iio_trigger <span style=\"color:#f92672\">*<\/span>trig;<span style=\"color:#75715e\">\/\/ IIO \u8bbe\u5907\u5f53\u524d\u89e6\u53d1\u5668 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">bool<\/span> trig_readonly; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> iio_poll_func <span style=\"color:#f92672\">*<\/span>pollfunc; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> iio_poll_func <span style=\"color:#f92672\">*<\/span>pollfunc_event; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> iio_chan_spec <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#f92672\">*<\/span>channels;<span style=\"color:#75715e\">\/\/IIO\u8bbe\u5907\u901a\u9053\u5217\u8868 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> num_channels;<span style=\"color:#75715e\">\/\/IIO\u8bbe\u5907\u901a\u9053\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> list_head channel_attr_list; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> attribute_group chan_attr_group; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> iio_info <span style=\"color:#f92672\">*<\/span>info; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">clockid_t<\/span> clock_id; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> mutex info_exist_lock; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> iio_buffer_setup_ops <span style=\"color:#f92672\">*<\/span>setup_ops; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> cdev chrdev; \n<\/span><\/span><span style=\"display:flex;\"><span>};<span style=\"color:#75715e\">\/\/iio_dev\u7528\u4e8e\u63cf\u8ff0\u4e00\u4e2a\u5177\u4f53IIO\u8bbe\u5907, include\/linux\/iio\/iio.h\n<\/span><\/span><\/span><\/code><\/pre><\/div><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* Device operating modes *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define INDIO_DIRECT_MODE\t\t0x01 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define INDIO_BUFFER_TRIGGERED\t\t0x02 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define INDIO_BUFFER_SOFTWARE\t\t0x04 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define INDIO_BUFFER_HARDWARE\t\t0x08 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define INDIO_ALL_BUFFER_MODES\t\t\t\t\t\\ \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t(INDIO_BUFFER_TRIGGERED <span style=\"color:#f92672\">|<\/span> INDIO_BUFFER_HARDWARE <span style=\"color:#f92672\">|<\/span> INDIO_BUFFER_SOFTWARE)<\/span><\/span><\/code><\/pre><\/div><table>\n\t<thead>\n\t\t\t<tr>\n\t\t\t\t\t<th>\u6a21\u5f0f<\/th>\n\t\t\t\t\t<th>\u63cf\u8ff0<\/th>\n\t\t\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t\t\t<tr>\n\t\t\t\t\t<td>INDIO_DIRECT_MODE<\/td>\n\t\t\t\t\t<td>\u63d0\u4f9b sysfs \u63a5\u53e3<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>INDIO_BUFFER_TRIGGERED<\/td>\n\t\t\t\t\t<td>\u652f\u6301\u786c\u4ef6\u7f13\u51b2\u89e6\u53d1<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>INDIO_BUFFER_SOFTWARE<\/td>\n\t\t\t\t\t<td>\u652f\u6301\u8f6f\u4ef6\u7f13\u51b2\u89e6\u53d1<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>INDIO_BUFFER_HARDWARE<\/td>\n\t\t\t\t\t<td>\u652f\u6301\u786c\u4ef6\u7f13\u51b2\u533a<\/td>\n\t\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<h3 id=\"311-iio_buffer_setup_ops\">3.1.1 iio_buffer_setup_ops<a class=\"anchor\" href=\"#311-iio_buffer_setup_ops\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> iio_buffer_setup_ops { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>preenable)(<span style=\"color:#66d9ef\">struct<\/span> iio_dev <span style=\"color:#f92672\">*<\/span>); <span style=\"color:#75715e\">\/* \u7f13\u51b2\u533a\u4f7f\u80fd\u4e4b\u524d\u8c03\u7528 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>postenable)(<span style=\"color:#66d9ef\">struct<\/span> iio_dev <span style=\"color:#f92672\">*<\/span>); <span style=\"color:#75715e\">\/* \u7f13\u51b2\u533a\u4f7f\u80fd\u4e4b\u540e\u8c03\u7528 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>predisable)(<span style=\"color:#66d9ef\">struct<\/span> iio_dev <span style=\"color:#f92672\">*<\/span>); <span style=\"color:#75715e\">\/* \u7f13\u51b2\u533a\u7981\u7528\u4e4b\u524d\u8c03\u7528 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>postdisable)(<span style=\"color:#66d9ef\">struct<\/span> iio_dev <span style=\"color:#f92672\">*<\/span>); <span style=\"color:#75715e\">\/* \u7f13\u51b2\u533a\u7981\u7528\u4e4b\u540e\u8c03\u7528 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> (<span style=\"color:#f92672\">*<\/span>validate_scan_mask)(<span style=\"color:#66d9ef\">struct<\/span> iio_dev <span style=\"color:#f92672\">*<\/span>indio_dev, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> <span style=\"color:#f92672\">*<\/span>scan_mask); <span style=\"color:#75715e\">\/* \u68c0\u67e5\u626b\u63cf\u63a9\u7801\u662f\u5426\u6709\u6548 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p>\u5728\u4f7f\u80fd\u6216\u7981\u7528\u7f13\u51b2\u533a\u7684\u65f6\u5019\u4f1a\u8c03\u7528\u8fd9\u4e9b\u51fd\u6570\u3002<\/p>"},{"title":"input\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/input%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/input%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-input-\u5b50\u7cfb\u7edf\u4ecb\u7ecd\">1 input \u5b50\u7cfb\u7edf\u4ecb\u7ecd<a class=\"anchor\" href=\"#1-input-%e5%ad%90%e7%b3%bb%e7%bb%9f%e4%bb%8b%e7%bb%8d\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u6309\u952e\u3001\u9f20\u6807\u3001\u952e\u76d8\u3001\u89e6\u6478\u5c4f\u7b49\u90fd\u5c5e\u4e8e\u8f93\u5165(<code>input<\/code>)\u8bbe\u5907\uff0cLinux \u5185\u6838\u4e3a\u6b64\u4e13\u95e8\u505a\u4e86\u4e00\u4e2a\u53eb\u505a input\u5b50\u7cfb\u7edf\u7684\u6846\u67b6\u6765\u5904\u7406\u8f93\u5165\u4e8b\u4ef6\u3002<br>\n<img src=\"assets\/1c4ed5c17216c58578f4e0ab6eb109bc_MD5.png\" alt=\"img\" \/>\ninput \u5b50\u7cfb\u7edf\u5206\u4e3a input \u9a71\u52a8\u5c42\u3001input \u6838\u5fc3\u5c42\u3001input \u4e8b\u4ef6\u5904\u7406\u5c42\uff0c\u6700\u7ec8\u7ed9\u7528\u6237\u7a7a\u95f4\u63d0\u4f9b\u53ef\u8bbf\u95ee\u7684\u8bbe\u5907\u8282\u70b9\u3002<br>\n\u9a71\u52a8\u5c42\uff1a\u8f93\u5165\u8bbe\u5907\u7684\u5177\u4f53\u9a71\u52a8\u7a0b\u5e8f\uff0c\u6bd4\u5982\u6309\u952e\u9a71\u52a8\u7a0b\u5e8f\uff0c\u5411\u5185\u6838\u5c42\u62a5\u544a\u8f93\u5165\u5185\u5bb9\u3002<br>\n\u6838\u5fc3\u5c42\uff1a\u627f\u4e0a\u542f\u4e0b\uff0c\u4e3a\u9a71\u52a8\u5c42\u63d0\u4f9b\u8f93\u5165\u8bbe\u5907\u6ce8\u518c\u548c\u64cd\u4f5c\u63a5\u53e3\u3002\u901a\u77e5\u4e8b\u4ef6\u5c42\u5bf9\u8f93\u5165\u4e8b\u4ef6\u8fdb\u884c\u5904\u7406\u3002<br>\n\u4e8b\u4ef6\u5c42\uff1a\u4e3b\u8981\u548c\u7528\u6237\u7a7a\u95f4\u8fdb\u884c\u4ea4\u4e92\u3002<\/p>\n<h2 id=\"10-\u6570\u636e\u7ed3\u6784\">1.0 \u6570\u636e\u7ed3\u6784<a class=\"anchor\" href=\"#10-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"101-input_dev\">1.0.1 input_dev<a class=\"anchor\" href=\"#101-input_dev\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">1<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">struct<\/span> input_dev { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">2<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name; <span style=\"color:#75715e\">\/\/\u8bbe\u5907\u540d \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">3<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>phys; <span style=\"color:#75715e\">\/\/ \u8bbe\u5907\u5728\u7cfb\u7edf\u4e2d\u8def\u5f84 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">4<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>uniq; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">5<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">struct<\/span> input_id id; <span style=\"color:#75715e\">\/\/\u4e0einput_handler\u5339\u914d\u7528\u7684id; \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">9<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> evbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(EV_CNT)]; <span style=\"color:#75715e\">\/\/\u8bbe\u5907\u6240\u652f\u6301\u4e8b\u4ef6\u7c7b\u578b\u4e3b\u8981\u6709EV_SYNC,EV_KEY,EV_REL,EV_ABS \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">10<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> keybit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(KEY_CNT)];<span style=\"color:#75715e\">\/\/ \u6309\u952e\u6240\u5bf9\u5e94\u7684\u4f4d\u56fe \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">11<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> relbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(REL_CNT)];<span style=\"color:#75715e\">\/\/ \u76f8\u5bf9\u5750\u6807\u5bf9\u5e94\u4f4d\u56fe \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">12<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> absbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(ABS_CNT)];<span style=\"color:#75715e\">\/\/ \u7edd\u5bf9\u5750\u6807\u5bf9\u5e94\u4f4d\u56fe \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">13<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> mscbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(MSC_CNT)];<span style=\"color:#75715e\">\/\/\u652f\u6301\u5176\u5b83\u4e8b\u4ef6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">14<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> ledbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(LED_CNT)];<span style=\"color:#75715e\">\/\/\u652f\u6301led\u4e8b\u4ef6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">15<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> sndbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(SND_CNT)];<span style=\"color:#75715e\">\/\/\u652f\u6301\u58f0\u97f3\u4e8b\u4ef6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">16<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> ffbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(FF_CNT)];<span style=\"color:#75715e\">\/\/\u652f\u6301\u53d7\u529b\u4e8b\u4ef6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">17<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> swbit[<span style=\"color:#a6e22e\">BITS_TO_LONGS<\/span>(SW_CNT)];<span style=\"color:#75715e\">\/\/\u652f\u6301\u5f00\u5173\u673a\u4e8b\u4ef6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">18<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">19<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> hint_events_per_packet; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">21<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> keycodemax; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">22<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> keycodesize; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">23<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>keycode; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">24<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">25<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>setkeycode)(<span style=\"color:#66d9ef\">struct<\/span> input_dev <span style=\"color:#f92672\">*<\/span>dev, \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">26<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> input_keymap_entry <span style=\"color:#f92672\">*<\/span>ke, \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">27<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#f92672\">*<\/span>old_keycode); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">28<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>getkeycode)(<span style=\"color:#66d9ef\">struct<\/span> input_dev <span style=\"color:#f92672\">*<\/span>dev, \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">29<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">struct<\/span> input_keymap_entry <span style=\"color:#f92672\">*<\/span>ke); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">30<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">31<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">struct<\/span> ff_device <span style=\"color:#f92672\">*<\/span>ff; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#ae81ff\">33<\/span><span style=\"color:#f92672\">:<\/span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> repeat_key;<span style=\"color:#75715e\">\/\/\u6700\u8fd1\u4e00\u6b21\u7684\u6309\u952e\u503c\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-input-\u9a71\u52a8\u7f16\u5199\u6d41\u7a0b\">1.1 input \u9a71\u52a8\u7f16\u5199\u6d41\u7a0b<a class=\"anchor\" href=\"#11-input-%e9%a9%b1%e5%8a%a8%e7%bc%96%e5%86%99%e6%b5%81%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"110-input\u7c7b\u7684\u5efa\u7acb\u548cproc\u5efa\u7acb\">1.1.0 input\u7c7b\u7684\u5efa\u7acb\u548cproc\u5efa\u7acb<a class=\"anchor\" href=\"#110-input%e7%b1%bb%e7%9a%84%e5%bb%ba%e7%ab%8b%e5%92%8cproc%e5%bb%ba%e7%ab%8b\" aria-label=\"Link\"><\/a><\/h3>\n<p><code>drivers\/input\/input.c<\/code>\u5c31\u662finput\u5b50\u7cfb\u7edf\u7684\u6838\u5fc3\u5c42\uff0c\u6b64\u6587\u4ef6\u91cc\u9762\u6709\u5982\u4e0b\u4ee3\u7801\uff1a<\/p>"},{"title":"led\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/led%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/led%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-led\u5b50\u7cfb\u7edf\u4ecb\u7ecd\">1 LED\u5b50\u7cfb\u7edf\u4ecb\u7ecd<a class=\"anchor\" href=\"#1-led%e5%ad%90%e7%b3%bb%e7%bb%9f%e4%bb%8b%e7%bb%8d\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u7528\u6765\u7ba1\u7406\u63a7\u5236\u677f\u5b50\u7684led\u706f\uff0c\u6bd4\u5982\u7cfb\u7edf\u5fc3\u8df3\u706f\uff0c\u666e\u901a\u7684\u786c\u76d8\u6307\u793a\u706f\u5149\uff0c\u989c\u8272\u706f\uff0c\u4f11\u7720\u5524\u9192\u706f\u7b49\u7b49\u3002<\/p>\n<p><img src=\"assets\/a6970c1ce03b8fb5bd89d46de5028857_MD5.webp\" alt=\"img\" \/>\nled \u5b50\u7cfb\u7edf\u76f8\u5173\u63cf\u8ff0\u53ef\u5728\u5185\u6838\u6e90\u7801\u00a0<code>Documentation\/leds\/leds-class.txt<\/code>\u00a0\u4e86\u89e3\u3002<\/p>\n<p>led \u5b50\u7cfb\u7edf\u662f\u4e00\u4e2a\u7b80\u5355\u7684 Linux \u5b50\u7cfb\u7edf \uff0c\u5728\u76ee\u5f55\u00a0<code>\/sys\/class\/leds<\/code>\u00a0\u4e0b\u5c55\u793a\u8be5\u5b50\u7cfb\u7edf\u8bbe\u5907\uff0c\u6bcf\u4e2a\u8bbe\u5907\u90fd\u6709\u81ea\u5df1\u7684\u5c5e\u6027\uff1a<br>\n<img src=\"assets\/467d6e1a9f8b64eddf1cc8089c75f2f4_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>brightness<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u8bbe\u7f6e<\/span> LED <span style=\"color:#960050;background-color:#1e0010\">\u4eae\u5ea6\uff0c\u8303\u56f4<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#f92672\">~<\/span> max_brightness \n<\/span><\/span><span style=\"display:flex;\"><span>max_brightness<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u6700\u5927\u4eae\u5ea6\uff08<\/span><span style=\"color:#ae81ff\">255<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u6216\u5176\u4ed6\u6570\u5b57\uff09<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>trigger<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u89e6\u53d1\u65b9\u5f0f\uff0c\u5982<\/span> heartbeat<span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>mmc0<span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>backlight<span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>gpio \n<\/span><\/span><span style=\"display:flex;\"><span>delay_off<span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>delay_on<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span>trigger\u4e3atimer\u65f6<span style=\"color:#960050;background-color:#1e0010\">\uff0c<\/span>LED\u4eae\u706d\u7684\u65f6\u95f4<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u5355\u4f4d<\/span>ms<\/span><\/span><\/code><\/pre><\/div><p><code>kernel\/include\/linux\/leds.h<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">enum<\/span> led_brightness { \n<\/span><\/span><span style=\"display:flex;\"><span>\tLED_OFF <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">0<\/span>, <span style=\"color:#75715e\">\/\/\u5168\u6697 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\tLED_HALF <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">127<\/span>, <span style=\"color:#75715e\">\/\/\u4e00\u534a\u4eae\u5ea6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\tLED_FULL <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">255<\/span>, <span style=\"color:#75715e\">\/\/\u6700\u5927\u4eae\u5ea6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-\u4ee3\u7801\u6846\u67b6\u5206\u6790\">1.1 \u4ee3\u7801\u6846\u67b6\u5206\u6790<a class=\"anchor\" href=\"#11-%e4%bb%a3%e7%a0%81%e6%a1%86%e6%9e%b6%e5%88%86%e6%9e%90\" aria-label=\"Link\"><\/a><\/h2>\n<p><code>led-class.c<\/code>\u00a0(led \u5b50\u7cfb\u7edf\u6846\u67b6\u7684\u5165\u53e3)<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7ef4\u62a4<\/span> LED <span style=\"color:#960050;background-color:#1e0010\">\u5b50\u7cfb\u7edf\u7684\u6240\u6709<\/span> LED <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\uff0c\u4e3a<\/span> LED <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u63d0\u4f9b\u6ce8\u518c\u64cd\u4f5c\u51fd\u6570<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_classdev_register<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">devm_led_classdev_register<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u6ce8\u9500\u64cd\u4f5c\u51fd\u6570<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_classdev_unregister<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">devm_led_classdev_unregister<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7535\u6e90\u7ba1\u7406\u7684\u4f11\u7720\u548c\u6062\u590d\u64cd\u4f5c\u51fd\u6570<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_classdev_suspend<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_classdev_resume<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7528\u6237\u6001\u64cd\u4f5c\u63a5\u53e3<\/span><span style=\"color:#f92672\">:<\/span>brightness <span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>max_brightness<\/span><\/span><\/code><\/pre><\/div><p><code>led-core.c<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u62bd\u8c61\u51fa<\/span> LED <span style=\"color:#960050;background-color:#1e0010\">\u64cd\u4f5c\u903b\u8f91\uff0c\u5c01\u88c5\u6210\u51fd\u6570\u5bfc\u51fa\uff0c\u4f9b\u5176\u5b83\u6587\u4ef6\u4f7f\u7528<\/span><span style=\"color:#f92672\">:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_init_core<\/span>()<span style=\"color:#f92672\">:<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u6838\u5fc3\u521d\u59cb\u5316<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_blink_set<\/span>()<span style=\"color:#f92672\">:<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u7f6e<\/span>led\u95ea\u70c1\u65f6\u95f4: \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_blink_set_oneshot<\/span>() <span style=\"color:#f92672\">:<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u95ea\u70c1\u4e00\u6b21<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_stop_software_blink<\/span>() <span style=\"color:#f92672\">:<\/span> led\u505c\u6b62\u95ea\u70c1 \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">led_set_brightness<\/span>() <span style=\"color:#f92672\">:<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u7f6e<\/span>led\u7684\u4eae\u5ea6 \n<\/span><\/span><span style=\"display:flex;\"><span>led_update_brightness : <span style=\"color:#960050;background-color:#1e0010\">\u66f4\u65b0\u4eae\u5ea6<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>led_sysfs_disable : <span style=\"color:#960050;background-color:#1e0010\">\u7528\u6237\u6001\u5173\u95ed<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>led_sysfs enable : <span style=\"color:#960050;background-color:#1e0010\">\u7528\u6237\u6001\u6253\u5f00<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>leds_list : leds\u94fe\u8868; \n<\/span><\/span><span style=\"display:flex;\"><span>leds_list_lock : leds\u94fe\u8868\u9501<\/span><\/span><\/code><\/pre><\/div><p><code>led-triggers.c<\/code><\/p>"},{"title":"Linux\u4e0b\u7684\u5185\u5b58\u6587\u4ef6\u7cfb\u7edf(sysfs,procfs,debugfs)","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E4%B8%8B%E7%9A%84%E5%86%85%E5%AD%98%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9Fsysfsprocfsdebugfs\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E4%B8%8B%E7%9A%84%E5%86%85%E5%AD%98%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9Fsysfsprocfsdebugfs\/","description":"<h1 id=\"1-\u5185\u5b58\u6587\u4ef6\u7cfb\u7edf\">1 \u5185\u5b58\u6587\u4ef6\u7cfb\u7edf<a class=\"anchor\" href=\"#1-%e5%86%85%e5%ad%98%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f\" aria-label=\"Link\"><\/a><\/h1>\n<p>Linux\u9075\u5faa<strong>\u4e00\u5207\u7686\u6587\u4ef6<\/strong>\u7684\u8bbe\u8ba1\u54f2\u5b66\u3002linux\u5185\u6838\u63d0\u4f9b\u4e863\u79cd\u00a0<code>\u201c\u5185\u5b58\u6587\u4ef6\u7cfb\u7edf\u201d<\/code>\uff0c\u5206\u522b\u662f<code>sysfs<\/code>\u3001<code>debugfs<\/code>\u3001<code>procfs<\/code>\uff0c\u9a71\u52a8\u5de5\u7a0b\u5e08\u53ef\u4ee5\u901a\u8fc7\u4efb\u610f\u4e00\u79cd\u6587\u4ef6\u7cfb\u7edf\u5411\u7528\u6237\u7a7a\u95f4\u4f20\u9012\u5185\u6838\u4fe1\u606f\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>Sysfs\u7684\u6302\u8f7d\u70b9\u4e3a<span style=\"color:#f92672\">\/<\/span>sys \n<\/span><\/span><span style=\"display:flex;\"><span>Debugfs\u7684\u6302\u8f7d\u70b9\u4e3a<span style=\"color:#f92672\">\/<\/span>sys<span style=\"color:#f92672\">\/<\/span>kernel<span style=\"color:#f92672\">\/<\/span>debug \n<\/span><\/span><span style=\"display:flex;\"><span>Procfs\u7684\u6302\u8f7d\u70b9\u4e3a<span style=\"color:#f92672\">\/<\/span>proc<\/span><\/span><\/code><\/pre><\/div><p><code>\u5185\u5b58\u6587\u4ef6\u7cfb\u7edf<\/code>: \u4e00\u79cd\u4e34\u65f6\u6587\u4ef6\u7cfb\u7edf\uff0c\u4e00\u822c\u4f1a\u5229\u7528\u811a\u672c\u6302\u8f7d\u5230rootfs\uff0c\u4f46\u662f\u8fd9\u4e9b\u76ee\u5f55\u90fd\u662f\u4f7f\u7528RAM\u7a7a\u95f4\uff0c\u4ed6\u4eec\u4e2d\u7684\u4fe1\u606f\u53ea\u5b58\u5728\u4e8e\u5185\u5b58\u4e2d\uff0c\u65ad\u7535\u540e\u5373\u6d88\u5931\u3002\u4ed6\u4eec\u7684\u51fa\u73b0\u65e8\u5728\u63d0\u4f9b\u4e00\u79cd\u4e0e\u7528\u6237\u7a7a\u95f4\u4ea4\u4e92\u4fe1\u606f\u7684\u65b9\u5f0f\u3002<\/p>\n<p>\u811a\u672c\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>[root<span style=\"color:#960050;background-color:#1e0010\">@<\/span>xxx]<span style=\"color:#f92672\">\/<\/span>etc<span style=\"color:#960050;background-color:#1e0010\">#<\/span> cat fstab \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># &lt;file system&gt; &lt;mount pt&gt; &lt;type&gt; &lt;options&gt; &lt;dump&gt; &lt;pass&gt; \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>root <span style=\"color:#f92672\">\/<\/span> ext2 rw,noauto <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">1<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>proc <span style=\"color:#f92672\">\/<\/span>proc proc defaults <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">0<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>devpts <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>pts devpts defaults,gid<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">5<\/span>,mode<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">620<\/span>,ptmxmode<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">0666<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">0<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>tmpfs <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>shm tmpfs mode<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">0777<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">0<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>tmpfs <span style=\"color:#f92672\">\/<\/span>tmp tmpfs mode<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">1777<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">0<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>sysfs <span style=\"color:#f92672\">\/<\/span>sys sysfs defaults <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">0<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>nodev <span style=\"color:#f92672\">\/<\/span>sys<span style=\"color:#f92672\">\/<\/span>kernel<span style=\"color:#f92672\">\/<\/span>debug debugfs defaults <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#ae81ff\">0<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u8f93\u5165<code>mount<\/code>\u67e5\u770b\u6302\u8f7d\u4fe1\u606f\uff1a\u53ef\u4ee5\u770b\u5230\u6709\u6302\u8f7d<code>procfs, sysfs\uff0c\u4ee5\u53cadebugfs<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>[root<span style=\"color:#960050;background-color:#1e0010\">@<\/span>xxx]<span style=\"color:#f92672\">~<\/span><span style=\"color:#960050;background-color:#1e0010\">#<\/span> mount \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>root on <span style=\"color:#f92672\">\/<\/span> type <span style=\"color:#a6e22e\">squashfs<\/span> (ro,relatime) \n<\/span><\/span><span style=\"display:flex;\"><span>devtmpfs on <span style=\"color:#f92672\">\/<\/span>dev type <span style=\"color:#a6e22e\">devtmpfs<\/span> (rw,relatime,size<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">1381884<\/span>k,nr_inodes<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">345471<\/span>,mode<span style=\"color:#f92672\">=<\/span><span style=\"color:#ae81ff\">755<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>proc on <span style=\"color:#f92672\">\/<\/span>proc type <span style=\"color:#a6e22e\">proc<\/span> (rw,relatime) <span style=\"color:#960050;background-color:#1e0010\">#<\/span>procfs \n<\/span><\/span><span style=\"display:flex;\"><span>sysfs on <span style=\"color:#f92672\">\/<\/span>sys type <span style=\"color:#a6e22e\">sysfs<\/span> (rw,relatime) <span style=\"color:#960050;background-color:#1e0010\">#<\/span>sysfs \n<\/span><\/span><span style=\"display:flex;\"><span>nodev on <span style=\"color:#f92672\">\/<\/span>sys<span style=\"color:#f92672\">\/<\/span>kernel<span style=\"color:#f92672\">\/<\/span>debug type <span style=\"color:#a6e22e\">debugfs<\/span> (rw,relatime) <span style=\"color:#960050;background-color:#1e0010\">#<\/span>debugfs \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p6 on <span style=\"color:#f92672\">\/<\/span>mnt<span style=\"color:#f92672\">\/<\/span>cfg type <span style=\"color:#a6e22e\">ext4<\/span> (rw,sync,relatime) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p7 on <span style=\"color:#f92672\">\/<\/span>mnt<span style=\"color:#f92672\">\/<\/span>data type <span style=\"color:#a6e22e\">ext4<\/span> (rw,sync,relatime) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p7 on <span style=\"color:#f92672\">\/<\/span>var<span style=\"color:#f92672\">\/<\/span>log type <span style=\"color:#a6e22e\">ext4<\/span> (rw,sync,relatime)<\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-sysfs\">1.1 sysfs<a class=\"anchor\" href=\"#11-sysfs\" aria-label=\"Link\"><\/a><\/h2>\n<p>Linux \u7684 sysfs \u662f\u4e00\u4e2a\u865a\u62df\u6587\u4ef6\u7cfb\u7edf\uff0c\u7528\u4e8e\u5411\u7528\u6237\u7a7a\u95f4\u5bfc\u51fa\u5185\u6838\u4e2d\u7684\u5bf9\u8c61\uff08\u5982\u8bbe\u5907\u3001\u9a71\u52a8\u7a0b\u5e8f\u3001\u6a21\u5757\u7b49\uff09\u7684\u5c5e\u6027\u548c\u72b6\u6001\u4fe1\u606f\u3002\u5b83\u6302\u8f7d\u5728 \/sys \u76ee\u5f55\u4e0b\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u7528\u6237\u548c\u7a0b\u5e8f\u67e5\u770b\u6216\u914d\u7f6e\u5185\u6838\u5c42\u7684\u4fe1\u606f\u3002\nsysfs \u7684\u4e3b\u8981\u4f5c\u7528\uff1a<\/p>"},{"title":"linux\u4e2d\u7684\u786c\u7f16\u7801\u5168\u5c40\u53d8\u91cf\u6bb5","link":"https:\/\/ioxera.github.io\/docs\/linux_qa\/linux%E4%B8%AD%E7%9A%84%E7%A1%AC%E7%BC%96%E7%A0%81%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E6%AE%B5\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/linux_qa\/linux%E4%B8%AD%E7%9A%84%E7%A1%AC%E7%BC%96%E7%A0%81%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%E6%AE%B5\/","description":"<h1 id=\"q-\u4e3a\u4f55linux\u5728\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u5e7f\u6cdb\u4f7f\u7528__irpchip_of_table\u8fd9\u79cd\u6bb5\u57fa\u5740\u6765\u5bfb\u5740\u786c\u7f16\u7801\u7684\u7ed3\u6784\u4f53\u53d8\u91cf\u800c\u4e0d\u76f4\u63a5\u4f7f\u7528\u5168\u5c40\u53d8\u91cf\u6570\u7ec4\">Q\uff1a \u4e3a\u4f55linux\u5728\u521d\u59cb\u5316\u8fc7\u7a0b\u4e2d\u5e7f\u6cdb\u4f7f\u7528__irpchip_of_table\u8fd9\u79cd\u6bb5\u57fa\u5740\u6765\u5bfb\u5740\u786c\u7f16\u7801\u7684\u7ed3\u6784\u4f53\u53d8\u91cf\uff0c\u800c\u4e0d\u76f4\u63a5\u4f7f\u7528\u5168\u5c40\u53d8\u91cf\u6570\u7ec4\uff1f<a class=\"anchor\" href=\"#q-%e4%b8%ba%e4%bd%95linux%e5%9c%a8%e5%88%9d%e5%a7%8b%e5%8c%96%e8%bf%87%e7%a8%8b%e4%b8%ad%e5%b9%bf%e6%b3%9b%e4%bd%bf%e7%94%a8__irpchip_of_table%e8%bf%99%e7%a7%8d%e6%ae%b5%e5%9f%ba%e5%9d%80%e6%9d%a5%e5%af%bb%e5%9d%80%e7%a1%ac%e7%bc%96%e7%a0%81%e7%9a%84%e7%bb%93%e6%9e%84%e4%bd%93%e5%8f%98%e9%87%8f%e8%80%8c%e4%b8%8d%e7%9b%b4%e6%8e%a5%e4%bd%bf%e7%94%a8%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f%e6%95%b0%e7%bb%84\" aria-label=\"Link\"><\/a><\/h1>\n<p>Linux \u5185\u6838\u5e7f\u6cdb\u4f7f\u7528\u00a0<code>__irqchip_of_table<\/code>\u00a0\u8fd9\u7c7b<strong>\u81ea\u5b9a\u4e49\u6bb5\uff08Section\uff09<strong>\u6765\u5b58\u653e\u786c\u4ef6\u5339\u914d\u7ed3\u6784\u4f53\uff0c\u800c\u975e\u5168\u5c40\u6570\u7ec4\uff0c\u6838\u5fc3\u662f\u4e3a\u4e86<\/strong>\u6a21\u5757\u5316\u3001\u53ef\u62d4\u63d2\u3001\u81ea\u52a8\u6536\u96c6\u3001\u53ef\u91ca\u653e\u3001\u8de8\u6587\u4ef6\u65e0\u4f9d\u8d56<\/strong>\u2014\u2014 \u8fd9\u662f\u5185\u6838\u9a71\u52a8\u4e0e\u8bbe\u5907\u6811\uff08DT\uff09\u5339\u914d\u7684\u6838\u5fc3\u8bbe\u8ba1\u601d\u60f3\u3002<\/p>\n<p>\u4e0b\u9762\u4ece\u539f\u7406\u3001\u5bf9\u6bd4\u3001\u597d\u5904\u3001\u5b9e\u73b0\u7ec6\u8282\u56db\u4e2a\u5c42\u9762\u8bb2\u900f\u3002<\/p>\n<hr>\n<h2 id=\"\u4e00\u5148\u770b\u4e24\u79cd\u65b9\u5f0f\u7684\u672c\u8d28\u533a\u522b\">\u4e00\u3001\u5148\u770b\u4e24\u79cd\u65b9\u5f0f\u7684\u672c\u8d28\u533a\u522b<a class=\"anchor\" href=\"#%e4%b8%80%e5%85%88%e7%9c%8b%e4%b8%a4%e7%a7%8d%e6%96%b9%e5%bc%8f%e7%9a%84%e6%9c%ac%e8%b4%a8%e5%8c%ba%e5%88%ab\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"1-\u5168\u5c40\u6570\u7ec4\u65b9\u5f0f\u4f60\u8bf4\u7684-\u76f4\u63a5\u7528\u5168\u5c40\u53d8\u91cf\u6570\u7ec4\">1. \u5168\u5c40\u6570\u7ec4\u65b9\u5f0f\uff08\u4f60\u8bf4\u7684 \u201c\u76f4\u63a5\u7528\u5168\u5c40\u53d8\u91cf\u6570\u7ec4\u201d\uff09<a class=\"anchor\" href=\"#1-%e5%85%a8%e5%b1%80%e6%95%b0%e7%bb%84%e6%96%b9%e5%bc%8f%e4%bd%a0%e8%af%b4%e7%9a%84-%e7%9b%b4%e6%8e%a5%e7%94%a8%e5%85%a8%e5%b1%80%e5%8f%98%e9%87%8f%e6%95%b0%e7%bb%84\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u5047\u8bbe\u5168\u5c40\u6570\u7ec4\u786c\u7f16\u7801\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> of_device_id irqchip_of_table[] <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span> { .compatible <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;arm,gic-400&#34;<\/span>, .data <span style=\"color:#f92672\">=<\/span> gic_of_init },\n<\/span><\/span><span style=\"display:flex;\"><span> { .compatible <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;arm,cortex-a9&#34;<\/span>, .data <span style=\"color:#f92672\">=<\/span> gic_of_init },\n<\/span><\/span><span style=\"display:flex;\"><span> { .compatible <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;ti,irq-gic&#34;<\/span>, .data <span style=\"color:#f92672\">=<\/span> ti_irq_init },\n<\/span><\/span><span style=\"display:flex;\"><span> { <span style=\"color:#75715e\">\/* \u7ed3\u5c3e\u7a7a\u9879 *\/<\/span> }\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p><strong>\u95ee\u9898<\/strong>\uff1a<\/p>\n<ul>\n<li>\u6240\u6709\u4e2d\u65ad\u63a7\u5236\u5668\u5fc5\u987b<strong>\u96c6\u4e2d\u5199\u5728\u540c\u4e00\u4e2a\u6587\u4ef6<\/strong><\/li>\n<li>\u589e\u5220\u9a71\u52a8\u8981<strong>\u4fee\u6539\u5168\u5c40\u6570\u7ec4<\/strong>\uff0c\u8026\u5408\u6781\u5f3a<\/li>\n<li>\u65e0\u6cd5\u652f\u6301 ** \u914d\u7f6e\u9879\uff08CONFIG_xxx\uff09** \u52a8\u6001\u589e\u5220<\/li>\n<li>\u5185\u6838\u521d\u59cb\u5316\u540e<strong>\u65e0\u6cd5\u91ca\u653e<\/strong>\u8fd9\u5757\u5185\u5b58<\/li>\n<\/ul>\n<h3 id=\"2-\u6bb5\u57fa\u5740\u65b9\u5f0f\u5185\u6838\u5b9e\u9645\u7528\u6cd5__irqchip_of_table\">2. \u6bb5\u57fa\u5740\u65b9\u5f0f\uff08\u5185\u6838\u5b9e\u9645\u7528\u6cd5\uff1a__irqchip_of_table\uff09<a class=\"anchor\" href=\"#2-%e6%ae%b5%e5%9f%ba%e5%9d%80%e6%96%b9%e5%bc%8f%e5%86%85%e6%a0%b8%e5%ae%9e%e9%99%85%e7%94%a8%e6%b3%95__irqchip_of_table\" aria-label=\"Link\"><\/a><\/h3>\n<p><strong>\u6bcf\u4e2a\u9a71\u52a8\u81ea\u5df1\u58f0\u660e<\/strong>\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ drivers\/irqchip\/irq-gic.c\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">IRQCHIP_DECLARE<\/span>(gic_400, <span style=\"color:#e6db74\">&#34;arm,gic-400&#34;<\/span>, gic_of_init);\n<\/span><\/span><span style=\"display:flex;\"><span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ drivers\/irqchip\/irq-ti.c\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">IRQCHIP_DECLARE<\/span>(ti_gic, <span style=\"color:#e6db74\">&#34;ti,irq-gic&#34;<\/span>, ti_irq_init);<\/span><\/span><\/code><\/pre><\/div><p>\u5b8f\u5c55\u5f00\u540e\uff08\u7b80\u5316\uff09\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> of_device_id __of_table_gic_400\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">__attribute__<\/span>((<span style=\"color:#a6e22e\">__section__<\/span>(<span style=\"color:#e6db74\">&#34;__irqchip_of_table&#34;<\/span>))) <span style=\"color:#f92672\">=<\/span> {\n<\/span><\/span><span style=\"display:flex;\"><span> .compatible <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;arm,gic-400&#34;<\/span>,\n<\/span><\/span><span style=\"display:flex;\"><span> .data <span style=\"color:#f92672\">=<\/span> gic_of_init\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p><strong>\u94fe\u63a5\u811a\u672c<\/strong>\u628a\u540c section \u53d8\u91cf<strong>\u81ea\u52a8\u5408\u5e76\u6210\u8fde\u7eed\u5757<\/strong>\uff0c\u5e76\u7ed9\u51fa\u8d77\u6b62\u7b26\u53f7\uff1a<\/p>"},{"title":"Linux\u5185\u6838-\u5f02\u5e38\u5206\u6790\u5de5\u5177","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8-%E5%BC%82%E5%B8%B8%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8-%E5%BC%82%E5%B8%B8%E5%88%86%E6%9E%90%E5%B7%A5%E5%85%B7\/","description":"<h1 id=\"1-dump_stack\u51fd\u6570\">1 dump_stack\u51fd\u6570<a class=\"anchor\" href=\"#1-dump_stack%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u6253\u5370\u5185\u6838\u8c03\u7528\u5806\u6808\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<p>\u6211\u4eec\u5b9a\u4e49\u56db\u4e2a\u51fd\u6570<code>aaa<\/code>\u3001<code>bbb<\/code>\u3001<code>ccc<\/code>\u3001<code>ddd<\/code>\uff0c\u7136\u540e<code>bbb<\/code>\u4e2d\u8c03\u7528<code>aaa<\/code>\uff0c<code>ccc<\/code>\u4e2d\u8c03\u7528<code>bbb<\/code>\uff0c<code>ddd<\/code>\u51fd\u6570\u8c01\u90fd\u4e0d\u8c03\u7528\u3002\u5728\u5165\u53e3\u51fd\u6570\u4e2d\uff0c\u6211\u4eec\u8c03\u7528<code>ccc<\/code>\u4e0e<code>ddd<\/code>\u51fd\u6570\uff0c\u770b\u770b\u5806\u6808\u6253\u5370\u6548\u679c\u5982\u4f55\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/module.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/kernel.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/init.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/delay.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">aaa<\/span>(<span style=\"color:#66d9ef\">void<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_EMERG <span style=\"color:#e6db74\">&#34;aaa<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">dump_stack<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">msleep<\/span>(<span style=\"color:#ae81ff\">100<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">bbb<\/span>(<span style=\"color:#66d9ef\">void<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_EMERG <span style=\"color:#e6db74\">&#34;bbb<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">aaa<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">msleep<\/span>(<span style=\"color:#ae81ff\">100<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">ccc<\/span>(<span style=\"color:#66d9ef\">void<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_EMERG <span style=\"color:#e6db74\">&#34;ccc<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">bbb<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">msleep<\/span>(<span style=\"color:#ae81ff\">100<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">ddd<\/span>(<span style=\"color:#66d9ef\">void<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_EMERG <span style=\"color:#e6db74\">&#34;ddd<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">msleep<\/span>(<span style=\"color:#ae81ff\">100<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">int<\/span> __init <span style=\"color:#a6e22e\">chrdevTest_init<\/span>(<span style=\"color:#66d9ef\">void<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_EMERG <span style=\"color:#e6db74\">&#34;INIT func<\/span><span style=\"color:#ae81ff\">\\r\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">ccc<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">ddd<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">void<\/span> __exit <span style=\"color:#a6e22e\">chrdevTest_exit<\/span>(<span style=\"color:#66d9ef\">void<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_EMERG <span style=\"color:#e6db74\">&#34;EXIT func<\/span><span style=\"color:#ae81ff\">\\r\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">module_init<\/span>(chrdevTest_init); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">module_exit<\/span>(chrdevTest_exit); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">MODULE_LICENSE<\/span>(<span style=\"color:#e6db74\">&#34;GPL&#34;<\/span>);<\/span><\/span><\/code><\/pre><\/div><p>\u53ef\u4ee5\u770b\u5230\u5f53\u6253\u5370\u5b8c<code>aaa<\/code>\u540e\u5f00\u59cb<code>dump_stack<\/code>, \u6253\u5370\u51fa\u51fd\u6570\u8c03\u7528\u6808\u3002<\/p>\n<p><img src=\"assets\/108bae16b3a275149b395555e1688659_MD5.png\" alt=\"img\" \/><\/p>\n<h1 id=\"2-\u5185\u6838\u6001\u5f02\u5e38call-trace\u7b49\u7ea7\">2 \u5185\u6838\u6001\u5f02\u5e38call trace\u7b49\u7ea7<a class=\"anchor\" href=\"#2-%e5%86%85%e6%a0%b8%e6%80%81%e5%bc%82%e5%b8%b8call-trace%e7%ad%89%e7%ba%a7\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5185\u6838\u6001call trace \u6709\u4e09\u79cd\u51fa\u9519\u60c5\u51b5\uff0c\u5206\u522b\u662f<code>bug<\/code>,\u00a0<code>oops<\/code>\u548c<code>panic<\/code>\u3002<\/p>\n<p>1\u3001\u00a0<code>bug<\/code>-\u00a0<strong>bug\u53ea\u662f\u63d0\u793a\u8b66\u544a<\/strong>\u3002<br>\n<code>BUG: sleeping function called from invalid context at \u2026<\/code>, \u6bd4\u5982\u5728\u539f\u5b50\u4e0a\u4e0b\u6587\u4e2d\u4f11\u7720\uff0c\u603b\u65ad\u670d\u52a1\u51fd\u6570\u4f11\u7720\uff0cspin_lock\u4e2d\u8fdb\u884cmight_sleep\u7b49\u3002<\/p>"},{"title":"Linux\u5185\u6838\u542f\u52a8\u6d41\u7a0b","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B\/","description":"<h1 id=\"1-\u94fe\u63a5\u811a\u672cvmlinuxlds\">1 \u94fe\u63a5\u811a\u672cvmlinux.lds<a class=\"anchor\" href=\"#1-%e9%93%be%e6%8e%a5%e8%84%9a%e6%9c%acvmlinuxlds\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5148\u7f16\u8bd1\u4e00\u4e0b Linux \u6e90\u7801\uff0c\u56e0\u4e3a\u6709\u5f88\u591a\u6587\u4ef6\u662f\u9700\u8981\u7f16\u8bd1\u624d\u4f1a\u751f\u6210\u7684\u3002\u9996\u5148\u5206\u6790 Linux \u5185\u6838\u7684\u8fde\u63a5\u811a\u672c\u6587\u4ef6\u00a0<code>arch\/arm\/kernel\/vmlinux.lds<\/code>\uff0c\u901a\u8fc7\u94fe\u63a5\u811a\u672c\u53ef\u4ee5\u627e\u5230 Linux \u5185\u6838\u7684\u7b2c\u4e00\u884c\u7a0b\u5e8f\u662f\u4ece\u54ea\u91cc\u6267\u884c\u7684\u3002vmlinux.lds \u4e2d\u6709\u5982\u4e0b\u4ee3\u7801:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">492<\/span> <span style=\"color:#a6e22e\">OUTPUT_ARCH<\/span>(arm) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">493<\/span> <span style=\"color:#a6e22e\">ENTRY<\/span>(stext) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">494<\/span> jiffies <span style=\"color:#f92672\">=<\/span> jiffies_64; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">495<\/span> SECTIONS \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">496<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">497<\/span> \t<span style=\"color:#75715e\">\/* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">498 \t* XXX: The linker does not define how output sections are \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">499 \t* assigned to input sections when there are multiple statements \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">500 \t* matching the same input section name. There is no documented \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">501 \t* order of matching. \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">502 \t* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">503 \t* unwind exit sections must be discarded before the rest of the \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">504 \t* unwind sections get included. \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">505 \t*\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">506<\/span> \t<span style=\"color:#f92672\">\/<\/span>DISCARD<span style=\"color:#f92672\">\/<\/span> <span style=\"color:#f92672\">:<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">507<\/span> \t<span style=\"color:#f92672\">*<\/span>(.ARM.exidx.exit.text) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">508<\/span> \t<span style=\"color:#f92672\">*<\/span>(.ARM.extab.exit.text) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">509<\/span> \t \n<\/span><\/span><span style=\"display:flex;\"><span>...... \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#ae81ff\">645<\/span> }<\/span><\/span><\/code><\/pre><\/div><p>ENTRY \u6307\u660e\u4e86\u4e86 Linux \u5185\u6838\u5165\u53e3\uff0c\u5165\u53e3\u4e3a stext\uff0cstext \u5b9a\u4e49\u5728\u6587\u4ef6arch\/arm\/kernel\/head.S \u4e2d \uff0c \u56e0 \u6b64 \u8981 \u5206 \u6790 Linux \u5185 \u6838 \u7684 \u542f \u52a8 \u6d41 \u7a0b \uff0c \u5c31 \u5f97 \u5148 \u4ece \u6587 \u4ef6arch\/arm\/kernel\/head.S \u7684 stext \u5904\u5f00\u59cb\u5206\u6790\u3002<\/p>"},{"title":"linux\u5185\u6838\u673a\u5236-1-\u4f11\u7720\u5524\u9192\u673a\u5236","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-1-%E4%BC%91%E7%9C%A0%E5%94%A4%E9%86%92%E6%9C%BA%E5%88%B6\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-1-%E4%BC%91%E7%9C%A0%E5%94%A4%E9%86%92%E6%9C%BA%E5%88%B6\/","description":"<h1 id=\"1-\u4f11\u7720\u4e0e\u5524\u9192\">1 \u4f11\u7720\u4e0e\u5524\u9192<a class=\"anchor\" href=\"#1-%e4%bc%91%e7%9c%a0%e4%b8%8e%e5%94%a4%e9%86%92\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/ab797fedbaf9245006cf3e3cf24814a3_MD5.png\" alt=\"img\" \/><\/p>\n<pre tabindex=\"0\"><code>1.APP \u8c03\u7528 read \u7b49\u51fd\u6570\u8bd5\u56fe\u8bfb\u53d6\u6570\u636e\uff0c\u6bd4\u5982\u8bfb\u53d6\u6309\u952e\uff1b\n2.APP \u8fdb\u5165\u5185\u6838\u6001\uff0c\u4e5f\u5c31\u662f\u8c03\u7528\u9a71\u52a8\u4e2d\u7684\u5bf9\u5e94\u51fd\u6570\uff0c\u53d1\u73b0\u6709\u6570\u636e\u5219\u590d\u5236\u5230\u7528\u6237\u7a7a\u95f4\u5e76\u9a6c\u4e0a\u8fd4\u56de\uff1b\n3.\u5982\u679c APP \u5728\u5185\u6838\u6001\uff0c\u4e5f\u5c31\u662f\u5728\u9a71\u52a8\u7a0b\u5e8f\u4e2d\u53d1\u73b0\u6ca1\u6709\u6570\u636e\uff0c\u5219 APP \u4f11\u7720\uff1b\n4.\u5f53\u6709\u6570\u636e\u65f6\uff0c\u6bd4\u5982\u5f53\u6309\u4e0b\u6309\u952e\u65f6\uff0c\u9a71\u52a8\u7a0b\u5e8f\u7684\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\u88ab\u8c03\u7528\uff0c\u5b83\u4f1a\u8bb0\u5f55\u6570\u636e\u3001\u5524\u9192 APP\uff1b\n5.APP \u7ee7\u7eed\u8fd0\u884c\u5b83\u7684\u5185\u6838\u6001\u4ee3\u7801\uff0c\u4e5f\u5c31\u662f\u9a71\u52a8\u7a0b\u5e8f\u4e2d\u7684\u51fd\u6570\uff0c\u590d\u5236\u6570\u636e\u5230\u7528\u6237\u7a7a\u95f4\u5e76\u9a6c\u4e0a\u8fd4\u56de<\/code><\/pre><p>drv_read\u51fd\u6570\u5f53\u6ca1\u6709\u6570\u636e\u65f6\u9700\u8981\u4f11\u7720\u7b49\u5f85\u6709\u6570\u636e\u5524\u9192\u3002\u5f53\u6309\u4e0b\u6309\u952e\uff0c\u9a71\u52a8\u7a0b\u5e8f\u4e2d\u7684\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\u88ab\u8c03\u7528\uff0c\u5b83\u4f1a\u8bb0\u5f55\u6570\u636e\uff0c\u5e76\u5524\u9192 APP\u7684read\u51fd\u6570\u3002<\/p>\n<h2 id=\"10-\u5f15\u5165\u4e0a\u4e0b\u6587\u6982\u5ff5\">1.0 \u5f15\u5165\u4e0a\u4e0b\u6587\u6982\u5ff5<a class=\"anchor\" href=\"#10-%e5%bc%95%e5%85%a5%e4%b8%8a%e4%b8%8b%e6%96%87%e6%a6%82%e5%bf%b5\" aria-label=\"Link\"><\/a><\/h2>\n<p>app\u6267\u884c\u6574\u4e2a\u8fc7\u7a0b\u5982\u4e0b\u56fe\uff0c\u53ef\u4ee5\u628a\u5b83\u770b\u4f5c\u88ab\u62c6\u5206\u62102\u6bb5\uff1a\u88ab\u53eb\u505a<code>\u201c\u4e0a\u4e0b\u6587\u201d<\/code>\u3002<br>\n<img src=\"assets\/baca3d59b6e67d0154ed73a5b797b61e_MD5.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>\n<p>\u8fdb\u7a0b\u4e0a\u4e0b\u6587\n\u7ea2\u5b9e\u7ebf\u6240\u6d89\u53ca\u7684\u4ee3\u7801\uff0c\u90fd\u662fAPP\u8c03\u7528\u7684\uff0c\u88ab\u53eb\u505a<code>\u8fdb\u7a0b\u4e0a\u4e0b\u6587<\/code>\uff0cdrv_read\u4e2d\u6709\u6570\u636e\u76f4\u63a5\u8fd4\u56de\u6570\u636e\uff0c\u6ca1\u6709\u6570\u636e\u7684\u8bdd\u8ba9\u51faCPU\u4f11\u7720\u7b49\u5f85\u3002<\/p>\n<\/li>\n<li>\n<p>\u4e2d\u65ad\u4e0a\u4e0b\u6587\n\u6309\u952e\u7684\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\uff0c\u4e0d\u5c5e\u4e8eAPP\u7684\u00a0<code>\u201c\u4e0a\u4e0b\u6587\u201d<\/code>\uff0c\u5f53\u4e2d\u65ad\u53d1\u751f\u65f6\uff0cAPP1 \u6b63\u5728\u4f11\u7720\u3002\u5728 APP \u7684<code>\u201c\u4e0a\u4e0b\u6587\u201d<\/code>\u4e2d\u53ef\u4ee5\u4f11\u7720\u3002<br>\n\u5728\u4e2d\u65ad\u7684\u5904\u7406\u8fc7\u7a0b\u4e2d\uff0c\u4e5f\u5c31\u662f<code>gpio_key_irq<\/code>\u7684\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4e0d\u80fd\u4f11\u7720\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u6240\u4ee5**\uff1a\u5728\u4e2d\u65ad\u5904\u7406\u51fd\u6570\u4e2d\uff0c\u4e0d\u80fd\u4f11\u7720\uff0c\u4e5f\u5c31\u4e0d\u80fd\u8c03\u7528\u4f1a\u5bfc\u81f4\u4f11\u7720\u7684\u51fd\u6570**, \u88ab\u53eb\u505a<code>\u4e2d\u65ad\u4e0a\u4e0b\u6587<\/code>\u3002<\/p>\n<h2 id=\"11-\u4f11\u7720\u51fd\u6570\">1.1 \u4f11\u7720\u51fd\u6570<a class=\"anchor\" href=\"#11-%e4%bc%91%e7%9c%a0%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5185\u6838\u6e90\u7801\uff1a<code>include\\linux\\wait.h<\/code><br>\n<img src=\"assets\/b9f7955766bf37a3be5682c801a85af9_MD5.png\" alt=\"img\" \/>\n\u53c2\u65701\uff1a<code>wq:<\/code>\u00a0<code>waitqueue<\/code>\u7b49\u5f85\u961f\u5217 \uff0c\u7528\u6765\u7b49\u5f85\u6761\u4ef6\u503c\uff0c<code>condition<\/code>\u4e0d\u4e3a0\u5219\u7acb\u5373\u8fd4\u56de<br>\n\u53c2\u65702\uff1a<code>condition<\/code> \u53ef\u4ee5\u662f\u4e00\u4e2a\u53d8\u91cf\uff0c\u4e5f\u53ef\u4ee5\u662f\u4efb\u4f55\u8868\u8fbe\u5f0f\u3002\u8868\u793a\u4e00\u76f4\u7b49\u5f85\uff0c\u76f4\u5230\u00a0<code>condition<\/code>\u4e3a\u771f<\/p>\n<h2 id=\"12-\u5524\u9192\u51fd\u6570\">1.2 \u5524\u9192\u51fd\u6570<a class=\"anchor\" href=\"#12-%e5%94%a4%e9%86%92%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/130cd8c01796721d874956f6afb78613_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"13-\u793a\u4f8b\u4ee3\u7801\">1.3 \u793a\u4f8b\u4ee3\u7801<a class=\"anchor\" href=\"#13-%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/89e065591a657e552f759a41aa2c5f94_MD5.png\" alt=\"img\" \/>\n1.read\u51fd\u6570\u4e2d\u8fdb\u884c<code>wait_event_interruptible<\/code>\uff0c\u56e0\u6b64\u9700\u8981\u521d\u59cb\u5316\u4e00\u4e2a<code>wq<\/code>, \u7528<code>init_waitqueue_head<\/code>\u51fd\u6570\u8fdb\u884c\u521d\u59cb\u5316\u7b49\u5f85\u961f\u5217\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">wait_queue_head_t<\/span> job_done_wq; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">init_waitqueue_head<\/span>(<span style=\"color:#f92672\">&amp;<\/span>job<span style=\"color:#f92672\">-&gt;<\/span>job_done_wq);<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/bd5336dd04eba776712707c2fcc709a5_MD5.png\" alt=\"img\" \/>\n<img src=\"assets\/1e51dbdc091628a8de987c50714e521d_MD5.png\" alt=\"img\" \/>\n\u6216\u8005\u7528<code>DECLARE_WAIT_QUEUE_HEAD<\/code>\u58f0\u660e\u5b9a\u4e49\u521d\u59cb\u5316\u4e00\u8d77\u3002<br>\n<img src=\"assets\/cbd1afee956061bf8fd9022de3245012_MD5.png\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#a6e22e\">DECLARE_WAIT_QUEUE_HEAD<\/span>(gpio_key_wait);<\/span><\/span><\/code><\/pre><\/div><p>read\u51fd\u6570\u5224\u65ad\u662f\u5426\u6709key\uff0c\u6709key\u5219\u76f4\u63a5\u8fd4\u56de\uff0c\u5426\u5219<code>wait_event_interruptible<\/code>\u4f11\u7720\u3002<br>\n<img src=\"assets\/8c1feb3b0cb7c6d9ba6327c94a4393cc_MD5.png\" alt=\"img\" \/><\/p>\n<pre tabindex=\"0\"><code>wait_event_interruptible(gpio_key_wait, g_key);<\/code><\/pre><p>2.\u5982\u679c\u6309\u952e\u6309\u4e0b\u4e86\uff0c\u4e2d\u65adisr\u8fdb\u884c\u54cd\u5e94\uff0c\u8c03\u7528<code>wake_up_interruptible<\/code>,\u5e76\u4e14\u8bbe\u7f6e<code>condition<\/code>\u4e3atrue.\u9a71\u52a8\u7684read\u51fd\u6570\u5c06\u4f1a\u88ab\u5524\u9192\u3002<br>\n<img src=\"assets\/3d52b98eb2a6243ea3bddd9401357395_MD5.png\" alt=\"img\" \/>\n\u9a71\u52a8\u4ee3\u7801<\/p>"},{"title":"linux\u5185\u6838\u673a\u5236-2-poll\u5e95\u5c42\u9a71\u52a8\u673a\u5236","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-2-poll%E5%BA%95%E5%B1%82%E9%A9%B1%E5%8A%A8%E6%9C%BA%E5%88%B6\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-2-poll%E5%BA%95%E5%B1%82%E9%A9%B1%E5%8A%A8%E6%9C%BA%E5%88%B6\/","description":"<h1 id=\"1-poll\u673a\u5236\">1 poll\u673a\u5236<a class=\"anchor\" href=\"#1-poll%e6%9c%ba%e5%88%b6\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"11-\u963b\u585e\u4e0e\u975e\u963b\u585eio\">1.1 \u963b\u585e\u4e0e\u975e\u963b\u585eIO<a class=\"anchor\" href=\"#11-%e9%98%bb%e5%a1%9e%e4%b8%8e%e9%9d%9e%e9%98%bb%e5%a1%9eio\" aria-label=\"Link\"><\/a><\/h2>\n<p>APP \u8c03\u7528 open \u51fd\u6570\u65f6\uff0c\u4e0d\u4f20\u5165<code>O_NONBLOCK<\/code>\uff0cAPP \u8c03\u7528 read \u51fd\u6570\u8bfb\u53d6\u6570\u636e\u65f6,\u4e3a<code>\u963b\u585eio<\/code>\u3002<br>\nAPP \u8c03\u7528 open \u51fd\u6570\u65f6\uff0c\u4f20\u5165<code>O_NONBLOCK<\/code>\u8868\u793a<code>\u201c\u975e\u963b\u585e\u201d<\/code>\uff0cAPP \u8c03\u7528 read \u51fd\u6570\u8bfb\u53d6\u6570\u636e\u65f6\uff0c\u5982\u679c\u9a71\u52a8\u7a0b\u5e8f\u4e2d\u6709\u6570\u636e\uff0c\u90a3\u4e48 APP \u7684 read\u51fd\u6570\u4f1a\u8fd4\u56de\u6570\u636e\uff0c\u5426\u5219\u4f1a\u7acb\u523b\u8fd4\u56de\u9519\u8bef\u3002\u8fd9\u79cd\u9700\u8981APP\u53cd\u590d\u4e3b\u52a8\u53bb\u201d\u8f6e\u8be2\u201d\u8bbe\u5907\uff0c\u5426\u5219\u65e0\u6cd5\u53ca\u65f6\u54cd\u5e94\u3002<br>\n\u6ce8\u610f\uff1a\u5bf9\u4e8e\u666e\u901a\u6587\u4ef6\u3001\u5757\u8bbe\u5907\u6587\u4ef6\uff0c<code>O_NONBLOCK<\/code>\u4e0d\u8d77\u4f5c\u7528\u3002<br>\n\u6ce8\u610f\uff1a\u5bf9\u4e8e\u5b57\u7b26\u8bbe\u5907\u6587\u4ef6\uff0c<code>O_NONBLOCK<\/code>\u00a0\u8d77\u4f5c\u7528\u7684\u524d\u63d0\u662f\u9a71\u52a8\u7a0b\u5e8f\u9488\u5bf9<code>O_NONBLOCK<\/code>\u505a\u4e86\u5904\u7406<br>\n\u53ea\u80fd\u5728 open \u65f6\u8868\u660e\u00a0<code>O_NONBLOCK<\/code>\u00a0\u5417\uff1f<br>\n\u5728 open \u4e4b\u540e\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7 fcntl \u4fee\u6539\u4e3a\u963b\u585e\u6216\u975e\u963b\u585e\uff1a<\/p>\n<ul>\n<li>open \u65f6\u8bbe\u7f6e\uff1a<\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> fd <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">open<\/span>(<span style=\"color:#960050;background-color:#1e0010\">\u201c<\/span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>xxx<span style=\"color:#960050;background-color:#1e0010\">\u201d<\/span>, O_RDWR <span style=\"color:#f92672\">|<\/span> O_NONBLOCK); <span style=\"color:#75715e\">\/* \u975e\u963b\u585e\u65b9\u5f0f *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> fd <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">open<\/span>(<span style=\"color:#960050;background-color:#1e0010\">\u201c<\/span><span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>xxx<span style=\"color:#960050;background-color:#1e0010\">\u201d<\/span>, O_RDWR ); <span style=\"color:#75715e\">\/* \u963b\u585e\u65b9\u5f0f *\/<\/span><\/span><\/span><\/code><\/pre><\/div><ul>\n<li>open \u4e4b\u540e\u8bbe\u7f6e\uff1a<\/li>\n<\/ul>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> flags <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">fcntl<\/span>(fd, F_GETFL); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">fcntl<\/span>(fd, F_SETFL, flags <span style=\"color:#f92672\">|<\/span> O_NONBLOCK); <span style=\"color:#75715e\">\/* \u975e\u963b\u585e\u65b9\u5f0f *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">fcntl<\/span>(fd, F_SETFL, flags <span style=\"color:#f92672\">&amp;<\/span> <span style=\"color:#f92672\">~<\/span>O_NONBLOCK); <span style=\"color:#75715e\">\/* \u963b\u585e\u65b9\u5f0f *\/<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u9a71\u52a8\u5904\u7406<code>O_NONBLOCK<\/code>\u00a0flag\u65f6\uff0c\u5982\u679c\u6ca1\u6709\u6570\u636eread\u51fd\u6570\u7acb\u5373\u8fd4\u56de\u3002<br>\n<img src=\"assets\/a391e39f61b2988025a128a64c016ab3_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"12-\u5e26\u8d85\u65f6\u7684\u963b\u585eiopollselect\">1.2 \u5e26\u8d85\u65f6\u7684\u963b\u585eIO(poll\/select)<a class=\"anchor\" href=\"#12-%e5%b8%a6%e8%b6%85%e6%97%b6%e7%9a%84%e9%98%bb%e5%a1%9eiopollselect\" aria-label=\"Link\"><\/a><\/h2>\n<p><code>POLL<\/code>\u00a0\u673a\u5236\u3001<code>SELECT<\/code>\u673a\u5236\u662f\u5b8c\u5168\u4e00\u6837\u7684\uff0c\u53ea\u662f APP \u63a5\u53e3\u51fd\u6570\u4e0d\u4e00\u6837\u3002\u7b80\u5355\u5730\u8bf4\uff0c\u5b83\u4eec\u5c31\u662f\u00a0<code>\u201c\u5b9a\u4e2a\u95f9\u949f\u201d<\/code>\u00a0\uff1a\u5728\u8c03\u7528 poll\u3001 select \u51fd\u6570\u65f6\u53ef\u4ee5\u4f20\u5165<code>\u201c\u8d85\u65f6\u65f6\u95f4\u201d<\/code>\u3002\u5728\u8fd9\u6bb5\u65f6\u95f4\u5185\uff0c\u6761\u4ef6\u5408\u9002\u65f6(\u6bd4\u5982\u6709\u6570\u636e\u53ef\u8bfb\u3001\u6709\u7a7a\u95f4\u53ef\u5199)\u5c31\u4f1a\u7acb\u523b\u8fd4\u56de\uff0c\u5426\u5219\u7b49\u5230\u201c\u8d85\u65f6\u65f6\u95f4\u201d\u7ed3\u675f\u65f6\u8fd4\u56de\u9519\u8bef\u3002<\/p>"},{"title":"linux\u5185\u6838\u673a\u5236-3-\u5f02\u6b65\u901a\u77e5","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-3-%E5%BC%82%E6%AD%A5%E9%80%9A%E7%9F%A5\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-3-%E5%BC%82%E6%AD%A5%E9%80%9A%E7%9F%A5\/","description":"<h1 id=\"1\u5f02\u6b65\u901a\u77e5\u6982\u8ff0\">1.\u5f02\u6b65\u901a\u77e5\u6982\u8ff0<a class=\"anchor\" href=\"#1%e5%bc%82%e6%ad%a5%e9%80%9a%e7%9f%a5%e6%a6%82%e8%bf%b0\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u4ec0\u4e48\u662f\u5f02\u6b65\u901a\u77e5\uff1f<br>\n\u4f60\u53bb\u4e70\u5976\u8336\uff1a<\/p>\n<ul>\n<li>\u4f60\u5728\u65c1\u8fb9\u7b49\u7740\uff0c\u773c\u775b\u76ef\u7740\u5e97\u5458\uff0c\u751f\u6015\u522b\u4eba\u63d2\u961f\uff0c\u4ed6\u4e00\u505a\u597d\u4f60\u5c31\u77e5\u9053\uff1a\u4f60\u662f\u4e3b\u52a8\u7b49\u5f85\u4ed6\u505a\u597d\uff0c\u8fd9\u53eb \u201c\u540c\u6b65\u201d\u3002<\/li>\n<li>\u4f60\u4ed8\u94b1\u540e\u5c31\u53bb\u73a9\u624b\u673a\u4e86\uff0c\u5e97\u5458\u505a\u597d\u540e\u4ed6\u4f1a\u53eb\u53f7\u544a\u8bc9\u4f60\uff1a\u4f60\u662f\u88ab\u52a8\u83b7\u5f97\u7ed3\u679c\uff0c\u8fd9\u53eb\u201c\u5f02\u6b65\u201d\u3002<\/li>\n<\/ul>\n<p>\u8fd8\u662f\u4ee5<code>gpio_key<\/code>\u7684\u4f8b\u5b50\uff0capp\u60f3\u8981\u5224\u65ad\u6309\u952e\u662f\u5426\u6709\u6309\u4e0b\uff0c\u65e0\u9700\u53bb\u67e5\u8be2\u6216\u8005\u4f11\u7720\uff0c\u53ea\u9700\u8981\u6ce8\u518c<code>SIGIO\u4fe1\u53f7<\/code>\u7ed9driver, \u5f53\u6309\u952e\u6309\u4e0b\uff0cdriver\u4e2d\u4f1a\u81ea\u5df1\u4e3b\u52a8\u901a\u77e5app\uff0c\u7ed9app\u53d1\u9001<code>SIGIO\u4fe1\u53f7<\/code>\uff0capp\u4e0a\u5c42\u6536\u5230<code>\u4fe1\u53f7SIGIO<\/code>\u4f1a\u6267\u884c\u4e8b\u5148\u6ce8\u518c\u7684<code>\u4fe1\u53f7\u5904\u7406\u51fd\u6570<\/code>\u8bfb\u53d6\u6309\u952e\u3002<\/p>\n<p>\u5f02\u6b65\u901a\u77e5\u4f7f\u7528\u4fe1\u53f7\u6765\u5b9e\u73b0\u3002\u5728 Linux \u5185\u6838\u6e90\u6587\u4ef6\u00a0<code>include\\uapi\\asmgeneric\\signal.h<\/code>\u00a0\u4e2d:<br>\n<img src=\"assets\/8eaeed6da73d87612d445da3d3bf9517_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"11-sigaction\u51fd\u6570\">1.1 sigaction\u51fd\u6570<a class=\"anchor\" href=\"#11-sigaction%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* \u7b2c\u4e00\u4e2a\u53c2\u6570\u4e3a\u4fe1\u53f7\u503c\uff0c \u53ef\u4ee5\u662f\u9664SIGKILL\u53caSIGSTOP\u5916\u7684\u4efb\u4f55\u4e00\u4e2a\u7279\u5b9a\u6709\u6548\u7684\u4fe1\u53f7\u3002 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> * \u7b2c\u4e8c\u4e2a\u53c2\u6570\u662f\u6307\u5411\u7ed3\u6784\u4f53sigaction\u7684\u4e00\u4e2a\u5b9e\u4f8b\u7684\u6307\u9488\uff0c \u5728\u7ed3\u6784\u4f53sigaction\u7684\u5b9e\u4f8b\u4e2d\uff0c \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> * \u6307\u5b9a\u4e86\u5bf9\u7279\u5b9a\u4fe1\u53f7\u7684\u5904\u7406\u51fd\u6570\uff0c \u82e5\u4e3a\u7a7a\uff0c \u5219\u8fdb\u7a0b\u4f1a\u4ee5\u7f3a\u7701\u65b9\u5f0f\u5bf9\u4fe1\u53f7\u5904\u7406\uff1b \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> * \u7b2c\u4e09\u4e2a\u53c2\u6570oldact\u6307\u5411\u7684\u5bf9\u8c61\u7528\u6765\u4fdd\u5b58\u539f\u6765\u5bf9\u76f8\u5e94\u4fe1\u53f7\u7684\u5904\u7406\u51fd\u6570\uff0c \u53ef\u6307\u5b9aoldact\u4e3aNULL\u3002 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> * \u5982\u679c\u628a\u7b2c\u4e8c\u3001 \u7b2c\u4e09\u4e2a\u53c2\u6570\u90fd\u8bbe\u4e3aNULL\uff0c \u90a3\u4e48\u8be5\u51fd\u6570\u53ef\u7528\u4e8e\u68c0\u67e5\u4fe1\u53f7\u7684\u6709\u6548\u6027\u3002\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">sigaction<\/span>(<span style=\"color:#66d9ef\">int<\/span> signum,<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> sigaction <span style=\"color:#f92672\">*<\/span>act,<span style=\"color:#66d9ef\">struct<\/span> sigaction <span style=\"color:#f92672\">*<\/span>oldact)); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> sigaction { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>sa_handler)(<span style=\"color:#66d9ef\">int<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>sa_sigaction)(<span style=\"color:#66d9ef\">int<\/span>, <span style=\"color:#66d9ef\">siginfo_t<\/span> <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">sigset_t<\/span> sa_mask; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> sa_flags; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>sa_restorer)(<span style=\"color:#66d9ef\">void<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>}; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">sa_flags\uff1a\u7528\u6765\u8bbe\u7f6e\u4fe1\u53f7\u5904\u7406\u7684\u5176\u4ed6\u76f8\u5173\u64cd\u4f5c\uff0c\u4e0b\u5217\u7684\u6570\u503c\u53ef\u7528\uff1a \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> 1.SA_RESETHAND\uff1a\u5f53\u8c03\u7528\u4fe1\u53f7\u5904\u7406\u51fd\u6570\u65f6\uff0c\u5c06\u4fe1\u53f7\u7684\u5904\u7406\u51fd\u6570\u91cd\u7f6e\u4e3a\u7f3a\u7701\u503c\uff1b \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> 2.SIG_DFLSA_RESTART\uff1a\u5982\u679c\u4fe1\u53f7\u4e2d\u65ad\u4e86\u8fdb\u7a0b\u7684\u67d0\u4e2a\u7cfb\u7edf\u8c03\u7528\uff0c \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> \t\u5219\u7cfb\u7edf\u81ea\u52a8\u542f\u52a8\u8be5\u7cfb\u7edf\u8c03\u7528\uff1b \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> 3.SA_NODEFER\uff1a\u5f53\u4fe1\u53f7\u5904\u7406\u51fd\u6570\u8fd0\u884c\u65f6\uff0c\u5185\u6838\u5c06\u963b\u585e\u8be5\u7ed9\u5b9a\u4fe1\u53f7\u3002\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">*\/<\/span><\/span><\/span><\/code><\/pre><\/div><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">_SAMPLE_PLAT_SYS_HandleSig<\/span>(<span style=\"color:#66d9ef\">int<\/span> nSignal, <span style=\"color:#66d9ef\">siginfo_t<\/span> <span style=\"color:#f92672\">*<\/span>si, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>arg) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">_SAMPLE_PLAT_ERR_Exit<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">exit<\/span>(<span style=\"color:#ae81ff\">1<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> sigaction sa; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">memset<\/span>(<span style=\"color:#f92672\">&amp;<\/span>sa, <span style=\"color:#ae81ff\">0<\/span>, <span style=\"color:#66d9ef\">sizeof<\/span>(<span style=\"color:#66d9ef\">struct<\/span> sigaction)); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">sigemptyset<\/span>(<span style=\"color:#f92672\">&amp;<\/span>sa.sa_mask); \n<\/span><\/span><span style=\"display:flex;\"><span>sa.sa_sigaction <span style=\"color:#f92672\">=<\/span> _SAMPLE_PLAT_SYS_HandleSig; \n<\/span><\/span><span style=\"display:flex;\"><span>sa.sa_flags <span style=\"color:#f92672\">=<\/span> SA_SIGINFO<span style=\"color:#f92672\">|<\/span>SA_RESETHAND; <span style=\"color:#75715e\">\/\/ Reset signal handler to \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/system default after signal triggered \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">sigaction<\/span>(SIGINT, <span style=\"color:#f92672\">&amp;<\/span>sa, NULL); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">sigaction<\/span>(SIGTERM, <span style=\"color:#f92672\">&amp;<\/span>sa, NULL);<\/span><\/span><\/code><\/pre><\/div><h2 id=\"12-signal\u51fd\u6570\">1.2 signal\u51fd\u6570<a class=\"anchor\" href=\"#12-signal%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"121-\u793a\u4f8b1\">1.2.1 \u793a\u4f8b1<a class=\"anchor\" href=\"#121-%e7%a4%ba%e4%be%8b1\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u6309\u4e0b<code>\u201cCtrl+C\u201d<\/code>\u5c06\u5411\u5176\u53d1\u51fa<code>SIGINT<\/code>\u4fe1\u53f7\uff0c \u6b63\u5728\u8fd0\u884ckill\u7684\u8fdb\u7a0b\u5c06\u5411\u5176\u53d1\u51fa<code>SIGTERM<\/code>\u4fe1\u53f7\uff0c \u4ee5\u4e0b\u4ee3\u7801\u7684\u8fdb\u7a0b\u53ef\u6355\u83b7\u8fd9\u4e24\u4e2a\u4fe1\u53f7\u5e76\u8f93\u51fa\u4fe1\u53f7\u503c\uff1a<\/p>"},{"title":"linux\u5185\u6838\u673a\u5236-4-\u5185\u6838\u5b9a\u65f6\u5668","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-4-%E5%86%85%E6%A0%B8%E5%AE%9A%E6%97%B6%E5%99%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-4-%E5%86%85%E6%A0%B8%E5%AE%9A%E6%97%B6%E5%99%A8\/","description":"<h1 id=\"1-\u5f15\u5165\u5b9a\u65f6\u5668\">1 \u5f15\u5165\u5b9a\u65f6\u5668<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5%e5%ae%9a%e6%97%b6%e5%99%a8\" aria-label=\"Link\"><\/a><\/h1>\n<p><a href=\"linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-1-%E4%BC%91%E7%9C%A0%E5%94%A4%E9%86%92%E6%9C%BA%E5%88%B6\/\">linux\u5185\u6838\u673a\u5236-1-\u4f11\u7720\u5524\u9192\u673a\u5236<\/a>\u5f15\u5165\u4e86\u4e2d\u65ad\uff0c\u5f53\u6309\u952e\u6309\u4e0b\u4f1a\u8bb0\u5f55\u6309\u952e\u4fe1\u606f\uff0c\u7406\u60f3\u72b6\u51b5\u662f\u6309\u4e0b\u4e00\u6b21\u6309\u952e\u8bb0\u5f55\u4e00\u7ec4\u6570\u636e\uff0c\u4f46\u5b9e\u9645\u4e0a\u6309\u4e0b\u673a\u68b0\u632f\u52a8\u5bfc\u81f4\u7535\u5e73\u53cd\u590d\u8df3\u52a8\u6700\u540e\u624d\u7a33\u5b9a\uff0c\u6309\u4e0b\u4e00\u6b21gpio irq\u4f1a\u89e6\u53d1\u591a\u6b21\uff0c\u8fd9\u4e2a\u88ab\u53eb\u505a**\u201c\u6296\u52a8\u201d<strong>\uff0c\u90a3\u4e48\u53ef\u4ee5\u5229\u7528\u5b9a\u65f6\u5668\u8fdb\u884c<\/strong>\u201c\u53bb\u6296\u201d**\u3002<br>\n<img src=\"assets\/c9c811da72d4ee1e2be83ea1dc37fe17_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"10-\u5b9a\u65f6\u5668timer_list\u7ed3\u6784\">1.0 \u5b9a\u65f6\u5668timer_list\u7ed3\u6784<a class=\"anchor\" href=\"#10-%e5%ae%9a%e6%97%b6%e5%99%a8timer_list%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/43212514e608b2a802e1250217f075cd_MD5.webp\" alt=\"img\" \/>\n\u5230<code>linux_5.10<\/code>\u7248\u672c<code>struct timer_list<\/code>\u53d8\u6210\u4e86<br>\n<img src=\"assets\/8c67f2b936480d431835a8c9ed08c61e_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> expires;\u00a0<span style=\"color:#75715e\">\/\/\u8bbe\u5b9a\u7684\u8d85\u65f6\u7684\u503c \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span>(<span style=\"color:#f92672\">*<\/span>function)(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>);\u00a0<span style=\"color:#75715e\">\/\/\u8d85\u65f6\u5904\u7406\u51fd\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> data;\u00a0<span style=\"color:#75715e\">\/\/\u8d85\u65f6\u5904\u7406\u51fd\u6570\u53c2\u6570\n<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-timer\u5185\u6838\u51fd\u6570\">1.1 timer\u5185\u6838\u51fd\u6570<a class=\"anchor\" href=\"#11-timer%e5%86%85%e6%a0%b8%e5%87%bd%e6%95%b0\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5728\u5185\u6838\u4e2d\u4f7f\u7528\u5b9a\u65f6\u5668\u5f88\u7b80\u5355\uff0c\u6d89\u53ca\u8fd9\u4e9b\u51fd\u6570(\u53c2\u8003\u5185\u6838\u6e90\u7801<code>include\\linux\\timer.h<\/code>)<\/p>\n<ol>\n<li><code>setup_timer(timer, fn, data)<\/code><br>\n<img src=\"assets\/e9d1dcb9de316a81e0984a1a6ef98dd4_MD5.webp\" alt=\"img\" \/>\n\u5230<code>linux_5.10<\/code>\u7248\u672c\u53d8\u6210\u4e86<code>timer_setup<\/code><br>\n<img src=\"assets\/d8019e55bfc87d5d23e84974b730b751_MD5.webp\" alt=\"img\" \/>\n\u8bbe\u7f6e\u5b9a\u65f6\u5668\uff0c\u4e3b\u8981\u662f\u521d\u59cb\u5316\u00a0<code>timer_list<\/code>\u00a0\u7ed3\u6784\u4f53\uff0c\u8bbe\u7f6e\u5176\u4e2d\u7684\u51fd\u6570\u3001\u53c2\u6570\u3002<\/li>\n<\/ol>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/\u8fd8\u6709\u4e00\u79cd\u7528\u5b8fDEFINE_TIMER\u53bb\u5b9a\u4e49\u548c\u521d\u59cb\u5316\u4e00\u4e2atimer_list \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define DEFINE_TIMER(_name, _function, _expires, _data) \\ \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> timer_list _name <span style=\"color:#f92672\">=<\/span> <span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">TIMER_INITIALIZER<\/span>(_function, _expires, _data) \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define __TIMER_INITIALIZER(_function, _expires, _data, _flags) { \\ \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t\t.entry <span style=\"color:#f92672\">=<\/span> { .next <span style=\"color:#f92672\">=<\/span> TIMER_ENTRY_STATIC },\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t.function <span style=\"color:#f92672\">=<\/span> (_function),\t\t\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t.expires <span style=\"color:#f92672\">=<\/span> (_expires),\t\t\t\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t.data <span style=\"color:#f92672\">=<\/span> (_data),\t\t\t\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t.flags <span style=\"color:#f92672\">=<\/span> (_flags),\t\t\t\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">__TIMER_LOCKDEP_MAP_INITIALIZER<\/span>(\t\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t__FILE__ <span style=\"color:#e6db74\">&#34;:&#34;<\/span> <span style=\"color:#a6e22e\">__stringify<\/span>(__LINE__))\t<span style=\"color:#960050;background-color:#1e0010\">\\<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><ol start=\"2\">\n<li>\n<p><code>void add_timer(struct timer_list *timer)<\/code><br>\n<img src=\"assets\/1a77ddd101e007963cd3e1237ad78b93_MD5.webp\" alt=\"img\" \/>\n\u5411\u5185\u6838\u6dfb\u52a0\u5b9a\u65f6\u5668\u3002<code>timer-&gt;expires<\/code>\u8868\u793a\u8d85\u65f6\u65f6\u95f4\u3002<br>\n\u5f53\u8d85\u65f6\u65f6\u95f4\u5230\u8fbe \uff0c \u5c31\u4f1a\u8c03\u7528\u8fd9\u4e2a\u51fd\u6570 \uff1a<code>timer-&gt;function(timer-&gt;data)<\/code>\u3002<\/p>"},{"title":"linux\u5185\u6838\u673a\u5236-5-mmap\u673a\u5236","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-5-mmap%E6%9C%BA%E5%88%B6\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-5-mmap%E6%9C%BA%E5%88%B6\/","description":"<h1 id=\"1-\u5f15\u5165mmap\">1 \u5f15\u5165mmap<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5mmap\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5e94\u7528\u7a0b\u5e8f\u548c\u9a71\u52a8\u7a0b\u5e8f\u4e4b\u95f4\u4f20\u9012\u6570\u636e\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7 read\u3001write \u51fd\u6570\u8fdb\u884c, \u7528\u6237\u6001\u548c\u5185\u6838\u6001\u7684\u6570\u636e\u4ea4\u4e92\u4e00\u822c\u7528<code>copy_from_user<\/code>,<code>copy_to_user<\/code>\u3002\u8fd9\u79cd\u65b9\u5f0f\u5728\u6570\u636e\u91cf\u6bd4\u8f83\u5c0f\u65f6\u6ca1\u4ec0\u4e48\u95ee\u9898\uff1b\u4f46\u662f\u6570\u636e\u91cf\u6bd4\u8f83\u5927\u65f6\u6548\u7387\u5c31\u592a\u4f4e\u4e86\u3002\u6bd4\u5982\u66f4\u65b0 LCD \u663e\u793a\u65f6\uff0c\u5982\u679c\u6bcf\u6b21\u90fd\u8ba9 APP \u4f20\u9012\u4e00\u5e27\u6570\u636e\u7ed9\u5185\u6838\uff0c\u5047\u8bbe LCD \u91c7\u7528<code>1024x600x32 bpp<\/code>\u00a0\u7684\u683c\u5f0f\uff0c\u4e00\u5e27\u6570\u636e\u5c31\u6709<code>1024x600x32\/8=2.3MB<\/code>\u00a0\u5de6\u53f3,\u800c\u4e14\u4e00\u822c\u4e3a\u4e86\u663e\u793a\u52a8\u6001\u753b\u9762\uff0cLDC\u8f93\u51fafps\u8981\u6c42\u662f<code>60fps or 30 fps<\/code>\uff0c\u90a3\u4e48\u4e00\u79d2\u6570\u636e\u91cf\u4e3a<code>30x2.3 = 70M<\/code>\u5de6\u53f3\uff0c\u663e\u7136<code>copy_from_user<\/code>\uff0c<code>copy_to_user<\/code>\u7684\u65b9\u5f0f\u4e0d\u518d\u9002\u5408\u3002<br>\n\u6539\u8fdb\u7684\u65b9\u6cd5\u5c31\u662f\u8ba9\u7a0b\u5e8f\u53ef\u4ee5\u76f4\u63a5\u8bfb\u5199\u9a71\u52a8\u7a0b\u5e8f\u4e2d\u7684 buffer\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7mmap \u5b9e\u73b0(memory map)\uff0c\u628a\u5185\u6838\u7684 buffer \u6620\u5c04\u5230\u7528\u6237\u6001\uff0c\u8ba9 APP \u5728\u7528\u6237\u6001\u76f4\u63a5\u8bfb\u5199\u3002<br>\n<img src=\"assets\/4844b6c4ae8b9f59bde229e7195633dc_MD5.png\" alt=\"img\" \/>\n<img src=\"assets\/47b74cf1b3bf52597c5c1838ab099f17_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"11-\u5185\u5b58\u6620\u5c04\u73b0\u8c61\">1.1 \u5185\u5b58\u6620\u5c04\u73b0\u8c61<a class=\"anchor\" href=\"#11-%e5%86%85%e5%ad%98%e6%98%a0%e5%b0%84%e7%8e%b0%e8%b1%a1\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;stdio.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;unistd.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;stdlib.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> a; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">main<\/span>(<span style=\"color:#66d9ef\">int<\/span> argc, <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">**<\/span>argv) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (argc <span style=\"color:#f92672\">!=<\/span> <span style=\"color:#ae81ff\">2<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">printf<\/span>(<span style=\"color:#e6db74\">&#34;Usage: %s &lt;number&gt;<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, argv[<span style=\"color:#ae81ff\">0<\/span>]); \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">1<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span>\ta <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">strtol<\/span>(argv[<span style=\"color:#ae81ff\">1<\/span>], NULL, <span style=\"color:#ae81ff\">0<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">printf<\/span>(<span style=\"color:#e6db74\">&#34;a&#39;s address = 0x%lx, a&#39;s value = %d<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, <span style=\"color:#f92672\">&amp;<\/span>a, a); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">while<\/span> (<span style=\"color:#ae81ff\">1<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">sleep<\/span>(<span style=\"color:#ae81ff\">10<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><p>\u5728 PC \u4e0a\u5982\u4e0b\u7f16\u8bd1(\u5fc5\u987b\u9759\u6001\u7f16\u8bd1)\uff1a<\/p>"},{"title":"Linux\u5185\u6838\u673a\u5236-6-\u5185\u6838\u94fe\u8868","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-6-%E5%86%85%E6%A0%B8%E9%93%BE%E8%A1%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-6-%E5%86%85%E6%A0%B8%E9%93%BE%E8%A1%A8\/","description":"<h1 id=\"1-\u5185\u6838\u94fe\u8868\">1 \u5185\u6838\u94fe\u8868<a class=\"anchor\" href=\"#1-%e5%86%85%e6%a0%b8%e9%93%be%e8%a1%a8\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5185\u6838\u94fe\u8868\u672c\u8d28\u5c31\u662f\u4e00\u4e2a\u53cc\u5411\u5faa\u73af\u94fe\u8868\uff1a<\/p>\n<p><img src=\"assets\/eccf0f61cd8aaad83972fa9ae35ef37c_MD5.webp\" alt=\"img\" \/>\n\u94fe\u8868\u7684\u5b9e\u73b0\u4ec5\u7528\u4e00\u4e2a<code>include\/linux\/list.h<\/code>\u5b9e\u73b0\u3002<\/p>\n<p>\u5185\u6838\u94fe\u8868\u6709\u522b\u4e8e\u4f20\u7edf\u94fe\u8868\u5c31\u5728\u8282\u70b9\u672c\u8eab\u4e0d\u5305\u542b\u6570\u636e\u57df\uff0c\u53ea\u5305\u542b\u6307\u9488\u57df\u3002\u6545\u800c\u53ef\u4ee5\u5f88\u7075\u6d3b\u7684\u62d3\u5c55\u6570\u636e\u7ed3\u6784\u3002\u4f7f\u7528\u65f6\u5305\u542b\u5728\u7528\u6237\u6570\u636e\u7ed3\u6784\u5185\u90e8\u3002<\/p>\n<h2 id=\"11-\u5185\u6838\u94fe\u8868\u7ed3\u6784\u4f53\">1.1 \u5185\u6838\u94fe\u8868\u7ed3\u6784\u4f53<a class=\"anchor\" href=\"#11-%e5%86%85%e6%a0%b8%e9%93%be%e8%a1%a8%e7%bb%93%e6%9e%84%e4%bd%93\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> list_head { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> list_head <span style=\"color:#f92672\">*<\/span>next, <span style=\"color:#f92672\">*<\/span>prev; \n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/352be0a8b8becef319ca147f1f5785a7_MD5.webp\" alt=\"img\" \/>\n\u8fd9\u91cc\u628a\u5185\u6838\u7ecf\u5178\u7684<code>container_of<\/code>\u548c<code>offsetof<\/code>\u5b9e\u73b0\u4e5f\u8d34\u8fdb\u6765\u4e86\u3002\u5b9e\u9645\u4e0a\u4e00\u822c\u4f7f\u7528<code>container_of<\/code>\uff0c\u9700\u8981\u5305\u542b<code>include\\linux\\kernel.h<\/code>\u5934\u6587\u4ef6\u3002<\/p>\n<h2 id=\"12-list\u521d\u59cb\u5316\">1.2 list\u521d\u59cb\u5316<a class=\"anchor\" href=\"#12-list%e5%88%9d%e5%a7%8b%e5%8c%96\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"121-\u7528\u5b8f\u521d\u59cb\u5316-list_head\">1.2.1 \u7528\u5b8f\u521d\u59cb\u5316-LIST_HEAD<a class=\"anchor\" href=\"#121-%e7%94%a8%e5%ae%8f%e5%88%9d%e5%a7%8b%e5%8c%96-list_head\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define LIST_HEAD_INIT(name) { &amp;(name), &amp;(name) } \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define LIST_HEAD(name) \\ \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> list_head name <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">LIST_HEAD_INIT<\/span>(name)<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/a9283e9d49d718986625ab822d19b007_MD5.webp\" alt=\"img\" \/>\n<code>LIST_HEAD<\/code>\u00a0\u5b9a\u4e49\u4e00\u4e2a<code>list_head<\/code>\u53d8\u91cf, \u8ba9<code>next\uff0c\u548cprev<\/code>\uff0c\u4e5f\u5c31\u662f\u3010\u524d\u9a71\u3011\u548c\u3010\u540e\u7ee7\u3011\u6307\u9488\u90fd\u6307\u5411\u81ea\u5df1\uff0c\u4f5c\u4e3a\u94fe\u8868\u5934\u6307\u9488\u3002<\/p>\n<p>\u4f8b\u5982\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">LIST_HEAD<\/span>(list); <span style=\"color:#75715e\">\/\/ struct list_head list = {.next = list, .prev = list};\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"122-\u7528\u63a5\u53e3\u521d\u59cb\u5316-init_list_head\">1.2.2 \u7528\u63a5\u53e3\u521d\u59cb\u5316-INIT_LIST_HEAD<a class=\"anchor\" href=\"#122-%e7%94%a8%e6%8e%a5%e5%8f%a3%e5%88%9d%e5%a7%8b%e5%8c%96-init_list_head\" aria-label=\"Link\"><\/a><\/h3>\n<p><img src=\"assets\/c9de045a5e2d622613de890a2f5c8981_MD5.webp\" alt=\"img\" \/>\n<code>INIT_LIST_HEAD<\/code>\u51fd\u6570\u7528\u6765\u5bf9\u4e00\u4e2alist_head\u6307\u9488\u521d\u59cb\u5316\u3002<code>WRITE_ONCE<\/code>\u662f\u4e00\u79cd\u5185\u5b58\u5c4f\u969c\u673a\u5236\uff0c\u53ea\u5199\u5165\u4e00\u6b21\uff0c \u9632\u6b62\u5e76\u53d1\u4ea7\u751f\u7ade\u6001\u6761\u4ef6\u3002<\/p>\n<p>\u56e0\u6b64<code>INIT_LIST_HEAD<\/code>\u7b49\u6548\u4e8e\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">inline<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">INIT_LIST_HEAD<\/span>(<span style=\"color:#66d9ef\">struct<\/span> list_head <span style=\"color:#f92672\">*<\/span>list) { \n<\/span><\/span><span style=\"display:flex;\"><span> list<span style=\"color:#f92672\">-&gt;<\/span>next <span style=\"color:#f92672\">=<\/span> list; \n<\/span><\/span><span style=\"display:flex;\"><span> list<span style=\"color:#f92672\">-&gt;<\/span>prev <span style=\"color:#f92672\">=<\/span> list; \n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><p>\u4f8b\u5982\uff1a<\/p>"},{"title":"linux\u5185\u6838\u673a\u5236-7-\u5e76\u53d1\u4e0e\u540c\u6b65","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-7-%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%90%8C%E6%AD%A5\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-7-%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%90%8C%E6%AD%A5\/","description":"<h1 id=\"1-\u5e76\u53d1\u573a\u666f\">1 \u5e76\u53d1\u573a\u666f<a class=\"anchor\" href=\"#1-%e5%b9%b6%e5%8f%91%e5%9c%ba%e6%99%af\" aria-label=\"Link\"><\/a><\/h1>\n<p>Linux \u7cfb\u7edf\u5e76\u53d1\u4ea7\u751f\u7684\u539f\u56e0\u5f88\u590d\u6742\uff0c\u603b\u7ed3\u4e00\u4e0b\u6709\u4e0b\u9762\u51e0\u4e2a\u4e3b\u8981\u539f \u56e0\uff1a<\/p>\n<ol>\n<li>\u591a\u7ebf\u7a0b\u5e76\u53d1\u8bbf\u95ee\uff0cLinux \u662f\u591a\u4efb\u52a1(\u7ebf\u7a0b)\u7684\u7cfb\u7edf\uff0c\u6240\u4ee5\u591a\u7ebf\u7a0b\u8bbf\u95ee\u662f\u6700\u57fa\u672c\u7684\u539f\u56e0\u3002<\/li>\n<li>\u62a2\u5360\u5f0f\u5e76\u53d1\u8bbf\u95ee\uff0c\u4ece 2.6 \u7248\u672c\u5185\u6838\u5f00\u59cb\uff0cLinux \u5185\u6838\u652f\u6301\u62a2\u5360\uff0c\u4e5f\u5c31\u662f\u8bf4\u8c03\u5ea6\u7a0b\u5e8f\u53ef\u4ee5 \u5728\u4efb\u610f\u65f6\u523b\u62a2\u5360\u6b63\u5728\u8fd0\u884c\u7684\u7ebf\u7a0b\uff0c\u4ece\u800c\u8fd0\u884c\u5176\u4ed6\u7684\u7ebf\u7a0b\u3002<\/li>\n<li>\u4e2d\u65ad\u7a0b\u5e8f\u5e76\u53d1\u8bbf\u95ee\uff0c\u8fd9\u4e2a\u65e0\u9700\u591a\u8bf4\uff0c\u5b66\u8fc7 STM32 \u7684\u540c\u5b66\u5e94\u8be5\u77e5\u9053\uff0c\u786c\u4ef6\u4e2d\u65ad\u7684\u6743\u5229\u662f\u5f88\u5927\u7684\u3002<\/li>\n<li>SMP(\u591a\u6838)\u6838\u95f4\u5e76\u53d1\u8bbf\u95ee\uff0c\u73b0\u5728 ARM \u67b6\u6784\u7684\u591a\u6838 SOC \u5f88\u5e38\u89c1\uff0c\u591a\u6838 CPU \u5b58\u5728\u6838\u95f4\u5e76\u53d1\u8bbf\u95ee\u3002<\/li>\n<\/ol>\n<h1 id=\"2-\u5e76\u53d1\u89e3\u51b3\u65b9\u6848\">2 \u5e76\u53d1\u89e3\u51b3\u65b9\u6848<a class=\"anchor\" href=\"#2-%e5%b9%b6%e5%8f%91%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"21-\u5185\u5b58\u5c4f\u969c\">2.1 \u5185\u5b58\u5c4f\u969c<a class=\"anchor\" href=\"#21-%e5%86%85%e5%ad%98%e5%b1%8f%e9%9a%9c\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"211-\u7f16\u8bd1\u5668\u6307\u4ee4\u91cd\u6392compiler-instruction-reordering\">2.1.1 \u7f16\u8bd1\u5668\u6307\u4ee4\u91cd\u6392\uff08Compiler Instruction Reordering)<a class=\"anchor\" href=\"#211-%e7%bc%96%e8%af%91%e5%99%a8%e6%8c%87%e4%bb%a4%e9%87%8d%e6%8e%92compiler-instruction-reordering\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> a, b; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">foo<\/span>(<span style=\"color:#66d9ef\">void<\/span>){ \n<\/span><\/span><span style=\"display:flex;\"><span> a <span style=\"color:#f92672\">=<\/span> b <span style=\"color:#f92672\">+<\/span> <span style=\"color:#ae81ff\">1<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span> b <span style=\"color:#f92672\">=<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">&lt;<\/span>foo<span style=\"color:#f92672\">&gt;:<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> ... \n<\/span><\/span><span style=\"display:flex;\"><span> ldr w0, [x0] <span style=\"color:#75715e\">\/\/load b to w0 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> add w1, w0, <span style=\"color:#960050;background-color:#1e0010\">#<\/span><span style=\"color:#ae81ff\">0x1<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> ... \n<\/span><\/span><span style=\"display:flex;\"><span> str w1, [x0] <span style=\"color:#75715e\">\/\/a = b + 1 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> ... \n<\/span><\/span><span style=\"display:flex;\"><span> str wzr, [x0] <span style=\"color:#75715e\">\/\/b = 0\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>\u6211\u4eec\u628a\u7f16\u8bd1\u4f18\u5316\u6253\u5f00\u5230-O2\uff0c\u518d\u6b21\u53cd\u6c47\u7f16\uff1a<\/p>"},{"title":"Linux\u5185\u6838\u673a\u5236-8-\u5185\u5b58\u7ba1\u7406","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-8-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/linux%E5%86%85%E6%A0%B8%E6%9C%BA%E5%88%B6-8-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86\/","description":"<h1 id=\"1-kmallocvmalloc\u533a\u522b\">1 kmalloc\/vmalloc\u533a\u522b<a class=\"anchor\" href=\"#1-kmallocvmalloc%e5%8c%ba%e5%88%ab\" aria-label=\"Link\"><\/a><\/h1>\n<table>\n\t<thead>\n\t\t\t<tr>\n\t\t\t\t\t<th>\u51fd\u6570<\/th>\n\t\t\t\t\t<th>\u4f4d\u7f6e<\/th>\n\t\t\t\t\t<th>\u7279\u6027<\/th>\n\t\t\t\t\t<th>\u5927\u5c0f\u9650\u5236<\/th>\n\t\t\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t\t\t<tr>\n\t\t\t\t\t<td>kmalloc<\/td>\n\t\t\t\t\t<td>\u7269\u7406\u5185\u5b58\u6620\u5c04\u533a\u57df<\/td>\n\t\t\t\t\t<td>\u7269\u7406\u5730\u5740\u865a\u62df\u5730\u5740\u5747\u8fde\u7eed<\/td>\n\t\t\t\t\t<td>\u4e0d\u80fd\u8d85\u8fc7128K<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>kzalloc<\/td>\n\t\t\t\t\t<td>\u7269\u7406\u5185\u5b58\u6620\u5c04\u533a\u57df<\/td>\n\t\t\t\t\t<td>\u7269\u7406\u5730\u5740\u865a\u62df\u5730\u5740\u5747\u8fde\u7eed<\/td>\n\t\t\t\t\t<td>\u4e0d\u80fd\u8d85\u8fc7128K<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>vmalloc<\/td>\n\t\t\t\t\t<td>\u865a\u62df\u5185\u5b58\u6620\u5c04\u533a\u57df<\/td>\n\t\t\t\t\t<td>\u865a\u62df\u5730\u5740\u8fde\u7eed\uff0c\u7269\u7406\u5730\u5740\u4e0d\u4e00\u5b9a\u8fde\u7eed<\/td>\n\t\t\t\t\t<td>\u65e0\u9650\u5236<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>vzalloc<\/td>\n\t\t\t\t\t<td>\u865a\u62df\u5185\u5b58\u6620\u5c04\u533a\u57df<\/td>\n\t\t\t\t\t<td>\u865a\u62df\u5730\u5740\u8fde\u7eed\uff0c\u7269\u7406\u5730\u5740\u4e0d\u4e00\u5b9a\u8fde\u7eed<\/td>\n\t\t\t\t\t<td>\u65e0\u9650\u5236<\/td>\n\t\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<p>kzalloc\u53ea\u662f\u76f8\u5f53\u4e8e\u9644\u52a0\u4e86\u00a0<strong>__GFP_ZERO<\/strong>\u00a0\u6807\u5fd7\u3002\u6240\u4ee5\u5b83\u9664\u4e86\u7533\u8bf7\u5185\u6838\u5185\u5b58\u5916\uff0c\u8fd8\u4f1a\u5bf9\u7533\u8bf7\u5230\u7684\u5185\u5b58\u5185\u5bb9\u6e05\u96f6\u3002<br>\n\u540c\u7406\uff0cvzalloc\u4e5f\u662f\u4e00\u6837\uff0c\u4f1a\u5bf9\u7533\u8bf7\u5185\u5b58\u5185\u5bb9\u6e05\u96f6\u3002<br>\n<img src=\"assets\/a7ed775befeda839e9ca6d90c7a76d69_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"11-kmalloc\u51fd\u6570\u539f\u578b\">1.1 kmalloc\u51fd\u6570\u539f\u578b\uff1a<a class=\"anchor\" href=\"#11-kmalloc%e5%87%bd%e6%95%b0%e5%8e%9f%e5%9e%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/f6963ea85e7c8a1bf433fc6e9da76742_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> __always_inline <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span><span style=\"color:#a6e22e\">kmalloc<\/span>(<span style=\"color:#66d9ef\">size_t<\/span> size, <span style=\"color:#66d9ef\">gfp_t<\/span> flags)<span style=\"color:#960050;background-color:#1e0010\">\uff1b<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"111-gpf-flags\u542b\u4e49\">1.1.1 gpf flags\u542b\u4e49<a class=\"anchor\" href=\"#111-gpf-flags%e5%90%ab%e4%b9%89\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u5728\u8fdb\u7a0b\u4e0a\u4e0b\u6587\uff0c\u53ef\u4ee5\u7761\u7720<\/span>\u3000\u3000\u3000\u3000\u3000GFP_KERNEL \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u5728\u8fdb\u7a0b\u4e0a\u4e0b\u6587\uff0c\u4e0d\u53ef\u4ee5\u7761\u7720\uff0c\u5982\uff1a<\/span> GFP_ATOMIC \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">|<\/span>\u3000\u3000<span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f<\/span>\u3000\u3000\u3000\u3000\u3000\u3000\u3000GFP_ATOMIC \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">|<\/span>\u3000\u3000<span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u8f6f\u4e2d\u65ad<\/span>\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000GFP_ATOMIC \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">|<\/span>\u3000\u3000<span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> Tasklet\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000GFP_ATOMIC \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u7528\u4e8e<\/span>DMA\u7684\u5185\u5b58<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u53ef\u4ee5\u7761\u7720<\/span>\u3000\u3000\u3000GFP_DMA <span style=\"color:#f92672\">|<\/span> GFP_KERNEL \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#f92672\">|<\/span><span style=\"color:#960050;background-color:#1e0010\">\u2013<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u7528\u4e8e<\/span>DMA\u7684\u5185\u5b58<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u4e0d\u53ef\u4ee5\u7761\u7720<\/span>\u3000\u3000GFP_DMA <span style=\"color:#f92672\">|<\/span>GFP_ATOMIC<\/span><\/span><\/code><\/pre><\/div><p>\u5982\u679c\u8fdb\u7a0b\u4e0a\u4e0b\u6587\u5141\u8bb8\u7761\u7720\u60c5\u51b5\u4e0b\u5c3d\u91cf\u7528<code>GFP_KERNEL<\/code>\uff0c \u5982\u679c\u8fdb\u7a0b\u4e0a\u4e0b\u6587\u7981\u6b62\u4f11\u7720\u7684\u8bdd\uff08\u5982\u4e2d\u65ad\uff0ctaskletd\u7b49\uff09\u5fc5\u987b\u7528<code>GFP_ATOMIC<\/code><\/p>\n<h2 id=\"12-vmalloc\u51fd\u6570\u539f\u578b\">1.2 vmalloc\u51fd\u6570\u539f\u578b\uff1a<a class=\"anchor\" href=\"#12-vmalloc%e5%87%bd%e6%95%b0%e5%8e%9f%e5%9e%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/920009835e781473a3a072b8bf625e27_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">extern<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span><span style=\"color:#a6e22e\">vmalloc<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> size);<\/span><\/span><\/code><\/pre><\/div><p>\u6ce8\u610f\uff1avmalloc\u548cvfree\u53ef\u4ee5\u7761\u7720\uff0c\u56e0\u6b64\u4e2d\u65ad\u4e0a\u4e0b\u6587\u7981\u6b62\u4f7f\u7528\u3002<\/p>\n<h2 id=\"13-\u5185\u5b58\u91ca\u653e\">1.3 \u5185\u5b58\u91ca\u653e<a class=\"anchor\" href=\"#13-%e5%86%85%e5%ad%98%e9%87%8a%e6%94%be\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">kfree<\/span>(<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">extern<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">vfree<\/span>(<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>addr);<\/span><\/span><\/code><\/pre><\/div><h1 id=\"2-kmallocvmalloc\u5185\u5b58\u5206\u914d\u539f\u7406\">2 kmalloc\/vmalloc\u5185\u5b58\u5206\u914d\u539f\u7406<a class=\"anchor\" href=\"#2-kmallocvmalloc%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e5%8e%9f%e7%90%86\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u53c2\u8003<a href=\"..\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/11-1.%20linux%E5%86%85%E6%A0%B8%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86\/\">11-1. linux\u5185\u6838\u5185\u5b58\u7ba1\u7406<\/a><\/p>"},{"title":"misc\u6742\u9879\u8bbe\u5907\u9a71\u52a8","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/misc%E6%9D%82%E9%A1%B9%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/misc%E6%9D%82%E9%A1%B9%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8\/","description":"<h1 id=\"1-\u5f15\u5165misc-device\">1 \u5f15\u5165misc device<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5misc-device\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"11-\u4f20\u7edfcdev\u65b9\u5f0f\">1.1 \u4f20\u7edfcdev\u65b9\u5f0f<a class=\"anchor\" href=\"#11-%e4%bc%a0%e7%bb%9fcdev%e6%96%b9%e5%bc%8f\" aria-label=\"Link\"><\/a><\/h2>\n<p>char_drv.c<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/module.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/kernel.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/types.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/fs.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/init.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/delay.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;asm\/uaccess.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;asm\/irq.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;asm\/io.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/cdev.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#include<\/span> <span style=\"color:#75715e\">&lt;linux\/device.h&gt; <\/span><span style=\"color:#75715e\">\n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">int<\/span> led_major; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> cdev cdev; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">led_drv_open<\/span>(<span style=\"color:#66d9ef\">struct<\/span> inode <span style=\"color:#f92672\">*<\/span>inode, <span style=\"color:#66d9ef\">struct<\/span> file <span style=\"color:#f92672\">*<\/span>file) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">ssize_t<\/span> <span style=\"color:#a6e22e\">led_drv_write<\/span>(<span style=\"color:#66d9ef\">struct<\/span> file <span style=\"color:#f92672\">*<\/span>file, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> __user <span style=\"color:#f92672\">*<\/span>buf, <span style=\"color:#66d9ef\">size_t<\/span> count, <span style=\"color:#66d9ef\">loff_t<\/span> <span style=\"color:#f92672\">*<\/span> ppos) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">struct<\/span> file_operations led_drv_fops <span style=\"color:#f92672\">=<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span> .owner <span style=\"color:#f92672\">=<\/span> THIS_MODULE, \n<\/span><\/span><span style=\"display:flex;\"><span> .open <span style=\"color:#f92672\">=<\/span> led_drv_open, \n<\/span><\/span><span style=\"display:flex;\"><span> .write\t<span style=\"color:#f92672\">=<\/span>\tled_drv_write, \n<\/span><\/span><span style=\"display:flex;\"><span>}; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">led_setup_cdev<\/span>(<span style=\"color:#66d9ef\">void<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> err, devno <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">MKDEV<\/span>(led_major, <span style=\"color:#ae81ff\">0<\/span>);<span style=\"color:#75715e\">\/\/index \u4e3a\u4ece\u8bbe\u5907\u53f7 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">cdev_init<\/span>(<span style=\"color:#f92672\">&amp;<\/span>cdev, <span style=\"color:#f92672\">&amp;<\/span>led_drv_fops); \n<\/span><\/span><span style=\"display:flex;\"><span> cdev.owner <span style=\"color:#f92672\">=<\/span> THIS_MODULE; \n<\/span><\/span><span style=\"display:flex;\"><span> cdev.ops <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">&amp;<\/span>led_drv_fops; \n<\/span><\/span><span style=\"display:flex;\"><span> err <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">cdev_add<\/span>(<span style=\"color:#f92672\">&amp;<\/span>cdev, devno, <span style=\"color:#ae81ff\">1<\/span>);<span style=\"color:#75715e\">\/\/devno \u4e3a\u7b2c\u4e00\u4e2a\u8bbe\u5907\u53f7\uff0c1\u4e3a\u6570\u91cf \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">if<\/span> (err) \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span>(KERN_NOTICE <span style=\"color:#e6db74\">&#34;Error %d adding&#34;<\/span>, err); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">led_drv_init<\/span>(<span style=\"color:#66d9ef\">void<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> result; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">dev_t<\/span> devno; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> class <span style=\"color:#f92672\">*<\/span>led_class; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev; \n<\/span><\/span><span style=\"display:flex;\"><span> devno<span style=\"color:#f92672\">=<\/span><span style=\"color:#a6e22e\">MKDEV<\/span>(led_major,<span style=\"color:#ae81ff\">0<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">if<\/span>(led_major)<span style=\"color:#75715e\">\/\/\u9759\u6001\u7533\u8bf7\u8bbe\u5907\u53f7 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> result<span style=\"color:#f92672\">=<\/span><span style=\"color:#a6e22e\">register_chrdev_region<\/span>(devno,<span style=\"color:#ae81ff\">1<\/span>,<span style=\"color:#e6db74\">&#34;led1_dev&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">else<\/span>{ \n<\/span><\/span><span style=\"display:flex;\"><span> result <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">alloc_chrdev_region<\/span>(<span style=\"color:#f92672\">&amp;<\/span>devno,<span style=\"color:#ae81ff\">0<\/span>,<span style=\"color:#ae81ff\">1<\/span>,<span style=\"color:#e6db74\">&#34;led1_dev&#34;<\/span>);<span style=\"color:#75715e\">\/\/\u52a8\u6001\u7533\u8bf7\u8bbe\u5907\u53f7 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> led_major <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">MAJOR<\/span>(devno); \n<\/span><\/span><span style=\"display:flex;\"><span> } \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">if<\/span>(result<span style=\"color:#f92672\">&lt;<\/span><span style=\"color:#ae81ff\">0<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">printk<\/span> (KERN_WARNING <span style=\"color:#e6db74\">&#34;hello: can&#39;t get major number %d<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, led_major); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> result; \n<\/span><\/span><span style=\"display:flex;\"><span> } \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">led_setup_cdev<\/span>(); \n<\/span><\/span><span style=\"display:flex;\"><span> led_class <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">class_create<\/span>(THIS_MODULE, <span style=\"color:#e6db74\">&#34;led_class&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\tdev <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">device_create<\/span>(led_class, NULL, devno, NULL, <span style=\"color:#e6db74\">&#34;%s&#34;<\/span>, <span style=\"color:#e6db74\">&#34;led_dev&#34;<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">if<\/span> (<span style=\"color:#a6e22e\">IS_ERR<\/span>(dev)) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#a6e22e\">dev_err<\/span>(dev, <span style=\"color:#e6db74\">&#34;device create failed error code(%ld)<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, <span style=\"color:#a6e22e\">PTR_ERR<\/span>(dev)); \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#a6e22e\">PTR_ERR<\/span>(dev); \n<\/span><\/span><span style=\"display:flex;\"><span>\t} \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#ae81ff\">0<\/span>; \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">led_drv_exit<\/span>(<span style=\"color:#66d9ef\">void<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">device_destroy<\/span>(led_class, dev); <span style=\"color:#75715e\">\/* remove the device *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">class_destroy<\/span>(led_class); <span style=\"color:#75715e\">\/* remove the device class *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">cdev_del<\/span>(<span style=\"color:#f92672\">&amp;<\/span>cdev); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#a6e22e\">unregister_chrdev_region<\/span>(<span style=\"color:#a6e22e\">MKDEV<\/span>(led_major,<span style=\"color:#ae81ff\">0<\/span>),<span style=\"color:#ae81ff\">1<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">module_init<\/span>(led_drv_init); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">module_exit<\/span>(led_drv_exit); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">MODULE_LICENSE<\/span>(<span style=\"color:#e6db74\">&#34;GPL&#34;<\/span>);<\/span><\/span><\/code><\/pre><\/div><p>\u603b\u7ed3\u6d41\u7a0b\uff1a<\/p>"},{"title":"pinctrl\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/pinctrl%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/pinctrl%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-pinctrl\u548cgpio-\u5b50\u7cfb\u7edf\u7b80\u4ecb\">1 pinctrl\u548cgpio \u5b50\u7cfb\u7edf\u7b80\u4ecb<a class=\"anchor\" href=\"#1-pinctrl%e5%92%8cgpio-%e5%ad%90%e7%b3%bb%e7%bb%9f%e7%ae%80%e4%bb%8b\" aria-label=\"Link\"><\/a><\/h1>\n<p>Linux \u9a71\u52a8\u8bb2\u7a76\u9a71\u52a8\u5206\u79bb\u4e0e\u5206\u5c42\uff0cpinctrl \u548c gpio \u5b50\u7cfb\u7edf\u5c31\u662f\u9a71\u52a8\u5206\u79bb\u4e0e\u5206\u5c42\u601d\u60f3\u4e0b\u7684\u4ea7\u7269\u3002<br>\npinctrl\u5b50\u7cfb\u7edf\u7528\u6765\u914d\u7f6e\u5f15\u811amux\u590d\u7528\u4fe1\u606f\uff0c\u5f15\u811a\u7535\u5668\u5c5e\u6027\uff08\u6bd4\u5982\u4e0a\/\u4e0b\u62c9\u3001\u901f\u5ea6\u3001\u9a71\u52a8\u80fd\u529b\u7b49\uff09\u4fe1\u606f\u3002<br>\ngpio\u5b50\u7cfb\u7edf\u63a7\u5236gpio\u7684\u8f93\u5165\u8f93\u51fa\uff0c\u4ee5\u53ca\u9ad8\u4f4e\u7535\u5e73\u3002\u4e0d\u8fc7\uff0c\u5927\u591a\u6570\u7684\u82af\u7247\u5e76\u6ca1\u6709\u5355\u72ec\u7684IOMUX\u6a21\u5757\uff0c\u5f15\u811a\u7684\u590d\u7528\u3001\u914d\u7f6e\u7b49\uff0c\u800c\u662f\u5728GPIO\u6a21\u5757\u5185\u90e8\u5b9e\u73b0\u7684\u3002<br>\n<img src=\"assets\/2af034c81de6ddb1614511699657bd89_MD5.webp\" alt=\"img\" \/><\/p>\n<h1 id=\"2-pinctrl\u5b50\u7cfb\u7edf\u539f\u7406\u4ecb\u7ecd\">2 pinctrl\u5b50\u7cfb\u7edf\u539f\u7406\u4ecb\u7ecd<a class=\"anchor\" href=\"#2-pinctrl%e5%ad%90%e7%b3%bb%e7%bb%9f%e5%8e%9f%e7%90%86%e4%bb%8b%e7%bb%8d\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"21-pinctrl\u5b50\u7cfb\u7edf\">2.1 pinctrl\u5b50\u7cfb\u7edf<a class=\"anchor\" href=\"#21-pinctrl%e5%ad%90%e7%b3%bb%e7%bb%9f\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"211-pinctrl\u5b50\u7cfb\u7edf\u8f6f\u4ef6\u67b6\u6784\">2.1.1 pinctrl\u5b50\u7cfb\u7edf\u8f6f\u4ef6\u67b6\u6784<a class=\"anchor\" href=\"#211-pinctrl%e5%ad%90%e7%b3%bb%e7%bb%9f%e8%bd%af%e4%bb%b6%e6%9e%b6%e6%9e%84\" aria-label=\"Link\"><\/a><\/h3>\n<p>pinctrl\u5b50\u7cfb\u7edf\u6e90\u7801\u8def\u5f84\u662f<code>linux\/drivers\/pinctrl<\/code>\uff1a<br>\n<img src=\"assets\/86e8664dcf9ec6daaf94f6198c4d64be_MD5.webp\" alt=\"img\" \/>\n<img src=\"assets\/06b0d81bcfe0fbadb8efb53c178efb06_MD5.webp\" alt=\"img\" \/><\/p>\n<ul>\n<li>\u5176\u4ed6\u9a71\u52a8\u5c42\uff08client\uff09\uff1a\u4f7f\u7528\u7cfb\u7edfpin\u8d44\u6e90\u7684\u8bbe\u5907\u9a71\u52a8\u7a0b\u5e8f<\/li>\n<li>pinctrl\u6838\u5fc3\u5c42(core)\uff1a\u5185\u6838\u62bd\u8c61\u51fa\u6765\uff0c\u5411\u4e0b\u4e3aSoC pin controler drvier\u63d0\u4f9b\u5e95\u5c42\u901a\u4fe1\u63a5\u53e3\u7684\u80fd\u529b\uff0c\u5411\u4e0a\u4e3a\u5176\u4ed6\u9a71\u52a8\u63d0\u4f9b\u4e86\u63a7\u5236pin\u7684\u80fd\u529b\uff0c\u6bd4\u5982pin\u590d\u7528\u3001\u914d\u7f6e\u5f15\u811a\u7684\u7535\u6c14\u7279\u6027\uff0c\u540c\u65f6\u4e5f\u4e3aGPIO\u5b50\u7cfb\u7edf\u63d0\u4f9bpin\u64cd\u4f5c\u3002<\/li>\n<li>pin\u63a7\u5236\u5668\u9a71\u52a8\u5c42(pinctrl-driver)\uff1a \u63d0\u4f9b\u4e86\u64cd\u4f5cpin\u7684\u5177\u4f53\u65b9\u6cd5\u3002<\/li>\n<\/ul>\n<p><code>pinctrl-driver<\/code>\u4e3b\u8981\u4e3a<code>pinctrl-core<\/code>\u63d0\u4f9bpin\u7684\u64cd\u4f5c\u80fd\u529b\u3002\u628a\u7cfb\u7edf\u6240\u6709\u7684pin\u4ee5\u53ca\u5bf9\u4e8epin\u7684\u63a7\u5236\u63a5\u53e3\u5b9e\u4f8b\u5316\u6210<code>pinctrl_desc<\/code>\uff0c\u5e76\u5c06<code>pinctrl_desc<\/code>\u6ce8\u518c\u5230<code>pinctrl-core<\/code>\u4e2d\u53bb\u3002<\/p>\n<h3 id=\"212-pinctrl\u91cd\u8981\u6982\u5ff5\">2.1.2 Pinctrl\u91cd\u8981\u6982\u5ff5<a class=\"anchor\" href=\"#212-pinctrl%e9%87%8d%e8%a6%81%e6%a6%82%e5%bf%b5\" aria-label=\"Link\"><\/a><\/h3>\n<p><code>Documentation\\devicetree\\bindings\\pinctrl\\pinctrl-bindings.txt<\/code>\u6709\u4ecb\u7ecd\u91cd\u8981\u76f8\u5173\u6982\u5ff5\uff1a<\/p>\n<p><strong>1. client device\uff1a<\/strong><br>\n\u201c\u5ba2\u6237\u8bbe\u5907\u201d\u5373\u4f7f\u7528Pinctrl\u7cfb\u7edf\u7684\u8bbe\u5907\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* For a client device requiring named states *\/<\/span>\n<\/span><\/span><span style=\"display:flex;\"><span>device {\n<\/span><\/span><span style=\"display:flex;\"><span>\tpinctrl<span style=\"color:#f92672\">-<\/span>names <span style=\"color:#f92672\">=<\/span> <span style=\"color:#e6db74\">&#34;default&#34;<\/span>, <span style=\"color:#e6db74\">&#34;sleep&#34;<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span>\tpinctrl<span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">&lt;&amp;<\/span>state_0_node_a<span style=\"color:#f92672\">&gt;<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span>\tpinctrl<span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#f92672\">=<\/span> <span style=\"color:#f92672\">&lt;&amp;<\/span>state_1_node_a<span style=\"color:#f92672\">&gt;<\/span>, <span style=\"color:#f92672\">&lt;&amp;<\/span>state_1_node_b<span style=\"color:#f92672\">&gt;<\/span>;\n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><ul>\n<li>\n<p><strong>pin state<\/strong><br>\n\u5bf9\u4e8e\u4e00\u4e2a<code>&quot;client device&quot;<\/code>\uff0c\u5b83\u6709\u591a\u4e2a<code>\u201c\u72b6\u6001\u201d<\/code>\uff1a<code>default\u3001sleep<\/code>\u7b49\u3002\n\u6bd4\u5982\uff0c\u9ed8\u8ba4\u72b6\u6001\u4e0b\uff0cUART\u8bbe\u5907\u6b63\u5e38\u5de5\u4f5c\uff0c\u90a3\u4e48\u6240\u7528\u7684\u5f15\u811a\u5c31\u8981\u590d\u7528\u4e3aUART\u529f\u80fd\uff1b<br>\n\u4f11\u7720\u72b6\u6001\u4e0b\uff0c\u4e3a\u4e86\u7701\u7535\uff0c\u53ef\u4ee5\u628a\u8fd9\u4e9b\u5f15\u811a\u590d\u7528\u4e3aGPIO\u529f\u80fd\uff1b\u6216\u8005\u76f4\u63a5\u628a\u5b83\u4eec\u914d\u7f6e\u8f93\u51fa\u9ad8\u7535\u5e73\u3002<\/p>\n<p>\u4e0a\u56fe<code>pinctrl-names<\/code>\u5b9a\u4e492\u79cd\u72b6\u6001\uff1a<code>default\uff0csleep<\/code>\u3002<br>\n<code>default<\/code>\u72b6\u6001\u5728<code>pinctrl-0<\/code>\u4e2d\u5b9a\u4e49\uff0c\u5f15\u7528\u4e86\u4f4d\u4e8e<code>pincontroller<\/code>\u8282\u70b9\u4e2d\u7684\u8282\u70b9<code>state_0_node_a<\/code>\u3002<br>\n<code>sleep<\/code>\u72b6\u6001\u5728<code>Pinctrl-1<\/code>\u4e2d\u5b9a\u4e49\uff0c\u5f15\u7528\u4e86\u4f4d\u4e8e<code>pincontroller<\/code>\u8282\u70b9\u4e2d\u7684\u8282\u70b9<code>state_1_node_a<\/code>\u548c<code>state_1_node_b<\/code>\u3002<\/p>\n<\/li>\n<\/ul>\n<p><strong>2. pin controller\uff1a<\/strong><br>\n\u82af\u7247\u624b\u518c\u91cc\u627e\u4e0d\u5230\u00a0<code>pin controller<\/code>\uff0c\u5b83\u662f\u4e00\u4e2a\u8f6f\u4ef6\u4e0a\u7684\u6982\u5ff5\u3002\u5bf9\u5e94 IOMUX\uff0c\u7528\u6765\u590d\u7528\u5f15\u811a\uff0c\u914d\u7f6e\u5f15\u811a\u7535\u6c14\u7279\u6027(\u6bd4\u5982\u4e0a\u4e0b\u62c9\u7535\u963b\uff0c\u9891\u7387\u7b49)\u3002<\/p>"},{"title":"platform\u9a71\u52a8\u6a21\u578b","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/platform%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9E%8B\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/platform%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9E%8B\/","description":"<h1 id=\"1-\u603b\u7ebf\u8bbe\u5907\u9a71\u52a8\u6a21\u578b\">1 \u603b\u7ebf\/\u8bbe\u5907\/\u9a71\u52a8\u6a21\u578b<a class=\"anchor\" href=\"#1-%e6%80%bb%e7%ba%bf%e8%ae%be%e5%a4%87%e9%a9%b1%e5%8a%a8%e6%a8%a1%e5%9e%8b\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/2401d212639129f6b8b28978c01e3822_MD5.png\" alt=\"img\" \/>\n\u8bbe\u5907\u5b9a\u4e49<code>platform_device<\/code>\u7ed3\u6784\u4f53\uff0c\u6ce8\u518c\u8bbe\u5907\u8d44\u6e90<\/p>\n<p>\u9a71\u52a8\u5b9a\u4e49<code>platform_driver<\/code>\u7ed3\u6784\u4f53\uff0c\u5b9e\u73b0<code>probe, file_operations<\/code><\/p>\n<p>\u603b\u7ebf\u9a71\u52a8\u6a21\u578b\u4f18\u70b9\uff1a\n\u9a71\u52a8\u53ea\u662f\u4e00\u5957\u63a7\u5236\u9a71\u52a8\u6846\u67b6\uff0c\u57fa\u672c\u4e0d\u7528\u4fee\u6539\uff0c\u548c\u5355\u677f\u786c\u4ef6\u76f8\u5173\u7684\u90fd\u5728\u8bbe\u5907\u4ee3\u7801\u91cc\u9762\uff0c\u786c\u4ef6\u4fee\u6539\u53ea\u9700\u8981\u4fee\u6539\u8bbe\u5907\u8d44\u6e90\u76f8\u5173\u7684\u4ee3\u7801\uff0c\u4e0d\u7528\u5173\u5fc3\u5177\u4f53\u7684\u51fd\u6570\u5b9e\u73b0\u548c\u5bc4\u5b58\u5668\u63a7\u5236\u3002<\/p>\n<h2 id=\"11-\u603b\u7ebf\u5e73\u53f0\u8bbe\u5907\u5e73\u53f0\u9a71\u52a8\u63cf\u8ff0\">1.1 \u603b\u7ebf\/\u5e73\u53f0\u8bbe\u5907\/\u5e73\u53f0\u9a71\u52a8\u63cf\u8ff0<a class=\"anchor\" href=\"#11-%e6%80%bb%e7%ba%bf%e5%b9%b3%e5%8f%b0%e8%ae%be%e5%a4%87%e5%b9%b3%e5%8f%b0%e9%a9%b1%e5%8a%a8%e6%8f%8f%e8%bf%b0\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"111-struct-bus_type\">1.1.1 struct bus_type<a class=\"anchor\" href=\"#111-struct-bus_type\" aria-label=\"Link\"><\/a><\/h3>\n<p><img src=\"assets\/54ae815c1698e5ca7c5a05d880f54e56_MD5.png\" alt=\"img\" \/>\n\u6709\u4e00\u4e2a\u5f88\u5173\u952e\u7684\u51fd\u6570\uff0c<code>match<\/code>\u51fd\u6570\u3002\u5f53\u8bbe\u5907\u4e0e\u8bbe\u5907\u679a\u4e3e\u8fc7\u7a0b\u4e2dmatch\u51fd\u6570\u4f1a\u6309\u7167\u89c4\u5219\u8fdb\u884c\u5339\u914d,\u89c4\u5219\u89c1<code>1.3.1<\/code>\u3002<\/p>\n<h3 id=\"112-struct-platform_driver\">1.1.2 struct platform_driver<a class=\"anchor\" href=\"#112-struct-platform_driver\" aria-label=\"Link\"><\/a><\/h3>\n<p><img src=\"assets\/acf47e3e04e01b14f6e1b55d02e69fa1_MD5.png\" alt=\"img\" \/><\/p>\n<h3 id=\"113-struct-platform_device\">1.1.3 struct platform_device<a class=\"anchor\" href=\"#113-struct-platform_device\" aria-label=\"Link\"><\/a><\/h3>\n<p><img src=\"assets\/0516f3e2899695eb12ecaffa26df8bee_MD5.png\" alt=\"img\" \/><\/p>\n<h3 id=\"114-\u603b\u7ebf\u8bbe\u5907\u9a71\u52a8\u4e09\u8005\u5173\u7cfb\">1.1.4 \u603b\u7ebf\/\u8bbe\u5907\/\u9a71\u52a8\u4e09\u8005\u5173\u7cfb<a class=\"anchor\" href=\"#114-%e6%80%bb%e7%ba%bf%e8%ae%be%e5%a4%87%e9%a9%b1%e5%8a%a8%e4%b8%89%e8%80%85%e5%85%b3%e7%b3%bb\" aria-label=\"Link\"><\/a><\/h3>\n<ol>\n<li>\u7cfb\u7edf\u542f\u52a8\u540e\uff0c\u4f1a\u8c03\u7528<code>buses_init()<\/code>\u51fd\u6570\u521b\u5efa<code>\/sys\/bus<\/code>\u6587\u4ef6\u76ee\u5f55\u3002<\/li>\n<li>\u63a5\u4e0b\u6765\u5c31\u662f\u901a\u8fc7\u603b\u7ebf\u6ce8\u518c\u51fd\u6570<code>bus_register()<\/code>\u8fdb\u884c\u603b\u7ebf\u6ce8\u518c\uff0c\u6ce8\u518c\u5b8c\u6210\u540e\uff0c\u5728<code>\/sys\/bus<\/code>\u76ee\u5f55\u4e0b\u751f\u6210device\u6587\u4ef6\u5939\u548cdriver\u6587\u4ef6\u5939\u3002<\/li>\n<li>\u6700\u540e\u5206\u522b\u901a\u8fc7<code>device_register()<\/code>\u548c<code>driver_register()<\/code>\u51fd\u6570\u6ce8\u518c\u5bf9\u5e94\u7684\u8bbe\u5907\u548c\u9a71\u52a8\u3002<br>\n<img src=\"assets\/50837d56ce0ba2a8ddab23e075c872ff_MD5.png\" alt=\"img\" \/><\/li>\n<\/ol>\n<h2 id=\"12-platform_device\u7684\u6ce8\u518c\u8fc7\u7a0b\">1.2 platform_device\u7684\u6ce8\u518c\u8fc7\u7a0b<a class=\"anchor\" href=\"#12-platform_device%e7%9a%84%e6%b3%a8%e5%86%8c%e8%bf%87%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/9bbb78757e86f78be03f502b7ea67880_MD5.png\" alt=\"img\" \/>\n<img src=\"assets\/bcf17378ff1fc58335f882cd8fe2e6ac_MD5.png\" alt=\"img\" \/><\/p>\n<ol>\n<li>\u7cfb\u7edf\u521d\u59cb\u5316\u65f6\uff0c\u8c03\u7528<code>platform_add_devices<\/code>\u51fd\u6570\uff0c\u628a\u6240\u6709\u653e\u7f6e\u5728\u677f\u7ea7<code>platform_device<\/code>\u6570\u7ec4\u4e2d\u7684<code>platform_device<\/code>\u6ce8\u518c\u5230\u7cfb\u7edf\u4e2d\u53bb\u3002<\/li>\n<\/ol>\n<ul>\n<li>1.1 \u6b64\u51fd\u6570\u5faa\u73af\u8c03\u7528<code>platform_device_register<\/code>\u51fd\u6570\uff0c\u6765\u6ce8\u518c\u6bcf\u4e2a<code>platform_device<\/code>\u3002<\/li>\n<li>1.2 \u800c<code>platform_device_register<\/code>\u4e2d\u4f1a\u8c03\u7528<code>platform_device_add<\/code>\u51fd\u6570\u3002<\/li>\n<\/ul>\n<ol start=\"2\">\n<li><code>platform_device<\/code>\u5168\u90e8\u6ce8\u518c\u5230\u7cfb\u7edf\u4e4b\u540e\uff0c\u4fbf\u53ef\u4ee5\u901a\u8fc7<code>platform<\/code>\u7684\u64cd\u4f5c\u63a5\u53e3\uff0c\u6765\u83b7\u53d6<code>platform_device<\/code>\u4e2d\u7684resource\u8d44\u6e90\u3002<\/li>\n<\/ol>\n<ul>\n<li>2.1 \u6bd4\u5982\u5730\u5740\u3001\u4e2d\u65ad\u53f7\u7b49\uff0c\u4ee5\u8fdb\u884c<code>request_mem_region<\/code>\u3001<code>ioremap<\/code>\uff08\u5c06resource\u5206\u914d\u7684\u7269\u7406\u5730\u5740\u6620\u5c04\u5230kernel\u7684\u865a\u62df\u7a7a\u95f4\u6765\uff09\u548c<code>request_irq<\/code>\u64cd\u4f5c\u3002<\/li>\n<li>2.2\u00a0<code>platform<\/code>\u7684\u64cd\u4f5c\u63a5\u53e3\u5305\u62ec<code>platform_get_irq<\/code>\u3001<code>platform_get_irq_byname<\/code>\u3001<code>platform_get_resource<\/code>\u3001<code>platform_get_resource_byname<\/code>\u7b49\u3002<\/li>\n<\/ul>\n<h2 id=\"13-platform_driver\u7684\u6ce8\u518c\u8fc7\u7a0b\">1.3 platform_driver\u7684\u6ce8\u518c\u8fc7\u7a0b<a class=\"anchor\" href=\"#13-platform_driver%e7%9a%84%e6%b3%a8%e5%86%8c%e8%bf%87%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5f53<code>insmod<\/code>\u8bbe\u5907\u9a71\u52a8\u7684\u65f6\u5019\u4f1a\u900f\u8fc7<code>module_init<\/code>\u8c03\u7528, \u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">platform_driver_register<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">driver_register<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span>\t\tbus_add_driver<span style=\"color:#75715e\">\/\/\u52a0\u5165driver\u94fe\u8868 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#a6e22e\">driver_attach<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t<span style=\"color:#a6e22e\">bus_for_each_dev<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t<span style=\"color:#a6e22e\">__driver_attach<\/span>() \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t\tdriver_match_device<span style=\"color:#75715e\">\/\/drvier\u5339\u914ddevice\u6210\u529f\u8c03\u7528driver\u7684probe \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t\t\tplatform_match \n<\/span><\/span><span style=\"display:flex;\"><span> \t\t\t\t\tdriver_probe_device<span style=\"color:#75715e\">\/\/drvier\u5339\u914ddevice\u6210\u529f\u8c03\u7528driver\u7684probe \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> \t\t\t\t\t\tdrv<span style=\"color:#f92672\">-&gt;<\/span><span style=\"color:#a6e22e\">probe<\/span>(dev);<\/span><\/span><\/code><\/pre><\/div><h3 id=\"131-device\u548cdriver\u7684\u5339\u914d\u8fc7\u7a0b\">1.3.1 device\u548cdriver\u7684\u5339\u914d\u8fc7\u7a0b<a class=\"anchor\" href=\"#131-device%e5%92%8cdriver%e7%9a%84%e5%8c%b9%e9%85%8d%e8%bf%87%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h3>\n<p><img src=\"assets\/9417e155aed246486ee06c34c93591b1_MD5.png\" alt=\"img\" \/><\/p>"},{"title":"PWM\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/pwm%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/pwm%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-pwm\u5b50\u7cfb\u7edf\u6846\u67b6\">1 pwm\u5b50\u7cfb\u7edf\u6846\u67b6<a class=\"anchor\" href=\"#1-pwm%e5%ad%90%e7%b3%bb%e7%bb%9f%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/ab0fb46382384f81a62865592e1c3cb5_MD5.webp\" alt=\"img\" \/>\n\u7528\u6237\u6001\uff1a\u57fa\u4e8esysfs\u64cd\u4f5cpwm<\/p>\n<p>\u5185\u6838\u6001\u5206\u4e3a\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>pwm core<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span>pwm_chip\u7684\u6dfb\u52a0\u5220\u9664<span style=\"color:#960050;background-color:#1e0010\">\uff0c<\/span>pwm_class\u7c7bpwm_chip<span style=\"color:#f92672\">\/<\/span>pwm_device\u7684sysfs\u521b\u5efa<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>pwm driver<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span>pwm_chip\u5bf9\u8c61\u5b9e\u4f8b<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u6ce8\u518c\u6dfb\u52a0\u5230<\/span>pwm core<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tpwm_chip\u53ef\u4ee5\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2apwm_device<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u6bcf\u4e2a<\/span>pwm_device\u901a\u8fc7\u8bbe\u7f6e\u4e0d\u540cpwm_state\u6765\u8fbe\u5230\u76ee\u7684<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span><\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-\u6e90\u7801\u7ed3\u6784\">1.1 \u6e90\u7801\u7ed3\u6784<a class=\"anchor\" href=\"#11-%e6%ba%90%e7%a0%81%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>drivers<span style=\"color:#f92672\">\/<\/span>pwm<span style=\"color:#f92672\">\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\tcore.c <span style=\"color:#75715e\">\/\/pwm\u5b50\u7cfb\u7edf\u6838\u5fc3\u3002 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\tsysfs.c<span style=\"color:#75715e\">\/\/pwm\u5b50\u7cfb\u7edf\u7684pwm_class\u6ce8\u518c\uff0cpwm_chip\u5c5e\u6027\uff0cpwm_device\u5c5e\u6027\u7b49\u5b9a\u4e49\u3002 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\tpwm<span style=\"color:#f92672\">-<\/span>imx.c<span style=\"color:#75715e\">\/\/imx\u7684pwm_chip\u9a71\u52a8\u3002\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/0081547dcbf45d50e9d7d3f3b445fa1f_MD5.webp\" alt=\"img\" \/>\n\u6211\u5df2\u7ecf\u7f16\u8bd1\u8fdb<code>vmlinux<\/code>\u4e86\uff0c\u53ef\u4ee5\u770b\u5230<code>built-in.o<\/code>\u3002<code>Makefile<\/code>\u5982\u4e0b\uff1a<\/p>\n<p><img src=\"assets\/c4afa12cfe24e59e610939f412043c65_MD5.webp\" alt=\"img\" \/>\n<code>Kconfig<\/code>\u5982\u4e0b\uff0c\u6211\u7684\u5185\u6838<code>.config<\/code>\u914d\u7f6e\u9009\u4e2d\u4e86<code>PWM\u548cPWM_IMX<\/code>\uff0c\u56e0\u6b64\u7f16\u8bd1\u8fdb\u4e86\u5185\u6838\u955c\u50cf\u3002<\/p>\n<p><img src=\"assets\/746183f50bcabbb9d8e5a87e113bef7b_MD5.webp\" alt=\"img\" \/>\n<img src=\"assets\/520585ca9581bbff7d2c9c088df94333_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"12-\u6570\u636e\u7ed3\u6784\">1.2 \u6570\u636e\u7ed3\u6784<a class=\"anchor\" href=\"#12-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"121pwm_chip\">1.2.1\u00a0<code>pwm_chip<\/code><a class=\"anchor\" href=\"#121pwm_chip\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u662f\u5bf9\u4e00\u4e2apwm\u63a7\u5236\u5668\u7684\u62bd\u8c61\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> pwm_chip { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> pwm_ops <span style=\"color:#f92672\">*<\/span>ops; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int<\/span> base; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> npwm;<span style=\"color:#75715e\">\/\/pwm\u63a7\u5236\u5668\u7684pwm\u6570\u91cf\u3002 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> pwm_device <span style=\"color:#f92672\">*<\/span> (<span style=\"color:#f92672\">*<\/span>of_xlate)(<span style=\"color:#66d9ef\">struct<\/span> pwm_chip <span style=\"color:#f92672\">*<\/span>pc, \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> of_phandle_args <span style=\"color:#f92672\">*<\/span>args); \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> of_pwm_n_cells; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#75715e\">\/* only used internally by the PWM framework *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> list_head list; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> pwm_device <span style=\"color:#f92672\">*<\/span>pwms; \n<\/span><\/span><span style=\"display:flex;\"><span>}; <span style=\"color:#75715e\">\/\/include\/linux\/pwm.h\n<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"122pwm_ops\">1.2.2\u00a0<code>pwm_ops<\/code><a class=\"anchor\" href=\"#122pwm_ops\" aria-label=\"Link\"><\/a><\/h3>\n<p>pwm\u63a7\u5236\u5668\u7684\u64cd\u4f5c\u63a5\u53e3\u3002<\/p>"},{"title":"regmap\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/regmap%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/regmap%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-regmap\u7684\u67b6\u6784\">1 regmap\u7684\u67b6\u6784<a class=\"anchor\" href=\"#1-regmap%e7%9a%84%e6%9e%b6%e6%9e%84\" aria-label=\"Link\"><\/a><\/h1>\n<p><code>regmap<\/code>\u662f\u4e3a\u4e86\u65b9\u4fbf\u64cd\u4f5c\u5bc4\u5b58\u5668\u800c\u8bbe\u8ba1\u7684\uff0c\u5b83\u5c06\u6240\u6709\u6a21\u5757\u7684\u5bc4\u5b58\u5668(\u5305\u62ecsoc\u4e0a\u6a21\u5757\u7684\u5bc4\u5b58\u5668\u548c\u5916\u56f4\u8bbe\u5907\u7684\u5bc4\u5b58\u5668\u7b49)<br>\n\u62bd\u8c61\u51fa\u6765\uff0c\u7528\u4e00\u5957\u7edf\u4e00\u63a5\u53e3\u6765\u64cd\u4f5c\u5bc4\u5b58\u5668\uff0c\u7edf\u4e00\u64cd\u4f5c\u00a0<code>i2c\u3001i3c\u3001spi\u3001mmio\u3001sccb\u3001sdw\u3001slimbus\u3001irq<\/code>\u7b49\u3002<\/p>\n<p><img src=\"assets\/4a964c7df84eadc885468fc5de10c1f4_MD5.webp\" alt=\"img\" \/>\n<img src=\"assets\/87c5e2015003dfc064f4fdece530cf2f_MD5.webp\" alt=\"img\" \/>\n<code>regmap<\/code>\u00a0\u6846\u67b6\u5206\u4e3a\u4e09\u5c42\uff1a<\/p>\n<p>\u2460\u3001\u5e95\u5c42\u7269\u7406\u603b\u7ebf\uff1a\u00a0<code>regmap<\/code>\u00a0\u652f\u6301\u7684\u7269\u7406\u603b\u7ebf\u6709\u00a0<code>i2c\u3001i3c\u3001spi\u3001mmio\u3001sccb\u3001sdw\u3001slimbus\u3001irq\u3001spmi \u548c w1<\/code>\u3002\n\u2461\u3001<code>regmap<\/code>\u00a0\u6838\u5fc3\u5c42\uff1a\u7528\u4e8e\u5b9e\u73b0\u00a0<code>regmap<\/code>\u6838\u5fc3\u3002\n\u2462\u3001<code>regmapAPI<\/code>\u00a0\u62bd\u8c61\u5c42\uff0c<code>regmap<\/code>\u00a0\u5411\u9a71\u52a8\u7f16\u5199\u4eba\u5458\u63d0\u4f9b\u7684 API \u63a5\u53e3\u3002<\/p>\n<h1 id=\"2-\u6570\u636e\u7ed3\u6784\">2 \u6570\u636e\u7ed3\u6784<a class=\"anchor\" href=\"#2-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"21-regmap-\u7ed3\u6784\u4f53\">2.1 regmap \u7ed3\u6784\u4f53<a class=\"anchor\" href=\"#21-regmap-%e7%bb%93%e6%9e%84%e4%bd%93\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> regmap { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">union<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">struct<\/span> mutex mutex; \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t<span style=\"color:#66d9ef\">struct<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#66d9ef\">spinlock_t<\/span> spinlock; \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> spinlock_flags; \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t}; \n<\/span><\/span><span style=\"display:flex;\"><span>\t}; \n<\/span><\/span><span style=\"display:flex;\"><span>\tregmap_lock lock; \n<\/span><\/span><span style=\"display:flex;\"><span>\tregmap_unlock unlock; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>lock_arg; <span style=\"color:#75715e\">\/* This is passed to lock\/unlock functions *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev; <span style=\"color:#75715e\">\/* Device we do I\/O on *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>work_buf; <span style=\"color:#75715e\">\/* Scratch buffer used to format I\/O *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> regmap_format format; <span style=\"color:#75715e\">\/* Buffer format *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> regmap_bus <span style=\"color:#f92672\">*<\/span>bus; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>bus_context; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> async; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">spinlock_t<\/span> async_lock; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">wait_queue_head_t<\/span> async_waitq; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> list_head async_list; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> list_head async_free; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> async_ret; \n<\/span><\/span><span style=\"display:flex;\"><span>\t... \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> max_register; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> (<span style=\"color:#f92672\">*<\/span>writeable_reg)(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> reg); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> (<span style=\"color:#f92672\">*<\/span>readable_reg)(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> reg); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> (<span style=\"color:#f92672\">*<\/span>volatile_reg)(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> reg); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">bool<\/span> (<span style=\"color:#f92672\">*<\/span>precious_reg)(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> reg); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> regmap_access_table <span style=\"color:#f92672\">*<\/span>wr_table; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> regmap_access_table <span style=\"color:#f92672\">*<\/span>rd_table; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> regmap_access_table <span style=\"color:#f92672\">*<\/span>volatile_table; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">struct<\/span> regmap_access_table <span style=\"color:#f92672\">*<\/span>precious_table; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>reg_read)(<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>context, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> reg, \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#f92672\">*<\/span>val); \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> (<span style=\"color:#f92672\">*<\/span>reg_write)(<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>context, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> reg, \n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> val); \n<\/span><\/span><span style=\"display:flex;\"><span>\t...... \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> rb_root range_tree; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>selector_work_buf; <span style=\"color:#75715e\">\/* Scratch buffer used for selector *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>}; <span style=\"color:#75715e\">\/\/ drivers\/base\/regmap\/internal.h\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><code>regmap<\/code>\u00a0\u7684\u521d\u59cb\u5316\u901a\u8fc7\u7ed3\u6784\u4f53\u00a0<code>regmap_config<\/code>\u6765\u5b8c\u6210\u3002<\/p>"},{"title":"rootfs\u6784\u5efa","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/rootfs%E6%9E%84%E5%BB%BA\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/rootfs%E6%9E%84%E5%BB%BA\/","description":"<h1 id=\"1-\u6839\u6587\u4ef6\u7cfb\u7edf\u7684\u5f15\u5165\">1 \u6839\u6587\u4ef6\u7cfb\u7edf\u7684\u5f15\u5165<a class=\"anchor\" href=\"#1-%e6%a0%b9%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e7%9a%84%e5%bc%95%e5%85%a5\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u6587\u4ef6\u7cfb\u7edf\u7c7b\u578b\u6709\u00a0<code>FATFS\u3001FAT\u3001EXT4\u3001YAFFS \u548c NTFS\uff0csquashfs<\/code>\u7b49\u3002\u6587\u4ef6\u7cfb\u7edf\u53ef\u4ee5\u8ba9\u7528\u6237\u901a\u8fc7\u6587\u4ef6IO\u7684\u5f62\u5f0f\u5bf9\u6587\u4ef6\u76ee\u5f55\u8fdb\u884c\u8bbf\u95ee\uff0c\u800c\u4e0d\u7528\u53bb\u8bbf\u95eeflash\u5b58\u50a8\u5730\u5740\uff0c\u5728\u4f7f\u7528\u4e0a\u66f4\u4e3a\u65b9\u4fbf\u8f7b\u677e\u3002<br>\n\u6839\u6587\u4ef6\u7cfb\u7edfrootfs, \u9996\u5148\u662f\u5185\u6838\u542f\u52a8\u65f6\u6240 mount(\u6302\u8f7d)\u7684\u7b2c\u4e00\u4e2a\u6587\u4ef6\u7cfb\u7edf\uff0c\u7cfb\u7edf\u5f15\u5bfc\u542f\u52a8\u7a0b\u5e8f\u4f1a\u5728\u6839\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d\u4e4b\u540e\u4ece\u4e2d\u628a\u4e00\u4e9b\u57fa\u672c\u7684\u521d\u59cb\u5316\u811a\u672c\u548c\u670d\u52a1\u7b49\u52a0\u8f7d\u5230\u5185\u5b58\u4e2d\u53bb\u8fd0\u884c\u3002<\/p>\n<p>\u5d4c\u5165\u5f0f\u6839\u6587\u4ef6\u7cfb\u7edf\u548c Linux \u5185\u6838\u662f\u5206\u5f00\u7684\uff0c\u5d4c\u5165\u5f0f Linux \u901a\u5e38\u5c06\u5185\u6838\u4ee3\u7801\u955c\u50cf\u4fdd\u5b58\u5728 NAND Flash \u7684\u6307\u5b9a\u5b58\u50a8\u5730\u5740\u3001EMMC \u4e13\u7528\u5206\u533a\u4e2d\u3002 \u5355\u72ec\u7684 Linux \u5185\u6838\u662f\u6ca1\u6cd5\u6b63\u5e38\u5de5\u4f5c\u7684\uff0c\u5fc5\u987b\u8981\u642d\u914d\u6839\u6587\u4ef6\u7cfb\u7edf\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\u6839\u6587\u4ef6\u7cfb\u7edf\uff0cLinux \u5185\u6838\u5728\u542f\u52a8\u7684\u65f6\u5019\u5c31\u4f1a\u63d0\u793a\u5185\u6838\u5d29\u6e83(Kernel panic)\uff1a<br>\n<img src=\"assets\/2b93029910d4a84070b7d99c7fc32ff5_MD5.webp\" alt=\"img\" \/><\/p>\n<h1 id=\"2-\u6839\u6587\u4ef6\u7cfb\u7edf\u7684\u7ec4\u6210\">2 \u6839\u6587\u4ef6\u7cfb\u7edf\u7684\u7ec4\u6210<a class=\"anchor\" href=\"#2-%e6%a0%b9%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e7%9a%84%e7%bb%84%e6%88%90\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/128ecd1597f720ec2d9e997fc99f6e2d_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"21-bin-\u76ee\u5f55\">2.1 \/bin \u76ee\u5f55<a class=\"anchor\" href=\"#21-bin-%e7%9b%ae%e5%bd%95\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5b58\u653e\u7740\u7cfb\u7edf\u9700\u8981\u7684\u53ef\u6267\u884c\u6587\u4ef6\uff0c\u4e00\u822c\u90fd\u662f\u4e00\u4e9b\u547d\u4ee4\uff0c\u6bd4\u5982<code>ls\u3001cp\u3001mv<\/code>\u7b49\u547d\u4ee4\u3002<br>\n<img src=\"assets\/1ba27c6b3e702632627d0e7e207224e1_MD5.webp\" alt=\"img\" \/><\/p>\n<h2 id=\"22-dev-\u76ee\u5f55\">2.2 \/dev \u76ee\u5f55<a class=\"anchor\" href=\"#22-dev-%e7%9b%ae%e5%bd%95\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u6b64\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u90fd\u662f\u8bbe\u5907\u8282\u70b9\u6587\u4ef6\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>ls <span style=\"color:#f92672\">-<\/span>l <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>crw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">89<\/span>, <span style=\"color:#ae81ff\">9<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>i2c<span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">9<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>crw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">10<\/span>, <span style=\"color:#ae81ff\">62<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>ion \n<\/span><\/span><span style=\"display:flex;\"><span>crw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">1<\/span>, <span style=\"color:#ae81ff\">11<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>kmsg \n<\/span><\/span><span style=\"display:flex;\"><span>srw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">-<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">0<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>log \n<\/span><\/span><span style=\"display:flex;\"><span>crw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">10<\/span>, <span style=\"color:#ae81ff\">237<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>loop<span style=\"color:#f92672\">-<\/span>control \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">7<\/span>, <span style=\"color:#ae81ff\">0<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>loop0 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">7<\/span>, <span style=\"color:#ae81ff\">1<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>loop1 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">0<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">8<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0boot0 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">16<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0boot1 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">1<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p1 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">2<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p2 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">3<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p3 \n<\/span><\/span><span style=\"display:flex;\"><span>brw<span style=\"color:#f92672\">-<\/span>rw<span style=\"color:#f92672\">----<\/span> <span style=\"color:#ae81ff\">1<\/span> root root <span style=\"color:#ae81ff\">179<\/span>, <span style=\"color:#ae81ff\">4<\/span> Jan <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#ae81ff\">08<\/span><span style=\"color:#f92672\">:<\/span><span style=\"color:#ae81ff\">00<\/span> <span style=\"color:#f92672\">\/<\/span>dev<span style=\"color:#f92672\">\/<\/span>mmcblk0p4<\/span><\/span><\/code><\/pre><\/div><h2 id=\"23-etc-\u76ee\u5f55\">2.3 \/etc \u76ee\u5f55<a class=\"anchor\" href=\"#23-etc-%e7%9b%ae%e5%bd%95\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u6b64\u76ee\u5f55\u4e0b\u5b58\u653e\u7740\u5404\u79cd\u914d\u7f6e\u6587\u4ef6\u3002<\/p>"},{"title":"RTC\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/rtc%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/rtc%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"linux\u4e0brtc\u5b50\u7cfb\u7edf\u9a71\u52a8\">Linux\u4e0bRTC\u5b50\u7cfb\u7edf\u9a71\u52a8<a class=\"anchor\" href=\"#linux%e4%b8%8brtc%e5%ad%90%e7%b3%bb%e7%bb%9f%e9%a9%b1%e5%8a%a8\" aria-label=\"Link\"><\/a><\/h1>\n<h1 id=\"1-\u5f15\u5165rtc\">1 \u5f15\u5165RTC<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5rtc\" aria-label=\"Link\"><\/a><\/h1>\n<p>CPU\u5185\u90e8\u6709\u5f88\u591a\u5b9a\u65f6\u5668\uff0c\u50cf\u770b\u95e8\u72d7<code>WDT\uff0cPWM<\/code>\u5b9a\u65f6\u5668\uff0c\u9ad8\u7cbe\u5ea6\u5b9a\u65f6\u5668Timer\u7b49\u7b49, \u53ea\u5728\u201c\u542f\u52a8\u201d\u5373\u201c\u901a\u7535\u65f6\u201d\u8fd0\u884c\uff0c\u65ad\u7535\u65f6\u505c\u6b62\u3002<\/p>\n<p>\u5f53\u7136\uff0c\u5982\u679c\u65f6\u949f\u4e0d\u80fd\u8fde\u7eed\u8ddf\u8e2a\u65f6\u95f4\uff0c\u5219\u5fc5\u987b\u624b\u52a8\u8bbe\u7f6e\u3002\u90a3\u4e48\u5f53\u5173\u673a\u540e\u5c31\u6ca1\u529e\u6cd5\u81ea\u52a8\u8ba1\u6570\u7edf\u8ba1\u65f6\u95f4\u4e86\u3002<code>RTC<\/code>\u00a0\u5c31\u5f88\u597d\u7684\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0cRTC\u662f\u5b9e\u65f6\u65f6\u949f\uff0c\u7528\u4e8e\u8bb0\u5f55\u5f53\u524d\u7cfb\u7edf\u65f6\u95f4\u3002<\/p>\n<h1 id=\"2-linux-\u5185\u6838-rtc-\u9a71\u52a8\u6846\u67b6\">2 Linux \u5185\u6838 RTC \u9a71\u52a8\u6846\u67b6<a class=\"anchor\" href=\"#2-linux-%e5%86%85%e6%a0%b8-rtc-%e9%a9%b1%e5%8a%a8%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p>RTC\u5728linux\u5185\u6838\u6001\u4e5f\u662f\u7528\u4e00\u4e2a\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\u53bb\u5b9e\u73b0\u7684\u3002Linux \u5185\u6838\u5c06 RTC \u8bbe\u5907\u62bd\u8c61\u4e3a<code>rtc_device<\/code>\u7ed3\u6784\u4f53\uff0c\u5b9a\u4e49\u5728\u00a0<code>include\/linux\/rtc.h<\/code>, \u8fdb\u5165<code>drivers\/rtc<\/code>\u5b50\u7cfb\u7edf\u76ee\u5f55\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>class.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u4e3a\u5e95\u5c42\u9a71\u52a8\u63d0\u4f9b<\/span> <span style=\"color:#66d9ef\">register<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u4e0e<\/span> unregister <span style=\"color:#960050;background-color:#1e0010\">\u63a5\u53e3\u7528\u4e8e<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u7684\u6ce8\u518c<\/span><span style=\"color:#f92672\">\/<\/span><span style=\"color:#960050;background-color:#1e0010\">\u6ce8\u9500\u3002\u521d\u59cb\u5316<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u7ed3\u6784\u3001<\/span>sysfs<span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>proc \n<\/span><\/span><span style=\"display:flex;\"><span>interface.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u63d0\u4f9b\u7528\u6237\u7a0b\u5e8f\u4e0e<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u7684\u63a5\u53e3\u51fd\u6570<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>dev.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u5c06<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u62bd\u8c61\u4e3a\u901a\u7528\u7684\u5b57\u7b26\u8bbe\u5907\uff0c\u63d0\u4f9b\u6587\u4ef6\u64cd\u4f5c\u51fd\u6570\u96c6<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>sysfs.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u7ba1\u7406<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u7684<\/span> sysfs <span style=\"color:#960050;background-color:#1e0010\">\u5c5e\u6027\uff0c\u83b7\u53d6<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u540d\u3001\u65e5\u671f\u3001\u65f6\u95f4\u7b49<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>proc.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u7ba1\u7406<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u7684<\/span> procfs <span style=\"color:#960050;background-color:#1e0010\">\u5c5e\u6027\uff0c\u63d0\u4f9b\u4e2d\u65ad\u72b6\u6001\u548c\u6807\u5fd7\u67e5\u8be2<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>lib.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u63d0\u4f9b<\/span> RTC<span style=\"color:#960050;background-color:#1e0010\">\u3001<\/span>Data <span style=\"color:#960050;background-color:#1e0010\">\u548c<\/span> Time <span style=\"color:#960050;background-color:#1e0010\">\u4e4b\u95f4\u7684\u8f6c\u6362\u51fd\u6570<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>rtc<span style=\"color:#f92672\">-<\/span>xxx.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a\u5404\u5e73\u53f0<\/span> RTC <span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u7684\u5b9e\u9645\u9a71\u52a8<\/span><\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/4f220291bc4ade9fca28801657a0830c_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"21-rtc\u5b50\u7cfb\u7edfmakefile\">2.1 rtc\u5b50\u7cfb\u7edfMakefile<a class=\"anchor\" href=\"#21-rtc%e5%ad%90%e7%b3%bb%e7%bb%9fmakefile\" aria-label=\"Link\"><\/a><\/h2>\n<p>rtc\u5b50\u7cfb\u7edfMakefile\u5982\u4e0b\uff0c \u53ef\u4ee5\u6839\u636e\u914d\u7f6e\u5b8f\u53bb\u88c1\u526artc\u5b50\u7cfb\u7edf\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_LIB) <span style=\"color:#f92672\">+=<\/span> lib.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_SYSTOHC) <span style=\"color:#f92672\">+=<\/span> systohc.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_CLASS) <span style=\"color:#f92672\">+=<\/span> rtc<span style=\"color:#f92672\">-<\/span>core.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_MC146818_LIB) <span style=\"color:#f92672\">+=<\/span> rtc<span style=\"color:#f92672\">-<\/span>mc146818<span style=\"color:#f92672\">-<\/span>lib.o \n<\/span><\/span><span style=\"display:flex;\"><span>rtc<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span>y :<span style=\"color:#f92672\">=<\/span> class.o interface.o \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>rtc<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_NVMEM) <span style=\"color:#f92672\">+=<\/span> nvmem.o \n<\/span><\/span><span style=\"display:flex;\"><span>rtc<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_INTF_DEV) <span style=\"color:#f92672\">+=<\/span> dev.o \n<\/span><\/span><span style=\"display:flex;\"><span>rtc<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_INTF_PROC) <span style=\"color:#f92672\">+=<\/span> proc.o \n<\/span><\/span><span style=\"display:flex;\"><span>rtc<span style=\"color:#f92672\">-<\/span>core<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_RTC_INTF_SYSFS) <span style=\"color:#f92672\">+=<\/span> sysfs.o<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/cf118d16bf7638aaca64c46f03d1e81b_MD5.png\" alt=\"img\" \/>\nLinux\u9ed8\u8ba4rtc\u662f\u5f00\u542f\u7684\u3002<\/p>"},{"title":"SPI\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/spi%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/spi%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-linux-spi\u9a71\u52a8\u6846\u67b6\">1 Linux SPI\u9a71\u52a8\u6846\u67b6<a class=\"anchor\" href=\"#1-linux-spi%e9%a9%b1%e5%8a%a8%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/ef79bf767fd27d6a9bc535b62ea223c3_MD5.webp\" alt=\"img\" \/>\nlinux SPI\u9a71\u52a8\u6846\u67b6\u5c42\u6b21\u5982\u4e0a\u56fe\uff1a<\/p>\n<p>\u9664\u5f00\u786c\u4ef6\u548c\u7528\u6237\u6001\u5e94\u7528\u7a0b\u5e8f\uff0c\u7531\u4e0a\u5230\u4e0b\u5206\u62103\u5c42\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u8bbe\u5907\u9a71\u52a8\u5c42<\/span><span style=\"color:#f92672\">:<\/span> spi\u6846\u67b6\u4f7f\u7528\u8005 \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u6838\u5fc3\u5c42\uff1a<\/span>spi\u6846\u67b6\u642d\u5efa\u8005 \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u63a7\u5236\u5668\u9a71\u52a8\u5c42\uff1a<\/span> spi\u6846\u67b6\u9002\u914d\u8005<\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-spi\u6838\u5fc3\u5c42\">1.1 spi\u6838\u5fc3\u5c42<a class=\"anchor\" href=\"#11-spi%e6%a0%b8%e5%bf%83%e5%b1%82\" aria-label=\"Link\"><\/a><\/h2>\n<p>SPI\u6838\u5fc3\u5c42\u4ee3\u7801\u4f4d\u4e8e<code>linux_5.10\\drivers\\spi<\/code>\u76ee\u5f55:<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># SPDX-License-Identifier: GPL-2.0 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># Makefile for kernel SPI drivers. \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>ccflags<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_DEBUG) <span style=\"color:#f92672\">:=<\/span> <span style=\"color:#f92672\">-<\/span>DDEBUG \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># small core, mostly translating board-specific \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># config declarations into driver model code \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_MASTER)\t\t<span style=\"color:#f92672\">+=<\/span> spi.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_MEM)\t\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>mem.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_MUX)\t\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>mux.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_SPIDEV)\t\t<span style=\"color:#f92672\">+=<\/span> spidev.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_LOOPBACK_TEST)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>loopback<span style=\"color:#f92672\">-<\/span>test.o \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"># SPI master controller drivers (bus) \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_ALTERA)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>altera.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_AR934X)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>ar934x.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_ARMADA_3700)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>armada<span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">3700.<\/span>o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_ATMEL)\t\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>atmel.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_ATMEL_QUADSPI)\t\t<span style=\"color:#f92672\">+=<\/span> atmel<span style=\"color:#f92672\">-<\/span>quadspi.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_AT91_USART)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>at91<span style=\"color:#f92672\">-<\/span>usart.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_ATH79)\t\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>ath79.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_AU1550)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>au1550.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_AXI_SPI_ENGINE)\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>axi<span style=\"color:#f92672\">-<\/span>spi<span style=\"color:#f92672\">-<\/span>engine.o \n<\/span><\/span><span style=\"display:flex;\"><span>obj<span style=\"color:#f92672\">-<\/span><span style=\"color:#960050;background-color:#1e0010\">$<\/span>(CONFIG_SPI_BCM2835)\t\t<span style=\"color:#f92672\">+=<\/span> spi<span style=\"color:#f92672\">-<\/span>bcm2835.o<\/span><\/span><\/code><\/pre><\/div><div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>drivers<span style=\"color:#f92672\">\/<\/span>spi<span style=\"color:#f92672\">\/<\/span>spi.c spi<span style=\"color:#f92672\">-<\/span>mem.c spi<span style=\"color:#f92672\">-<\/span>mux.c \n<\/span><\/span><span style=\"display:flex;\"><span>include<span style=\"color:#f92672\">\/<\/span>linux<span style=\"color:#f92672\">\/<\/span>spi<span style=\"color:#f92672\">\/<\/span>spi.h \n<\/span><\/span><span style=\"display:flex;\"><span>spi.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u4e00\u65b9\u9762\u5bf9<\/span>SPI\u5b50\u7cfb\u7edf\u8fdb\u884c\u521d\u59cb\u5316\u5de5\u4f5c<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u6ce8\u518c<\/span>spi bus<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u6ce8\u518c<\/span>spi_master class<span style=\"color:#960050;background-color:#1e0010\">\uff0c<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u540c\u65f6\u63d0\u4f9b<\/span>spi\u8bbe\u5907\u9a71\u52a8\u5bf9spi\u603b\u7ebf\u8fdb\u884c\u64cd\u4f5c\u7684API<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u53e6\u4e00\u65b9\u9762<\/span>SPI\u5b50\u7cfb\u7edf\u5bf9spi\u63a7\u5236\u5668\u5c42<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u63d0\u4f9b\u6ce8\u518c\u63a7\u5236\u5668\u7684<\/span>api\u548c\u56de\u8c03\u64cd\u4f5c\u51fd\u6570<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>spi.h\u5305\u542b\u4e86spi\u6838\u5fc3\u5c42\u7684\u4e00\u4e9b\u91cd\u8981\u6570\u636e\u7ed3\u6784<span style=\"color:#960050;background-color:#1e0010\">\uff0c<\/span><span style=\"color:#66d9ef\">struct<\/span> spi_master; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> spi_transfer; <span style=\"color:#66d9ef\">struct<\/span> spi_message<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u4ee5\u53ca\u4e00\u4e9b\u5b9e\u73b0\u6bd4\u8f83\u7b80\u5355\u7684\u51fd\u6570\u7b49\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span>spi<span style=\"color:#f92672\">-<\/span>gpio.c<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span>SPI GPIO\u6846\u67b6<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span>SPI\u5b50\u7cfb\u7edf\u63d0\u4f9b\u4e86\u4e00\u4e2a\u540d\u4e3aspi<span style=\"color:#f92672\">-<\/span>gpio\u7684\u6846\u67b6<span style=\"color:#960050;background-color:#1e0010\">\uff0c<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u53ef\u4f7f\u7528<\/span>GPIO\u5f15\u811a\u6a21\u62dfSPI\u603b\u7ebf<span style=\"color:#960050;background-color:#1e0010\">\uff0c<\/span>gpio\u6a21\u62dfspi\u4ee3\u7801\u5728drivers<span style=\"color:#f92672\">\/<\/span>spi<span style=\"color:#f92672\">\/<\/span>spi<span style=\"color:#f92672\">-<\/span>gpio.c\u4e2d<span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u8fd9\u4e2a\u6846\u67b6\u5141\u8bb8\u5c06<\/span>GPIO\u5f15\u811a\u914d\u7f6e\u4e3aSPI\u603b\u7ebf\u7684\u65f6\u949f<span style=\"color:#960050;background-color:#1e0010\">\u3001\u7247\u9009\u3001\u8f93\u5165\u548c\u8f93\u51fa\u4fe1\u53f7\uff0c<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u5e76\u63d0\u4f9b\u4e86\u5bf9\u5e94\u7684\u63a5\u53e3\u51fd\u6570\u4f9b\u9a71\u52a8\u7a0b\u5e8f\u4f7f\u7528\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>spi<span style=\"color:#f92672\">-<\/span>bitbang<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span>spi<span style=\"color:#f92672\">-<\/span>bitbang\u662fLinux\u5185\u6838\u4e2d\u63d0\u4f9b\u7684\u4e00\u4e2a\u901a\u7528\u6846\u67b6<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u7528\u4e8e\u5728\u6ca1\u6709\u786c\u4ef6<\/span>SPI\u63a7\u5236\u5668 \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#960050;background-color:#1e0010\">\u6216\u9700\u8981\u7075\u6d3b\u63a7\u5236<\/span>SPI\u65f6\u5e8f\u548c\u914d\u7f6e\u7684\u7cfb\u7edf\u4e2d\u6a21\u62dfSPI\u603b\u7ebf\u7684\u901a\u4fe1<span style=\"color:#960050;background-color:#1e0010\">\u3002\u4ee3\u7801\u5728<\/span>spi<span style=\"color:#f92672\">-<\/span>bitbang.c\u4e2d<\/span><\/span><\/code><\/pre><\/div><p>\u6838\u5fc3\u5c42\u7684\u4f5c\u7528:<\/p>"},{"title":"UART\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/uart%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/uart%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<h1 id=\"1-uart\u5de5\u4f5c\u539f\u7406\">1 UART\u5de5\u4f5c\u539f\u7406<a class=\"anchor\" href=\"#1-uart%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u7565<\/p>\n<h1 id=\"2-linux\u4e0btty\u9a71\u52a8\u6846\u67b6\">2 Linux\u4e0bTTY\u9a71\u52a8\u6846\u67b6<a class=\"anchor\" href=\"#2-linux%e4%b8%8btty%e9%a9%b1%e5%8a%a8%e6%a1%86%e6%9e%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/f9b4ecf1737bbdf3d00b6a18468f5e98_MD5.png\" alt=\"img\" \/>\n\u53ef\u4ee5\u770b\u5230<code>tty\u6846\u67b6<\/code>\u4e0b\u4e0d\u6b62\u5305\u542buart,\u8fd8\u6709display\u8bbe\u5907\uff0c\u952e\u76d8\u8bbe\u5907\u3002<\/p>\n<p>\u8be6\u7ec6\u5c55\u5f00\u5982\u4e0b\uff0c<code>tty_driver<\/code>\u4f4d\u4e8e<code>tty_io.c<\/code>\uff0c \u8c03\u7528\u5e95\u4e0b\u7684<code>uart_diver<\/code>\u4f4d\u4e8e<code>serial_core.c<\/code>\u3002<code>uart_driver<\/code>\u5b50\u7cfb\u7edf\u4f1a\u88ab\u6700\u5e95\u5c42\u7684soc\u5382\u5546\u62ff\u53bb\u9002\u914d\uff0c\u8c03\u7528<code>uart_register_driver<\/code>\u6ce8\u518c\u81ea\u5df1\u7684uart\u63a7\u5236\u5668\uff0c\u53bb\u5b9e\u73b0\u63a7\u5236\u5668\u8981\u5b9e\u73b0\u7684<code>uart_fops<\/code>\u64cd\u4f5c\u51fd\u6570\u3002<br>\n<img src=\"assets\/1bee99c336c013dcffe6b28e10c00fb6_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"21-\u8bbe\u5907\u8282\u70b9\u5dee\u522b\">2.1 \u8bbe\u5907\u8282\u70b9\u5dee\u522b<a class=\"anchor\" href=\"#21-%e8%ae%be%e5%a4%87%e8%8a%82%e7%82%b9%e5%b7%ae%e5%88%ab\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/9b49ea435397d60866604dec0d5c7c55_MD5.png\" alt=\"img\" \/><\/p>\n<h3 id=\"211-\u4e32\u53e3\u7ec8\u7aefdevttys\">2.1.1 \u4e32\u53e3\u7ec8\u7aef\uff08\/dev\/ttyS*\uff09<a class=\"anchor\" href=\"#211-%e4%b8%b2%e5%8f%a3%e7%bb%88%e7%ab%afdevttys\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u4e32\u53e3\u7ec8\u7aef\u662f\u4f7f\u7528\u8ba1\u7b97\u673a\u4e32\u53e3\u8fde\u63a5\u7684\u7ec8\u7aef\u8bbe\u5907\u3002Linux\u628a\u6bcf\u4e2a\u4e32\u884c\u7aef\u53e3\u90fd\u770b\u505a\u662f\u4e00\u4e2a\u5b57\u7b26\u8bbe\u5907\u3002\u8fd9\u4e9b\u4e32\u884c\u7aef\u53e3\u6240\u5bf9\u5e94\u7684\u8bbe\u5907\u540d\u79f0\u662f<code>\/dev\/ttyS*<\/code>\u3002<\/p>\n<h3 id=\"212-\u63a7\u5236\u53f0\u7ec8\u7aefdevconsole\">2.1.2 \u63a7\u5236\u53f0\u7ec8\u7aef\uff08\/dev\/console\uff09<a class=\"anchor\" href=\"#212-%e6%8e%a7%e5%88%b6%e5%8f%b0%e7%bb%88%e7%ab%afdevconsole\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u5728Linux\u7cfb\u7edf\u4e2d\uff0c\u8ba1\u7b97\u673a\u7684\u8f93\u51fa\u8bbe\u5907\u901a\u5e38\u88ab\u79f0\u4e3a\u63a7\u5236\u53f0\u7ec8\u7aef\uff0c\u8fd9\u91cc\u7279\u6307printk\u4fe1\u606f\u8f93\u51fa\u5230\u8bbe\u5907\u3002<code>\/dev\/console<\/code>\u662f\u4e00\u4e2a\u865a\u62df\u7684\u8bbe\u5907\uff0c\u5b83\u9700\u8981\u6620\u5c04\u5230\u771f\u6b63\u7684tty\u4e0a\uff0c\u6bd4\u5982\u901a\u8fc7\u5185\u6838\u542f\u52a8\u53c2\u6570<code>\u201cconsole=ttySCA0\u201d<\/code>\u5c31\u628aconsole\u6620\u5c04\u5230\u4e86\u4e32\u53e30\u3002<\/p>\n<h3 id=\"213-\u865a\u62df\u7ec8\u7aefdevtty\">2.1.3 \u865a\u62df\u7ec8\u7aef\uff08\/dev\/tty*\uff09<a class=\"anchor\" href=\"#213-%e8%99%9a%e6%8b%9f%e7%bb%88%e7%ab%afdevtty\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u5f53\u7528\u6237\u767b\u5f55\u65f6\uff0c\u4f7f\u7528\u7684\u662f\u865a\u62df\u7ec8\u7aef\u3002\u4f7f\u7528<code>Ctcl+Alt[F1 - F6]<\/code>\u7ec4\u5408\u952e\u65f6\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5207\u6362\u5230tty1\u3001tty2\u3001tty3\u7b49\u4e0a\u9762\u53bb\u3002tty*\u5c31\u79f0\u4e3a\u865a\u62df\u7ec8\u7aef\uff0c\u800c<code>tty0<\/code>\u5219\u662f\u5f53\u524d\u6240\u4f7f\u7528\u865a\u62df\u7ec8\u7aef\u7684\u4e00\u4e2a\u522b\u540d\u3002<\/p>\n<h2 id=\"22-\u67b6\u6784\u5c42\u6b21\">2.2 \u67b6\u6784\u5c42\u6b21<a class=\"anchor\" href=\"#22-%e6%9e%b6%e6%9e%84%e5%b1%82%e6%ac%a1\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/92fae0471c1239a9b6104d85fdfc2e59_MD5.png\" alt=\"img\" \/>\nTTY\u6838\u5fc3\u5c42-&gt;\u884c\u89c4\u7a0b\u5c42-&gt;tty\u9a71\u52a8\u5c42\u3002<\/p>\n<h2 id=\"23-uart\u9a71\u52a8\u5b50\u7cfb\u7edf\">2.3 UART\u9a71\u52a8\u5b50\u7cfb\u7edf<a class=\"anchor\" href=\"#23-uart%e9%a9%b1%e5%8a%a8%e5%ad%90%e7%b3%bb%e7%bb%9f\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"231-\u6570\u636e\u7ed3\u6784\u548capi\">2.3.1 \u6570\u636e\u7ed3\u6784\u548cAPI<a class=\"anchor\" href=\"#231-%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84%e5%92%8capi\" aria-label=\"Link\"><\/a><\/h3>\n<h4 id=\"2311-uart_driver\">2.3.1.1 uart_driver<a class=\"anchor\" href=\"#2311-uart_driver\" aria-label=\"Link\"><\/a><\/h4>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> uart_driver { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> module <span style=\"color:#f92672\">*<\/span>owner; <span style=\"color:#75715e\">\/* \u6a21\u5757\u6240\u5c5e\u8005 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>driver_name; <span style=\"color:#75715e\">\/* \u9a71\u52a8\u540d\u5b57 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>dev_name; <span style=\"color:#75715e\">\/* \u8bbe\u5907\u540d\u5b57 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> major; <span style=\"color:#75715e\">\/* \u4e3b\u8bbe\u5907\u53f7 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> minor; <span style=\"color:#75715e\">\/* \u6b21\u8bbe\u5907\u53f7 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">int<\/span> nr; <span style=\"color:#75715e\">\/* \u8bbe\u5907\u6570 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> console <span style=\"color:#f92672\">*<\/span>cons; <span style=\"color:#75715e\">\/* \u63a7\u5236\u53f0 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#75715e\">\/* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t* these are private; the low level driver should not \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t* touch these; they should be initialised to NULL \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\t*\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> uart_state <span style=\"color:#f92672\">*<\/span>state; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> tty_driver <span style=\"color:#f92672\">*<\/span>tty_driver; \n<\/span><\/span><span style=\"display:flex;\"><span>}; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/include\/linux\/serial_core.h\n<\/span><\/span><\/span><\/code><\/pre><\/div><h5 id=\"23111-uart_driver-\u6ce8\u518c\u4e0e\u6ce8\u9500\">2.3.1.1.1 uart_driver \u6ce8\u518c\u4e0e\u6ce8\u9500<a class=\"anchor\" href=\"#23111-uart_driver-%e6%b3%a8%e5%86%8c%e4%b8%8e%e6%b3%a8%e9%94%80\" aria-label=\"Link\"><\/a><\/h5>\n<p><code>int uart_register_driver(struct uart_driver *drv);<\/code><\/p>"},{"title":"USB gadget\u5b50\u7cfb\u7edf","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/usb-gadget%E5%AD%90%E7%B3%BB%E7%BB%9F\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/usb-gadget%E5%AD%90%E7%B3%BB%E7%BB%9F\/","description":"<p><a href=\"https:\/\/www.cnblogs.com\/linhaostudy\/p\/18397499\">https:\/\/www.cnblogs.com\/linhaostudy\/p\/18397499<\/a><\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-1-linux\u4e2d\u65ad\u4ecb\u7ecd","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-1-linux%E4%B8%AD%E6%96%AD%E4%BB%8B%E7%BB%8D\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-1-linux%E4%B8%AD%E6%96%AD%E4%BB%8B%E7%BB%8D\/","description":"<h1 id=\"1-\u4e2d\u65ad\u4e0e\u5f02\u5e38\u79cd\u7c7b\">1 \u4e2d\u65ad\u4e0e\u5f02\u5e38\u79cd\u7c7b<a class=\"anchor\" href=\"#1-%e4%b8%ad%e6%96%ad%e4%b8%8e%e5%bc%82%e5%b8%b8%e7%a7%8d%e7%b1%bb\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/0af306620f9986633e87d26d35c17473_MD5.webp\" alt=\"img\" \/>\nCPU \u5728\u8fd0\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u88ab\u5404\u79cd<code>\u201c\u5f02\u5e38\u201d<\/code>\u6253\u65ad\u3002\u8fd9\u4e9b<code>\u201c\u5f02\u5e38\u201d<\/code>\u6709\uff1a<\/p>\n<ol>\n<li>\u6307\u4ee4\u672a\u5b9a\u4e49<\/li>\n<li>Reset\u590d\u4f4d<\/li>\n<li>\u6307\u4ee4\u3001\u6570\u636e\u8bbf\u95ee\u6709\u95ee\u9898<\/li>\n<li>SWI(\u8f6f\u4e2d\u65ad)<\/li>\n<li>\u5feb\u4e2d\u65ad<\/li>\n<li>IRQ\u4e2d\u65ad<\/li>\n<\/ol>\n<p>IRQ\u4e2d\u65ad\u53ea\u662f\u4e00\u7c7b\u5f02\u5e38\uff0c\u5bfc\u81f4IRQ\u4e2d\u65ad\u53d1\u751f\u7684\u60c5\u51b5\u6709\u5f88\u591a\uff0c\u6bd4\u5982\uff1a<\/p>\n<ol>\n<li>\u6309\u952e<\/li>\n<li>\u5b9a\u65f6\u5668<\/li>\n<li>ADC \u8f6c\u6362\u5b8c\u6210<\/li>\n<li>UART \u53d1\u9001\u5b8c\u6570\u636e\u3001\u6536\u5230\u6570\u636e<\/li>\n<\/ol>\n<p>\u4f17\u591a\u7684<code>\u201c\u4e2d\u65ad\u6e90\u201d<\/code>\uff0c\u6c47\u96c6\u5230<code>\u201c\u4e2d\u65ad\u63a7\u5236\u5668\u201d<\/code>\uff0c\u7531<code>\u201c\u4e2d\u65ad\u63a7\u5236\u5668\u201d<\/code>\u9009\u62e9\u4f18\u5148\u7ea7\u6700\u9ad8\u7684\u4e2d\u65ad\u5e76\u901a\u77e5 CPU\u3002<\/p>\n<h1 id=\"2-\u4e2d\u65ad\u7684\u5904\u7406\u6d41\u7a0b\">2 \u4e2d\u65ad\u7684\u5904\u7406\u6d41\u7a0b<a class=\"anchor\" href=\"#2-%e4%b8%ad%e6%96%ad%e7%9a%84%e5%a4%84%e7%90%86%e6%b5%81%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h1>\n<p>arm \u5bf9\u5f02\u5e38(\u4e2d\u65ad)\u5904\u7406\u8fc7\u7a0b\uff1a<\/p>\n<ol>\n<li>\u521d\u59cb\u5316\uff1a<br>\na) \u8bbe\u7f6e<strong>\u4e2d\u65ad\u6e90<\/strong>\uff0c\u8ba9\u5b83\u53ef\u4ee5\u4ea7\u751f\u4e2d\u65ad<br>\nb) \u8bbe\u7f6e<strong>\u4e2d\u65ad\u63a7\u5236\u5668<\/strong>(\u53ef\u4ee5\u5c4f\u853d\u67d0\u4e2a\u4e2d\u65ad\uff0c\u4f18\u5148\u7ea7)<br>\nc) \u8bbe\u7f6e\u00a0<strong>CPU \u603b\u5f00\u5173(\u4f7f\u80fd\u4e2d\u65ad)<\/strong><\/li>\n<li>\u6267\u884c\u5176\u4ed6\u7a0b\u5e8f\uff1a\u6b63\u5e38\u7a0b\u5e8f<\/li>\n<li>\u4ea7\u751f\u4e2d\u65ad\uff1a\u6bd4\u5982\u6309\u4e0b\u6309\u952e\uff08\u4e2d\u65ad\u6e90\u53d1\u51fa\u4e2d\u65ad\u8bf7\u6c42\uff09\u2014&gt;\u4e2d\u65ad\u63a7\u5236\u5668\u2014&gt;CPU<\/li>\n<li>CPU \u6bcf\u6267\u884c\u5b8c\u4e00\u6761\u6307\u4ee4\u90fd\u4f1a\u68c0\u67e5\u6709\u65e0\u4e2d\u65ad\/\u5f02\u5e38\u4ea7\u751f<\/li>\n<li>CPU \u53d1\u73b0\u6709\u4e2d\u65ad\/\u5f02\u5e38\u4ea7\u751f\uff0c\u5f00\u59cb\u5904\u7406\u3002<\/li>\n<\/ol>\n<p>\u5bf9\u4e8e\u4e0d\u540c\u7684\u5f02\u5e38\uff0c\u8df3\u53bb\u4e0d\u540c\u7684\u5730\u5740\u6267\u884c\u6267\u884c\u67d0\u4e2a\u51fd\u6570\uff0c\u8fd9\u4e2a\u5c31\u662f\u5f02\u5e38\u5411\u91cf\u3002\u2462\u2463\u2464\u90fd\u662f\u786c\u4ef6\u505a\u7684\u3002\u2462\u662f\u4e2d\u65ad\u6e90\u6765\u505a\uff0c\u2463\u2464\u662fcpu\u6765\u505a<\/p>\n<p>\u7efc\u4e0a5\u4e2a\u8fc7\u7a0b\uff0c\u8f6f\u4ef6\u8981\u505a\u7684\u4e8b\u60c5:<br>\na) \u4fdd\u5b58\u73b0\u573a(\u5404\u79cd\u5bc4\u5b58\u5668)<br>\nb) \u5904\u7406\u5f02\u5e38(\u4e2d\u65ad): \u4ece<strong>\u5f02\u5e38\u5411\u91cf\u8868<\/strong>\u8df3\u5230\u4e0d\u540c\u7684\u5f02\u5e38\u5411\u91cf\u53bb\u6267\u884c\uff0c\u5206\u8fa8\u4e2d\u65ad\u6e90\uff0c\u518d\u8c03\u7528\u4e0d\u540c\u7684\u5904\u7406\u51fd\u6570<br>\nc) \u6062\u590d\u73b0\u573a<\/p>\n<h2 id=\"21-\u5f02\u5e38\u5411\u91cf\u8868\">2.1 \u5f02\u5e38\u5411\u91cf\u8868<a class=\"anchor\" href=\"#21-%e5%bc%82%e5%b8%b8%e5%90%91%e9%87%8f%e8%a1%a8\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u5f02\u5e38\u5411\u91cf\u8868\u7528\u6765\u5b58\u50a8\u5f02\u5e38\u7684\u5904\u7406\u7a0b\u5e8f\uff0c\u5728\u7279\u5b9a\u5f02\u5e38\u53d1\u751f\u540e\uff0cCPU\u4f1a\u8df3\u8f6c\u5230\u5f02\u5e38\u5411\u91cf\u8868\u5bf9\u5e94\u7684\u5f02\u5e38\u5904\u7406\u7a0b\u5e8f\u5904\u8fdb\u884c\u5f02\u5e38\u5904\u7406\u3002\n<img src=\"assets\/162227a6e5de0c51db3eca22d9e7a558_MD5.webp\" alt=\"img\" \/>\n<img src=\"assets\/91fe1c20b53cd06b2dd41a493a2089bc_MD5.webp\" alt=\"img\" \/><\/p>\n<table>\n\t<thead>\n\t\t\t<tr>\n\t\t\t\t\t<th>\u5411\u91cf\u5730\u5740<\/th>\n\t\t\t\t\t<th>\u4e2d\u65ad\u7c7b\u578b<\/th>\n\t\t\t\t\t<th>\u4e2d\u65ad\u6a21\u5f0f<\/th>\n\t\t\t<\/tr>\n\t<\/thead>\n\t<tbody>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X00<\/td>\n\t\t\t\t\t<td>\u590d\u4f4d\u4e2d\u65ad(Rest)<\/td>\n\t\t\t\t\t<td>\u7279\u6743\u6a21\u5f0f(SVC)<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X04<\/td>\n\t\t\t\t\t<td>\u672a\u5b9a\u4e49\u6307\u4ee4\u4e2d\u65ad(Undefined Instruction)<\/td>\n\t\t\t\t\t<td>\u672a\u5b9a\u4e49\u6307\u4ee4\u4e2d\u6b62\u6a21\u5f0f(Undef)<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X08<\/td>\n\t\t\t\t\t<td>\u8f6f\u4e2d\u65ad(Software Interrupt,SWI)<\/td>\n\t\t\t\t\t<td>\u7279\u6743\u6a21\u5f0f(SVC)<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X0C<\/td>\n\t\t\t\t\t<td>\u6307\u4ee4\u9884\u53d6\u4e2d\u6b62\u4e2d\u65ad(Prefetch Abort)<\/td>\n\t\t\t\t\t<td>\u4e2d\u6b62\u6a21\u5f0f<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X10<\/td>\n\t\t\t\t\t<td>\u6570\u636e\u8bbf\u95ee\u4e2d\u6b62\u4e2d\u65ad(Data Abort)<\/td>\n\t\t\t\t\t<td>\u4e2d\u6b62\u6a21\u5f0f<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X14<\/td>\n\t\t\t\t\t<td>\u672a\u4f7f\u7528(Not Used)<\/td>\n\t\t\t\t\t<td>\u672a\u4f7f\u7528<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X18<\/td>\n\t\t\t\t\t<td>IRQ<\/td>\n\t\t\t\t\t<td>\u4e2d\u65ad(IRQ Interrupt)<\/td>\n\t\t\t<\/tr>\n\t\t\t<tr>\n\t\t\t\t\t<td>0X1C<\/td>\n\t\t\t\t\t<td>FIQ<\/td>\n\t\t\t\t\t<td>\u4e2d\u65ad(FIQ Interrupt)<\/td>\n\t\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n<p>\u53d1\u751f\u590d\u4f4d\u65f6\uff0cCPU \u5c31\u53bb \u6267\u884c\u7b2c 1 \u6761\u6307\u4ee4\uff1a<code>b reset<\/code>\u3002<br>\n\u53d1\u751f\u4e2d\u65ad\u65f6\uff0cCPU \u5c31\u53bb\u6267\u884c<code>\u201cldr pc, _irq\u201d<\/code>\u8fd9\u6761\u6307\u4ee4\u3002\u8fd9\u4e9b\u6307\u4ee4\u5b58\u653e\u7684\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\u3002<\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-2-ARM\u67b6\u6784GIC\u4ecb\u7ecd","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-2-arm%E6%9E%B6%E6%9E%84gic%E4%BB%8B%E7%BB%8D\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-2-arm%E6%9E%B6%E6%9E%84gic%E4%BB%8B%E7%BB%8D\/","description":"<h1 id=\"1-armv7-32\u4f4dgicv2\u4ecb\u7ecd\">1 armv7 32\u4f4dGICv2\u4ecb\u7ecd<a class=\"anchor\" href=\"#1-armv7-32%e4%bd%8dgicv2%e4%bb%8b%e7%bb%8d\" aria-label=\"Link\"><\/a><\/h1>\n<p>armv7 32\u4f4d gic\u91c7\u7528v2\u7248\u672c\uff0c\u53c2\u8003\u624b\u518c\u00a0<a href=\"https:\/\/developer.arm.com\/documentation\/ihi0048\/bb\/?lang=en\">https:\/\/developer.arm.com\/documentation\/ihi0048\/bb\/?lang=en<\/a><\/p>\n<p><code>GIC400<\/code>\u00a0\u5c31\u662fv2\u7248\u672c\u7684\u4e2d\u65ad\u63a7\u5236\u5668 IP \u6838\uff0c\u5f53 GIC \u63a5\u6536\u5230\u5916\u90e8\u4e2d\u65ad\u4fe1\u53f7\u4ee5\u540e\u5c31\u4f1a\u62a5\u7ed9 ARM \u5185\u6838\u3002\u6846\u67b6\u5982\u4e0b\uff1a<br>\n<img src=\"assets\/4e755304aa5e0ecc55dbad9d316d9197_MD5.webp\" alt=\"img\" \/>\nGIC \u67b6\u6784\u5206\u4e3a\u4e86\u4e24\u4e2a\u903b\u8f91\u5757\uff1a<code>Distributor<\/code>\u00a0\u548c\u00a0<code>CPU Interface<\/code>\uff0c\u4e5f\u5c31\u662f\u5206\u53d1\u5668\u7aef\u548c CPU \u63a5\u53e3\u7aef\u3002<\/p>\n<h2 id=\"10-\u5206\u53d1\u5668\u7aef\u548c-cpu-\u63a5\u53e3\u7aef\">1.0 \u5206\u53d1\u5668\u7aef\u548c CPU \u63a5\u53e3\u7aef<a class=\"anchor\" href=\"#10-%e5%88%86%e5%8f%91%e5%99%a8%e7%ab%af%e5%92%8c-cpu-%e6%8e%a5%e5%8f%a3%e7%ab%af\" aria-label=\"Link\"><\/a><\/h2>\n<ol>\n<li>\u5206\u53d1\u5668\u7528\u6765\u63a7\u5236\u5168\u5c40\u4e2d\u65ad\u4f7f\u80fd\uff0c\u6bcf\u4e00\u4e2a\u4e2d\u65ad\u4f7f\u80fd\u5f00\u5173\uff0c\u4e2d\u65ad\u4f18\u5148\u7ea7\uff0c\u5916\u90e8\u4e2d\u65ad\u89e6\u53d1\u65b9\u5f0f\uff08\u8fb9\u6cbf\u89e6\u53d1\u3001\u7535\u5e73\u89e6\u53d1\uff09\u7b49\u3002<\/li>\n<li>cpu\u63a5\u6536\u7aef\u7528\u6765\u63a5\u6536\u4e2d\u65ad\u4fe1\u53f7\u6c47\u62a5\u7ed9cpu, \u5982\uff1a\u5e94\u7b54\u4e2d\u65ad\uff0c\u901a\u77e5\u4e2d\u65ad\u5904\u7406\u5b8c\u6210\uff0c\u5b9a\u4e49\u62a2\u5360\u7b56\u7565\uff0c\u8bbe\u7f6e\u4f18\u5148\u7ea7\u63a9\u7801\uff0c\u5f53\u591a\u4e2a\u4e2d\u65ad\u5230\u6765\u9009\u62e9\u6700\u9ad8\u4f18\u5148\u7ea7\u7684\u4e2d\u65ad\u53f7\u3002<\/li>\n<\/ol>\n<p>\u00a0<code>core_ca7.h<\/code>\u5b9a\u4e49\u4e86GIC\u7684\u6240\u6709\u5bc4\u5b58\u5668\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/* \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">* GIC \u5bc4\u5b58\u5668\u63cf\u8ff0\u7ed3\u6784\u4f53\uff0c \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">* GIC \u5206\u4e3a\u5206\u53d1\u5668\u7aef\u548c CPU \u63a5\u53e3\u7aef \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\"> *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">typedef<\/span> <span style=\"color:#66d9ef\">struct<\/span> { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#75715e\">\/* \u5206\u53d1\u5668\u7aef\u5bc4\u5b58\u5668 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int32_t<\/span> RESERVED0[<span style=\"color:#ae81ff\">1024<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> _IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_CTLR; <span style=\"color:#75715e\">\/* Offset: 0x1000 (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> _IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_TYPER; <span style=\"color:#75715e\">\/* Offset: 0x1004 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> _IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_IIDR; <span style=\"color:#75715e\">\/* Offset: 0x1008 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">int32_t<\/span> RESERVED1[<span style=\"color:#ae81ff\">29<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> _IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_IGROUPR[<span style=\"color:#ae81ff\">16<\/span>]; <span style=\"color:#75715e\">\/* Offset: 0x1080 - 0x0BC (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED2[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ISENABLER[<span style=\"color:#ae81ff\">16<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1100 - 0x13C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED3[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ICENABLER[<span style=\"color:#ae81ff\">16<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1180 - 0x1BC (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED4[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ISPENDR[<span style=\"color:#ae81ff\">16<\/span>]; <span style=\"color:#75715e\">\/* Offset: 0x1200 - 0x23C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED5[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ICPENDR[<span style=\"color:#ae81ff\">16<\/span>]; <span style=\"color:#75715e\">\/* Offset: 0x1280 - 0x2BC (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED6[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ISACTIVER[<span style=\"color:#ae81ff\">16<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1300 - 0x33C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED7[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ICACTIVER[<span style=\"color:#ae81ff\">16<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1380 - 0x3BC (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED8[<span style=\"color:#ae81ff\">16<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint8_t<\/span> D_IPRIORITYR[<span style=\"color:#ae81ff\">512<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1400 - 0x5FC (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED9[<span style=\"color:#ae81ff\">128<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint8_t<\/span> D_ITARGETSR[<span style=\"color:#ae81ff\">512<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1800 - 0x9FC (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED10[<span style=\"color:#ae81ff\">128<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> D_ICFGR[<span style=\"color:#ae81ff\">32<\/span>]; <span style=\"color:#75715e\">\/* Offset: 0x1C00 - 0xC7C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED11[<span style=\"color:#ae81ff\">32<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PPISR; <span style=\"color:#75715e\">\/* Offset: 0x1D00 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_SPISR[<span style=\"color:#ae81ff\">15<\/span>]; <span style=\"color:#75715e\">\/* Offset: 0x1D04 - 0xD3C (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED12[<span style=\"color:#ae81ff\">112<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __OM <span style=\"color:#66d9ef\">uint32_t<\/span> D_SGIR; <span style=\"color:#75715e\">\/* Offset: 0x1F00 ( \/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED13[<span style=\"color:#ae81ff\">3<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint8_t<\/span> D_CPENDSGIR[<span style=\"color:#ae81ff\">16<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1F10 - 0xF1C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint8_t<\/span> D_SPENDSGIR[<span style=\"color:#ae81ff\">16<\/span>];<span style=\"color:#75715e\">\/* Offset: 0x1F20 - 0xF2C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED14[<span style=\"color:#ae81ff\">40<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR4; <span style=\"color:#75715e\">\/* Offset: 0x1FD0 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR5; <span style=\"color:#75715e\">\/* Offset: 0x1FD4 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR6; <span style=\"color:#75715e\">\/* Offset: 0x1FD8 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR7; <span style=\"color:#75715e\">\/* Offset: 0x1FDC (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR0; <span style=\"color:#75715e\">\/* Offset: 0x1FE0 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR1; <span style=\"color:#75715e\">\/* Offset: 0x1FE4 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR2; <span style=\"color:#75715e\">\/* Offset: 0x1FE8 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_PIDR3; <span style=\"color:#75715e\">\/* Offset: 0x1FEC (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_CIDR0; <span style=\"color:#75715e\">\/* Offset: 0x1FF0 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_CIDR1; <span style=\"color:#75715e\">\/* Offset: 0x1FF4 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_CIDR2; <span style=\"color:#75715e\">\/* Offset: 0x1FF8 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> D_CIDR3; <span style=\"color:#75715e\">\/* Offset: 0x1FFC (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#75715e\">\/* CPU \u63a5\u53e3\u7aef\u5bc4\u5b58\u5668 *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> C_CTLR; <span style=\"color:#75715e\">\/* Offset: 0x2000 (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> C_PMR; <span style=\"color:#75715e\">\/* Offset: 0x2004 (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> C_BPR; <span style=\"color:#75715e\">\/* Offset: 0x2008 (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> C_IAR; <span style=\"color:#75715e\">\/* Offset: 0x200C (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __OM <span style=\"color:#66d9ef\">uint32_t<\/span> C_EOIR; <span style=\"color:#75715e\">\/* Offset: 0x2010 ( \/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> C_RPR; <span style=\"color:#75715e\">\/* Offset: 0x2014 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> C_HPPIR; <span style=\"color:#75715e\">\/* Offset: 0x2018 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> C_ABPR; <span style=\"color:#75715e\">\/* Offset: 0x201C (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> C_AIAR; <span style=\"color:#75715e\">\/* Offset: 0x2020 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __OM <span style=\"color:#66d9ef\">uint32_t<\/span> C_AEOIR; <span style=\"color:#75715e\">\/* Offset: 0x2024 ( \/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> C_AHPPIR; <span style=\"color:#75715e\">\/* Offset: 0x2028 (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED15[<span style=\"color:#ae81ff\">41<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> C_APR0; <span style=\"color:#75715e\">\/* Offset: 0x20D0 (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED16[<span style=\"color:#ae81ff\">3<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IOM <span style=\"color:#66d9ef\">uint32_t<\/span> C_NSAPR0; <span style=\"color:#75715e\">\/* Offset: 0x20E0 (R\/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED17[<span style=\"color:#ae81ff\">6<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __IM <span style=\"color:#66d9ef\">uint32_t<\/span> C_IIDR; <span style=\"color:#75715e\">\/* Offset: 0x20FC (R\/ ) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">uint32_t<\/span> RESERVED18[<span style=\"color:#ae81ff\">960<\/span>]; \n<\/span><\/span><span style=\"display:flex;\"><span> __OM <span style=\"color:#66d9ef\">uint32_t<\/span> C_DIR; <span style=\"color:#75715e\">\/* Offset: 0x3000 ( \/W) *\/<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span> } GIC_Type;<\/span><\/span><\/code><\/pre><\/div><h2 id=\"11-gic-\u7c7b\u578b\">1.1 GIC \u7c7b\u578b<a class=\"anchor\" href=\"#11-gic-%e7%b1%bb%e5%9e%8b\" aria-label=\"Link\"><\/a><\/h2>\n<p>GIC \u5c06\u4f17\u591a\u7684\u4e2d\u65ad\u6e90\u5206\u4e3a\u5206\u4e3a\u4e09\u7c7b\uff1a<br>\n\u2460\u3001<code>SPI<\/code>(<code>Shared Peripheral Interrupt<\/code>),\u5171\u4eab\u4e2d\u65ad\uff0c\u987e\u540d\u601d\u4e49\uff0c\u6240\u6709 Core \u5171\u4eab\u7684\u4e2d\u65ad\uff0c\u8fd9\u4e2a\u662f\u6700\u5e38\u89c1\u7684\uff0c\u90a3\u4e9b\u5916\u90e8\u4e2d\u65ad\u90fd\u5c5e\u4e8e SPI \u4e2d\u65ad \u3002<br>\n\u2461\u3001<code>PPI<\/code>(<code>Private Peripheral Interrupt)<\/code>\uff0c\u79c1\u6709\u4e2d\u65ad\uff0cGIC \u662f\u652f\u6301\u591a\u6838\u7684\uff0c\u6bcf\u4e2a\u6838\u6709\u81ea\u5df1\u72ec\u6709\u7684\u4e2d\u65ad\u3002\n\u2462\u3001<code>SGI<\/code>(<code>Software-generated Interrupt<\/code>)\uff0c\u8f6f\u4ef6\u4e2d\u65ad\uff0c\u7531\u8f6f\u4ef6\u89e6\u53d1\u7684\u4e2d\u65ad\uff0c\u901a\u8fc7\u5411\u5bc4\u5b58\u5668<code>GICD_SGIR<\/code>\u00a0\u5199\u5165\u6570\u636e\u6765\u89e6\u53d1\uff0c\u7cfb\u7edf\u4f1a\u4f7f\u7528 SGI \u4e2d\u65ad\u6765\u5b8c\u6210\u591a\u6838\u4e4b\u95f4\u7684\u901a\u4fe1\u3002<\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-3-\u4e2d\u65ad\u7ed3\u6784\u4f53","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-3-%E4%B8%AD%E6%96%AD%E7%BB%93%E6%9E%84%E4%BD%93\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-3-%E4%B8%AD%E6%96%AD%E7%BB%93%E6%9E%84%E4%BD%93\/","description":"<h1 id=\"0-sparse_irq\">0 SPARSE_IRQ<a class=\"anchor\" href=\"#0-sparse_irq\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5982\u679c\u5185\u6838\u914d\u7f6e\u4e86\u00a0<strong>CONFIG_SPARSE_IRQ<\/strong>\uff0c\u90a3\u4e48\u5b83\u5c31\u4f1a\u7528\u00a0<strong>\u57fa\u6570\u6811(radix tree)<\/strong>\u00a0\u6765\u4ee3\u66ff irq_desc \u6570\u7ec4\u3002<br>\nSPARSE \u7684\u610f\u601d\u662f\u201c\u7a00\u758f\u201d\uff0c\u5047\u8bbe\u5927\u5c0f\u4e3a 1000 \u7684\u6570\u7ec4\u4e2d\u53ea\u7528\u5230 2 \u4e2a\u6570\u7ec4\u9879\uff0c\u90a3\u4e0d\u662f\u6d6a\u8d39\u561b\uff1f\u5f53\u4e2d\u65ad\u6bd4\u8f83\u201c\u7a00\u758f\u201d\u65f6\u53ef\u4ee5\u7528\u57fa\u6570\u6811\u6765\u4ee3\u66ff\u6570\u7ec4\u3002<br>\n<img src=\"assets\/b3ae409f76f7b81cc8c6699d36750d8d_MD5.png\" alt=\"img\" \/><\/p>\n<h1 id=\"1-irq_desc-\u6570\u7ec4\">1 irq_desc \u6570\u7ec4<a class=\"anchor\" href=\"#1-irq_desc-%e6%95%b0%e7%bb%84\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u4f4d\u4e8e<code>include\/linux\/irqdesc.h<\/code><\/p>\n<p><img src=\"assets\/3f217a7aeb63db6d9ae48e5d379cdd3e_MD5.png\" alt=\"img\" \/>\n<img src=\"assets\/4752a458521f7731e48212bf9ac6f1d0_MD5.png\" alt=\"img\" \/>\n\u5185\u6838\u4e2d\u8bb0\u5f55\u4e00\u4e2a<code>irq_desc<\/code>\u7684\u6570\u7ec4\uff0c\u6570\u7ec4\u7684\u6bcf\u4e00\u9879\u5bf9\u5e94\u4e00\u4e2a\u4e2d\u65ad\u6216\u8005\u4e00\u7ec4\u4e2d\u65ad\uff08\u4f7f\u7528\u540c\u4e00\u4e2d\u65ad\u53f7\uff09\u3002<code>irq_desc<\/code>\u51e0\u4e4e\u8bb0\u5f55\u6240\u6709\u4e2d\u65ad\u76f8\u5173\u7684\u4e1c\u897f\uff0c\u8fd9\u4e2a\u7ed3\u6784\u662f\u4e2d\u65ad\u7684\u6838\u5fc3\u3002\u6bcf\u4e00\u4e2a<code>irq_desc<\/code>\u6570\u7ec4\u9879\u4e2d\u90fd\u6709\u4e00\u4e2a\u51fd\u6570\uff1a<code>handle_irq<\/code>\uff0c\u8fd8\u6709\u4e00\u4e2a<code>action\u94fe\u8868<\/code>\u3002<\/p>\n<p><code>irq_desc<\/code>\u00a0\u6570\u7ec4\u7ed3\u6784\u94fe\u8def\u5982\u4e0b\u56fe\uff1a<\/p>\n<p><img src=\"assets\/5da9ab448e1ff453afeadff8ddce9fcc_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"11-\u4e2d\u65ad\u5904\u7406\u51fd\u6570handle_irq\">1.1 \u4e2d\u65ad\u5904\u7406\u51fd\u6570handle_irq<a class=\"anchor\" href=\"#11-%e4%b8%ad%e6%96%ad%e5%a4%84%e7%90%86%e5%87%bd%e6%95%b0handle_irq\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"111-\u5171\u4eab\u4e2d\u65ad\u6982\u5ff5\u5f15\u5165\">1.1.1 \u5171\u4eab\u4e2d\u65ad\u6982\u5ff5\u5f15\u5165<a class=\"anchor\" href=\"#111-%e5%85%b1%e4%ba%ab%e4%b8%ad%e6%96%ad%e6%a6%82%e5%bf%b5%e5%bc%95%e5%85%a5\" aria-label=\"Link\"><\/a><\/h3>\n<p>\uff1a<br>\n<img src=\"assets\/b65bbc426ceb6a81004e96f5edcf0b48_MD5.png\" alt=\"img\" \/><\/p>\n<ol>\n<li>\u4e0a\u56fe\u4e00\u4e2agpio\u6309\u952e\u8fde\u63a5gpio\u6a21\u5757\u7b2c\u4e00\u4e2a\u5f15\u811a1\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u8be5\u5f15\u811a\uff0c\u5f53\u7535\u5e73\u53d1\u751f\u53d8\u5316\u65f6\uff0c\u8ba9\u8be5\u5f15\u811a\u4ea7\u751f\u4e2d\u65ad\uff0c\u90a3\u4e48gpio\u6a21\u5757\u4f1a\u4e0a\u62a5\u4e2d\u65ad\u5230gic\u6a21\u5757, gic\u6a21\u5757\u7ee7\u7eed\u4e2d\u65adcpu\u3002<\/li>\n<li>\u540c\u7406\u5f53\u4e00\u4e2a\u5916\u90e8\u8bbe\u5907\u7f51\u5361\u548c\u8be5gpio\u6309\u952e\u53ef\u4ee5\u5171\u4eab\u4e00\u4e2a\u4e2d\u65ad\uff0c\u4e5f\u63a5\u5230gpio\u6a21\u5757\u7b2c\u4e00\u4e2a\u5f15\u811a1\uff0cgpio\u6a21\u5757\u4f1a\u4e0a\u62a5\u4e2d\u65ad\u5230gic\u6a21\u5757, gic\u6a21\u5757\u7ee7\u7eed\u4e2d\u65adcpu\u3002\u8fd9\u91cc\u5c31\u7528\u5230\u4e86\u5171\u4eab\u4e2d\u65ad\u7684\u6982\u5ff5\u3002<\/li>\n<\/ol>\n<p>\u53ef\u4ee5\u770b\u5230\u4e2d\u65ad\u7684\u89e6\u53d1\u65f6\u4ece\u5de6\u5230\u53f3\u7684\u8fc7\u7a0b\uff0c\u90a3\u4e48cpu\u8fdb\u884c\u54cd\u5e94\u4e2d\u65ad\u8bf7\u6c42\u65f6\u5c31\u662f\u4ece\u53f3\u5230\u5de6\u7684\u8fc7\u7a0b\u3002<\/p>\n<ol>\n<li>\n<p>cpu\u8bfb\u53d6GIC\u63a7\u5236\u5668\uff0c\u5224\u6bb5\u4e2d\u65ad\u53f7\uff0c\u5982\u679c\u662fA\u53f7\u4e2d\u65ad\u8bf4\u660e\u662f\u6765\u6e90\u4e8e<code>gpio\u6a21\u5757<\/code>\uff0c\u5982\u679c\u662f<code>A'<\/code>\u4e2d\u65ad\uff0c\u8bf4\u660e\u6765\u6e90\u4e8e<code>\u5176\u4ed6\u6a21\u5757<\/code>\u3002<\/p>\n<\/li>\n<li>\n<p>A\u53f7\u4e2d\u65ad\u7684\u6765\u6e90\u6709\u5f88\u591a\u79cd\uff0c\u6709<code>gpio0,gpio1....<\/code>\uff0c \u53c8\u4f1a\u4ecegpio\u63a7\u5236\u5bc4\u5b58\u5668\u6765\u8fa8\u522b\u5012\u662f\u662f\u54ea\u4e00\u4e2agpio\u4ea7\u751f\u7684\u4e2d\u65ad\uff0c\u6bd4\u5982\u662fB\u53f7\u4e2d\u65ad<\/p>\n<\/li>\n<li>\n<p>B\u53f7\u4e2d\u65ad\u7684\u6765\u6e90\u6709\u5f88\u591a\u79cd\uff0c\u6709<code>\u6309\u952e\uff0c\u7f51\u5361...<\/code><\/p>\n<\/li>\n<\/ol>\n<h3 id=\"112-\u4e2d\u65ad\u7684\u5904\u7406\u51fd\u6570\u6765\u6e90\">1.1.2 \u4e2d\u65ad\u7684\u5904\u7406\u51fd\u6570\u6765\u6e90<a class=\"anchor\" href=\"#112-%e4%b8%ad%e6%96%ad%e7%9a%84%e5%a4%84%e7%90%86%e5%87%bd%e6%95%b0%e6%9d%a5%e6%ba%90\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u4e2d\u65ad\u5904\u7406\u51fd\u6570\u6765\u6e90\u6709\u4e09\uff1a<\/p>\n<ol>\n<li>\n<p>GIC \u7684\u5904\u7406\u51fd\u6570\uff1a<br>\nCPU\u4ece\u5f02\u5e38\u5411\u91cf\u8868\u4e2d\u8c03\u7528<code>handle_arch_irq<\/code>\uff0c\u8fd9\u4e2a\u51fd\u6570\u6307\u9488\u662f\u6709GIC\u9a71\u52a8\u8bbe\u7f6e\u7684\u3002\u8c03\u7528<code>irq_desc[virq].handle_irq<\/code>\u51fd\u6570\uff0c\u8fd9\u4e5f\u5e94\u8be5\u7531GIC\u9a71\u52a8\u63d0\u4f9b\u3002\n\u4f8b\u5982 GIC \u4e2d\u65ad CPU \u65f6\uff0cCPU \u8bfb\u53d6 GIC \u72b6\u6001\u5f97\u5230\u4e2d\u65ad A\u3002\u5047\u8bbe\u00a0<code>irq_desc[A].handle_irq \u662f XXX_gpio_irq_handler<\/code>(XXX \u6307\u5382\u5bb6)\uff0c\u8fd9\u4e2a\u51fd\u6570\u9700\u8981\u8bfb\u53d6\u82af\u7247\u7684 GPIO \u63a7\u5236\u5668\uff0c\u7ec6\u5206\u53d1\u751f\u7684\u662f\u54ea\u4e00\u4e2a GPIO \u4e2d\u65ad(\u5047\u8bbe\u662fB)\uff0c\u518d\u53bb\u8c03\u7528\u00a0<code>irq_desc[B]. handle_irq<\/code>\u3002<\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-4-\u8bbe\u5907\u6811\u4e2d\u7684\u4e2d\u65ad\u63cf\u8ff0\u4e0e\u89e3\u6790","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-4-%E8%AE%BE%E5%A4%87%E6%A0%91%E4%B8%AD%E7%9A%84%E4%B8%AD%E6%96%AD%E6%8F%8F%E8%BF%B0%E4%B8%8E%E8%A7%A3%E6%9E%90\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-4-%E8%AE%BE%E5%A4%87%E6%A0%91%E4%B8%AD%E7%9A%84%E4%B8%AD%E6%96%AD%E6%8F%8F%E8%BF%B0%E4%B8%8E%E8%A7%A3%E6%9E%90\/","description":"<h1 id=\"1-\u4e2d\u65ad\u5728\u8bbe\u5907\u6811\u4e2d\u7684\u63cf\u8ff0\">1 \u4e2d\u65ad\u5728\u8bbe\u5907\u6811\u4e2d\u7684\u63cf\u8ff0<a class=\"anchor\" href=\"#1-%e4%b8%ad%e6%96%ad%e5%9c%a8%e8%ae%be%e5%a4%87%e6%a0%91%e4%b8%ad%e7%9a%84%e6%8f%8f%e8%bf%b0\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"11-\u591a\u7ea7\u4e2d\u65ad\u63a7\u5236\u5668\">1.1 \u591a\u7ea7\u4e2d\u65ad\u63a7\u5236\u5668<a class=\"anchor\" href=\"#11-%e5%a4%9a%e7%ba%a7%e4%b8%ad%e6%96%ad%e6%8e%a7%e5%88%b6%e5%99%a8\" aria-label=\"Link\"><\/a><\/h2>\n<p>GPIO1 \u8fde\u63a5\u5230 GIC\uff0cGPIO2 \u8fde\u63a5\u5230 GIC\uff0c\u6240\u4ee5 GPIO1 \u7684\u7236\u4e2d\u65ad\u63a7\u5236\u5668\u662f GIC\uff0cGPIO2\u7684\u7236\u4e2d\u65ad\u63a7\u5236\u5668\u4e5f\u662f GIC\u3002\u5047\u8bbe GPIO1 \u6709 32 \u4e2a\u4e2d\u65ad\u6e90\uff0c\u4f46\u662f\u5b83\u628a\u5176\u4e2d\u7684 16 \u4e2a\u6c47\u805a\u8d77\u6765\u5411 GIC \u53d1\u51fa\u4e00\u4e2a\u4e2d\u65ad\uff0c\u628a\u53e6\u5916 16 \u4e2a\u6c47\u805a\u8d77\u6765\u5411 GIC \u53d1\u51fa\u53e6\u4e00\u4e2a\u4e2d\u65ad\u3002\u8fd9\u5c31\u610f\u5473\u7740 GPIO1 \u4f1a\u7528\u5230 GIC \u7684\u4e24\u4e2a\u4e2d\u65ad\uff0c\u4f1a\u6d89\u53ca GIC \u91cc\u7684 2 \u4e2a\u00a0<code>hwirq<\/code> \u3002\n<img src=\"assets\/a532f5f4a8b745ea6820bca75c9b2f69_MD5.png\" alt=\"img\" \/><\/p>\n<h2 id=\"12-\u8bbe\u5907\u6811\u4e2d\u65ad\u76f8\u5173\u5c5e\u6027\">1.2 \u8bbe\u5907\u6811\u4e2d\u65ad\u76f8\u5173\u5c5e\u6027<a class=\"anchor\" href=\"#12-%e8%ae%be%e5%a4%87%e6%a0%91%e4%b8%ad%e6%96%ad%e7%9b%b8%e5%85%b3%e5%b1%9e%e6%80%a7\" aria-label=\"Link\"><\/a><\/h2>\n<ul>\n<li>\n<p><code>interrupt-controller<\/code>\n\u8bbe\u5907\u6811\u4e2d\uff0c\u4e2d\u65ad\u63a7\u5236\u5668\u8282\u70b9\u4e2d\u5fc5\u987b\u4f7f\u7528\u6b64\u5c5e\u6027\u8868\u660e\u5b83\u662f\u00a0<code>\u201c\u4e2d\u65ad\u63a7\u5236\u5668\u201d<\/code>\u3002<br>\n<img src=\"assets\/f8cf3c6c372d3798fa3352e9c6138dfa_MD5.png\" alt=\"img\" \/><\/p>\n<\/li>\n<li>\n<p><code>interrupt-cells<\/code>\n\u5b9a\u4e49\u5b50\u8282\u70b9\u4e2dinterrupts\u5c5e\u6027\u4f7f\u7528\u51e0\u4e2acell\uff0c\u6bcf\u4e2acell\u7684\u63cf\u8ff0\u53c2\u8003\u5177\u4f53\u7684\u9a71\u52a8\u6587\u6863\uff0c\u5982<code>arm,cortex-a15-gic<\/code>\u3002<\/p>\n<\/li>\n<li>\n<p><code>interrupt-parent<\/code>\n\u5b9a\u4e49\u4e2d\u65ad\u63a7\u5236\u5668\u7684\u7236\u8282\u70b9\uff0c\u9700\u8981\u6839\u636e\u591a\u7ea7\u4e2d\u65ad\u63a7\u5236\u5668\u7684\u7ed3\u6784\u8bbe\u7f6e<br>\n<img src=\"assets\/bf4f54f03d0a393baeca4c9351a9e2b0_MD5.png\" alt=\"img\" \/><\/p>\n<\/li>\n<li>\n<p><code>interrupts<\/code>\n\u5b9a\u4e49\u8981\u4f7f\u7528\u7684\u5177\u4f53\u4e2d\u65ad\u53f7\u53ca\u89e6\u53d1\u65b9\u5f0f\uff0ccell\u4e2a\u6570\u7531\u7236\u4e2d\u65ad\u63a7\u5236\u5668\u8282\u70b9\u7684<code>interrupt-cells<\/code>\u5c5e\u6027\u5b9a\u4e49\u3002\n<img src=\"assets\/3812cc5a6cc5d11f76d958a926d24c66_MD5.png\" alt=\"img\" \/><\/p>\n<\/li>\n<\/ul>\n<h2 id=\"13-dts\u4e2d\u83b7\u53d6\u4e2d\u65ad\">1.3 dts\u4e2d\u83b7\u53d6\u4e2d\u65ad<a class=\"anchor\" href=\"#13-dts%e4%b8%ad%e8%8e%b7%e5%8f%96%e4%b8%ad%e6%96%ad\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"131-\u5bf9\u4e8e-platform_device\">1.3.1 \u5bf9\u4e8e platform_device<a class=\"anchor\" href=\"#131-%e5%af%b9%e4%ba%8e-platform_device\" aria-label=\"Link\"><\/a><\/h3>\n<p>\u5f53\u5e73\u53f0\u8bbe\u5907\u548c\u5e73\u53f0\u9a71\u52a8match\u4e0a\u540e\uff0c\u4e00\u4e2a\u8282\u70b9\u80fd\u88ab\u8f6c\u6362\u4e3a\u00a0<code>platform_device<\/code>\uff0c\u8c03\u7528<code>platform_get_resource<\/code>\u53ef\u83b7\u53d6\u8282\u70b9\u8d44\u6e90\u4fe1\u606f\u3002<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">extern<\/span> <span style=\"color:#66d9ef\">struct<\/span> resource <span style=\"color:#f92672\">*<\/span><span style=\"color:#a6e22e\">platform_get_resource<\/span>(<span style=\"color:#66d9ef\">struct<\/span> platform_device <span style=\"color:#f92672\">*<\/span>,<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span>);<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/47d1d87e0e9264b41c96e635893981c7_MD5.png\" alt=\"img\" \/>\n<img src=\"assets\/bbb3746aed4422b6f90476a824be8cf0_MD5.png\" alt=\"img\" \/><\/p>\n<h3 id=\"132-\u5bf9\u4e8e-i2c-\u8bbe\u5907spi-\u8bbe\u5907\">1.3.2 \u5bf9\u4e8e I2C \u8bbe\u5907\u3001SPI \u8bbe\u5907<a class=\"anchor\" href=\"#132-%e5%af%b9%e4%ba%8e-i2c-%e8%ae%be%e5%a4%87spi-%e8%ae%be%e5%a4%87\" aria-label=\"Link\"><\/a><\/h3>\n<p>I2C \u603b\u7ebf\u9a71\u52a8\u5728\u5904\u7406\u8bbe\u5907\u6811\u91cc\u7684 I2C \u5b50\u8282\u70b9\u65f6\uff0cLinux\u603b\u7ebf\u4f1a\u81ea\u52a8\u5904\u7406\u5176\u4e2d\u7684\u4e2d\u65ad\u4fe1\u606f\u3002\u4e00\u4e2a I2C \u8bbe\u5907\u4f1a\u88ab\u8f6c\u6362\u4e3a\u4e00\u4e2a\u00a0<code>i2c_client<\/code>\u7ed3\u6784\u4f53\uff0c\u4e2d\u65ad\u53f7\u4f1a\u4fdd\u5b58\u5728 i2c_client \u7684 irq \u6210\u5458\u91cc\uff0c\u4ee3\u7801\u5982\u4e0b(<code>drivers\/i2c\/i2c-core.c<\/code>)\uff0cprobe\u51fd\u6570\u91cc\u9762<code>of_irq_get<\/code>\u51fd\u6570\u4f1a\u6839\u636edts\u4e2d\u7684i2c\u8282\u70b9\u83b7\u53d6\u4e2d\u65ad\u8d44\u6e90\u5e76\u4fdd\u5b58\u5728<code>i2c_client-&gt;irq<\/code>\u4e2d\u3002<br>\n<img src=\"assets\/6612468e04dd8dd5414b953d2637a373_MD5.png\" alt=\"img\" \/>\n<img src=\"assets\/7b91f0f92454458c8cc4c67edb78ec6f_MD5.png\" alt=\"img\" \/>\nSPI\u603b\u7ebf\u540c\u7406\uff0c\u4e00\u4e2a SPI \u8bbe\u5907\u4f1a\u88ab\u8f6c\u6362\u4e3a\u4e00\u4e2a<code>spi_device<\/code>\u7ed3\u6784\u4f53\uff0c\u4e2d\u65ad\u53f7\u4f1a\u4fdd\u5b58\u5728\u00a0<code>spi_device<\/code>\u00a0\u7684 irq \u6210\u5458\u91cc\uff0c\u4ee3\u7801\u5982\u4e0b(<code>drivers\/spi\/spi.c<\/code>)\uff1a<br>\n<img src=\"assets\/b23d19a794d25e54e6c2ed21c38b5975_MD5.png\" alt=\"img\" \/><\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-5-\u4e2d\u65ad\u5904\u7406-tasklet","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-5-%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86-tasklet\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-5-%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86-tasklet\/","description":"<h1 id=\"1-tasklet\u5f15\u5165\">1 tasklet\u5f15\u5165<a class=\"anchor\" href=\"#1-tasklet%e5%bc%95%e5%85%a5\" aria-label=\"Link\"><\/a><\/h1>\n<p><a href=\"%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-1-linux%E4%B8%AD%E6%96%AD%E4%BB%8B%E7%BB%8D\/\">\u4e2d\u65ad\u5b50\u7cfb\u7edf-1-linux\u4e2d\u65ad\u4ecb\u7ecd<\/a>\u4ecb\u7ecd\u4e86linux\u4e2d\u7684\u786c\u4ef6\u4e2d\u65ad\u548c\u8f6f\u4ef6\u4e2d\u65ad\uff0ccpu\u4f1a\u5148\u5904\u7406\u786c\u4ef6\u4e2d\u65ad\uff0c\u7136\u540e\u5904\u7406\u8f6f\u4ef6\u4e2d\u65ad\u3002<\/p>\n<p>\u7b80\u5355\u8bf4\u53ef\u4ee5\u8ba4\u4e3a\u5185\u6838\u4e2d\u6709\u4e00\u4e2a\u6570\u7ec4softirq[], \u91cc\u9762\u6709\u5f88\u591a\u9879\uff0c\u67d0\u4e00\u9879\u5bf9\u5e94timer\uff0c\u67d0\u4e00\u9879\u8868\u793atasklet, \u6bcf\u4e00\u9879\u4e2d\u90fd\u6709\u4e00\u4e2a<code>.action<\/code>\u51fd\u6570\uff0c\u5f53\u5185\u6838\u5904\u7406\u5b8c\u67d0\u4e00\u4e2a\u786c\u4ef6\u4e2d\u65ad\u4e4b\u540e\uff0c\u5904\u7406\u8f6f\u4ef6\u4e2d\u65ad\u65f6\u4f1a\u627e\u5230\u5bf9\u5e94\u7684\u9879\uff0c\u627e\u5230<code>.action<\/code>\u51fd\u6570\u6267\u884c\u3002<\/p>\n<p>\u5bf9\u4e8e<code>tasklet<\/code>\u8f6f\u4ef6\u4e2d\u65ad\uff0c\u5b83\u7684<code>.action<\/code>\u51fd\u6570\u5bf9\u5e94<code>tasklet_action<\/code>,\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4ece\u94fe\u8868\u91cc\u53d6\u51fa\u6bcf\u4e00\u4e2a<code>tasklet<\/code>\u7ed3\u6784\uff0c\u6267\u884c\u91cc\u9762\u7684<code>.func<\/code>\u51fd\u6570\u3002<\/p>\n<p>\u5185\u6838\u5904\u7406\u786c\u4ef6\u4e2d\u65ad\u7684\u8fc7\u7a0b\u53eb\u505a\u4e2d\u65ad\u4e0a\u534a\u90e8\uff0c\u5904\u7406\u8f6f\u4ef6\u4e2d\u65ad\u7684\u8fc7\u7a0b\u53eb\u505a\u4e2d\u65ad\u4e0b\u534a\u90e8\u3002\u4e0a\u534a\u90e8\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4e2d\u65ad\u662f\u7981\u6b62\u7684\uff0c\u8fd9\u91cc\u9632\u6b62\u4e2d\u65ad\u5d4c\u5957\uff0c\u4e5f\u5c31\u662f\u8bf4\u6765\u4e86\u66f4\u7d27\u6025\u7684\u786c\u4ef6\u4e2d\u65ad\uff0c\u4e5f\u8981\u7b49\u8fd9\u4e2a\u4e0a\u534a\u90e8\u5206\u5904\u7406\u5b8c\uff0c\u4e0a\u534a\u90e8\u4e00\u822c\u5904\u7406\u91cd\u8981\u7d27\u6025\u4e8b\u60c5\u3002\u4e0b\u534a\u90e8\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4e2d\u65ad\u662f\u4f7f\u80fd\u7684\uff0c\u56e0\u6b64\u5728\u4e0b\u534a\u90e8\u7684\u5904\u7406\u8fc7\u7a0b\u5b83\u662f\u53ef\u4ee5\u54cd\u5e94\u5176\u4ed6\u4e2d\u65ad\u3002\u56e0\u6b64\u5982\u679c\u6709\u4e0d\u7d27\u6025\u4f46\u662f\u8017\u65f6\u7684\u4e8b\u60c5\u653e\u5728\u4e0b\u534a\u90e8\u6765\u5904\u7406\uff0c\u6bd4\u5982\u7528tasklet\u3002<br>\n<img src=\"assets\/4b5a5e18214c3846ee701dec69b4ea5e_MD5.webp\" alt=\"img\" \/><\/p>\n<h1 id=\"2-tasklet\u662f\u5982\u4f55\u4ece\u4ece\u4e0a\u534a\u90e8\u8c03\u5ea6\u5230\u4e0b\u534a\u90e8\u5206\">2 tasklet\u662f\u5982\u4f55\u4ece\u4ece\u4e0a\u534a\u90e8\u8c03\u5ea6\u5230\u4e0b\u534a\u90e8\u5206<a class=\"anchor\" href=\"#2-tasklet%e6%98%af%e5%a6%82%e4%bd%95%e4%bb%8e%e4%bb%8e%e4%b8%8a%e5%8d%8a%e9%83%a8%e8%b0%83%e5%ba%a6%e5%88%b0%e4%b8%8b%e5%8d%8a%e9%83%a8%e5%88%86\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5982\u4f55\u4f7f\u80fd\u6216\u8005\u8bf4\u8c03\u5ea6tasklet\u5462\uff1f\u5b83\u5176\u5b9e\u5c31\u662f\u628a\u4e00\u4e2atasklet\u653e\u5165\u5230\u5185\u6838tasklet\u94fe\u8868\u4e2d\uff0c\u5047\u5982\u786c\u4ef6\u4e2d\u65ad\u670d\u52a1\u51fd\u6570func_A(), \u8f6f\u4ef6\u4e2d\u65ad\u4e2d\u4e5f\u5c31\u662f\u4e0b\u534a\u90e8\u653e\u5165tasklet\u4e2d\u65ad\u7684\u670d\u52a1\u51fd\u6570\u4e3afunc_B(), \u90a3\u4e48\u53ef\u4ee5\u60f3\u8c61\u770bA\u548cB\u88ab\u8c03\u5ea6\u7684\u6b21\u6570\u56e0\u8be5\u662f\u591a\u5bf91\u7684\u5173\u7cfb\uff0c\u5e94\u4e3a\u8f6f\u4ef6\u4e2d\u65ad\u7531\u4e8e\u662f\u4f7f\u80fd\u4e2d\u65ad\u7684\uff0c\u56e0\u6b64func_A()\u5bf9\u5e94\u7684\u786c\u4ef6\u53c8\u53ef\u80fd\u4f1a\u4ea7\u751f\u786c\u4ef6\u4e2d\u65ad\u3002<\/p>\n<h1 id=\"3-tasklet\u4f7f\u7528\">3 tasklet\u4f7f\u7528<a class=\"anchor\" href=\"#3-tasklet%e4%bd%bf%e7%94%a8\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"31-\u521d\u59cb\u5316tasklet\">3.1 \u521d\u59cb\u5316tasklet<a class=\"anchor\" href=\"#31-%e5%88%9d%e5%a7%8b%e5%8c%96tasklet\" aria-label=\"Link\"><\/a><\/h2>\n<h3 id=\"310-tasklet\u7ed3\u6784\u4f53\">3.1.0 tasklet\u7ed3\u6784\u4f53<a class=\"anchor\" href=\"#310-tasklet%e7%bb%93%e6%9e%84%e4%bd%93\" aria-label=\"Link\"><\/a><\/h3>\n<p><img src=\"assets\/bd286283bb932cb9f7d9929b99f4abc7_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> tasklet_struct { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> tasklet_struct <span style=\"color:#f92672\">*<\/span>next;<span style=\"color:#75715e\">\/\/tasklet\u94fe\u8868 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> state;<span style=\"color:#75715e\">\/\/RUN\u8868\u793a\u6b63\u5728\u8fd0\u884c\uff0cSCHED\u8868\u793a\u5df2\u88ab\u8c03\u5ea6 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">atomic_t<\/span> count;<span style=\"color:#75715e\">\/\/0\u8868\u793a\u5904\u4e8e\u6fc0\u6d3b\u72b6\u6001\uff0c\u4e0d\u4e3a0\u8868\u793a\u8be5tasklet\u7981\u6b62\uff0c\u4e0d\u5141\u8bb8\u6267\u884c \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">void<\/span> (<span style=\"color:#f92672\">*<\/span>func)(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>);<span style=\"color:#75715e\">\/\/\u5904\u7406\u51fd\u6570\uff0c\u7b49\u6548softirq\u7684action\u51fd\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> data; \n<\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p><code>\\include\\linux\\interrupt.h<\/code><br>\nstate \u6709 2 \u4f4d\uff1a<br>\n<img src=\"assets\/18043b94dc7344e05a50874ed51841a3_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u25fc<\/span> bit0 <span style=\"color:#960050;background-color:#1e0010\">\u8868\u793a<\/span> TASKLET_STATE_SCHED \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7b49\u4e8e<\/span> <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u65f6\u8868\u793a\u5df2\u7ecf\u6267\u884c\u4e86<\/span> tasklet_schedule <span style=\"color:#960050;background-color:#1e0010\">\u628a\u8be5<\/span> tasklet <span style=\"color:#960050;background-color:#1e0010\">\u653e\u5165\u961f\u5217\u4e86\uff1b<\/span>(<span style=\"color:#960050;background-color:#1e0010\">\u7b49\u4e8e<\/span><span style=\"color:#ae81ff\">1<\/span><span style=\"color:#960050;background-color:#1e0010\">\u8868\u793a\u653e\u5165\u961f\u5217\u5c31\u7eea\u4e86<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span>tasklet_schedule <span style=\"color:#960050;background-color:#1e0010\">\u4f1a\u5224\u65ad\u8be5\u4f4d\uff0c\u5982\u679c\u5df2\u7ecf\u7b49\u4e8e<\/span> <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u90a3\u4e48\u5b83\u5c31\u4e0d\u4f1a\u518d\u6b21\u628a<\/span>tasklet <span style=\"color:#960050;background-color:#1e0010\">\u653e\u5165\u961f\u5217\u3002<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u25fc<\/span> bit1 <span style=\"color:#960050;background-color:#1e0010\">\u8868\u793a<\/span> TASKLET_STATE_RUN \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7b49\u4e8e<\/span> <span style=\"color:#ae81ff\">1<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u65f6\uff0c\u8868\u793a\u6b63\u5728\u8fd0\u884c<\/span> tasklet <span style=\"color:#960050;background-color:#1e0010\">\u4e2d\u7684<\/span> func <span style=\"color:#960050;background-color:#1e0010\">\u51fd\u6570\uff1b\u51fd\u6570\u6267\u884c\u5b8c\u540e\u5185\u6838\u4f1a\u628a\u8be5\u4f4d\u6e05<\/span> <span style=\"color:#ae81ff\">0<\/span><span style=\"color:#960050;background-color:#1e0010\">\u3002<\/span><\/span><\/span><\/code><\/pre><\/div><p>count \u8868\u793a\u8be5 tasklet \u662f\u5426\u4f7f\u80fd\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#960050;background-color:#1e0010\">\u7b49\u4e8e<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u8868\u793a\u4f7f\u80fd\u4e86\uff0c\u975e<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u8868\u793a\u88ab\u7981\u6b62\u4e86\u3002\u5bf9\u4e8e<\/span> count <span style=\"color:#960050;background-color:#1e0010\">\u975e<\/span> <span style=\"color:#ae81ff\">0<\/span> <span style=\"color:#960050;background-color:#1e0010\">\u7684<\/span> tasklet<span style=\"color:#960050;background-color:#1e0010\">\uff0c\u91cc\u9762\u7684<\/span> func <span style=\"color:#960050;background-color:#1e0010\">\u51fd\u6570\u4e0d\u4f1a\u88ab\u6267\u884c<\/span><\/span><\/span><\/code><\/pre><\/div><h3 id=\"311-tasklet\u94fe\u8868\">3.1.1 tasklet\u94fe\u8868<a class=\"anchor\" href=\"#311-tasklet%e9%93%be%e8%a1%a8\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> tasklet_head { \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> tasklet_struct <span style=\"color:#f92672\">*<\/span>head; \n<\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#66d9ef\">struct<\/span> tasklet_struct <span style=\"color:#f92672\">**<\/span>tail; \n<\/span><\/span><span style=\"display:flex;\"><span>}; \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#a6e22e\">DEFINE_PER_CPU<\/span>(<span style=\"color:#66d9ef\">struct<\/span> tasklet_head, tasklet_vec); <span style=\"color:#75715e\">\/\/kernel\/softirq.c \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#a6e22e\">DEFINE_PER_CPU<\/span>(<span style=\"color:#66d9ef\">struct<\/span> tasklet_head, tasklet_hi_vec); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/\u5bf9\u5e94softirq\u7684TASKLET_SOFTIRQ\u548cHI_SOFTIRQ\uff0c \u4f18\u5148\u7ea7\u5206\u522b\u4e3a6\u548c0\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>tasklet\u6267\u884c\u8fc7\u7a0b\u00a0<code>TASKLET_SOFTIRQ<\/code>\u5bf9\u5e94\u6267\u884c\u51fd\u6570\u4e3a<code>tasklet_action<\/code>\uff0c<code>HI_SOFTIRQ<\/code>\u4e3a<code>tasklet_hi_action<\/code>\u3002<\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-6-\u4e2d\u65ad\u5904\u7406-workqueue","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-6-%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86-workqueue\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-6-%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86-workqueue\/","description":"<h1 id=\"1-\u5de5\u4f5c\u961f\u5217workqueue\u5f15\u5165\">1 \u5de5\u4f5c\u961f\u5217workqueue\u5f15\u5165<a class=\"anchor\" href=\"#1-%e5%b7%a5%e4%bd%9c%e9%98%9f%e5%88%97workqueue%e5%bc%95%e5%85%a5\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5b9a\u65f6\u5668\u3001\u00a0<code>tasklet<\/code>\uff0c\u5b83\u4eec\u90fd\u662f\u5728\u8f6f\u4e2d\u65ad\u4e0a\u4e0b\u6587\u4e2d\u6267\u884c\u7684\u4e14\u65e0\u6cd5\u4f11\u7720\u3002\u90a3\u4e48\u5982\u679c\u4e00\u65e6\u4e2d\u65ad\u8981\u5904\u7406\u8017\u65f6\u590d\u6742\u7684\u64cd\u4f5c\uff0c\u5c31\u4f1a\u957f\u671f\u5360\u7528cpu\u3002\u5982\u679c\u4f7f\u7528\u5185\u6838\u7ebf\u7a0b\u6765\u5904\u7406\u8fd9\u4e9b\u8017\u65f6\u7684\u5de5\u4f5c\uff0c\u90a3\u5c31\u53ef\u4ee5\u89e3\u51b3cpu\u5360\u7528\u95ee\u9898\u3002<br>\nLinux\u5185\u6838\u4e2d<code>\u5de5\u4f5c\u961f\u5217workqueue<\/code>\u5c31\u662f\u7ebf\u7a0b\u5316\u5904\u7406\u7684\u4e00\u79cd\u65b9\u5f0f\uff0c<code>\u201c\u5de5\u4f5c\u961f\u5217\u201d(workqueue)<\/code>, \u5b83\u662f\u5185\u6838\u81ea\u5e26\u7684<code>\u5185\u6838\u7ebf\u7a0b<\/code>\u3002\u8981\u4f7f\u7528<code>\u201c\u5de5\u4f5c\u961f\u5217\u201d<\/code>\uff0c\u53ea\u9700\u8981\u628a<code>\u201c\u5de5\u4f5c\u201d<\/code>\u653e\u5165<code>\u201c\u5de5\u4f5c\u961f\u5217&quot;<\/code>\u4e2d\uff0c\u5bf9\u5e94\u7684\u5185\u6838\u7ebf\u7a0b\u5c31\u4f1a\u53d6\u51fa\u00a0<code>\u201c\u5de5\u4f5c\u201d<\/code>\uff0c\u6267\u884c\u91cc\u9762\u7684\u51fd\u6570\u3002<\/p>\n<p>\u5de5\u4f5c\u961f\u5217\u7684\u5e94\u7528\u573a\u5408\uff1a<br>\n\u8981\u505a\u7684\u4e8b\u60c5\u6bd4\u8f83\u8017\u65f6\uff0c\u751a\u81f3\u53ef\u80fd\u9700\u8981\u4f11\u7720\uff0c\u90a3\u4e48\u53ef\u4ee5\u4f7f\u7528\u5de5\u4f5c\u961f\u5217\u3002<br>\n\u7f3a\u70b9\uff1a\u591a\u4e2a\u5de5\u4f5c(\u51fd\u6570)\u662f\u5728\u67d0\u4e2a\u5185\u6838\u7ebf\u7a0b\u4e2d\u4f9d\u5e8f\u6267\u884c\u7684\uff0c\u524d\u9762\u51fd\u6570\u6267\u884c\u5f88\u6162\uff0c\u5c31\u4f1a\u5f71\u54cd\u5230\u540e\u9762\u7684\u51fd\u6570\u3002<br>\n\u5728\u591a CPU \u7684\u7cfb\u7edf\u4e0b\uff0c\u4e00\u4e2a\u5de5\u4f5c\u961f\u5217\u53ef\u4ee5\u6709\u591a\u4e2a\u5185\u6838\u7ebf\u7a0b\uff0c\u53ef\u4ee5\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u7f13\u89e3\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<p>\u5de5\u961f\u961f\u5217\u7684\u6e90\u7801\u673a\u5236\u5728<code>Linux-4.9.88\\kernel\\workqueue.c<\/code>\uff0c\u5934\u6587\u4ef6\u5728<code>Linux-4.9.88\\include\\linux\\workqueue.h<\/code><\/p>\n<h2 id=\"11-work_struct\u63cf\u8ff0\">1.1 work_struct\u63cf\u8ff0<a class=\"anchor\" href=\"#11-work_struct%e6%8f%8f%e8%bf%b0\" aria-label=\"Link\"><\/a><\/h2>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> work_struct { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">atomic_long_t<\/span> data; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> list_head entry; \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">work_func_t<\/span> func; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#ifdef CONFIG_LOCKDEP \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">struct<\/span> lockdep_map lockdep_map; \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#endif \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>};<\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/224e394caba6e4e32bd7d7c8897e7c81_MD5.webp\" alt=\"img\" \/>\n<img src=\"assets\/371b91f1080e79bd8c69e538bb199f23_MD5.webp\" alt=\"img\" \/>\n\u8868\u793a\u4e00\u4e2awork\u7ed3\u6784\uff0c\u4e00\u4e2a\u4efb\u52a1\u6216\u8005\u53eb\u505a\u4e00\u4e2a\u5de5\u4f5c\uff0c\u91cc\u9762\u7684<code>.func<\/code>\u8868\u793a\u662f\u8981\u6267\u884c\u7684\u4efb\u52a1\u51fd\u6570\uff0c\u7c7b\u578b\u5b9a\u4e49\u4e3a\uff1a<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">typedef<\/span> <span style=\"color:#a6e22e\">void<\/span> (<span style=\"color:#f92672\">*<\/span><span style=\"color:#66d9ef\">work_func_t<\/span>)(<span style=\"color:#66d9ef\">struct<\/span> work_struct <span style=\"color:#f92672\">*<\/span>work);<\/span><\/span><\/code><\/pre><\/div><h3 id=\"111-\u5b9a\u4e49\u4e00\u4e2awork\">1.1.1 \u5b9a\u4e49\u4e00\u4e2awork<a class=\"anchor\" href=\"#111-%e5%ae%9a%e4%b9%89%e4%b8%80%e4%b8%aawork\" aria-label=\"Link\"><\/a><\/h3>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define DECLARE_WORK(n, f) \\ \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> work_struct n <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">__WORK_INITIALIZER<\/span>(n, f) \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">#define DECLARE_DELAYED_WORK(n, f) \\ \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">struct<\/span> delayed_work n <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">__DELAYED_WORK_INITIALIZER<\/span>(n, f, <span style=\"color:#ae81ff\">0<\/span>) \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/\u7b2c 1 \u4e2a\u5b8f\u662f\u7528\u6765\u5b9a\u4e49\u4e00\u4e2a work_struct \u7ed3\u6784\u4f53\uff0c\u8981\u6307\u5b9a\u5b83\u7684\u51fd\u6570\u3002 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/\u7b2c 2 \u4e2a\u5b8f\u7528\u6765\u5b9a\u4e49\u4e00\u4e2a delayed_work \u7ed3\u6784\u4f53\uff0c\u4e5f\u8981\u6307\u5b9a\u5b83\u7684\u51fd\u6570\u3002\u6240\u4ee5\u201cdelayed\u201d \n<\/span><\/span><\/span><span style=\"display:flex;\"><span> <span style=\"color:#75715e\">\/\/ \uff0c\u610f\u601d\u5c31\u662f\u8bf4\u8981\u8ba9\u5b83\u8fd0\u884c\u65f6\uff0c\u53ef\u4ee5\u6307\u5b9a\uff1a\u67d0\u6bb5\u65f6\u95f4\u4e4b\u540e\u4f60\u518d\u6267\u884c\n<\/span><\/span><\/span><\/code><\/pre><\/div><p><img src=\"assets\/a2706a597a30f1a3624502a77ceead8c_MD5.webp\" alt=\"img\" \/>\n\u5b9a\u4e49\u4e00\u4e2awork\u4e3a<code>n<\/code>, \u5e76\u4e14\u521d\u59cb\u5316\u51fd\u6570<code>f<\/code>.<\/p>"},{"title":"\u4e2d\u65ad\u5b50\u7cfb\u7edf-7-\u4e2d\u65ad\u5904\u7406-threaded_irq","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-7-%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86-threaded_irq\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E4%B8%AD%E6%96%AD%E5%AD%90%E7%B3%BB%E7%BB%9F-7-%E4%B8%AD%E6%96%AD%E5%A4%84%E7%90%86-threaded_irq\/","description":"<h1 id=\"1-threaded_irq\u5f15\u5165\">1 threaded_irq\u5f15\u5165<a class=\"anchor\" href=\"#1-threaded_irq%e5%bc%95%e5%85%a5\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5de5\u4f5c\u961f\u5217\u7528\u8d77\u6765\u633a\u7b80\u5355\uff0c\u4f46\u662f\u5b83\u6709\u4e00\u4e2a\u7f3a\u70b9\uff1a\u5de5\u4f5c\u961f\u5217\u4e2d\u6709\u591a\u4e2a work\uff0c\u524d\u4e00\u4e2a work \u6ca1\u5904\u7406\u5b8c\u4f1a\u5f71\u54cd\u540e\u9762\u7684 work\u6267\u884c\uff0c\u5bfc\u81f4\u540e\u9762\u7684work\u6ca1\u6cd5\u5feb\u901f\u54cd\u5e94\u3002\u90a3\u4e48\u53ef\u4ee5\u518d\u5185\u6838\u81ea\u5df1\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b\u6765\u5355\u72ec\u5904\u7406\uff0c\u4e0d\u8ddf\u522b\u7684 work \u51d1\u5728\u4e00\u5757\u4e86\u3002\u6bd4\u5982\u5728 Linux \u7cfb\u7edf\u4e2d\uff0c\u5bf9\u4e8e\u5b58\u50a8\u8bbe\u5907\u6bd4\u5982 SD\/TF \u5361\uff0c\u5b83\u7684\u9a71\u52a8\u7a0b\u5e8f\u5c31\u662f\u8fd9\u6837\u505a\u7684\uff0c\u5b83\u6709\u81ea\u5df1\u7684\u5185\u6838\u7ebf\u7a0b\u3002\u7528<code>kthread_creat<\/code>\u521b\u5efa\u5185\u6838\u7ebf\u7a0b\u3002<br>\n\u5bf9\u4e8e\u4e2d\u65ad\u5904\u7406\uff0c\u8fd8\u6709\u53e6\u4e00\u79cd\u65b9\u6cd5\uff1a<code>threaded irq<\/code>\uff0c\u7ebf\u7a0b\u5316\u7684\u4e2d\u65ad\u5904\u7406\u3002\u4e2d\u65ad\u7684\u5904\u7406\u4ecd\u7136\u53ef\u4ee5\u8ba4\u4e3a\u5206\u4e3a\u4e0a\u534a\u90e8\u3001\u4e0b\u534a\u90e8\u3002\u4e0a\u534a\u90e8\u7528\u6765\u5904\u7406\u7d27\u6025\u7684\u4e8b\u60c5\uff0c\u4e0b\u534a\u90e8\u7528\u4e00\u4e2a\u5185\u6838\u7ebf\u7a0b\u6765\u5904\u7406\uff0c\u8fd9\u4e2a\u5185\u6838\u7ebf\u7a0b\u4e13\u7528\u4e8e\u8fd9\u4e2a\u4e2d\u65ad\u3002<\/p>\n<h1 id=\"2-threaded_irq\u4f7f\u7528\">2 threaded_irq\u4f7f\u7528<a class=\"anchor\" href=\"#2-threaded_irq%e4%bd%bf%e7%94%a8\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u524d\u9762\u7684\u6587\u7ae0\u5df2\u7ecf\u63d0\u5230\u4e86<code>threaded_irq<\/code>\u3002<\/p>\n<ol>\n<li>\u53ef\u4ee5\u53ea\u63d0\u4f9b\u00a0<code>thread_fn<\/code>\uff0c\u5185\u6838\u4f1a\u63d0\u4f9b\u9ed8\u8ba4\u7684\u4e0a\u534a\u90e8\u5904\u7406\u51fd\u6570<code>irq_default_primary_handler<\/code>,\u8be5\u51fd\u6570\u53ea\u662f\u8fd4\u56de\u4e00\u4e2a<strong>IRQ_WAKE_THREAD<\/strong>\u3002\u53d1\u751f\u4e2d\u65ad\u65f6\uff0c\u7cfb\u7edf\u4f1a\u7acb\u523b\u8c03\u7528 handler \u51fd\u6570\uff0c\u7136\u540e\u5524\u9192\u67d0\u4e2a\u5185\u6838\u7ebf\u7a0b\uff0c\u5185\u6838\u7ebf\u7a0b\u518d\u6765\u6267\u884c<code>thread_fn<\/code>\u00a0\u51fd\u6570\u3002<\/li>\n<li>\u4e5f\u53ef\u4ee5\u65e2\u63d0\u4f9b<code>handler<\/code>\u51fd\u6570\uff0c\u4e5f\u63d0\u4f9b<code>thread_fn<\/code>\u51fd\u6570\u3002\u7b49\u786c\u4ef6\u4e2d\u65ad\u5230\u6765\uff0c\u5148\u6267\u884c<code>handler<\/code>\u51fd\u6570\uff0chandler\u51fd\u6570\u4e2d\u8fd4\u56de<strong>IRQ_WAKE_THREAD<\/strong>\u53bb\u5524\u9192\u4e2d\u65ad\u7ebf\u7a0b\u51fd\u6570<code>thread_fn<\/code>\u3002<\/li>\n<\/ol>\n<p><img src=\"assets\/67f8c1c31fdf3f25299413a750e9e895_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">extern<\/span> <span style=\"color:#66d9ef\">int<\/span> __must_check \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">devm_request_threaded_irq<\/span>(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t <span style=\"color:#66d9ef\">irq_handler_t<\/span> handler, <span style=\"color:#66d9ef\">irq_handler_t<\/span> thread_fn, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> irqflags, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>devname, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev_id); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/include\\linux\\interrupt.h \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">inline<\/span> <span style=\"color:#66d9ef\">int<\/span> __must_check \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">devm_request_irq<\/span>(<span style=\"color:#66d9ef\">struct<\/span> device <span style=\"color:#f92672\">*<\/span>dev, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq, <span style=\"color:#66d9ef\">irq_handler_t<\/span> handler, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> irqflags, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>devname, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev_id) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#a6e22e\">devm_request_threaded_irq<\/span>(dev, irq, handler, NULL, irqflags, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t\t\t\t devname, dev_id); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">extern<\/span> <span style=\"color:#66d9ef\">int<\/span> __must_check \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">request_threaded_irq<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq, <span style=\"color:#66d9ef\">irq_handler_t<\/span> handler, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t <span style=\"color:#66d9ef\">irq_handler_t<\/span> thread_fn, \n<\/span><\/span><span style=\"display:flex;\"><span>\t\t <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> flags, <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev); \n<\/span><\/span><span style=\"display:flex;\"><span> \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">static<\/span> <span style=\"color:#66d9ef\">inline<\/span> <span style=\"color:#66d9ef\">int<\/span> __must_check \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#a6e22e\">request_irq<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span> irq, <span style=\"color:#66d9ef\">irq_handler_t<\/span> handler, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span> flags, \n<\/span><\/span><span style=\"display:flex;\"><span>\t <span style=\"color:#66d9ef\">const<\/span> <span style=\"color:#66d9ef\">char<\/span> <span style=\"color:#f92672\">*<\/span>name, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>dev) \n<\/span><\/span><span style=\"display:flex;\"><span>{ \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#66d9ef\">return<\/span> <span style=\"color:#a6e22e\">request_threaded_irq<\/span>(irq, handler, NULL, flags, name, dev); \n<\/span><\/span><span style=\"display:flex;\"><span>} \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">extern<\/span> <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#a6e22e\">free_irq<\/span>(<span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span>, <span style=\"color:#66d9ef\">void<\/span> <span style=\"color:#f92672\">*<\/span>);<\/span><\/span><\/code><\/pre><\/div><h1 id=\"3-threaded_irq\u5b9e\u4f8b\">3 threaded_irq\u5b9e\u4f8b<a class=\"anchor\" href=\"#3-threaded_irq%e5%ae%9e%e4%be%8b\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"31-\u9a71\u52a8\u6e90\u7801\u7f16\u5199\">3.1 \u9a71\u52a8\u6e90\u7801\u7f16\u5199<a class=\"anchor\" href=\"#31-%e9%a9%b1%e5%8a%a8%e6%ba%90%e7%a0%81%e7%bc%96%e5%86%99\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u9a71\u52a8\u4ee3\u7801<\/p>"},{"title":"\u5185\u6838\u547d\u4ee4\u63a5\u53e3-ioctl\u4ecb\u7ecd","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E5%86%85%E6%A0%B8%E5%91%BD%E4%BB%A4%E6%8E%A5%E5%8F%A3-ioctl%E4%BB%8B%E7%BB%8D\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E5%86%85%E6%A0%B8%E5%91%BD%E4%BB%A4%E6%8E%A5%E5%8F%A3-ioctl%E4%BB%8B%E7%BB%8D\/","description":"<h1 id=\"1-\u5f15\u5165ioctl\">1 \u5f15\u5165ioctl<a class=\"anchor\" href=\"#1-%e5%bc%95%e5%85%a5ioctl\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u4e00\u4e2a\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\u901a\u5e38\u4f1a\u5b9e\u73b0\u8bbe\u5907\u6253\u5f00\u3001\u5173\u95ed\u3001\u8bfb\u3001\u5199\u7b49\u529f\u80fd\uff0c\u5728\u4e00\u4e9b\u9700\u8981\u7ec6\u5206\u7684\u60c5\u5883\u4e0b\uff0c\u5982\u679c\u9700\u8981\u6269\u5c55\u65b0\u7684\u529f\u80fd\u589e\u6dfb\u547d\u4ee4\uff0c\u901a\u5e38\u4ee5\u589e\u8bbe\u00a0<code>ioctl()<\/code>\u00a0\u547d\u4ee4\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002<br>\n\u5bf9\u4e8eioctl\u8fd9\u4e2a\u7cfb\u7edf\u8c03\u7528\u63a5\u53e3\uff0cLinux\u7684\u521b\u59cb\u4eba\u57282.0\u7248\u672c\u4e4b\u524d\u5e76\u6ca1\u6709\u8fdb\u884c\u6dfb\u52a0\uff0c\u4ec5\u6709write\u548cread\u4e24\u4e2a\u63a5\u53e3\uff0c\u4f46\u662f\u540e\u6765\u53d1\u73b0\u5f53\u9700\u8981\u53bb\u63a7\u5236\u6587\u4ef6\u7684\u67d0\u4e9b\u64cd\u4f5c\u7684\u65f6\u5019\uff0c\u5f88\u663e\u7136\u8fd9\u4e24\u4e2a\u63a5\u53e3\u6839\u672c\u4e0d\u591f\u7528\u3002\u6240\u4ee5\u624d\u6709\u4e86\u8fd9\u4e2a\u4e07\u80fd\u63a7\u5236\u63a5\u53e3ioctl\uff0c\u4f46\u662f\u4f5c\u4e3aLinux\u7684\u521b\u59cb\u4ebaLinus\u672c\u4eba\u4e00\u76f4\u6392\u65a5\u8be5\u63a5\u53e3\uff0c\u56e0\u4e3a\u8fd9\u4e2aioctl\u63a5\u53e3\u7684\u5728\u5185\u6838\u4e2d\u7684\u4f7f\u7528\u76f8\u5f53\u4e8e\u5bf9\u5e94\u7528\u5c42\u5f00\u8bbe\u4e86\u4e00\u4e2a\u80fd\u591f\u76f4\u63a5\u4ea4\u4e92\u7684\u7a97\u53e3\uff0c\u5f88\u5f71\u54cd\u5185\u6838\u6574\u4f53\u7684\u6743\u9650\u63a7\u5236\uff0c\u4e0d\u8fc7\u7531\u4e8e\u76ee\u524d\u8fd8\u6682\u65f6\u6ca1\u6709\u66f4\u597d\u53ef\u4ee5\u66ff\u4ee3\u7684\u65b9\u6cd5\uff0c\u6240\u4ee5\u8fd8\u662f\u7ee7\u7eed\u4fdd\u7559\u4e86\u8fd9\u4e2a\u63a5\u53e3\u7684\u4f7f\u7528\u3002<br>\n<img src=\"assets\/4b291cf545575fdc53f80362b18ef3cd_MD5.webp\" alt=\"img\" \/><\/p>\n<h1 id=\"2-\u7528\u6237\u7a7a\u95f4-ioctl\">2 \u7528\u6237\u7a7a\u95f4 ioctl<a class=\"anchor\" href=\"#2-%e7%94%a8%e6%88%b7%e7%a9%ba%e9%97%b4-ioctl\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/0d1c2de854848ba83258c3f6c650b4f6_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">int<\/span> <span style=\"color:#a6e22e\">ioctl<\/span>(<span style=\"color:#66d9ef\">int<\/span> fd, <span style=\"color:#66d9ef\">int<\/span> request, <span style=\"color:#960050;background-color:#1e0010\">\u2026<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span>ret <span style=\"color:#f92672\">=<\/span> <span style=\"color:#a6e22e\">ioctl<\/span>(fd, MYCMD); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">if<\/span> (ret <span style=\"color:#f92672\">==<\/span> <span style=\"color:#f92672\">-<\/span><span style=\"color:#ae81ff\">1<\/span>) { \n<\/span><\/span><span style=\"display:flex;\"><span>\t<span style=\"color:#a6e22e\">printf<\/span>(<span style=\"color:#e6db74\">&#34;ioctl: %s<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, <span style=\"color:#a6e22e\">strerror<\/span>(errno)); \n<\/span><\/span><span style=\"display:flex;\"><span>}<\/span><\/span><\/code><\/pre><\/div><p>\u51fd\u6570\u529f\u80fd\uff1a<br>\n1.\u5411\u786c\u4ef6\u8bbe\u5907\u53d1\u9001\u63a7\u5236\u547d\u4ee4<br>\n2.\u8fd8\u53ef\u4ee5\u548c\u786c\u4ef6\u8bbe\u5907\u8fdb\u884c\u8bfb\u6216\u8005\u5199\u64cd\u4f5c<br>\n\u53c2\u6570\uff1a<br>\n<code>fd\uff1a<\/code>\u6587\u4ef6\u63cf\u8ff0\u7b26<br>\n<code>request\uff1a<\/code>\u7ed9\u786c\u4ef6\u8bbe\u5907\u53d1\u9001\u7684\u63a7\u5236\u547d\u4ee4<br>\n<code>arg\uff1a<\/code>\u4fdd\u5b58\u7684\u5c31\u662f\u7528\u6237\u7f13\u51b2\u533a\u7684\u9996\u5730\u5740<br>\n\u8fd4\u56de\u503c\uff1a\u6267\u884c\u6210\u529f\u8fd4\u56de0\uff0c\u6267\u884c\u5931\u8d25\u8fd4\u56de-1, ioctl \u6700\u5e38\u89c1\u7684\u00a0<code>errorno<\/code>\u00a0\u503c\u4e3a\u00a0<code>ENOTTY<\/code>\uff08<code>error not a typewriter<\/code>)\u8868\u793a\u547d\u4ee4\u627e\u4e0d\u5230\u3002<\/p>\n<h1 id=\"3-\u5185\u6838\u7a7a\u95f4-ioctl\">3 \u5185\u6838\u7a7a\u95f4 ioctl<a class=\"anchor\" href=\"#3-%e5%86%85%e6%a0%b8%e7%a9%ba%e9%97%b4-ioctl\" aria-label=\"Link\"><\/a><\/h1>\n<p><img src=\"assets\/3e354ecff186e3ef9e428aa506263b4d_MD5.webp\" alt=\"img\" \/><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">long<\/span> (<span style=\"color:#f92672\">*<\/span>unlocked_ioctl) (<span style=\"color:#66d9ef\">struct<\/span> file <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>); \n<\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#66d9ef\">long<\/span> (<span style=\"color:#f92672\">*<\/span>compat_ioctl) (<span style=\"color:#66d9ef\">struct<\/span> file <span style=\"color:#f92672\">*<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">int<\/span>, <span style=\"color:#66d9ef\">unsigned<\/span> <span style=\"color:#66d9ef\">long<\/span>);<\/span><\/span><\/code><\/pre><\/div><h1 id=\"4-ioctl\u7684\u547d\u4ee4\u6784\u6210\">4 IOCTL\u7684\u547d\u4ee4\u6784\u6210<a class=\"anchor\" href=\"#4-ioctl%e7%9a%84%e5%91%bd%e4%bb%a4%e6%9e%84%e6%88%90\" aria-label=\"Link\"><\/a><\/h1>\n<p>ioctl\u547d\u4ee4\u5c31\u662f\u7528\u6237\u548c\u9a71\u52a8\u7ea6\u5b9a\u7684\u4e00\u79cd\u534f\u8bae\uff0c \u7406\u8bba\u4e0a\u53ef\u4ee5\u4e3a\u4efb\u610f int \u578b\u6570\u636e\uff0c\u53ef\u4ee5\u4e3a 0\u30011\u30012\u30013\u2026\u2026\uff0c\u4f46\u662f\u4e3a\u4e86\u786e\u4fdd\u8be5 \u201c\u534f\u8bae\u201d \u7684\u552f\u4e00\u6027\uff0cioctl \u547d\u4ee4\u5e94\u8be5\u4f7f\u7528\u66f4\u79d1\u5b66\u4e25\u8c28\u7684\u65b9\u6cd5\u8d4b\u503c\uff0c\u5728linux\u4e2d\uff0c\u63d0\u4f9b\u4e86\u4e00\u79cd ioctl \u547d\u4ee4\u7684\u7edf\u4e00\u683c\u5f0f\uff0c\u5c06 32 \u4f4d int \u578b\u6570\u636e\u5212\u5206\u4e3a\u56db\u4e2a\u4f4d\u6bb5\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a<br>\n<img src=\"assets\/b67cb8587c4aea05937f31756c5932f4_MD5.webp\" alt=\"img\" \/><\/p>"},{"title":"\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8-1-\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\u6846\u67b6","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8-1-%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E6%A1%86%E6%9E%B6\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8-1-%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E6%A1%86%E6%9E%B6\/","description":"<p>\u4e0b\u9762\u4ee5<code>IMX6ULL<\/code>\u82af\u7247\u7684GPIO\u64cd\u4f5c\u4e3a\u793a\u4f8b\u4ecb\u7ecd\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8\u6846\u67b6\u3002<\/p>\n<h1 id=\"1-gpio-\u5bc4\u5b58\u5668\u7684-2-\u79cd\u64cd\u4f5c\u65b9\u6cd5\">1 GPIO \u5bc4\u5b58\u5668\u7684 2 \u79cd\u64cd\u4f5c\u65b9\u6cd5<a class=\"anchor\" href=\"#1-gpio-%e5%af%84%e5%ad%98%e5%99%a8%e7%9a%84-2-%e7%a7%8d%e6%93%8d%e4%bd%9c%e6%96%b9%e6%b3%95\" aria-label=\"Link\"><\/a><\/h1>\n<ol>\n<li><strong>\u76f4\u63a5\u8bfb\u5199<\/strong>\uff1a\u8bfb\u51fa\u3001\u4fee\u6539\u5bf9\u5e94\u4f4d\u3001\u5199\u5165\u3002<\/li>\n<\/ol>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>a) <span style=\"color:#960050;background-color:#1e0010\">\u8981\u8bbe\u7f6e<\/span> bit n<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\u3000\u3000val <span style=\"color:#f92672\">=<\/span> data_reg; \n<\/span><\/span><span style=\"display:flex;\"><span>\u3000\u3000val <span style=\"color:#f92672\">=<\/span> val <span style=\"color:#f92672\">|<\/span> (<span style=\"color:#ae81ff\">1<\/span><span style=\"color:#f92672\">&lt;&lt;<\/span>n); \n<\/span><\/span><span style=\"display:flex;\"><span>\u3000\u3000data_reg <span style=\"color:#f92672\">=<\/span> val; \n<\/span><\/span><span style=\"display:flex;\"><span>b) <span style=\"color:#960050;background-color:#1e0010\">\u8981\u6e05\u9664<\/span> bit n<span style=\"color:#960050;background-color:#1e0010\">\uff1a<\/span> \n<\/span><\/span><span style=\"display:flex;\"><span>\u3000\u3000val <span style=\"color:#f92672\">=<\/span> data_reg; \n<\/span><\/span><span style=\"display:flex;\"><span>\u3000\u3000val <span style=\"color:#f92672\">=<\/span> val <span style=\"color:#f92672\">&amp;<\/span> <span style=\"color:#f92672\">~<\/span>(<span style=\"color:#ae81ff\">1<\/span><span style=\"color:#f92672\">&lt;&lt;<\/span>n); \n<\/span><\/span><span style=\"display:flex;\"><span>\u3000\u3000data_reg <span style=\"color:#f92672\">=<\/span> val;<\/span><\/span><\/code><\/pre><\/div><ol start=\"2\">\n<li><strong>set-and-clear protocol<\/strong>\uff1a(\u82af\u7247\u4e0d\u4e00\u5b9a\u652f\u6301\uff09<\/li>\n<\/ol>\n<p>\u3000\u3000<code>set_reg, clr_reg, data_reg<\/code>\u00a0\u4e09\u4e2a\u5bc4\u5b58\u5668\u5bf9\u5e94\u7684\u662f\u540c\u4e00\u4e2a\u7269\u7406\u5bc4\u5b58\u5668\uff0c<code>set_reg<\/code>\u548c<code>clr_reg<\/code>\u4f4d\u4ec5\u7f6e1\u6709\u6548:<\/p>\n<p>\u3000\u3000a) \u8981\u8bbe\u7f6e bit n\uff1a<code>set_reg = (1&lt;&lt;n);<\/code><\/p>\n<p>\u3000\u3000b) \u8981\u6e05\u9664 bit n\uff1a<code>clr_reg = (1&lt;&lt;n);<\/code><\/p>\n<h1 id=\"2-gpio-\u5bc4\u5b58\u5668\u914d\u7f6e\u6d41\u7a0b\">2 GPIO \u5bc4\u5b58\u5668\u914d\u7f6e\u6d41\u7a0b<a class=\"anchor\" href=\"#2-gpio-%e5%af%84%e5%ad%98%e5%99%a8%e9%85%8d%e7%bd%ae%e6%b5%81%e7%a8%8b\" aria-label=\"Link\"><\/a><\/h1>\n<h2 id=\"21-ccm\u65f6\u949f\u8bbe\u7f6e\">2.1 CCM\u65f6\u949f\u8bbe\u7f6e<a class=\"anchor\" href=\"#21-ccm%e6%97%b6%e9%92%9f%e8%ae%be%e7%bd%ae\" aria-label=\"Link\"><\/a><\/h2>\n<p>CCM\u5bc4\u5b58\u5668\u4e3aGPIO \u6a21\u5757\u63d0\u4f9b\u65f6\u949f\uff1a<\/p>\n<p><img src=\"assets\/fda5b137b3c6f6ff734346de5221a94a_MD5.png\" alt=\"img\" \/>\n\u4ee5IMX6ULL \u82af\u7247\u4e3a\u5217\uff0c<code>GPIOn<\/code>\u00a0\u8981\u7528\u00a0<code>CCM_CCGRx<\/code>\u00a0\u5bc4\u5b58\u5668\u4e2d\u7684 2 \u4f4d\u6765\u51b3\u5b9a\u8be5\u7ec4 GPIO \u662f\u5426\u4f7f\u80fd\u3002\u5c06\u5bf9\u5e94\u7684<code>clk gating enable<\/code>\u3002<\/p>"},{"title":"\u5b57\u7b26\u8bbe\u5907\u9a71\u52a8-2-GPIO\u9a71\u52a8KEY\u793a\u4f8b","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8-2-gpio%E9%A9%B1%E5%8A%A8key%E7%A4%BA%E4%BE%8B\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8-2-gpio%E9%A9%B1%E5%8A%A8key%E7%A4%BA%E4%BE%8B\/","description":"<h1 id=\"1-app-\u8bfb\u53d6\u6309\u952e\u65b9\u5f0f\">1 APP \u8bfb\u53d6\u6309\u952e\u65b9\u5f0f<a class=\"anchor\" href=\"#1-app-%e8%af%bb%e5%8f%96%e6%8c%89%e9%94%ae%e6%96%b9%e5%bc%8f\" aria-label=\"Link\"><\/a><\/h1>\n<ol>\n<li>\u67e5\u8be2\u65b9\u5f0f<\/li>\n<li>\u4f11\u7720-\u5524\u9192\u65b9\u5f0f<\/li>\n<li>poll \u65b9\u5f0f<\/li>\n<li>\u5f02\u6b65\u901a\u77e5\u65b9\u5f0f<\/li>\n<\/ol>\n<p>\u7b2c2\u30013\u30014\u79cd\u65b9\u6cd5\uff0c\u90fd\u6d89\u53ca\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\u3002<\/p>\n<h2 id=\"11-\u67e5\u8be2\u65b9\u5f0f\">1.1 \u67e5\u8be2\u65b9\u5f0f<a class=\"anchor\" href=\"#11-%e6%9f%a5%e8%af%a2%e6%96%b9%e5%bc%8f\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/2d734498e29ee9089a2ac545da4fd411_MD5.png\" alt=\"img\" \/>\nAPP \u8c03\u7528 open \u65f6\uff0c\u5bfc\u81f4\u9a71\u52a8\u4e2d\u5bf9\u5e94\u7684 open \u51fd\u6570\u88ab\u8c03\u7528\uff0c\u5728\u91cc\u9762\u914d\u7f6e GPIO \u4e3a\u8f93\u5165\u5f15\u811a\u3002 APP \u8c03\u7528 read \u65f6\uff0c\u5bfc\u81f4\u9a71\u52a8\u4e2d\u5bf9\u5e94\u7684 read \u51fd\u6570\u88ab\u8c03\u7528\uff0c\u5b83\u8bfb\u53d6\u5bc4\u5b58\u5668\uff0c\u628a\u5f15\u811a\u72b6\u6001\u76f4\u63a5\u8fd4\u56de\u7ed9 APP,APP\u9700\u8981\u53cd\u590dread\u67e5\u8be2\u5f15\u811a\u7535\u5e73\u72b6\u6001\u3002<\/p>\n<p>\u5f88\u660e\u663e\uff0c\u67e5\u8be2\u65b9\u5f0f\u7528\u7684\u975e\u963b\u585eIO\uff08<code>O_NONBLOCK<\/code>\uff09\u3002<\/p>\n<h2 id=\"12-\u4f11\u7720-\u5524\u9192\u65b9\u5f0f\">1.2 \u4f11\u7720-\u5524\u9192\u65b9\u5f0f<a class=\"anchor\" href=\"#12-%e4%bc%91%e7%9c%a0-%e5%94%a4%e9%86%92%e6%96%b9%e5%bc%8f\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/5064556f928fbd1866dbb29fa3703d67_MD5.png\" alt=\"img\" \/><\/p>\n<ol>\n<li>APP \u8c03\u7528 open \u65f6\uff0c\u5bfc\u81f4\u9a71\u52a8\u4e2d\u5bf9\u5e94\u7684 open \u51fd\u6570\u88ab\u8c03\u7528\uff0c\u5728\u91cc\u9762\u914d\u7f6eGPIO \u4e3a\u8f93\u5165\u5f15\u811a\uff1b\u5e76\u4e14\u6ce8\u518c GPIO \u7684\u4e2d\u65ad\u5904\u7406\u51fd\u6570\u3002<\/li>\n<li>APP \u8c03\u7528 read \u65f6\uff0c\u5bfc\u81f4\u9a71\u52a8\u4e2d\u5bf9\u5e94\u7684 read \u51fd\u6570\u88ab\u8c03\u7528\uff0c\u5982\u679c\u6709\u6309\u952e\u6570\u636e\u5219\u76f4\u63a5\u8fd4\u56de\u7ed9 APP\uff1b\u5426\u5219 APP \u5728\u5185\u6838\u6001read\u51fd\u6570\u4e2d\u4f11\u7720\u3002<\/li>\n<li>\u5f53\u7528\u6237\u6309\u4e0b\u6309\u952e\u65f6\uff0c GPIO \u4e2d\u65ad\u88ab\u89e6\u53d1\uff0c\u5bfc\u81f4\u9a71\u52a8\u7a0b\u5e8f\u4e4b\u524d\u6ce8\u518c\u7684\u4e2d\u65ad\u670d\u52a1\u7a0b\u5e8f\u88ab\u6267\u884c\u3002\u5b83\u4f1a\u8bb0\u5f55\u6309\u952e\u6570\u636e\uff0cread\u51fd\u6570\u88ab\u5524\u9192\uff0c\u6267\u884c\u9a71\u52a8\u4ee3\u7801\uff0c\u628a\u6309\u952e\u6570\u636e\u8fd4\u56de\u7ed9APP(\u7528\u6237\u7a7a\u95f4)\u3002<\/li>\n<\/ol>\n<h2 id=\"13-poll-\u65b9\u5f0f\">1.3 poll \u65b9\u5f0f<a class=\"anchor\" href=\"#13-poll-%e6%96%b9%e5%bc%8f\" aria-label=\"Link\"><\/a><\/h2>\n<p>\u4e0a\u9762\u7684\u4f11\u7720-\u5524\u9192\u65b9\u5f0f\u6709\u4e2a\u7f3a\u70b9\uff1a\u5982\u679c\u4e00\u76f4\u6ca1\u64cd\u4f5c\u6309\u952e\uff0c\u90a3\u4e48 APP \u5c31\u4f1a\u6c38\u8fdc\u4f11\u7720\u3002<br>\n\u6211\u4eec\u53ef\u4ee5\u7ed9 APP \u5b9a\u4e2a\u95f9\u949f\uff0c\u8fd9\u5c31\u662f poll \u65b9\u5f0f\u3002\u5f53\u8d85\u65f6\u540e\u5c31\u76f4\u63a5\u8fd4\u56de\u4e0d\u518d\u4f11\u7720\u3002<br>\n<img src=\"assets\/20424cb9de7df01c8c5f1cfad80f3282_MD5.png\" alt=\"img\" \/><\/p>"},{"title":"\u8bbe\u5907\u6811","link":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/%E8%AE%BE%E5%A4%87%E6%A0%91\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E5%AE%8B%E5%AE%9D%E5%8D%8E%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0\/%E8%AE%BE%E5%A4%87%E6%A0%91\/","description":"<p><a href=\"http:\/\/wiki.100ask.net\/Linux_devicetree\">http:\/\/wiki.100ask.net\/Linux_devicetree<\/a>\n<a href=\"https:\/\/nu-ll.github.io\/2019\/10\/13\/%E8%AE%BE%E5%A4%87%E6%A0%91\/\">https:\/\/nu-ll.github.io\/2019\/10\/13\/%E8%AE%BE%E5%A4%87%E6%A0%91\/<\/a><\/p>"},{"title":"\u8bbe\u5907\u6811","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E8%AE%BE%E5%A4%87%E6%A0%91\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E8%AE%BE%E5%A4%87%E6%A0%91\/","description":"<h1 id=\"1-\u5f15\u7528\u8bbe\u5907\u6811\">1 \u5f15\u7528\u8bbe\u5907\u6811<a class=\"anchor\" href=\"#1-%e5%bc%95%e7%94%a8%e8%ae%be%e5%a4%87%e6%a0%91\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u5728\u5185\u6838\u4e2d\uff0c\u4f7f\u7528\u540c\u4e00\u4e2a\u82af\u7247\u7684\u677f\u5b50\uff0c\u5b83\u4eec\u6240\u7528\u7684\u5916\u8bbe\u8d44\u6e90\u4e0d\u4e00\u6837\uff0c\u6bd4\u5982 A \u677f\u7528 GPIO A\uff0cB \u677f\u7528 GPIO B\uff0c \u5982\u679c\u7528<code>plateform_device<\/code>\u5b9a\u4e49\u8d44\u6e90\u4fe1\u606f\uff0c\u90a3\u4e48\u6bcf\u6b21\u5355\u677f\u786c\u4ef6\u8d44\u6e90\u53d8\u52a8\u540e\uff0c\u90fd\u8981\u6539\u9a71\u52a8\u7a0b\u5e8f\u6e90\u7801\uff0c\u91cd\u65b0\u7f16\u8bd1\u9a71\u52a8\uff0c\u91cd\u65b0\u52a0\u8f7d\u9a71\u52a8\uff0c\u975e\u5e38\u9ebb\u70e6\u3002<br>\n\u968f\u7740 ARM \u82af\u7247\u7684\u6d41\u884c\uff0c\u5185\u6838\u4e2d\u9488\u5bf9\u8fd9\u4e9b ARM \u677f\u4fdd\u5b58\u6709\u5927\u91cf\u7684\u3001\u6ca1\u6709\u6280\u672f\u542b\u91cf\u7684\u6587\u4ef6\u3002 Linus \u5927\u53d1\u96f7\u9706\uff1a<code>&quot;this whole ARM thing is a f*cking pain in the ass&quot;<\/code>\u3002\u4e8e\u662f\uff0cLinux \u5185\u6838\u5f00\u59cb\u5f15\u5165\u8bbe\u5907\u6811\u3002 \u8bbe\u5907\u6811\u5e76\u4e0d\u662f\u91cd\u65b0\u53d1\u660e\u51fa\u6765\u7684\uff0c\u5728 Linux \u5185\u6838\u4e2d\u5176\u4ed6\u5e73\u53f0\u5982\u00a0<code>PowerPC<\/code>\uff0c\u65e9\u5c31\u4f7f\u7528\u8bbe\u5907\u6811\u6765\u63cf\u8ff0\u786c\u4ef6\u4e86\u3002<br>\n\u8bbe\u5907\u6811\u53ea\u662f\u7528\u6765\u7ed9\u5185\u6838\u91cc\u7684\u9a71\u52a8\u7a0b\u5e8f\uff0c\u6307\u5b9a\u786c\u4ef6\u7684\u4fe1\u606f\u3002<\/p>\n<h2 id=\"11-\u6839\u6587\u4ef6\u7cfb\u7edf\u4e2d\u67e5\u770b\u8bbe\u5907\u6811\">1.1 \u6839\u6587\u4ef6\u7cfb\u7edf\u4e2d\u67e5\u770b\u8bbe\u5907\u6811<a class=\"anchor\" href=\"#11-%e6%a0%b9%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e4%b8%ad%e6%9f%a5%e7%9c%8b%e8%ae%be%e5%a4%87%e6%a0%91\" aria-label=\"Link\"><\/a><\/h2>\n<p><img src=\"assets\/5401d4130b266dc2d66870db3afca69f_MD5.png\" alt=\"img\" \/>\n\u70e7\u5f55\u7684dtb\u6587\u4ef6,\u663e\u7136\u4e24\u8005\u662f\u5b8c\u5168\u76f8\u540c\u7684\u3002<br>\n<img src=\"assets\/c811236f1dce2a8f57423b3a10add39e_MD5.png\" alt=\"img\" \/>\n\u9664\u4e86\u539f\u59cb\u7684dtb\u6587\u4ef6\uff0c\u6839\u6587\u4ef6\u7cfb\u7edf\u8fd8\u4ee5\u76ee\u5f55\u7ed3\u6784\u7684\u65b9\u5f0f\u5448\u73b0dtb\u6587\u4ef6,\u5728<code>devicetree<\/code>\u76ee\u5f55\u4e0b\uff0c\u5219\u6709\u4e00\u4e2a<code>base<\/code>\u76ee\u5f55\uff0c\u8fd9\u4e2abase\u76ee\u5f55\uff0c\u5c31\u5bf9\u5e94\u7740\u6839\u8282\u70b9\u3002<br>\n<img src=\"assets\/b7544aaf99c17452cba3650047003a65_MD5.png\" alt=\"img\" \/>\nbase\u76ee\u5f55\u4e0b\uff0c\u6bcf\u4e00\u4e2a\u8282\u70b9\u5bf9\u5e94\u4e00\u4e2a\u76ee\u5f55, \u6bcf\u4e00\u4e2a\u5c5e\u6027\u5bf9\u5e94\u4e00\u4e2a\u6587\u4ef6. \u8fd9\u4e9b\u5c5e\u6027\u7684\u503c\u5982\u679c\u662f\u5b57\u7b26\u4e32\uff0c\u53ef\u4ee5\u4f7f\u7528 cat \u547d\u4ee4\u628a\u5b83\u6253\u5370\u51fa\u6765\u3002\u5bf9\u4e8e\u6570\u503c\uff0c\u53ef\u4ee5\u7528\u00a0<code>hexdump<\/code>\u00a0\u628a\u5b83\u6253\u5370\u51fa\u6765\u3002<br>\n<img src=\"assets\/165ba74c0a750ba5c6fb8312b027ad8f_MD5.png\" alt=\"img\" \/>\n\u8fdb\u5165<code>led<\/code>\u76ee\u5f55\uff0c\u91cc\u9762\u4e00\u5171\u6709\u4e09\u4e2a\u6587\u4ef6\uff0c\u9664<code>name<\/code>\u5916\uff0c\u5206\u522b\u5bf9\u5e94\u7740led\u8282\u70b9\u7684\u4e24\u4e2a\u5c5e\u6027\uff0ccat\u5c5e\u6027\u5982\u4e0b\uff1a<br>\n<img src=\"assets\/4a792a8000cd2c2ed0dd3dfe8671b7f2_MD5.png\" alt=\"img\" \/>\n<code>pin<\/code>\u5c5e\u6027\u7684\u503c\u4e3a<code>0x00 05 00 05<\/code>\uff0c\u4e5f\u5c31\u662f<code>GPF5<\/code>.<br>\n\u5982\u679c\u8282\u70b9\u6ca1\u6709\u8bbe\u7f6e<code>name<\/code>\u5c5e\u6027\uff0c\u90a3\u4e48\u8f6c\u6362\u4e3a<code>device_node<\/code>\u65f6\uff0c\u4f1a\u5c06\u8282\u70b9\u81ea\u5df1\u7684\u540d\u79f0\u4f5c\u4e3a<code>name<\/code>\u5c5e\u6027\u503c\u3002 \u6240\u4ee5\u8fd9\u91cc<code>name<\/code>\u662f<code>led<\/code>.<br>\n\u6839\u6587\u4ef6\u7cfb\u7edf\u4e0b\u4e5f\u53ef\u4ee5\u67e5\u770b<code>platform_device<\/code>\u3002\u7cfb\u7edf\u4e2d\u6240\u6709\u7684<code>platform_device<\/code>\uff0c\u90fd\u53ef\u4ee5\u5728<code>\/sys\/devices\/platform\/<\/code>\u8def\u5f84\u4e0b\u67e5\u770b\u3002<br>\n<img src=\"assets\/49ea87c0edc54018805697a0795612df_MD5.png\" alt=\"img\" \/>\n\u53e6\u5916\uff0c\u7cfb\u7edf\u4e2d\u6240\u6709\u7684<code>platform_device<\/code>\uff0c\u6709\u6765\u81ea\u8bbe\u5907\u6811\u7684\uff0c\u4e5f\u6709\u6765\u81ea<code>.c<\/code>\u6587\u4ef6\u4e2d\u6ce8\u518c\u7684\u3002\u90a3\u4e48\uff0c\u6211\u4eec\u600e\u4e48\u77e5\u9053\u54ea\u4e9b<code>platform_device<\/code>\u662f\u6765\u81ea\u8bbe\u5907\u6811\uff0c\u54ea\u4e9b\u662f\u6765\u81ea.c\u6587\u4ef6\u4e2d\u6ce8\u518c\u7684\uff1f<\/p>\n<pre tabindex=\"0\"><code>\u7b54\uff1a\u53ef\u4ee5\u67e5\u770b\u8be5platform_device\u7684\u76f8\u5173\u76ee\u5f55\u4e0b\uff0c\u662f\u5426\u6709of_node\uff0c\u5982\u679c\u6709of_node\uff0c\u90a3\u4e48\u8fd9\u4e2aplatform_device\u5c31\u6765\u81ea\u4e8e\u8bbe\u5907\u6811\uff1b\u5426\u5219\uff0c\u6765\u81ea.c\u6587\u4ef6\u3002<\/code><\/pre><p>\u4ee5<code>led<\/code>\u4e3a\u4f8b\uff0c\u8fdb\u5165led\u76ee\u5f55\uff0c\u53ef\u4ee5\u770b\u5230\u6709<code>of_node<\/code>\uff0c\u8bf4\u660e\u8fd9\u4e2a<code>platform_device<\/code>\u6765\u81ea\u8bbe\u5907\u6811\u3002\u540c\u65f6\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u4e2a<code>of_node<\/code>\u662f\u4e00\u4e2a\u94fe\u63a5\u6587\u4ef6\uff0c\u6307\u5411\u7684\u662f<code>\/sys\/firmware\/devicetree\/base\/led<\/code>\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u53ef\u4ee5\u8fdb\u5165\u00a0<code>\/sys\/devices\/platform\/&lt;\u8bbe\u5907\u540d&gt;\/of_node<\/code>\u00a0\u67e5\u770b\u5b83\u7684\u8bbe\u5907\u6811\u5c5e\u6027\u3002<br>\n<img src=\"assets\/2571b963140c57982bd222912d6ecb13_MD5.png\" alt=\"img\" \/>\n\u5728\/proc\u4e0b\u6709\u4e00\u4e2a\u94fe\u63a5\u6587\u4ef6<code>device-tree<\/code>\uff0c\u5b83\u6307\u5411\u7684\u662f<code>\/sys\/firmware\/devicetree\/base<\/code><br>\n<img src=\"assets\/2ddbd92332ac4370106931478075c552_MD5.png\" alt=\"img\" \/><\/p>\n<h1 id=\"2-\u8bbe\u5907\u6811\u7684\u8bed\u6cd5\">2 \u8bbe\u5907\u6811\u7684\u8bed\u6cd5<a class=\"anchor\" href=\"#2-%e8%ae%be%e5%a4%87%e6%a0%91%e7%9a%84%e8%af%ad%e6%b3%95\" aria-label=\"Link\"><\/a><\/h1>\n<p>\u8bbe\u5907\u6811\u6587\u4ef6(<code>dts: device tree source<\/code>)\uff0c\u5b83\u9700\u8981\u7f16\u8bd1\u4e3a\u00a0<code>dtb(device tree blob)<\/code>\u6587\u4ef6\uff0c\u5185\u6838\u4f7f\u7528\u7684\u662f dtb \u6587\u4ef6\u3002<\/p>"},{"title":"\u8bbe\u5907\u6811\u89e3\u6790\u51fd\u6570","link":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E8%AE%BE%E5%A4%87%E6%A0%91%E8%A7%A3%E6%9E%90%E5%87%BD%E6%95%B0\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/ioxera.github.io\/docs\/%E9%9F%A6%E4%B8%9C%E5%B1%B1%E5%86%85%E6%A0%B8%E9%A9%B1%E5%8A%A8%E7%AC%94%E8%AE%B0\/%E8%AE%BE%E5%A4%87%E6%A0%91%E8%A7%A3%E6%9E%90%E5%87%BD%E6%95%B0\/","description":"<h1 id=\"1\u8bbe\u5907\u6811\u76f8\u5173\u7684\u5934\u6587\u4ef6\">1.\u8bbe\u5907\u6811\u76f8\u5173\u7684\u5934\u6587\u4ef6<a class=\"anchor\" href=\"#1%e8%ae%be%e5%a4%87%e6%a0%91%e7%9b%b8%e5%85%b3%e7%9a%84%e5%a4%b4%e6%96%87%e4%bb%b6\" aria-label=\"Link\"><\/a><\/h1>\n<p>1.\u5904\u7406\u00a0<code>DTB<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>of_fdt.h <span style=\"color:#75715e\">\/\/ dtb \u6587\u4ef6\u7684\u76f8\u5173\u64cd\u4f5c\u51fd\u6570, \u6211\u4eec\u4e00\u822c\u7528\u4e0d\u5230, \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u56e0\u4e3a dtb \u6587\u4ef6\u5728\u5185\u6838\u4e2d\u5df2\u7ecf\u88ab\u8f6c\u6362\u4e3a device_node \u6811(\u5b83\u66f4\u6613\u4e8e\u4f7f\u7528)\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>2.\u5904\u7406\u00a0<code>device_node<\/code><\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c\" data-lang=\"c\"><span style=\"display:flex;\"><span>of.h <span style=\"color:#75715e\">\/\/ \u63d0\u4f9b\u8bbe\u5907\u6811\u7684\u4e00\u822c\u5904\u7406\u51fd\u6570, \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u6bd4\u5982 of_property_read_u32(\u8bfb\u53d6\u67d0\u4e2a\u5c5e\u6027\u7684 u32 \u503c), \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ of_get_child_count(\u83b7\u53d6\u67d0\u4e2a device_node \u7684\u5b50\u8282\u70b9\u6570) \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_address.h <span style=\"color:#75715e\">\/\/ \u5730\u5740\u76f8\u5173\u7684\u51fd\u6570, \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ \u6bd4\u5982 of_get_address(\u83b7\u5f97 reg \u5c5e\u6027\u4e2d\u7684 addr, size \u503c) \n<\/span><\/span><\/span><span style=\"display:flex;\"><span><span style=\"color:#75715e\">\/\/ of_match_device (\u4ece matches \u6570\u7ec4\u4e2d\u53d6\u51fa\u4e0e\u5f53\u524d\u8bbe\u5907\u6700\u5339\u914d\u7684\u4e00\u9879) \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_dma.h <span style=\"color:#75715e\">\/\/ \u8bbe\u5907\u6811\u4e2d DMA \u76f8\u5173\u5c5e\u6027\u7684\u51fd\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_gpio.h <span style=\"color:#75715e\">\/\/ GPIO \u76f8\u5173\u7684\u51fd\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_graph.h <span style=\"color:#75715e\">\/\/ GPU \u76f8\u5173\u9a71\u52a8\u4e2d\u7528\u5230\u7684\u51fd\u6570, \u4ece\u8bbe\u5907\u6811\u4e2d\u83b7\u5f97 GPU \u4fe1\u606f \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_iommu.h <span style=\"color:#75715e\">\/\/ \u5f88\u5c11\u7528\u5230 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_irq.h <span style=\"color:#75715e\">\/\/ \u4e2d\u65ad\u76f8\u5173\u7684\u51fd\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_mdio.h <span style=\"color:#75715e\">\/\/ MDIO (Ethernet PHY) API \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_net.h <span style=\"color:#75715e\">\/\/ OF helpers for network devices. \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_pci.h <span style=\"color:#75715e\">\/\/ PCI \u76f8\u5173\u51fd\u6570 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_pdt.h <span style=\"color:#75715e\">\/\/ \u5f88\u5c11\u7528\u5230 \n<\/span><\/span><\/span><span style=\"display:flex;\"><span>of_reserved_mem.h <span style=\"color:#75715e\">\/\/ reserved_mem \u7684\u76f8\u5173\u51fd\u6570\n<\/span><\/span><\/span><\/code><\/pre><\/div><p>3.\u5904\u7406\u00a0<code>platform_device<\/code><\/p>"}]}}