前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux内核21-Linux内核的中断处理过程

Linux内核21-Linux内核的中断处理过程

作者头像
Tupelo
发布于 2022-08-15 07:53:41
发布于 2022-08-15 07:53:41
2.6K00
代码可运行
举报
文章被收录于专栏:嵌入式ARM和Linux嵌入式ARM和Linux
运行总次数:0
代码可运行

中断处理

如前所述,我们知道异常的处理还是比较简单的,就是给相关的进程发送信号,而且不存在进程调度的问题,所以内核很快就处理完了异常。

但是,这种方法不适用于中断,因为当一个不相关的进程正在运行的时候,发送给特定进程的中断信号会被挂起,等到该进程执行的时候才会处理。所以,给中断发送一个信号没有太大意义。

另外,中断的处理与中断类型息息相关。所以,我们将中断分为3类:

  1. I/O中断
  2. 定时器中断
  3. CPU之间的中断

下面我们将以I/O中断为例展开叙述。

I/O中断处理

中断资源是有限的,所以对于I/O中断处理程序来说,应该尽量为尽可能多的设备提供服务。比如PCI总线架构,几个设备共享同一个IRQ请求线。这意味中断矢量表是共享的,不能一一覆盖所有设备。比如下面的表4-3中,中断号43就被分配给了USB端口和声卡。但是,对于一些旧的架构来说,共享IRQ请求线不是那么可靠,比如ISA总线。

增强中断处理程序的灵活性,有下面两种方式:

  • IRQ共享 在每个中断处理程序中罗列所有共享该IRQ的设备的中断服务例程(ISR)。每次轮询一遍这些服务例程,判断是哪个设备发送的中断请求。所以,每次中断请求都要把所有的中断服务例程执行一遍。
  • IRQ动态分配 直到最后时刻,IRQ中断请求线才会与设备驱动程序关联起来。比如,只有当用户访问软盘设备的时候才会给软盘设备分配中断请求线IRQ。使用这种方法,即使不共享IRQ中断请求线,几个硬件设备也能使用相同的中断号。

众所周知,中断有轻重缓急之分,而且中断处理程序的执行时间不能过长。因为中断处理程序运行时,IRQ中断请求线的信号会被暂时忽略,所以,长时间执行且非重要的操作应该被延后执行。更为重要的是,代表中断处理程序执行的进程必须总是处于TASK_RUNING状态,或系统冻结中,因此,中断处理程序不能执行阻塞程序,比如I/O硬盘操作。

Linux将中断要执行的操作分为三类:

  • 关键中断 比如响应PIC控制器发送的中断,重新编程设置PIC或者设备控制器,更新设备和处理器访问的数据结构等。这些中断能够被快速执行且是关键数据,因为它们都必须被尽可能快的执行。在中断处理程序中立即执行这些关键操作,此时可屏蔽中断被禁止。
  • 非关键中断 更新只有处理器访问的数据结构的中断请求(比如,读取键盘按键按下后的键码)。这类中断在中断处理程序中也能很快完成处理。
  • 非关键可延时中断 比如拷贝缓存中的内容到进程的地址空间中的操作就是非关键可延时中断操作(比如,发送键盘的一行缓存到终端处理进程中)。这类操作完全可以延时一段时间执行,并不会影响内核操作。对于这类操作一般使用软中断和tasklet机制完成。

I/O中断处理的基本步骤是:

  1. 保存IRQ值和内核态堆栈中寄存器值->恢复进程的时候使用。
  2. 给PIC控制器发送应答,告知正在响应IRQ请求线,允许继续发送中断。
  3. 执行中断服务例程(ISR)。
  4. 从中断返回(跳转到ret_from_intr()函数地址)。

为了响应中断处理,需要几个数据结构和函数去描述IRQ请求线的状态和要执行的函数功能。图4-4展示了处理中断的过程原理图。其中的函数,后面描述。

中断向量表

在表4-2中,我们列出了IRQ的分配,中断号对应32-238。另外,Linux使用中断号128实现系统调用。

表4-2 Linux中断向量表

中断线号

使用范围

0–19

不可屏蔽中断和异常

20–31

为Intel保留

32–127

外部中断

128

系统调用专用

129–238

外部中断

239

APIC定时器中断

240

APIC温度中断

241–250

保留

251–253

CPU之间的中断

254

APIC错误中断

255

APIC伪中断

对于IRQ可配置的设备,有三种方法选择IRQ中断请求线:

  • 通过跳线帽(一般旧计算机时代使用)。
  • 通过设备的程序进行设置。用户可以选择可用的IRQ请求线或者自行探查系统可用的IRQ中断请求线。
  • 在系统启动阶段,按照硬件协议进行申请,然后通过协商,尽可能减少冲突。完成分配后,每个中断处理程序通过函数读取访问I/O设备的IRQ中断请求线。比如,遵循PCI总线标准的设备,可以使用一组类似pci_read_config_byte()的函数读取设备的配置空间。

表4-3展示了一个分配设备和IRQ的示例:

IRQ

INT

Hardware device

0

32

定时器

1

33

键盘

2

34

PIC级联

3

35

第二个串行端口

4

36

第一个串行端口

6

38

软盘

8

40

系统时钟

10

42

网口

11

43

USB端口,声卡

12

44

PS/2鼠标

13

45

协处理器

14

46

EIDE硬盘控制器的第一个链

15

47

EIDE硬盘控制器的第二个链

也就是说,内核必须在使能中断之前,知道哪个I/O设备对应哪个IRQ号。然后在设备驱动初始化的时候才能对应上正确的中断处理程序。

IRQ相关数据结构

那么,IRQ数据结构是什么样子呢?下图展示了IRQ数据结构以及它们之间的关系。该图中没有展示软中断和tasklet相关的数据结构和关系。因为我们后面会单独写文章对其进行阐述。

中断矢量表中的每一项都包含一个irq_desc_t类型的描述符,它的成员如表4-4所示。所有的项都存储到irq_desc数组中。

表4-4 irq_desc_t结构成员

成员

描述

handler

指向PIC对象,响应PIC发送的中断请求

handler_data

handler需要的数据

action

指向具体的中断服务例程

status

表明IRQ请求线的状态

depth

IRQ线禁止使能标志

irq_count

中断计数(诊断使用)

irqs_unhandled

未处理中断计数

lock

自旋锁,保护该数据结构的访问

非预期中断,就是那些可能没有中断服务例程(ISR)或者中断服务例程和中断请求线不匹配的中断。内核对于这类中断是不作处理的。但是内核如何检测这类中断呢?又是如何禁止这类中断呢?因为中断号是共享的,所以,内核不会一检测到非预期中断就禁止它,而是对于总的中断请求次数和未处理的中断次数进行计数。当总的中断次数达到100000次,而未处理的中断是99900次时,内核就会禁止该中断。

表4-5 展示了中断请求线的状态标志

标志

描述

IRQ_INPROGRESS

IRQ的服务程序正在被执行

IRQ_DISABLED

IRQ线被禁止

IRQ_PENDING

IRQ被挂起

IRQ_REPLAY

IRQ被禁止,但是上一次还没有响应PIC

IRQ_AUTODETECT

自动检测IRQ

IRQ_WAITING

内核在执行硬件设备探测时使用IRQ线;而且,相应的中断还没有被触发

IRQ_LEVEL

X86架构未使用

IRQ_MASKED

未使用

IRQ_PER_CPU

X86架构未使用

depth和标志IRQ_DISABLED表明IRQ线被使能还是禁止。每次调用disable_irq()disable_irq_nosync()函数,depth都会增加;如果depth大于0,则函数禁止IRQ线并且设置IRQ_DISABLED标志。相反,如果调用enable_irq()函数,depth会递减,如果depth等于0,则使能IRQ线并且清除IRQ_DISABLED标志。

系统启动时,调用init_IRQ()函数设置IRQ描述符中的status成员为IRQ_DISABLED。与讲解异常处理一样,也会调用setup_idt()类似的函数初始化IDT表,通过下面的代码段完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (i = 0; i < NR_IRQS; i++)
    if (i+32 != 128)
        set_intr_gate(i+32,interrupt[i]);

这段代码的功能就是遍历interrupt数组,查找各个中断处理程序的地址。需要注意的是,中断号128没有分配,留给系统调用作为异常使用。

除了8259A芯片之外,Linux还支持其它的PIC控制器,比如SMP IO-APICIntel PIIX4内部的8259中断控制器SGI的Visual Workstation Cobalt (IO-)APIC。为了统一处理这些硬件,Linux内核使用了面向对象的编程思想,构建了一个PIC对象,包含PIC名称和7个PIC标准方法。这种设计的优点是驱动程序无需关注系统中到底是什么中断控制器,硬件的差异被屏蔽掉了。这个PIC对象的数据结构类型称为hw_interrupt_type

我们更好理解,举一个具体的实例,假设计算机是单核,带有2个8259A中断控制器,提供16个标准的IRQ。那么irq_desc_t类型的描述符中的handler指向hw_interrupt_type类型的结构对象i8259A_irq_type,其成员如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct hw_interrupt_type i8259A_irq_type = {
    .typename = "XT-PIC",           /* PIC名称 */
    .startup = startup_8259A_irq,
    .shutdown = shutdown_8259A_irq,
    .enable = enable_8259A_irq,
    .disable = disable_8259A_irq,
    .ack = mask_and_ack_8259A,
    .end = end_8259A_irq,
    .set_affinity = NULL
};

"XT-PIC",中断控制器名称。startupshutdown分别表示启动和关闭IRQ线,但是对于8259A来说,这两个函数与enabledisable两个函数相同。 mask_and_ack_8259A()应答中断控制器,end_8259A_irq()函数在中断处理程序结束时调用。set_affinity方法设为NULL, 这个方法是为多核系统设计的,用来声明CPU的亲和力affinity,也就是说为某个IRQ指定在哪个CPU上处理。

我们知道,多个设备可以共享一个IRQ。因此,内核必须为每个设备及其对应的中断维护一个数据结构,称为irqaction描述符。它的成员如下表所示:

表4-6 irqaction描述符的各个成员

成员

描述

handler

中断服务例程(ISR)

flags

描述IRQ和设备之间的关系

mask

未使用

name

I/O设备的名称

dev_id

指向设备本身

next

指向下一个irqaction

irq

IRQ线

dir

指向目录/proc/irq/n

表4-7 irqaction的标志位

成员

描述

SA_INTERRUPT

执行中断处理程序时必须禁止中断

SA_SHIRQ

允许共享IRQ

SA_SAMPLE_RANDOM

可以被当做随机数发生器

init_IRQ()的代码实现随着硬件架构的发展,以及内核的不断优化升级,会不断变化,且变得越来越复杂。但是,万变不离其宗,核心的设计思想没变。

多核系统中的IRQ分配

我们知道SMP的全称是对称多处理系统,这意味,Linux内核不应该对一个CPU有任何偏向。于是,内核在CPU之间采用循环法(round-robin)分配IRQ。因此,所有的CPU响应中断的时间都差不多。

之前我们已经了解过,多APIC系统的分配IRQ机制非常复杂。

在系统引导阶段,负责引导的CPU执行setup_IO_APIC_irqs()函数初始化I/O-APIC芯片。也就是初始化其中断重定向表(24项),然后所有来自I/O设备的IRQ就可以被中继到各个CPU上,分配原则是最低优先级优先原则。在此期间,所有的CPU执行setup_local_APIC()函数,初始化自身的APIC控制器。当然也可以将中断控制器中的TPR(任务优先级寄存器)写入相同值,从而公平地对待每个CPU,按照循环的方式分配IRQ。一旦初始化完成,内核就不能再修改这个值了。至于实现循环,前面我们讲过了,请参考之前的文章。

简而言之,设备发出IRQ信号,多APIC系统选择一个CPU,并把中断信号发送给响应的私有APIC,继而,私有APIC中断CPU。

虽说初始化之后,内核本不应该在关心IRQ分配问题。但是不幸的是,有时候硬件在分配中断时会发生错误(比如,基于奔腾4的SMP主板就有这样的问题)。因此,Linux2.6内核使用一个特定的内核线程叫kirqd进行纠正IRQ的自动分配(如果有必要的话)。

内核线程使用多APIC系统一个很棒的功能,叫做CPU的IRQ亲和力:通过修改I/O-APIC的中断重定向表,将中断信号指定到新的CPU上。具体操作就是调用set_ioapic_affinity_irq()函数,它需要两个参数:需要重定向的IRQ矢量表和一个32位的掩码(用来表示接收IRQ的CPU)。系统管理员也可以通过写新的CPU位掩码到/proc/irq/n/smp_affinity文件中,修改响应中断的CPU。

kirqd内核线程周期性地执行do_irq_balance()函数,追踪最近一段时间内,每个CPU上接收到的中断次数。如果发现CPU的中断负载不均衡了,它就会选择将某个IRQ移到另一个负载低的CPU上,或者采用在所有的CPU上循环响应IRQ。

内核态堆栈

在学习标识进程的时候,我们已经知道每个进程的thread_info描述符和内核态堆栈使用一个联合体结构组合在一起,占用内存一个或者两个页帧,这取决于编译内核时的配置。如果这个联合体的大小是8KB,内核态堆栈可以被任何一种内核控制路径使用:异常处理程序,中断处理程序和可延时函数。相反,如果这个联合体的大小是4KB,内核使用三种类型的内核态堆栈:

  • 异常堆栈 处理异常时使用,包含系统调用。每个进程都有一个异常处理使用的堆栈。
  • 硬IRQ堆栈 用于处理中断。每个CPU具有一个硬IRQ堆栈。
  • 软IRQ堆栈 处理可延时函数时使用。比如,软中断或tasklet。每个CPU都有一个软IRQ堆栈。

软、硬IRQ堆栈分别使用hardirq_stacksoftirq_stack两个数组存储。每个数组元素对应一个irq_ctx类型的联合体,占用一个页帧。该页帧的底部存储thread_info结构,其余的内存存储堆栈;因为堆栈的增长方向是递减的。因此软、硬IRQ堆栈与进程的堆栈非常相似,只是thread_info不同,一个是描述CPU,而另一个是描述进程。

为中断服务程序保存寄存器

我们已经知道,当CPU收到中断,它就会执行IDT表中对应的中断处理程序。

执行中断处理程序,意味着上下文切换。这部分的内容需要汇编语言编写,然后才能调用C函数。前面我们已经知道,中断处理程序的地址首先存储在interrupt[]数组中,然后才会被拷贝到IDT表中的某项对应的中断门。

中断数组的构建在arch/i386/kernel/entry.S文件中,都是汇编指令。数组的个数是NR_IRQS,如果内核支持I/O-APIC芯片,则NR_IRQS等于224,如果内核支持的是较旧的8259A中断控制器,则NR_IRQS等于16。数组的每一项包含的汇编函数的地址处的内容如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pushl $n-256
jmp common_interrupt

存储在堆栈上的IRQ号是中断减去256。也就是说,内核使用负数表示IRQ号,因为内核保留正数表示系统调用。对于通用中断代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
common_interrupt:
    SAVE_ALL
    movl %esp,%eax
    call do_IRQ
    jmp ret_from_intr

SAVE_ALL展开如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cld
push %es
push %ds
pushl %eax
pushl %ebp
pushl %edi
pushl %esi
pushl %edx
pushl %ecx
pushl %ebx
movl $__USER_DS,%edx
movl %edx,%ds
movl %edx,%es

SAVE_ALL保存中断处理程序可能用到的所有的CPU寄存器到堆栈上,除了eflags、cs、eip、ss和esp这些寄存器之外,因为这些寄存器是由CPU控制单元自动保存的。该宏用户代码段的选择符到ds寄存器中。

保存完所有的寄存器之后,栈顶位置就被存储在eax寄存器中;然后中断处理程序调用do_IRQ()函数。

do_IRQ()函数

函数do_IRQ()执行和中断有关的所有的服务例程,声明如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
__attribute__((regparm(3))) unsigned int do_IRQ(struct pt_regs *regs)

关键字regparm指示函数去eax寄存器中获取参数regs的值,如前所述,eax寄存器存储着中断使用的堆栈的栈顶位置。

函数do_IRQ()主要执行以下内容:

  1. 执行irq_enter()宏,增加嵌套中断计数;
  2. 如果堆栈的大小等于4KB,切换到硬IRQ堆栈;
  3. 调用__do_IRQ()函数,然后把regs指针和IRQ号(regs->orig_eax)传递给它;
  4. 如果在第2步切换到硬IRQ堆栈中,则拷贝ebx寄存器中的原始堆栈指针到esp寄存器中,以便切换回之前使用的异常堆栈或软IRQ堆栈中;
  5. 执行irq_exit()宏,减少中断计数,检查是否有可延时处理的函数正在等待处理;
  6. 终止:跳转到ret_from_intr()函数地址。

4.6.1.7 __do_IRQ()函数

__do_IRQ()函数接收IRQ号和指向pt_regs的指针作为参数,分别是通过eax和edx寄存器传递。然后,对中断作出应有的响应,代码片段如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spin_lock(&(irq_desc[irq].lock));
irq_desc[irq].handler->ack(irq);
irq_desc[irq].status &= ~(IRQ_REPLAY | IRQ_WAITING);
irq_desc[irq].status |= IRQ_PENDING;
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))
        && irq_desc[irq].action) {
    irq_desc[irq].status |= IRQ_INPROGRESS;
    do {
        irq_desc[irq].status &= ~IRQ_PENDING;
        spin_unlock(&(irq_desc[irq].lock));
        handle_IRQ_event(irq, regs, irq_desc[irq].action);
        spin_lock(&(irq_desc[irq].lock));
    } while (irq_desc[irq].status & IRQ_PENDING);
    irq_desc[irq].status &= ~IRQ_INPROGRESS;
}
irq_desc[irq].handler->end(irq);
spin_unlock(&(irq_desc[irq].lock));

上面的代码主要执行内容如下所示:

  1. 加锁,保护IRQ描述符数据结构 通过上面的代码,我们可以看出,在访问相应的IRQ描述符时,内核会请求自旋锁。这是防止不同CPU之间可能造成的并发访问。因为,在多核系统中,可能会发生同类型的其它CPU关心的中断,它们使用同一个IRQ描述符,所以造成访问冲突。
  2. 响应PIC中断控制器 加锁之后,函数调用IRQ描述符的ack方法,给中断控制器应答。如果使用的是旧的8259A中断控制器,使用mask_and_ack_8259A()响应PIC同时禁止IRQ线;屏蔽掉该IRQ线,保证CPU不再接收到这个类型的中断,直到中断处理程序完成处理。如果使用的是I/O-APIC,情况更为复杂。依赖于中断的类型,既可以使用ack方法响应PIC控制器也可以延时到中断处理程序结束再完成。
  3. 设置IRQ描述符的标志 设置IRQ_PENDING标志,因为此时已经应答过PIC中断控制器,但是还没有对其进行服务。也会清除IRQ_WAITINGIRQ_REPLAY标志。
  4. 真正执行中断处理。 此时,可能有三种意外情况需要处理: 假设没有上面的三种情况,中断被正式处理。设置IRQ_INPROGRESS标志,并启动循环处理。每次迭代过程,清除IRQ_PENDING标志,释放中断自旋锁,然后执行调用handle_IRQ_event()执行中断服务程序。
    1. 设置了IRQ_DISABLED 即使IRQ线被禁止,CPU还是有可能执行__do_IRQ()函数,所以需要特殊处理。
    2. 设置了IRQ_INPROGRESS 多核系统中,此时可能另外一个CPU可能正在处理先前发生的相同中断。Linux对此的处理方式就是延后处理。这样的处理方式使内核架构更为简单,因为设备驱动程序的中断服务程序是不需要可重入的(它们的执行一般都是序列化的)。
    3. irq_desc[irq].action为空 当没有与中断相关联的中断服务例程时,就会发生这种情况。通常,只有在内核探测硬件设备时才会发生这种情况。
  5. 中断服务程序完成。 释放自旋锁。

总结

其实内核经过这么多年的发展,在实现方式上已经发生了很大变化。但是其基本思想没变。比如我们以Linux4.4.203内核对于中断的处理为例,与上面的处理过程进行比较,理解其主要变化。

调用do_IRQ函数。其入口位于entry_32.S文件中,是C语言实现的。

do_IRQ函数原型为:

handle_irq函数最终调用的是下面的函数:

而我们之间已经说过desc->handle_irq的初始化在系统初始化时完成:

可见desc->handle_irq(irq, desc);执行的是handle_level_irq(irq, desc)。我们进入handle_level_irq(irq, desc)看看都做了哪些操作:

通过上面5步分析,我们知道,内核代码以及硬件设备在发生变化,但是中断处理的核心思想没有变。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式ARM和Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
matinal:SAP 项目实施全流程,项目实施必须要知道这些
SAP为独立实施的项目提供了面向过程的、清晰的、准确的实施路标。这个路标起到了项目向导的作用,用来确定步骤,明确转折点,并且通常用来设定整个项目的进度,使得可以使用最优的预算和资源,快速高质量的生成一个新的系统。ASAP路标包括下面几个阶段:项目准备,业务蓝图,实现,最后准备以及上线支持。 1、项目准备阶段 项目准备阶段主要是建立项目组织,包括项目团队、角色和职责。这一阶段确定系统实施的目标。还要确定项目的基本构造,包括硬件、网络要素。执行正式安装的规模和指标,并且初始化SAP系统。 1.1 定义项目目标和范围 SAP项目的任务和目标须与公司未来3-5年内的任务和目标一致。指导委员会的重要责任就是决定SAP项目的实施范围。SAP推荐使用“大爆炸”的方式,即公司一次性实施SAP大部分标准的功能和针对公司的特定行业解决方案。 只有通过“大爆炸”的方法才能使公司将SAP系统所获取的信息作为一项资源来使用,如人力、材料、资金,而不是把SAP当作是记录和报表系统。一个综合系统的真正优势只有在公司的所有实施点和办公业务都在SAP平台上运行时才能得到真正的体现。 1.2确定项目组织和资源 建立项目资源计划,项目资源需求包含以下几点: 在合适的阶段分配和支付财务预算; 获取并按照计划来配备相关的系统硬件、软件、网络系统; 选出业务骨干,这些人是他们所在部门的主要成员,并且被任命为功能团队成员,他们被赋予为系统进行全面调试和对最终用户进行培训的任务; 1.3 定义风险控制策略 SAP实施项目是一个标准软件包的实施,主要风险包括: 合适资源的缺乏; 在实施范围和系统功能的问题上缺乏清晰性,完备性和明确性; 需求获取和分析 理解SAP系统所提供的功能 功能上的差距评估和分析 正确配置和定制SAP系统 SAP系统的综合测试 数据风险,特别是各种主数据的准确性 通过制定有效的风险控制策略来控制上述可能的风险。 1.4准备项目计划 建立项目工作计划:项目经理制定项目的主工作计划,包括各阶段的完成时间点以及要提交的主要工作产品。 建立项目组培训计划:针对关键用户和最终用户的系统培训。 1.5项目启动 项目一般由一个发起会议来正式启动,参加这个会议的有管理人员、控制委员会成员、SAP顾问和小组成员。在项目启动大会上介绍项目的目标、项目组的组织成员及职责以及项目的主要工作计划。 1.6项目培训 模块顾问根据培训计划,执行项目组培训。 1.7开发、测试机系统准备 安装开发机、测试机系统,并给所有的项目组成员安装SAP桌面登录系统。 2、蓝图设计阶段 业务蓝图阶段主要处理需求的归档和最终的确定。小组成员和顾问在不同的业务活动领域内进行访谈,并召开项目讨论会,以获得各业务流程的确定需求。当前业务与未来业务的任何差别都必须进行识别,并要寻找和设计合适的解决方案。这个阶段最后输出企业蓝图文档,详细说明设计后的流程,包括公司结构和业务流程的文本和图形说明文件。一旦确定和验证了所有这些信息之后,蓝图就可以作为所有后续阶段的基础。 2.1 AS-IS业务流程调研 制定调研计划,确定调研的时间以及参加的人员,输出文档:调研计划; 设定调研提纲,根据访谈的人员的岗位,设定调研的内容,输出文档:调研问卷; 执行业务调研,根据调研计划,访谈岗位的人员,了解业务现状以及期望未来可达到的管理目标,输出文档:会议纪要; 完成业务调研文档,根据访谈的内容,整理形成公司AS-IS现状业务文档,输出文档:现状业务流程图,现状报告,包括如下内容: 现有系统的Landscape 组织架构 现状业务流程图 收集的现状报表、表单 业务主数据现状等; 2.2 TO-BE业务流程设计 根据现状业务以及未来管理的期望,组织跨模块讨论,编制TO-BE业务流程报告,然后对未来业务流程进行模块小组内讨论,然后提交指导委员会进行评审;输出文档:TO-BE业务蓝图文档。 未来业务流程文档包括如下内容: 确定未来系统的组织架构,比如设定公司代码、成本控制范围、利润中心、成本中心、工厂、仓库、销售组织、采购组织等组织架构。 编制业务流程文档,设定未来业务流程如何在部门间的流转,单据如何控制。 2.3开发需求确认 在讨论和编制业务蓝图的过程中,涉及到需要开发的业务需求,则需要确认各模块的开发需求,输出文档:开发计划。 2.4主数据的收集方案及计划 讨论确认需要收集什么样的主数据,以及主数据的收集内容及计划安排,输出文档,主数据收集模版、主数据收集计划。 2.5业务蓝图的汇报及签署 业务蓝图编制完成后,在模块内部进行
matinal
2023/11/18
6180
实施方法论题库
1.最终用户培训工作,建议由() 得,培训后最终用户需参加考试,考试不合格者需继续培训  A
用户10175992
2023/10/17
3900
大型软件交付项目注意事项53条
多年前,从事信息技术行业流行自嘲“挨踢”,对于不同的受众,也可以说是“整电脑”或者“做软件”的。后来“互联网”火了,渐渐就变成了“搞互联网”的,尽管最近国内互联网有些颓,中概互联成了中丐互联,但暂时还没有新的替代词汇。如果用英文就很直接,信息技术是“IT”,计算机科学是“CS”,软件工程师是“SE”。我们常说的系统、应用、APP、程序都是“软件”,与硬件相对应。
IT民工闲话
2022/01/10
1.2K0
大型软件交付项目注意事项53条
实施工程师
每个阶段下面有不同的工作事项,各个阶段之间都是承上启下关系,上一阶段的顺利完成是保证下一阶段的工作开展的基础。
红目香薰
2022/11/29
7040
实施工程师
Java项目的开发流程「建议收藏」
  1)、选择基础平台,无论是采用第三方平台还是自行开发平台,都需要深入了解,查看是否符合要求。
全栈程序员站长
2022/06/25
1.5K0
信息系统项目实施管理方案
针对本项目,我公司提供的实施详细内容包括: 1) 合理、科学的设备选型及购置项目需求的全部设备; 2) 完成项目需求全部设备和系统的现场安装、配置及调试; 3) 系统联调; 4) 项目验收及测试,提交详细验收及测试文档; 5) 系统试运行,并提交相关技术文档; 6) 提供专业培训及现场用户培训; 7) 售后服务支持;
用户7454708
2023/05/08
9130
信息系统项目实施管理方案
十大管理领域可能的问题与解决举措
熟读吧,根据案例中出现的情况,使用不同的话术 可研过程中可能出现的问题 项目经理的技术经验不足 没有正式、书面的新产品研发项目建议书就开展可行性研究工作 新产品研发的可行性研究工作不充分,尤其缺少技术可行性分析和论证 研发过程中对人才缺乏、竟争对手等带来的风险缺乏充分的分析,没有合理有效的应对方案 没有新产品的初步设计方案就开始研发工作 新产品的需求和技术指标不应由领导把关,应进行外部评审 在项目启动前缺少对项目成本的估算或成本估算工作未到位 可行性研究报告缺少必要的内部论证或外部评估环节 没有制订综合、全
用户3148308
2021/05/27
7860
一个合格的项目经理都需要做哪些事情?
之前在公司一直主要负责app研发这块工作,后来公司实行项目责任制,正好谈下来一个比较大的项目(北京新机场新机场安全管控平台),这个平台简单来讲就是集团承包安全部用的一个安全管控平台,因为总包下面有100多家分包公司,整体工程的安全管理是一块很大的工作。
再见孙悟空_
2023/02/10
2630
一个合格的项目经理都需要做哪些事情?
项目管理是科学还是艺术? 深刻分析
最要紧的就是要明白什么是因地制宜、因势利导,只有最合适的,没有什么叫对的,什么叫错的 项目经理最忌讳的就是完美主义倾向,尤其是做技术人员出身的,喜欢寻找标准答案,耽误了工作进度,也迷茫了自己。
PM吃瓜
2023/03/02
4430
项目管理是科学还是艺术? 深刻分析
B端SaaS产品工作流程
产品研发流程大体分为:立项阶段、设计阶段、开发阶段、测试阶段、上线阶段、运营阶段。
物流IT圈
2020/07/02
1.5K1
从零开始掌握政务信息化项目开发全流程
政务信息化项目开发全流程包括立项、需求分析、项目规划、系统设计、系统开发、测试与部署、运维与管理、收尾等主要阶段。每个阶段都有其特定的任务和要求,确保项目按照既定的目标和标准顺利进行。
Towserliu
2024/07/27
9800
从零开始掌握政务信息化项目开发全流程
软件测试流程及产出物
测试从需求分析开始介入,测试人员参与需求的分析活动,确定测试的需求。需要了解测试需求及测试进度,即需要验证什么功能需求点,采用什么测试策略,描述目前在进行哪一阶段的测试(单元测试、集成测试、系统测试)以及每个阶段内在进行的测试种类(功能测试、性能测试、压力测试等)。详细阅读分析需求文档,进行逻辑梳理并勾勒出功能的大概流程图;与产品经理等相关人员探讨表述不清楚的地方,细化业务流程;考虑正常流程中的测试难点;考虑与其他功能的关联;考虑非正常流程;考虑版本数据兼容。
全栈程序员站长
2022/09/01
9970
软件测试流程及产出物
CMMI-4中19个PA的大致描述
组织过程资产库下面有组织级标准过程库, 这个库里一共有19各PA(就是标准过程啦) PA的英文是Process Area CM(配置管理过程,英文是Configuration Management) 项目研发和管理过程中会产生很多工作成果,例如文档、程序和数据等,它们都应当被管理起来,以便查阅和修改。鉴于用户的需求会发生变更,导致项目的相关产品也会随之变更,为了使项目的所有过程和产品保持一致性,并且便于跟踪控制,我们需要建立一套严格的配置管理流程 DAR(决策分析过程,英文是Deci
liulun
2018/01/12
1K0
软件测试面试常考题目总结
开发首先要规范好编码,出低级错时不要指责,内心指出错误。让他们自己进行测试,反思找出错误。
wangmcn
2022/07/26
4800
如何对进度进行有效的监控与管理?
项目进度控制是项目 管理 工作中的重要一环,但现在的软件开发项目进度失控的例子却屡见不鲜,甚至进度的延迟总是在快到计划结束的时刻暴露出来,然后谁也不知道到底什么时候才能够结束项目。因此,业内流传着这样一句令人心酸的话:“规划规划全是鬼话,计划计划全是空话”。前不久,我就遇到了这样的一个实际项目。   “当进度报告上显示已完成90%时,项目就像遇到了一个黑洞,不断地吞噬着项目组队的时间。你说这是怎么了?”在A 公司工作的一个好友和我谈起时,话语中露出了深深的不解和抱怨。是呀,问题出在哪呢?根据我的经验,这是经典的“上梁不正下梁歪”问题,我认为要想对项目进度有效的监控与管理,必须抓好以下两个方面:   ◆ 项目计划:计划的可行性和可操作性是进度监控的基础;   ◆ 项目进度度量:对项目进度进行科学的度量,才能够获得项目的真实进展情况,并对项目计划做出相应调整。   首先,我们从90%,这个项目完成百分比的来源说起,项目经理在进度报告中写下这个值的时候,他的依据是什么?在这个项目后来的实际情况来看,当时90%的数字是有误的,其实只有50%左右,说明获取这个进度数字时出现了问题。为了更好地理解这个问题,我们来看一个生活中的实际例子:   假设我们驱车从厦门开往福州,在途中我们如何获得进度信息呢?对于熟悉这一路段的司机来说这个问题很简单,可以从窗外的景象来得知已经开到哪里,从而做出正确的估计。但是对于软件开发项目而言,项目团队就像进入了一个全新的征途,就像一个第一次驶过这一路段的司机一样,很难从“窗外的景象”来判断自己的进度。那对于这样的情况,该采用什么方法呢?对于司机而言,他能够通过路边的里程碑这一个简单工具。   来获知自己的进度信息,那么为什么项目团队不为自己设立一些这样的“里程碑”呢?   从这个简单的故事中,我们似乎已经可以得到一些启示,那么现在问题的关键在于如何合理地设立标识项目进度的“里程碑”,接下来我们来看看具体如何操作。   在一个软件开发项目中,需要完成的事务很多也很复杂,其复杂度足以让任何人无法对其工作量进行有效的估计,因此对工作任务进行分解是十分重要,这也是设定里程碑的基础。但如何进行工作任务分解呢?这也许也是困扰许多人的一个问题。其实工作任务分解可以从两个方面获得帮助:   ◆ 软件开发生命周期:不管你打算采用什么样的软件开发生命周期模型,它都可以帮助你将整个软件开发项目进行阶段性的划分,而这些阶段就可以做你计划中很重要的里程碑。   ◆ 软件开发需求:软件开发生命周期只给你的项目计划提供了一个框架,而软件开发需求才是其中的血肉,因此软件开发需求的整理与规格化,是细化项目计划的基础。也就是说,在制定项目计划时,应该在你选择的软件开发生命周期模型的框架下,结合软件开发需求来细分任务和设定里程碑。   回顾在这个项目中,他们考虑到项目的复杂性,采用了其熟悉的瀑布型(软件开发生命周期),并且在制定计划时,项目经理认真参考了许多经验值,将2个月的时间按照经验值中的百分比给需求分析、系统设计、编码实现、系统测试、部署交付五个阶段分别安排了时间。并且根据软件需求说明书的内容,列出了软件模块,   并根据每个模块细化了系统设计和编码实现的进度安排。一切看起来都很正常,但是为什么还是没有效果呢?我从他们对细节的回顾中发现了一些问题:   ◆ 所有的项目计划均是由项目经理的估计值制定的,也就是说项目经理包办了整个项目计划的制定工作;   ◆ 在项目计划中只是简单地在每个阶段的结束时间上标上了一个里程碑符号;   ◆ 进度报告中的项目完成百分比,是直接通过“已经历的时间(2 个月)”计算得到的;   ◆ 项目过程中,需求在变化,但项目计划却没有跟进;   ◆ 项目延迟的主要原因在于两个方面:项目需求增加,以及系统设计和编码实现的时间都超过了原先的计划。   这一切就是典型的项目进度失控的直接诱因,相信这些项目中都能够发现以上问题的影子。那么如果避免或者解决这些问题呢?在我的资料库中,包括以下几个针对此症的“药方”,在我的实践中收到了良好效果,你也不妨试一试。 第一个药方是以面向客户的角度整理需求。我看到许多软件项目开发团队进入了系统设计和编码实现阶段之后,在整个开发团队之间的交流里充满着计算机领域的东西,却难得见到问题领域的东西,这样很容易造成软件开发与客户需求的脱节。因此,从一开始就以面向客户的角度来整理需求,让这些需求的实现成为项目团队共同的目标,这将容易使项目始终保持正确的方向。UML中的Use Case、特征驱动开发中的Feature、极限编程中的UserStory都是很好的办法,以这些方式组织的需求,作为项目计划中的血肉,将更有利于进度的安排与控制。 第二个药方是项目团队共同完成项目计划。项目计划的一个很重要的前提是项目估算,项目估算最大的基础是经验值,而软件工程书籍中的经验值反应的只
PM吃瓜
2020/07/01
2.1K0
产品工作基本流程
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2p5qjwxvujms4
葆宁
2020/10/26
1.3K1
产品工作基本流程
项目干系人(StakeHolder)是干啥的?
项目的成功完成绝不仅是项目经理或项目组的责任,它是所有项目利益相关者(stakeholder)共同努力的如果,调查结果表明,项目成功的第一保证是利益相关者在项目全生命周期中的有效协作。
PM吃瓜
2020/08/09
2.6K0
【软件测试系列六】《软件系统测试方案》
本文档是完成[XXX]项目测试的指导性文件。本文档给出了对测试需求、测试环境、测试过程及测试结果的总体要求, 这也是本测试项目中其他文档编写及结果评价的基础。
再见孙悟空_
2023/09/19
1.5K0
EDI项目实施中,EDI提供商与客户是怎样分工的呢?
一次EDI项目实施通常需要经历需求分析、制定实施计划、前期准备、EDI连接测试、数据映射实施(含与后端系统集成)、本地集成测试、业务集成测试、交付验收、用户培训、试运行&调试、正式上线,共11个阶段。期间需要客户与其EDI提供商协同配合,才能顺利地完成EDI项目实施。本文主要介绍客户及其EDI提供商如何分工,帮助客户理解EDI项目实施中自身以及EDI提供商的主要工作内容,从全局角度理解EDI项目实施过程,并提前做好人员安排。
知行软件EDI
2020/12/14
5030
EDI项目实施中,EDI提供商与客户是怎样分工的呢?
day48_项目管理学习笔记
课程目标 认识项目管理 了解软件项目管理的整个过程 软件工程师在`整个项目过程中要做哪些工作` 提前规划自己的职业生涯,遇到机会立即抓住机会 通过学习本课程学会用 `项目管理的方式去工作` 课程安排
黑泽君
2018/10/11
5320
day48_项目管理学习笔记
相关推荐
matinal:SAP 项目实施全流程,项目实施必须要知道这些
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档