OK6410A 开发板 (八) 29 linux-5.11 OK6410A 主要内核线程解析

发布者:JoyfulExplorer最新更新时间:2022-09-13 来源: csdn关键字:OK6410A  开发板  11 手机看文章 扫描二维码
随时随地手机看文章

kthreadd这篇博客简述了 一下 系统内创建的 所有内核线程

// 进程 1 2 的 父进程为 0

// 其他所有内核线程(被[]包括的) 父进程都是 kthreadd

进程ID 所属用户 状态  COMMAND进程名 进程创建文件 进程创建函数


// 1号用户进程

    1 root      1412 S    {linuxrc} init //init/main.c kernel_thread

    // 1号用户进程

   

// 2号内核进程

    2 root         0 SW   [kthreadd] // init/main.c  kernel_thread

    // 2号内核线程,负责 创建所有的内核线程


// 内核的管家进程


    3 root         0 IW   [kworker/0:0-eve] //kernel/workqueue.c create_worker

    4 root         0 IW<  [kworker/0:0H-kb]

    5 root         0 IW   [kworker/u2:0-ev]

   16 root         0 IW   [kworker/0:1-eve]

   30 root         0 IW<  [kworker/0:1H-kb]

   31 root         0 IW<  [kworker/u3:1-xp]

   48 root         0 IW   [kworker/u2:7-nf]

   67 root         0 IW<  [kworker/u3:4-xp]

    // "kworker" is a placeholder process for kernel worker threads, which perform most of the actual processing for the kernel, especially in cases where there are interrupts, timers, I/O, etc. 

    // These typically correspond to the vast majority of any allocated "system" time to running processes. 

    // It is not something that can be safely removed from the system in any way, and is completely unrelated to nepomuk or KDE (except in that these programs may make system calls, which may require the kernel to do something).

    // 用于执行内核工作队列,分为绑定 CPU (名称格式为 kworker/0:0-eve)和未绑定 CPU(名称格式为 kworker/u3:4-xp)两类。

    7 root         0 SW   [ksoftirqd/0] // kernel/softirq.c smpboot_register_percpu_thread

    // ksoftirqd以与kworker几乎相同的方式处理 softirq

    // softirq 使用的内核线程ksoftirqd


// 模块相关进程


// 内存相关进程

    6 root         0 IW<  [mm_percpu_wq] // mm/vmstat.c alloc_workqueue

   10 root         0 SW   [oom_reaper] // mm/oom_kill.c kthread_run

   11 root         0 IW<  [writeback] // mm/backing-dev.c alloc_workqueue

   12 root         0 SW   [kcompactd0] // mm/compaction.c kthread_run

   19 root         0 SW   [kswapd0] // mm/vmscan.c kthread_run

    // 用于内存回收


// 网络相关进程


   20 root         0 IW<  [nfsiod] // fs/nfs/inode.c alloc_workqueue

   21 root         0 IW<  [ipv6_addrconf] // net/ipv6/addrconf.c create_workqueue

    8 root         0 IW<  [netns] // net/core/net_namespace.c create_singlethread_workqueue

    9 root         0 IW<  [inet_frag_wq] // net/ipv4/inet_fragment.c create_workqueue


// 块设备相关进程

   13 root         0 IW<  [kblockd] // block/blk-core.c alloc_workqueue

// rpc相关

   15 root         0 IW<  [rpciod] // net/sunrpc/sched.c alloc_workqueue

   18 root         0 IW<  [xprtiod] // net/sunrpc/sched.c alloc_workqueue


// 防死机看门狗内核进程

   14 root         0 SW   [watchdogd] // drivers/watchdog/watchdog_dev.c kthread_create_worker

   

// mmc 相关

   23 root         0 IW<  [sdhci] // drivers/mmc/host/sdhci.c alloc_workqueue

   24 root         0 SW   [irq/88-mmc0] // drivers/mmc/host/sdhci.c request_threaded_irq

    // 给中断线程化使用的irq内核线程

   29 root         0 IW<  [mmc_complete] // drivers/mmc/core/block.c alloc_workqueue


// 用户进程


   53 root      4100 S    /sbin/mdev -df

   64 root     19388 S    /usr/bin/Xorg :0.0 vt01 -s 0 -noreset -allowMouseOpe



// 后期 需 重点关注 这些进程

// init kthreadd 

// kworker ksoftirqd 

// mem(5个) kblockd mmc(3个) watchdogd 


idle线程


init线程


kthreadd线程


kworker线程


入口是 worker_thread


kthread

create->threadfn/即worker_thread

woke_up:

...

recheck:

if (!need_more_worker(pool))

goto sleep;

if (unlikely(!may_start_working(pool)) && manage_workers(worker))

goto recheck;

do{

process_scheduled_works

process_one_work

worker->current_func(work);

}while(keep_working(pool));

sleep:

schedule();

goto woke_up;


ksoftirqd 线程

kthread

create->threadfn/即run_ksoftirqd

__do_softirq

struct softirq_action *h;

h = softirq_vec;

while ((softirq_bit = ffs(pending))) { 

h += softirq_bit - 1;

h->action(h);

h++;

}


watchdogd 线程


总结 : 

1.watchdogd 线程 是个 kworker 线程

2.定时器的处理函数会提交喂狗任务给 watchdogd 线程

4.watchdogd 线程被调入后喂狗


---- 初始化时


subsys_initcall_sync(watchdog_init);


watchdog_init

watchdog_dev_init

watchdog_kworker = kthread_create_worker(0, "watchdogd"); // 即 kthread -> (create->threadfn/即worker_thread)




module_platform_driver(s3c2410wdt_driver)

.probe      = s3c2410wdt_probe,

s3c2410wdt_probe

watchdog_register_device

__watchdog_register_device

watchdog_dev_register

watchdog_cdev_register

// 喂狗任务

kthread_init_work(&wd_data->work, watchdog_ping_work);

// 定时器

hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);

wd_data->timer.function = watchdog_timer_expired;


----运行时


// 定时器时间到了,watchdog_timer_expired被调用

// watchdog_timer_expired 提交喂狗任务 给 watchdog_kworker

watchdog_timer_expired

kthread_queue_work(watchdog_kworker, &wd_data->work);


// 喂狗任务 被调用 

watchdog_ping_work

__watchdog_ping(wd_data->wdd);

wdd->ops->ping(wdd)/即s3c2410wdt_keepalive

writel(wdt->count, wdt->reg_base + S3C2410_WTCNT);


mmc 相关线程

//等涉及到 mmc 分析了再说

// 设备驱动相关


kblockd 线程

// 等涉及 ext3 分析了再说

// 文件系统相关


mem 相关线程

// 等涉及到内存分析了再说

// 内存相关


其他

创建内核线程的API是什么

A.比较高级的API : kernel_thread

B.比较中级的API : kthread_create

C.比较简单的API : alloc_workqueue/create_workqueue/smpboot_register_percpu_thread/request_threaded_irq



使用A 的 场景 : 就 两个

使用B 的 场景 : 不超过20个

使用C 的 场景 : 很多,有超过200个

 

内核建议我们使用C


C 对于 我们来说是什么

一个创建线程的方法(包括3方面)

1.工作者线程的创建 // 任务的创建完全是内核处理的,我们不需要关心

2.工作任务的提交(当然先要创建任务) // 任务的创建和提交是我们处理的,需要关心 // 有些是内核处理的

3.工作者线程的唤醒 // 唤醒 是 我们处理的,需要关心 // 有些是内核处理的


C 创建的线程(名为target)  会 查询 队列(名为queue)中的任务,然后没有任务(task

)就睡眠

如果有代码将任务(task)插入了该队列(queue),然后唤醒target,此时 target 会执行任务(task)中的处理函数


对于内核,这个框架的实现有好几种

1. 工作队列

2. softirq


工作队列

1.利用 alloc_workqueue/create_workqueue 完成 工作者线程的创建

2.利用 insert_work 完成 工作任务的提交 // queue_work 调用的深层函数

3.利用 wake_up_worker 完成 工作者线程的唤醒 // queue_work 调用的深层函数


softirq

1. 利用 smpboot_register_percpu_thread 完成 工作者线程的创建

2. 利用 or_softirq_pending 完成 工作任务的提交

3. 利用 wakeup_softirqd 完成 工作者线程的唤醒


softirq机制

处理函数的调用


分为两种

1. 直接处理 // 对应 __do_softirq  ,但是 __do_softirq  中也会 有 该动作(唤醒 softirqd 处理)执行的条件判断

2. 唤醒 softirqd 处理 // 对应 __do_softirqd  , 该函数位于 softirqd 中,是主体函数


原因:

处理函数的调用A :

1.__do_softirq // 一个函数,直接调用即可,该函数可以直接处理softirq,而不用唤醒 softirqd

2.__do_softirqd // 在一个线程里面,使其被调用只能先 唤醒该线程1

// linux-5.11 中没有这个函数,而是用的__do_softirq 

// TODO 

处理函数的调用A的封装:

1.invoke_softirq/do_softirq

2.wakeup_softirqd

处理函数的调用A的封装的封装:

1.irq_exit/netif_rx_ni/local_bn_enable

2.raise_softirq/__do_softirq 

处理函数的调用A的封装的封装的封装:

1.无

2.invoke_softirq/do_softirq

处理函数的调用A的封装的封装的封装的封装:

1.无

2.irq_exit/netif_rx_ni/local_bn_enable


引起 __do_softirq 运行的函数

处理函数的调用A :

1.__do_softirq // 一个函数,直接调用即可


处理函数的调用A的封装:

1.invoke_softirq/do_softirq


处理函数的调用A的封装的封装:

1.irq_exit/netif_rx_ni/local_bn_enable


引起 __do_softirqd 运行的函数

处理函数的调用A :


2.__do_softirqd // 在一个线程里面,使其被调用只能先 唤醒该线程1

处理函数的调用A的封装:


2.wakeup_softirqd

处理函数的调用A的封装的封装:


2.raise_softirq/__do_softirq 

处理函数的调用A的封装的封装的封装:


2.invoke_softirq/do_softirq

处理函数的调用A的封装的封装的封装的封装:


2.irq_exit/netif_rx_ni/local_bn_enable


同时引起 两者 运行的函数

irq_exit/netif_rx_ni/local_bn_enable

invoke_softirq/do_softirq

__do_softirq 


只引起 __do_softirq(绝对不会引起唤醒softirqd的函数) 运行的函数


只引起 __do_softirqd 运行的函数

raise_softirq

wakeup_softirqd

__do_softirqd 

关键字:OK6410A  开发板  11 引用地址:OK6410A 开发板 (八) 29 linux-5.11 OK6410A 主要内核线程解析

上一篇:OK6410A 开发板 (八) 30 linux-5.11 OK6410A 进程相关的寄存器
下一篇:OK6410A 开发板 (八) 28 linux-5.11 OK6410A 进程之间的区别

推荐阅读最新更新时间:2024-11-05 16:33

STM32F4开发板----定时器(004)
定时器 定时器功能:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和pwm) 1.通用定时器 1.1 初始化基本定时参数 /** * @brief TIM Time Base Init structure definition * @note This structure is used with all TIMx except for TIM6 and TIM7. */ typedef struct { uint16_t TIM_Prescaler; /*! Specifies the prescaler value used to divide the TIM clock.
[单片机]
2011年LED商用显示市场或将驶入快车道
    综合2010年中国B2B商用显示市场表现,奥维咨询(AVC)预测,未来五年,中国B2B商用显示市场更加值得期待,将显现以下发展趋势。     由于轻薄、低能耗、低辐射等优势,目前LED背光液晶电视已经在B2C市场应用十分广泛,奥维咨询(AVC)数据表明,B2CLED液晶电视渗透率已达30%.但由于价格、产品特性以及用户需求,其在B2B领域的应用率仍然不高,2010年其市场渗透比例不足5%.然而,随着2011年LED新增产能的大规模释放,其产品价格将与CCFL的进一步接近,奥维咨询(AVC)预计,2011年,LED液晶在B2B市场渗透率将会达到8%~10%.     此外,目前在大屏幕拼接墙领域主要有三大技术,分别是
[电源管理]
stm32使用HX711读电子秤的值
使用HX711变送器模块+5kg的传感器。 #define HX711_DATA PEin(0) #define HX711_SCK PEout(1) void HX711_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.G
[单片机]
stm32使用HX7<font color='red'>11</font>读电子秤的值
CyberLink:想看4K蓝光 DVD,请不使用英特尔11/12代处理器
1 月 16 日消息,根据 CyberLink 讯连科技的说法,英特尔 11/12 代酷睿处理器已经不支持播放 4K 蓝光 DVD 实体光盘。   英特尔 Software Guard Extensions (英特尔 SGX) 功能是在 Windows 平台上播放超高清蓝光电影光盘上的 DRM(数字版权管理)内容的 CPU 和主板固件的要求。   在一份问答中,多媒体影音服务商 CyberLink 表示,英特尔 SGX 功能已从英特尔第 11 代(或更新的)CPU 中删除,并且可能会在新版本的英特尔驱动程序或实用程序(例如,英特尔 SGX 和英特尔管理引擎驱动程序和固件)上删除对 SGX 的支持。   CyberLi
[手机便携]
CyberLink:想看4K蓝光 DVD,请不使用英特尔<font color='red'>11</font>/12代处理器
2011年市场景气低迷依旧,但供求不平衡有望缓解
受访人:潘松,上海海尔集成电路有限公司副总经理   全球经济还远远没有走出金融危机的影响,以美国为代表的世界主要经济体还陷在泥潭中,而以中国为代表的新兴经济体又面临通胀等压力。总体来说,2011年的全球IC和电子元器件市场不容乐观。在市场成长率、出货量方面仍会较为低迷;不过2010年下半年出现的因过度紧缩造成的供求不平衡将不再出现。   绿色环境能源政策引发的产品升级,以及物联网、智能电网、生产设备更新等一系列内需市场的启动,会给中高端产品市场带来较好的机会。但在低端消费品市场方面,随着人民币升值的压力,劳力、资源成本的上升,低端产品将会面临更为残酷的竞争。上述市场以及未来中高端消费品市场如3DTV、4G通讯、电容触控等
[半导体设计/制造]
知名分析师预测2011年半导体市场增长6%
  Future Horizons 的创始人及分析师Malcolm Penn认为全球半导体业受2009年的金融危机的影响,到2010年耀眼的超过30%的增长,所以进入2011年将回归到正常年景,增长6%。   Penn在演讲会上说,明年产业将回顾到正常增长,据目前已有的各种预测是在增长1.5%至10.5%之间。Penn坚持现在谈明年的态势还不可能太精准,关键是看趋势。   Penn抛出它的预测数字2011年增长6%,但是仍认为有很大的上升空间。   因为在2010年7月时Penn曾作过2011年由增长28%,下调到14%,并声言这是重新校正。   Penn的6%增长预测是基于2011年的芯片平均售价,ASP可能增长1.5%
[半导体设计/制造]
TMS320LF2407与LAN91C111型嵌入式以太网接口电路的实现
嵌入式以太网不仅可用于工业现场实现现场节点的自动上网功能,而且还可以用于信息家电的以太网接口实现远程控制,具有很好的发展前景。文章介绍基于 TMS320LF2407 型DSP的嵌入式系统与LAN91C111型自适应10Mb/s/100Mb/s嵌入式以太网控制的接口电路及软硬件实现方法。   1 引言   目前关于嵌入式以太网的设计方案不是很多,其中大多是基于单片机的,缺点是速度慢、成本太高。DSP作为一种特殊的嵌入式微处理器系统,具有嵌入的协处理器和用于快速数据处理的并行数据通道,在嵌入式网络设备中引入DSP技术可以使嵌入式以太网变得更快、更便宜、更容易进行功能扩充。本文介绍了基于TMS320LF2407型的嵌入式系统与L
[工业控制]
TMS320LF2407与LAN91C<font color='red'>111</font>型嵌入式以太网接口电路的实现
NI推出802.11ax无线测试解决方案
2016年6月16日,NI(美国国家仪器,National Instruments, 简称NI)作为致力于为工程师和科学家提供解决方案来应对全球最严峻的工程挑战的供应商,宣布推出WLAN测量套件抢先体验版,以支持IEEE 802.11ax(草案0.1)高效率无线标准草案。 WLAN测量套件结合了NI RF矢量信号收发仪(VST),帮助工程师在802.11物理层标准进行重大修改后仍能够有效地测量802.11ax设计的性能。 WLAN测量套件为研究人员、工程师和技术专家提供了强大且灵活的功能,帮助生成和分析802.11a/b/g/n/j/p/ac/ah/af等各种802.11波形。该测量套件专门针对802.11ax进行了更新,这些用
[网络通信]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved