drivers\base\driver.c

本文详细介绍了Linux内核中驱动操作的核心函数,包括遍历设备、创建及删除属性文件、驱动注册与注销等关键流程,并提供了具体实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

小结:

 

本文件主要是负责驱动的操作

 

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

函数列表:

 

int   driver_for_each_device(struct device_driver * drv, struct device * start,

                        void * data, int (*fn)(struct device *, void *))

遍历挂在drv驱动上的设备链表,执行fn函数

 

struct device * driver_find_device(struct device_driver *drv,

                               struct device * start, void * data,

                               int (*match)(struct device *, void *))

同上,只是match成功后就退出循环

 

@@@@@@

int   driver_create_file(struct device_driver * drv, struct driver_attribute * attr)

为驱动创建指定的属性文件

 

void driver_remove_file(struct device_driver * drv, struct driver_attribute * attr)

删除驱动的属性文件

 

@@@@@@

int   driver_register(struct device_driver * drv)

驱动的注册,先将drv->klist_devices设备链表挂空,然后调用bus.c文件的bus_add_driver函数进行设置

 

void       driver_unregister(struct device_driver * drv)

驱动的反注册

 

struct device_driver *driver_find(const char *name, struct bus_type *bus)

根据名字从指定总线上找寻设备,返回驱动的结构体

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//根据节点获取设备,根据obj获取设备驱动

#define   to_dev(node)         container_of(node, struct device, driver_list)

#define   to_drv(obj)           container_of(obj, struct device_driver, kobj)

 

//通过节点获取下一个设备

static      struct device *       next_device(struct klist_iter * i)

{

       struct klist_node    *n = klist_next(i);

       //根据节点获取设备宿主

       return     n ? container_of(n, struct device, knode_driver) : NULL;

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//遍历驱动的设备链表,执行fn函数

int   driver_for_each_device(

       struct device_driver      * drv,

       struct device                 * start,

       void                            * data,

       int (*fn)(struct device *, void *))

{

       struct klist_iter i;

       struct device * dev;

       int error = 0;

 

       if (!drv)         return -EINVAL;                  //驱动不存在,返回错误

 

       //初始化容器

       klist_iter_init_node(&drv->klist_devices, &i,

                          start ? &start->knode_driver : NULL);

 

       //遍历链表,执行fn函数

       while ((dev = next_device(&i)) && !error)

              error = fn(dev, data);

 

       //退出容器

       klist_iter_exit(&i);

       return error;

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//这个函数就不COPY了,和上一个函数一样,区别是匹配成功后就会退出

//分析bus.c文件时也有类型的函数结构

struct device   * driver_find_device(

       struct device_driver      *drv,

       struct device                 * start,

       void                            * data,

       int (*match)(struct device *, void *))

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

int   driver_create_file(struct device_driver * drv,      struct driver_attribute * attr)

{

       int error;

       if (get_driver(drv)) {            //驱动引用计数加1

              error = sysfs_create_file(&drv->kobj, &attr->attr);     //创建属性文件

              put_driver(drv);

       } else                                  //引用失败,错误返回

              error = -EINVAL;

       return error;

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//删除驱动的属性文件

void       driver_remove_file(struct device_driver * drv,    struct driver_attribute * attr)

{

       if (get_driver(drv)) {

              sysfs_remove_file(&drv->kobj, &attr->attr);

              put_driver(drv);

       }

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//驱动引用计数

struct device_driver      * get_driver(struct device_driver * drv)

{

       return drv ? to_drv(kobject_get(&drv->kobj)) : NULL;

}

 

//驱动释放计数

void put_driver(struct device_driver * drv)

{

       kobject_put(&drv->kobj);

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//驱动注册,核心函数是bus_add_driver(drv)

int   driver_register(struct device_driver * drv)

{

       if ((drv->bus->probe && drv->probe) ||

           (drv->bus->remove && drv->remove) ||

           (drv->bus->shutdown && drv->shutdown)) {

              //打印警告:驱动和总线都定义了函数,将调用总线上的函数

       }

       klist_init(&drv->klist_devices, NULL, NULL);   //初始化驱动的设备链表

       return     bus_add_driver(drv);                          //驱动添加到总线上,实现在bus.c中

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

//从总线上移除驱动

void       driver_unregister(struct device_driver * drv)

{

       bus_remove_driver(drv);

}

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

struct device_driver      *driver_find(const char *name,    struct bus_type *bus)

{

       //根据名字在总线的驱动链表中查找obj

       struct kobject        *k = kset_find_obj(&bus->drivers, name);

       if (k)      

              return     to_drv(k);       //找到目标,返回该obj的驱动结构体宿主

 

       return NULL;

}

 

我將其他人的Katalon項目工程下載導入到我的電腦上,但是顯示Aug 15, 2025 1:45:15 PM com.kms.katalon.core.logging.KeywordLogger startTest INFO: -------------------- Aug 15, 2025 1:45:15 PM com.kms.katalon.core.logging.KeywordLogger startTest INFO: START Test Cases/Get Report in CWS Aug 15, 2025 1:45:16 PM com.kms.katalon.core.logging.KeywordLogger logInfo INFO: Starting 'Chrome' driver Aug 15, 2025 1:45:16 PM com.kms.katalon.core.logging.KeywordLogger logInfo INFO: Action delay is set to 0 milliseconds Aug 15, 2025 1:45:17 PM com.kms.katalon.core.logging.KeywordLogger logFailed SEVERE: ❌ Unable to open browser with url: '' (Root cause: com.kms.katalon.core.exception.StepFailedException: Unable to open browser with url: '' at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.stepFailed(WebUIKeywordMain.groovy:117) at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.runKeyword(WebUIKeywordMain.groovy:43) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword.openBrowser(OpenBrowserKeyword.groovy:47) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword.execute(OpenBrowserKeyword.groovy:33) at com.kms.katalon.core.keyword.internal.KeywordExecutor.executeKeywordForPlatform(KeywordExecutor.groovy:74) at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords.openBrowser(WebUiBuiltInKeywords.groovy:62) at Get Report in CWS.run(Get Report in CWS:70) at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194) at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119) at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:448) at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:439) at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:418) at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:410) at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:285) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:137) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:125) at TempTestCase1755236711660.run(TempTestCase1755236711660.groovy:25) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) Caused by: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: session not created from unknown error: cannot find Chrome binary Host info: host: 'CNM62C3LR3', ip: '10.248.41.211' Build info: version: '4.22.0', revision: 'c5f3146703' System info: os.name: 'Windows 11', os.arch: 'amd64', os.version: '10.0', java.version: '17.0.14' Driver info: com.kms.katalon.selenium.driver.CChromeDriver Command: [null, newSession {capabilities=[Capabilities {browserName: chrome, goog:chromeOptions: {args: [], extensions: []}, unhandledPromptBehavior: ignore, webSocketUrl: true}]}] at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:114) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:75) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:61) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:162) at org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:216) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:174) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:518) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:232) at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:161) at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:114) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:88) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:83) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:72) at com.kms.katalon.selenium.driver.CChromeDriver.<init>(CChromeDriver.java:13) at com.kms.katalon.core.webui.driver.chrome.ChromeDriverBuilder.createDriver(ChromeDriverBuilder.java:41) at com.kms.katalon.core.webui.driver.AbstractDriverBuilder.build(AbstractDriverBuilder.java:39) at com.kms.katalon.core.webui.driver.DriverFactory.startNewBrowser(DriverFactory.java:251) at com.kms.katalon.core.webui.driver.DriverFactory.openWebDriver(DriverFactory.java:161) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword$_openBrowser_closure1.doCall(OpenBrowserKeyword.groovy:40) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword$_openBrowser_closure1.call(OpenBrowserKeyword.groovy) at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.runKeyword(WebUIKeywordMain.groovy:35) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword.openBrowser(OpenBrowserKeyword.groovy:47) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword.execute(OpenBrowserKeyword.groovy:33) at com.kms.katalon.core.keyword.internal.KeywordExecutor.executeKeywordForPlatform(KeywordExecutor.groovy:74) at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords.openBrowser(WebUiBuiltInKeywords.groovy:62) at Script1754445852181.run(Script1754445852181.groovy:70) ... 13 more ) Aug 15, 2025 1:45:17 PM com.kms.katalon.core.logging.KeywordLogger log SEVERE: ❌ Test Cases/Get Report in CWS FAILED. Reason: com.kms.katalon.core.exception.StepFailedException: Unable to open browser with url: '' at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.stepFailed(WebUIKeywordMain.groovy:117) at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.runKeyword(WebUIKeywordMain.groovy:43) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword.openBrowser(OpenBrowserKeyword.groovy:47) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword.execute(OpenBrowserKeyword.groovy:33) at com.kms.katalon.core.keyword.internal.KeywordExecutor.executeKeywordForPlatform(KeywordExecutor.groovy:74) at com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords.openBrowser(WebUiBuiltInKeywords.groovy:62) at Get Report in CWS.run(Get Report in CWS:70) at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194) at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119) at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:448) at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:439) at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:418) at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:410) at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:285) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:137) at com.kms.katalon.core.main.TestCaseMain.runTestCase(TestCaseMain.java:125) at TempTestCase1755236711660.run(TempTestCase1755236711660.groovy:25) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) Caused by: org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Response code 500. Message: session not created from unknown error: cannot find Chrome binary Host info: host: 'CNM62C3LR3', ip: '10.248.41.211' Build info: version: '4.22.0', revision: 'c5f3146703' System info: os.name: 'Windows 11', os.arch: 'amd64', os.version: '10.0', java.version: '17.0.14' Driver info: com.kms.katalon.selenium.driver.CChromeDriver Command: [null, newSession {capabilities=[Capabilities {browserName: chrome, goog:chromeOptions: {args: [], extensions: []}, unhandledPromptBehavior: ignore, webSocketUrl: true}]}] at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:114) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:75) at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:61) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:162) at org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:216) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:174) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:518) at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:232) at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:161) at org.openqa.selenium.chromium.ChromiumDriver.<init>(ChromiumDriver.java:114) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:88) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:83) at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:72) at com.kms.katalon.selenium.driver.CChromeDriver.<init>(CChromeDriver.java:13) at com.kms.katalon.core.webui.driver.chrome.ChromeDriverBuilder.createDriver(ChromeDriverBuilder.java:41) at com.kms.katalon.core.webui.driver.AbstractDriverBuilder.build(AbstractDriverBuilder.java:39) at com.kms.katalon.core.webui.driver.DriverFactory.startNewBrowser(DriverFactory.java:251) at com.kms.katalon.core.webui.driver.DriverFactory.openWebDriver(DriverFactory.java:161) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword$_openBrowser_closure1.doCall(OpenBrowserKeyword.groovy:40) at com.kms.katalon.core.webui.keyword.builtin.OpenBrowserKeyword$_openBrowser_closure1.call(OpenBrowserKeyword.groovy) at com.kms.katalon.core.webui.keyword.internal.WebUIKeywordMain.runKeyword(WebUIKeywordMain.groovy:35) ... 18 more Aug 15, 2025 1:45:17 PM com.kms.katalon.core.logging.KeywordLogger endTest INFO: END Test Cases/Get Report in CWS
最新发布
08-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值