LINUX内核源文件介绍以及头文件介绍

LINUX内核源文件介绍以及头文件介绍
LINUX内核源文件介绍以及头文件介绍

LINUX 内核源文件介绍以及头文件介绍

LINUX 内核源文件介绍以及头文件介绍.txt两人之间的感情就像织毛衣,建立的时候一针一线,小心而漫长,拆除的时候只要轻轻一拉。。。。*******************LINUX 内核(0.11)源文件介绍****************** 1、内核源文件放置目录:

|

|————boot 系统引导汇编程序目录

|

|————fs 文件系统目录

|

|————include 头文件目录

|

|————init 内核初始化程序目录

|

|————kernel 内存进程调度、信号处理、系统调用等程序的目录

|

|————lib 内核库函数目录

|

|————mm 内存管理程序目录

|

|————tools 生成内核Image文件的工具程序目录

|

|————Makefile文件

|

2、引导启动程序目录boot

包含3个汇编语言文件,是内核源文件中最先被编译的程序。

功能:当计算机家电时引导内核启动,将内核代码加载到内存中,并完成系统初始化工作。

boot

|

|————bootsect.s 磁盘引导块程序,编译后会驻留在磁盘的第一个扇区中|

|————setup.s 读取机器的硬件配置参数,并把内核模式system移动到适当的内存位置处

|

|————head.s 会被编译连接在system模块的最前部分,主要进行硬件设备的探测配置和内存管理页面的配置工作

|

3、文件系统目录fs

包含17个C语言程序

fs

|

|——buffer.c 管理高速缓冲区

|

|——file_table.c 在0.11仅定义了一个文件句柄(描述符)结构数组

|

|——ioctl.c 将引用kernel/chr_dev/tty.c中的函数,实现字符设备的IO 控制功能

|

|——exec.c 主要包含一个执行程序函数do_execve()

|

|——fcntl.c 实现文件I/O控制的系统调用函数

|

|——read_write.c 实现文件读/写和定位的三个系统调用函数

|

|——stat.c 实现了两个获取文件状态的系统调用函数

|

|——open.c 主要包含实现修改文件属性和创建与关闭文件的系统调用函数

|

|——char_dev.c 主要包含字符设备读写函数rw_char()

|

|——pipe.c 包含管道读写函数和创建管道的系统调用函数

|

|——file_dev.c 包含基于i节点和描述符结构的文件读写函数。

|

|——namei.c 主要包括文件系统中目录名和文件名的操作函数和系统调用函数

|

|——block_dev.c 包含块数据读和写函数

|

|——inode.c 包含针对文件系统i节点操作的函数

|

|——truncate.c 用于在删除文件时释放文件所占用的设备数据空间

|

|——bitmap.c 用于处理文件系统中i节点和逻辑数据块的位图

|

|——super.c 包含对文件系统超级块的处理函数

|

4、头文件主目录include

有32个.h文件,其中主目录下有13个,s

am子目录中有4个,sys子目录中有5个,linux子目录中有10个

include

|

|——a.out.h a.out头文件,定义了a.out执行文件格式和一些宏

|

|——const.h 常数符号头文件,目前仅定义了i节点中i_mode字段的各标志位

|

|——ctype.h 字符类型头文件。定义了一些有关字符类型判断和转换的宏|

|——errno.h 错误号头文件。包含系统中各种出错号

|

|——fcntl.h 文件控制头文件。用于文件及其描述符的操作控制常数符号的定义

|

|——signal.h 信号头文件。定义信号符号常量,信号结构以及信号操作函数原型

|

|——stdarg.h 标准参数头文件。以宏的形式定义变量参数列表。定义了一个类型(va_list)和三个宏(va_start,va_arg和va_end),用于vsprintf、vprintf、vfprintf函数

|

|——stddef.h 标准定义头文件。定义了NULL,offsetof(TYPE,MEMBER)

|

|——string.h 字符串头文件。主要定义了一些有关字符串操作的嵌入函数|

|——termios.h 终端输入输出函数头文件。主要定义控制异步通信口的终端接口

|

|——time.h 时间类型头文件。最主要定义了tm结构和一些有关时间的函数原形

|

|——unistd.h Linux 标准头文件。定义了各种符号常数和类型,并申明了各种函数,如__LIBRARY__,则还包括系统调用号和内嵌汇编_syscall()等

|

|——utime.h 用户时间头文件。定义了访问和修改时间结构以及utime()原型。

|

|——asm 主要定义了一些与CPU体系结构密切相关的数据结构、宏函数和变量

| |

| |——asm/io.h io头文件。以宏的嵌入汇编程序形式定义对io端口操作的函数

| |

| |——asm/memory.h 内存拷贝头文件。包含memcpy()嵌入式汇编宏函数

| |

| |——asm/segment.h 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数

| |

| |——asm/system.h 用户时间头文件。定义了访问和修改时间结构以及utime()原型

| |

|

|

|——linux

| |

| |——linux/config.h 内核配置头文件。定义键盘语言和硬盘类型(HD_TYPE)可选项

| |

| |——linux/fdreg.h 软驱头文件。含有软盘控制器参数的一些定义

| |

| |——linux/fs.h 文件系统头文件。定义文件表结构

| |

| |——linux/hdreg.h 硬盘参数头文件。定义访问硬盘寄存器端口,状态码,分区表等信息

| |

| |——linux/head.h head头文件。定义了段描述符的简单结构,和几个选择符常量

| |

| |——linux/kernek.h 内核头文件。含有一些内核常用函数的原形定义

| |

| |——linux/

mm.h 内存管理头文件。含有页面大小定义和一些页面释放函数原型

| |

| |——linux/sched.h 调度程序头文件,定义了任务结构task_struct、初始任务0的数据,还有一些有关描述参数设置和获取的嵌入式汇编函数宏语句

| |

| |——linux/sys.h 系统调用头文件。含有72个系统调用C 函数处理程序,以sys_开头

| |——linux/tty.h tty头文件,定义了有关tty_io,串行通信方面的参数、常数

| |

|

|

|——sys

| |

| |——sys/stat.h 文件状态头文件。含有文件或文件系统状态结构stat{}和常量

| |

| |——sys/times.h 定义了进程中运行时间结构tms以及times()函数原型

| |

| |——sys/types.h 类型头文件。定义了基本的系统数据类型

| |

| |——sys/utsname.h 系统名称结构头文件

| |

| |——sys/wait.h 等待调用头文件。定义系统调用wait()核waitpid()及相关常数符号

| |

|

5、内核初始化程序目录init

该目录下仅包含一个文件main.c。用于执行内核所有的初始化工作,然后移到用户模式创建新进程,并在控制台设备上运行shell程序。

6、内核程序主目录kernel

包含了12个代码文件和一个Makefile文件,另外还有3个子目录blk_dev、chr_dev、math。

kernel

|

|——asm.s 用于处理系统硬件异常所引起的中断,对各硬件异常的实际处理程序则是在traps.c文件中,在各个中断处理程序中,将分别调用traps.c中相应的C语言处理函数

|

|——exit.c 主要包括用于处理进程终止的系统调用,包括进程释放、会话(进程组)终止和程序退出处理函数以及杀死进程、终止进程、挂起进程等系统调用函数。

|

|——fork.c 给出了sys_fork()系统调用中使用了两个C语言函数:find_empty_process()和copy_process()。

|

|——mktime.c 包含一个内核使用的时间函数mktime(),用于计算机从1970年1月1日0时起到开机当日的秒数,作为开机描述。仅在inti/main.c 中被调用一次

|

|——pani.c 包含一个显示内核出错信息并停机的函数panic()

|

|——printk.c 包含一个内核专用信息显示函数printk()

|

|——sched.c 包含有关调度的基本函数(sleep_on、wakeup、schedule等)以及一些简单的系统调用函数,另外还有几个与定时相关的软盘操作函数

|

|——signal.c 包含了有关信号处理的4个系统调用以及一个在对应的中断处理程序中处理信号的函数do_signal()

|

|——sys.c 包含了很多系统调用函数,其中有些还没有实现

|

|——system_call.s 实现了Linux系统调用(int 0x80)的接口处理过程,实

际的处理过程则包含在个系统调用相应的C语言处理函数中,这些处理函数分布在整个Linux内核代码中。

|

|——vsprintf.c 实现了现在已经归入标准库函数中的字符串格式化函数

|

|

|——blk_dev 子目录块设备驱动程序

| |

| |——hd.c 实现对硬盘数据块进行读/写的底层驱动函数,主要是do_hd_request()函数

| |

| |——floppy.c 主要实现了对软盘数据块的读/写驱动函数,主要是do_fd_request()函数。

| |

| |——ll_rw_blk.c 实现了低层块设备数据读/写函数ll_rw_block(),内核中所有其他程序都是通过该函数对块设备进行数据读写操作。

| |

|

|——chr_dev 子目录字符设备驱动程序子目录

| |

| |——tty_io.c 包含tty字符设备读函数tty_read()和写函数tty_write(),为文件系统提供了上层访问接口。另外还包括在串行中中断处理过程中调用的C函数do_tty_interrupt(),该函数将会在中断类型为读字符的处理中被调用。

| |

| |——console.c 主要包含控制台初始化程序和控制台写函数con_write(),用于被tty设备调用。还包含对显示器和键盘中断的初始化设置程序con_init()。

| |

| |——rs_io.s 由于实现两个串行接口的中断处理程序。该中断处理程序会根据从中断标识寄存器中取得的4种中断类型分别进行处理,并在处理中断类型为读字符的代码中调用do_tty_interrupt().

| |

| |——serial.c 用于对异步串行通信芯片UART进行初始化操作,并设置两个通信端口的中断向量。另外还包括tty用于往串口输出的rs_write()函数。

| |

| |——tty_ioctl.c 实现了tty的io控制接口函数tty_ioctl()以及对termio(s)终端Io结构的读写函数,并会在实现系统调用sys_ioctl()的fs/ioctl.c程序中被调用

| |

| |——keyboard.s 主要实现了键盘中断处理过程keyboard_interrupt. | |

|

|

|

|——math子目录协处理器仿真和操作程序子目录

| |

| |

| |——math_emulate.c 是中断int7的中断处理程序调用的C函数。| |

|

|——lib子目录内核库函数目录lib主要用于用户编程调用,是编译系统标准库的接口函数之一。

| |

| |——Makefile 文件

| |

| |——_exit.c 包含内核使用的程序终止函数void _exit(int exit_code)

| |

| |——close.c

| |

| |——ctype.c

| |

| |——dup.c

| |

| |——errno.c

| |

| |——execve.c

| |

| |——malloc.c

| |

| |——open.c

| |

| |——setsid.c

| |

| |——string.c

| |

| |——wait.c

| |

| |—

—write.c

| |

| |

|

7、内存管理程序目录

mm

|

|——page.s 包括内存页面异常中断(int 14)处理程序,主要用于处理程序由于缺页而引起的页异常中断和访问非法地址而引起的页保护

|

|——memory.c 包括对内存进行初始化的函数mem_init(),由page.s的内存处理中断过程调用的do_no_page()和do_wp_page()函数。在创建新进城而执行复制

进城操作时,即使用该文件中的内存处理函数来分配管理内存空间。

|

|

8、编译内核工具程序目录tools

该目录下的build.c程序用于将Linux各个目录中被分别编译生成的目标代码连接合并成一个可运行的内核映像文件Image.

Linux内核崩溃原因分析及错误跟踪技术

Linux内核崩溃原因分析及错误跟踪技术 随着嵌入式Linux系统的广泛应用,对系统的可靠性提出了更高的要求,尤其是涉及到生命财产等重要领域,要求系统达到安全完整性等级3级以上[1],故障率(每小时出现危险故障的可能性)为10-7以下,相当于系统的平均故障间隔时间(MTBF)至少要达到1141年以上,因此提高系统可靠性已成为一项艰巨的任务。对某公司在工业领域14 878个控制器系统的应用调查表明,从2004年初到2007年9月底,随着硬软件的不断改进,根据错误报告统计的故障率已降低到2004年的五分之一以下,但查找错误的时间却增加到原来的3倍以上。 这种解决问题所需时间呈上升的趋势固然有软件问题,但缺乏必要的手段以辅助解决问题才是主要的原因。通过对故障的统计跟踪发现,难以解决的软件错误和从发现到解决耗时较长的软件错误都集中在操作系统的核心部分,这其中又有很大比例集中在驱动程序部分[2]。因此,错误跟踪技术被看成是提高系统安全完整性等级的一个重要措施[1],大多数现代操作系统均为发展提供了操作系统内核“崩溃转储”机制,即在软件系统宕机时,将内存内容保存到磁盘[3],或者通过网络发送到故障服务器[3],或者直接启动内核调试器[4]等,以供事后分析改进。 基于Linux操作系统内核的崩溃转储机制近年来有以下几种: (1) LKCD(Linux Kernel Crash Dump)机制[3]; (2) KDUMP(Linux Kernel Dump)机制[4]; (3) KDB机制[5]; (4) KGDB机制[6]。 综合上述几种机制可以发现,这四种机制之间有以下三个共同点: (1) 适用于为运算资源丰富、存储空间充足的应用场合; (2) 发生系统崩溃后恢复时间无严格要求; (3) 主要针对较通用的硬件平台,如X86平台。 在嵌入式应用场合想要直接使用上列机制中的某一种,却遇到以下三个难点无法解决: (1) 存储空间不足 嵌入式系统一般采用Flash作为存储器,而Flash容量有限,且可能远远小于嵌入式系统中的内存容量。因此将全部内存内容保存到Flash不可行。

linux 下各个头文件的作用

linux 下各个头文件的作用 2.6.30.4的头文件的位置和2.6.25.8的不一样,除去内核源码下的include目录外, 在arch/arm/mach-s3c2410/和arch/arm/plat-s3c24xx/目录下都有include目录的。 #include /* printk() */// #include /* kmalloc() */// #include /* file_operations、 inode_operations、super_operations结构体*/// #include /* error codes */ #include /* size_t等各种系统typedef的数据类型 */// #include /* O_ACCMODE */// #include /* COPY_TO_USER */#include /*MODULE_LICENSE("GPL");内核认识的特定许可有, "GPL"( 适用 GNU 通用公共许可的任何版本 ), "GPL v2"( 只适用 GPL 版 本 2 ), "GPL and additional rights", "Dual BSD/GPL", "Dual MPL/GPL", "Proprietary". 除非你的模块明确标识是在内核认识的一个自由许可下, 否则就假定它是私有的, 内核在模块加载时被"弄污浊"了. 象我们在第 1 章"许可条款"中提到的, 内核开发者不会热心帮助在加载了私有模块后遇到问题的用户. MODULE_AUTHOR ( 声明谁编写了模

Linux课后题和答案

第1章 Linux概述 1.什么是Linux? Linux是一套免费使用和自由传播的类UNIX操作系统,源代码开放,能运行于各类硬件平台,包括Intel x86系列和RISC处理器。这个系统是由世界各地成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的UNIX 兼容产品。 2.Linux有哪些特性? (1)开放性 (2)多用户 (3)多任务 (4)良好的用户界面 (5)设备独立性 (6)丰富的网络功能 (7)可靠的系统安全 (8)良好的可移植性 3.什么是内核,它的作用是什么? 内核是系统的心脏,是运行程序和管理磁盘、打印机等硬件设备的核心程序。它的总有是管理CPU、内存和外设。 4.什么是shell,shell的作用是什么? shell是系统的用户界面,它实际上是一个命令解释器,它解释由用户输入的命令并把它们送到内核,把执行的结果显示给用户。不仅如此,shell有自己的编程语言,允许用户编写由 安装Linux至少需要哪两个分区?还有哪些常用分区? 至少有/和swap分区。其它常用分区有:/bin /home /usr /var /usr/local /tmp等5.安全专家建议,安装Linux时,最好为主要的目录建立单独的分区,试分析这样做的优点。 由于每个分区指定了自己的大小,当某个分区的数据超过自己的大小限制时,不会挤占其它分区的空间。 6.swap交换分区的作用是什么? 它实际上是用硬盘实现虚拟内存,即当系统内存使用率比较高的时候,内核会自动使用swap分区来模拟内存。 7.安装Linux都需要收集哪些信息? 安装过程所使用的语言、键盘鼠标类型、安装类型、磁盘分区、系统语言、安装软件包。 8.什么是运行级别?Linux有几个运行级别? 运行级别是指Linux的运行状态,Linux系统有六种不同的运行级,这六种运行级分别为:0:停机 1:单用户模式,就像Win9X下的安全模式。 2:多用户,但是没有 NFS 3:完全多用户模式,标准的运行级 4:保留,一般不用 5:X Window 图形界面模式 6:重新启动 如何安全关闭Linux系统?

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

Linux操作系统期末复习资料

电信2012级《Linux操作系统》期末复习提纲第1章概述 操作系统的概念与功能 操作系統的概念: 1.操作系统是计算机系统的一种基本软件,它直接管理和控制计算机的硬件和软件资源,合理地调度资源,使之得到充分的利用;并为用户使用这些资源提供一个便当的操作环境和优良的用户界面。 2.从资源角度看,操作系统是管理和控制计算机资源的软件。 3.从用户角度看,操作系统是用户与计算机的接口。 操作系統的功能: 1.处理器管理:在多道程序间分配和调度CPU,协调各程序的运行。 2.存储器管理:对内存储器进行分配、保护和扩充。 3.设备管理:对设备进行有用地管理和分配,并控制设备完成I/O操作。 4.文件管理:管理文件的存储和检索操作,并对文件实施共享、保密和保护措施。 5.用户接口:提供使用界面,便当用户使用系统功能。 Linux系统的特点 1.继承UNIX优秀品质,具有出色的性能和稳定性; 2.遵照GPL许可,自由软件; 3.符合POSIX标准,兼容性好; 4.适用于各种硬件平台,可移植性好; 5.网络功能强大;

6.安全性好。第2章Linux操作基础 命令的格式; 命令名[选项1] [选项2] ... [参数1] [参数2] ... 简单命令的功能与用法:echo、who、date、cal 文件系统概念: 文件命名与通配符 1.文件的命名:Linux文件名的最大长度是255个字符,通常由字母、数字、‘.’、‘_’和‘-’组成。以‘.’开头的文件是隐含文件。 2.文件名中不能含有‘/ ’字符和空字符‘\0’,因为它们对Linux内核具有分外含义。如‘/ ’表示根目录或路径分隔符。 3.文件名中不应含有以下字符,因为它们对Shell具有分外含义:; | < > ` “ “$ ! % & * ? \ ( ) [ ] 文件类型及表示法 1.普通文件(-):包括文本文件、数据文件、可执行的二进制程序等。 2.目录文件(d):一种分外的文件,用于构成文件系统的分层树型结构。 每个目录文件中至少包括两个文件,“..”表示上一级目录,“.”表示该目录本身。 3.设备文件:一种分外文件,Linux系统利用它们来标识各个设备驱动器,核心使用它们与硬件设备通信。有两类特别的设备文件:字符设备(c)和块设备(b)。 文件(包括目录)权限的含义及表示法(字符和数字表示法)

UnixLinux系统的安全性概述

计算机网络安全技术题目:Unix/linux系统的安全性概述 班级:09 级达内班 组长:朱彦文学号:09700308 组员:冯鑫学号:09700310 组员:刘新亮学号:09700309 组员:梁小文学号:09700312 组员:龚占银学号:09700313 组员:高显飞学号:09700304 组员:陶志远学号:09700305 时间:2011年6月

目录 1、linux系统的介绍 (1) 2、服务安全管理 (1) 2.1、安全防护的主要内容 (1) 3、linux系统文件安全 (1) 3.1、文件相关权限的设置 (2) 3.2、SUID和SGID程序 (2) 4、用户访问安全 (2) 4.1、口令安全 (2) 4.2、登录安全 (3) 5、防火墙、IP伪装个代理服务器 (4) 5.1、什么是防火墙 (4) 5.2防火墙分类 (4) 6、服务器被侵入后的处理 (5) 7、日常安全注意事项 (5) 8、参考文献 (6)

Unix/linux系统的安全性概述 1、linux系统的介绍 Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux 来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。Linux,其安全性漏洞已经广为流传,黑客可以很容易地侵入。而网络服务器往往储存了大量的重要信息,或向大量用户提供重要服务;一旦遭到破坏,后果不堪设想。所以,网站建设者更需要认真对待有关安全方面的问题,以保证服务器的安全。 2、服务安全管理 2.1、安全防护的主要内容 对于网站管理人员而言,日常性的服务器安全保护主要包括四方面内容: 文件存取合法性:任何黑客的入侵行为的手段和目的都可以认为是非法存取文件,这些文件包括重要数据信息、主页页面 HTML文件等。这是计算机安全最重要的问题,一般说来,未被授权使用的用户进入系统,都是为了获取正当途径无法取得的资料或者进行破坏活动。良好的口令管理 (由系统管理员和用户双方配合 ),登录活动记录和报告,用户和网络活动的周期检查都是防止未授权存取的关键。 用户密码和用户文件安全性:这也是计算机安全的一个重要问题,具体操作上就是防止 已授权或未授权的用户相互存取相互的重要信息。文件系统查帐、su登录和报告、用户意识、加密都是防止泄密的关键。 防止用户拒绝系统的管理:这一方面的安全应由操作系统来完成。操作系统应该有能力 应付任何试图或可能对它产生破坏的用户操作,比较典型的例子是一个系统不应被一个有意 使用过多资源的用户损害 (例如导致系统崩溃 )。 防止丢失系统的完整性:这一方面与一个好系统管理员的实际工作 (例如定期地备份文件系统,系统崩溃后运行 fsck检查、修复文件系统,当有新用户时,检测该用户是否可能使系统崩溃的软件 )和保持一个可靠的操作系统有关 (即用户不能经常性地使系统崩溃 )。

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.360docs.net/doc/1313071064.html, 来源: https://www.360docs.net/doc/1313071064.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

Linux操作系统概述

第1章Linux操作系统概述 Linux操作系统是目前发展最快的操作系统,从1991年诞生到现在的二十多年间,Linux逐步完善和发展。Linux操作系统在服务器、嵌入式等方面获得了长足的发展,并在个人操作系统方面有着大范围的应用,这主要得益于其开放性。本章对Linux的发展进行介绍,主要包括如下内容: ?Linux发展的历史,以时间为主线对Linux的诞生进行介绍; ?分析Linux和UNIX操作系统的异同; ?介绍常用的几种Linux发行版本的特点; ?对Linux操作系统的系统架构进行简单的介绍; ?介绍GNU通用公共许可证及其特点。 通过本章的阅读,读者可以对Linux的发展历史和Linux操作系统的基本特点有一个简单的认识。 1.1 Linux发展历史 Linux操作系统于1991年诞生,目前已经成为主流的操作系统之一。其版本从开始的0.01版本到目前的2.6.28.4版本经历了二十多年的发展,从最初的蹒跚学步的“婴儿”成长为目前在服务器、嵌入式系统和个人计算机等多个方面得到广泛应用的操作系统。 1.1.1 Linux的诞生和发展 Linux的诞生和发展与个人计算机的发展历程是紧密相关的,特别是随着Intel的i386个人计算机的发展而逐步成熟。在1981年之前没有个人计算机,计算机是大型企业和政府部门才能使用的昂贵设备。IBM公司在1981年推出了个人计算机IBM PC,从而造成个人计算机的发展和普及。刚开始的时候,微软帮助IBM公司开发的MS-DOS操作系统在个人计算机中占有统治地位。随着IT行业的发展,个人计算机的硬件价格虽然逐年在下降,但是软件特别是操作系统的价格一直居高不下。 与个人计算机对应,在大型机上的主流操作系统是UNIX,而UNIX操作系统对操作系统的发展有诸多障碍:

LINUX内核源文件介绍以及头文件介绍

LINUX 内核源文件介绍以及头文件介绍 LINUX 内核源文件介绍以及头文件介绍.txt两人之间的感情就像织毛衣,建立的时候一针一线,小心而漫长,拆除的时候只要轻轻一拉。。。。*******************LINUX 内核(0.11)源文件介绍****************** 1、内核源文件放置目录: | |————boot 系统引导汇编程序目录 | |————fs 文件系统目录 | |————include 头文件目录 | |————init 内核初始化程序目录 | |————kernel 内存进程调度、信号处理、系统调用等程序的目录 | |————lib 内核库函数目录 | |————mm 内存管理程序目录 | |————tools 生成内核Image文件的工具程序目录 | |————Makefile文件 | 2、引导启动程序目录boot 包含3个汇编语言文件,是内核源文件中最先被编译的程序。 功能:当计算机家电时引导内核启动,将内核代码加载到内存中,并完成系统初始化工作。 boot | |————bootsect.s 磁盘引导块程序,编译后会驻留在磁盘的第一个扇区中| |————setup.s 读取机器的硬件配置参数,并把内核模式system移动到适当的内存位置处 |

|————head.s 会被编译连接在system模块的最前部分,主要进行硬件设备的探测配置和内存管理页面的配置工作 | 3、文件系统目录fs 包含17个C语言程序 fs | |——buffer.c 管理高速缓冲区 | |——file_table.c 在0.11仅定义了一个文件句柄(描述符)结构数组 | |——ioctl.c 将引用kernel/chr_dev/tty.c中的函数,实现字符设备的IO 控制功能 | |——exec.c 主要包含一个执行程序函数do_execve() | |——fcntl.c 实现文件I/O控制的系统调用函数 | |——read_write.c 实现文件读/写和定位的三个系统调用函数 | |——stat.c 实现了两个获取文件状态的系统调用函数 | |——open.c 主要包含实现修改文件属性和创建与关闭文件的系统调用函数 | |——char_dev.c 主要包含字符设备读写函数rw_char() | |——pipe.c 包含管道读写函数和创建管道的系统调用函数 | |——file_dev.c 包含基于i节点和描述符结构的文件读写函数。 | |——namei.c 主要包括文件系统中目录名和文件名的操作函数和系统调用函数 | |——block_dev.c 包含块数据读和写函数 | |——inode.c 包含针对文件系统i节点操作的函数 | |——truncate.c 用于在删除文件时释放文件所占用的设备数据空间 | |——bitmap.c 用于处理文件系统中i节点和逻辑数据块的位图 |

linux下C编程详解

1)Linux程序设计入门--基础知识 Linux下C语言编程基础知识 前言: 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 ---------------------------------------------------------------------------- ---- 1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c): int main(int argc,char **argv) { printf("Hello Linux "); } 要编译这个程序,我们只要在命令行下执行: gcc -o hello hello.c gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程序的输出结果了.命令行中gcc表示我们是用gcc来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件. gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息. 知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明. 2.Makefile的编写 假设我们有下面这样的一个程序,源代码如下: /* main.c */ #include "mytool1.h" #include "mytool2.h" int main(int argc,char **argv) { mytool1_print("hello"); mytool2_print("hello"); } /* mytool1.h */ #ifndef _MYTOOL_1_H #define _MYTOOL_1_H

Linux内核分析-网络[五]:网桥

看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的容。 view plaincopy to clipboardprint? 1. s kb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,以下图为例,一台linux机器可以看作网桥和路由的结合,网桥将物理上的两个局域网LAN1、LAN2当作一个局域网处理,路由连接了两个子网1.0和2.0。从eth0和eth1网卡收到的报文在Bridge模块中会被处理成是由Bridge收到的,因此Bridge也相当于一个虚拟网卡。 STP五种状态 DISABLED BLOCKING LISTENING LEARNING FORWARDING 创建新的网桥br_add_bridge [net\bridge\br_if.c] 当使用SIOCBRADDBR调用ioctl时,会创建新的网桥br_add_bridge。 首先是创建新的网桥: view plaincopy to clipboardprint?

1. d ev = new_bridge_dev(net, name); 然后设置dev->dev.type为br_type,而br_type是个全局变量,只初始化了一个名字变量 view plaincopy to clipboardprint? 1. S ET_NETDEV_DEVTYPE(dev, &br_type); 2. s tatic struct device_type br_type = { 3. .name = "bridge", 4. }; 然后注册新创建的设备dev,网桥就相当一个虚拟网卡设备,注册过的设备用ifconfig 就可查看到: view plaincopy to clipboardprint? 1. r et = register_netdevice(dev); 最后在sysfs文件系统中也创建相应项,便于查看和管理: view plaincopy to clipboardprint? 1. r et = br_sysfs_addbr(dev); 将端口加入网桥br_add_if() [net\bridge\br_if.c] 当使用SIOCBRADDIF调用ioctl时,会向网卡加入新的端口br_add_if。 创建新的net_bridge_port p,会从br->port_list中分配一个未用的port_no,p->br会指向br,p->state设为BR_STATE_DISABLED。这里的p实际代表的就是网卡设备。 view plaincopy to clipboardprint? 1. p = new_nbp(br, dev); 将新创建的p加入CAM表中,CAM表是用来记录mac地址与物理端口的对应关系;而刚刚创建了p,因此也要加入CAM表中,并且该表项应是local的[关系如下图],可以看到,CAM表在实现中作为net_bridge的hash表,以addr作为hash值,链入 net_bridge_fdb_entry,再由它的dst指向net_bridge_port。

linux下socket编程常用头文件

linux下socket编程常用头文件 sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函数 netdb.h:提供设置及获取域名的函数 sys/ioctl.h:提供对I/O控制的函数 sys/poll.h:提供socket等待测试机制的函数 其他在网络程序中常见的头文件 unistd.h:提供通用的文件、目录、程序及进程操作的函数 errno.h:提供错误号errno的定义,用于错误处理 fcntl.h:提供对文件控制的函数 time.h:提供有关时间的函数 crypt.h:提供使用DES加密算法的加密函数 pwd.h:提供对/etc/passwd文件访问的函数 shadow.h:提供对/etc/shadow文件访问的函数 pthread.h:提供多线程操作的函数 signal.h:提供对信号操作的函数 sys/wait.h、sys/ipc.h、sys/shm.h:提供进程等待、进程间通讯(IPC)及共享内存的函数 建议:在编写网络程序时,可以直接使用下面这段头文件代码 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

Linux操作系统发展及其特点概述

Linux操作系统发展及其特点概述 Unix操作系统的诞生 Linux 操作系统是UNIX 操作系统的一个克隆版本。UNIX 操作系统是美国贝尔实验室的Ken.Thompson和Dennis Ritchie于1969年夏在DEC PDP-7 小型计算机上开发的一个分时操作系统。当时Ken Thompson 为了能在闲置不用的PDP-7 计算机上运行他非常喜欢的星际旅行(Space travel)游戏,在1969 年夏天乘他夫人回家乡加利福尼亚渡假期间,在一个月内开发出了Unix 操作系统的原型。当时使用的是BCPL 语言(基本组合编程语言),后经Dennis Ritchie 于1972 年用移植性很强的C 语言进行了改写,使得UNIX 系统在大专院校得到了推广。 Linux 操作系统的诞生与发展 Linux 是芬兰赫尔辛基大学高才生Linus Benedict Torvalds在1991年4月编写出来的。Linux内核的创建是由芬兰赫尔辛基的Linus Torvalds个人努力完成的。1991年底,Linus Torvalds首次在Internet上发布T基于Intel386体系结构Linux源代码,许多大专院校的学生和科研机构的研究人员纷纷把它作为学习和研究的对象。他们不断改进Linux版本,不断地为Linux增加新的功能Linux逐渐成为一个基本稳定、可靠、功能比较完善的操作系统,由于Linux操作系统从产生直至现在的发展一直在Internet这个摇篮中,伴随着网络概念的不断膨胀,“网络一代”的迅速崛起,它急速地发展着。 Linux诞生后的几个月里,Torvalds在不断地听取试用者的反馈的同时,仍然潜心于不断地改进程序,使其功能更强大、性能更稳定。到了1991年底,已经陆续推出了0.02版、0.03版、0.1版、0.11版。也许由于Torvalds从小深受其祖父(一名统计学教授,Torvalds少年时代学习的电脑启蒙者)和信仰共产主义的父亲的影响,加上本身淡泊金钱的个性,所以尽管当时Torvalds已欠了大约五千美元的学生货款,但在开始发布源代码时,他就制定了这样的版权规则: (1)任何人可以免费使用该操作系统,但不得将其作为商品出售; (2)任何人可以对该操作系统进行修改,但必须将其修改以源代码的形式公开;(3)如果不同意以上规定,任何人无权对其进行复制或从事任何行为。 软件按其分发方式可以划分为三种模式,即商业软件(Commercial Software)、共享软件(Share Software)和自由软件(Free Software)。商业软件的代表是美国微软公司(Microsoft)的Windows操作系统,用户必须先购买商业软件许可证才能使用软件,并且不能得到软件的源代码,也不能对软件进行任何逆向工程以得到源代码,即使软件存在缺陷用户也无权对软件进行任何修改或改进,否则将被认为侵犯版权。共享软件在分发时,用户可以先试用后付费,通常不提供软件源代码,如果超过试用期没有购买而仍使用,将被认为侵犯版权,目前许多通过网络分发销售的软件都采用这种方式,著名的软件有代理服务器软件WinGate。 自由软件在分发时必须向用户公开源代码,通常用户可以通过某种途径(如网络下载)免费得到其分发版,但用户如果付费的话将得到完善的服务和文档。自由软件的出现给人们带来很多的好处。首先,免费的软件可给用户节省相当一笔费用。其次,源代码公开和可自由修改吸引了众多的开发者参与软件的查错与改

LINUX系统及其编程部分习题参考答案

第1章 Linux概述 8.什么是内核,它的作用是什么? 内核是系统的心脏,是运行程序和管理磁盘、打印机等硬件设备的核心程序。它的作用是管理CPU、内存和外设。 9.什么是shell,shell的作用是什么? shell是系统的用户界面,它实际上是一个命令解释器,它解释由用户输入的命令并把它们送到内核,把执行的结果显示给用户。不仅如此,shell有自己的编程语言,允许用户编写由shell命令组成的程序。 13.安装Linux至少需要哪两个分区?还有哪些常用分区? 至少有/和swap分区。其它常用分区有:/bin /home /usr /var /us r /loca l /tmp等15.swap交换分区的作用是什么? 它实际上是用硬盘实现虚拟内存,即当系统内存使用率比较高的时候,内核会自动使用swap分区来模拟内存。 第2章 shell及常用命令 1.判断下列命题是否正确 1)Linux的文件名与命令不区分大小写。(×)。 2)$ls *\*和$ls *"*"的显示结果完全一致。(×) 3)rm 和rmdir的作用一样,都是删除整个目录。(×) 4)Linux文件名的命名规则必须遵守8.3的格式。(×) 4.什么是shell?shell在用户与操作系统之间的作用是什么? shell是一个命令解释器,它可以用来启动、挂起、停止程序,还允许用户编写由shell 命令组成的程序。shell是系统的用户界面,它提供了用户与内核进行交互的一种接口。它接收用户输入的命令并把它送入内核执行,把执行结果显示给用户。 5.什么是通配符?常用的操作通配符有哪些? Linux系统中的通配符除了“*”和“?”以外,还可以使用“[”、“]”和“-”组成的字符组模式,以便精确地扩充需要匹配的文件范围。 通配符*:通配符*可以代表文件名中的任意字符或字符串。通配符*不能与单句点开头的文件名相匹配。以单句点开头的文件在Linux中是隐藏文件。 通配符?:通配符?可以匹配任意一个字符。 字符组模式:通配符“[”、“]”、“-”用于构成字符组模式。“[”和“]”将字符组括起来,表示可以匹配字符组中的任意一个。“-”用于表示字符范围。例如[abc]表示匹配a或者b或者c,[a-f]表示匹配从a到f这个范围之中的任意一个字符。 8.Linux系统的目录/usr、/home、/bin、/dev/、/var、/etc/中主要存放什么文件? /usr存放用户安装的软件; /home存放系统用户自身的数据; /bin存放shell命令等可执行文件; /dev存放系统设备的信息; /var主要存放系统可变信息的内容,如日志、邮件、打印队列等; /etc存放系统配置信息。 9.如何使用cat命令将多个文件连接起来显示? 使用命令:cat file1 file2 ….就可以将多个文件首尾相连显示在屏幕上。 10.more命令和less命令有什么区别? more可将文件显示在屏幕上,但它每次只显示一页。 less 的作用与more十分相似,都可以用来浏览文本文件的内容,不同的是less允许使

Linux环境常用库简介

Linux环境常用库简介 一个程序的开发离不开许多库函数的支持,可是库如此之多,有开源免费的也有收费的。很希望熟悉编程的前辈把自己的经验整理下,常用的库都包含哪些功能。下文是在网上找的一个类似的资料。期待更多更全的内容。 --------------------------------------------------------------------------------------------------- 看到有时候大家在写代码的时候不知道应该加入何种库,所以特地总结了一下.供大家参考. 库头文件描述 libGL.so 实现到OpenGL API的接口 libGLU.so 实现到OpenGL API的接口 libImlib.so 实现一套图像处理例程 libc.so 实现标准C库(不需要头文件) libcom_err.so 实现出错处理例程的集合 libcrypt.so 实现加密函数的集合 libcurses.so 光标字符模式的屏幕操作库 libdb.so 创建和操作数据库的库 libdl.so 让程序在运行时加载和使用库代码而无须在编译时链接库 libform.so 实现字符模式应用程序的窗体处理能力 libglib.so Glib库,提供了大多数程序需要的大量基本工具函数,比如散列表等 libgthread.so 实现对Glib的线程支持 libgtk.so GIMP下的X库 libhistory.so 实现GNU readline(libreadline)包中的命令行历史机制 libjpeg.so 定义到JPEG库的接口,赋予应用程序使用JPEG图像文件的能力 libm.so 实现标准C数学库 libmenu.so 提供在字符模式屏幕上创建和使用菜单的例程 libncurses.so 使用ncurses文本模式屏幕控制系统的应用程序的基础库 libnss.so 用于名字服务切换工具的功能,提供了名字数据库比如DNS接口

基于Linux内核编程的实验报告(Linux内核分析实验报告)

基于Linux内核编程的实验报告(Linux内核分析实验 报告) 以下是为大家整理的基于Linux内核编程的实验报告(Linux内核分析实验报告)的相关范文,本文关键词为基于,Linux,内核,编程,实验,报告,分析,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。 Linux内核分析实验报告

实验题目:文件系统实验 实验目的:linux文件系统使用虚拟文件系统VFs作为内核文件子系统。可以安装多种 不同形式的文件系统在其中共存并协同工作。VFs对用户提供了统一的文件访问接口。本实验的要求是 (1)编写一个get_FAT_boot函数,通过系统调用或动态模块调用它可以提 取和显示出FAT文件系统盘的引导扇区信息。这些信息的格式定义在内核文件的fat_boot_sector结构体中。函数可通过系统调用或动态模块调用。 (2)编写一个get_FAT_dir函数,通过系统调用或动态模块调用它可以 返回FAT文件系统的当 前目录表,从中找出和统计空闲的目录项(文件名以0x00打头的为从未使用过目录项,以0xe5打头的为已删除的目录项),将这些空闲的目录项集中调整到目录表的前部。这些信息的格式定义在内核文件的msdos_dir_entry结构体中。 硬件环境:内存1g以上 软件环境:Linux(ubuntu)2-6实验步骤: 一:实验原理: 以实验4为蓝本,在优盘中编译并加载模块,启动测试程序,查

/proc/mydir/myfile的文件内容。从优盘得到fat文件系统的内容存在msdos_sb_info结构中,然后得到msdos_sb_info结构相应的属性值,得到实验一的数据。实验二中,得到fat文件系统第一个扇区的十六个文件信息。然后按照文件名头文字的比较方法,应用归并排序的方法,将头文件是0x00和0xe5的文件调到前面,其他的文件调到后面 二:主要数据结构说明: (1)超级块对象: 数据结构说明:一个已经安装的文件系统的安装点由超级块对象代表。 structsuper_block{... conststructsuper_operations*s_op;} (2)索引i节点对象 数据结构说明:索引i节点对象包含了内核要操作的文件的全部控制信息,对应着打开文件的i节点表。structinode{ conststructinode_operations*i_op;...} (3)目录项对象 数据结构说明:录项对象代表了文件路径名的各个部分,目录文件名和普 通文件名都属于目录项对象。structdentry{

Linux中常用头文件的作用

Linux中常用头文件的作用 1、Linux中一些头文件的作用: :ANSI C。提供断言,assert(表达式) :GCC。GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数。使用glib只需要包含 :GCC。文件夹操作函数。struct dirent,struct DIR,opendir(),closedir(),readdir(),readdir64()等 :ANSI C。字符测试函数。isdigit(),islower()等 :ANSI C。查看错误代码errno是调试程序的一个重要方法。当linuc C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h :处理命令行参数。getopt() 2、 ------------------------- linux常用头文件如下: POSIX标准定义的头文件 目录项 文件控制 文件名匹配类型 路径名模式匹配类型 组文件 网络数据库操作 口令文件 正则表达式 TAR归档值 终端I/O 符号常量 文件时间 字符扩展类型 ------------------------- INTERNET定义 套接字本地接口 INTERNET地址族 传输控制协议定义 ------------------------- 内存管理声明 Select函数 套接字借口 文件状态 进程时间

《Linux操作系统》课程教学大纲

《Linux操作系统》教学大纲 一、课程目的 Linux操作系统是一个功能强大而且十分灵活的操作系统,安全行、稳定性好,很少受到病毒和黑客的攻击。本课程系统介绍Linux操作系统的基本操作、讲解系统的安装及配置、系统常用命令的使用,用较多的课时学习系统的图形界面及图形界面下的应用程序的功能及使用方法,特别是对于Linux强大的网络服务功能安排了综合实验来加强应用和动手能力。本课程可以配合操作系统原理课,使学生能理论结合实践。 二、课程性质和任务 本课程的主要任务是讲授Linux操作系统的理论基础和服务器配置实践知识,同时通过大量实验,着重培养学生的动手能力。 (1)使学生了解Linux操作系统在行业中的重要地位和广泛的使用范围。 (2)在学习Windows Server的基础上,加深对服务器操作系统的认识和实践配置能力。 (3)加深对计算机网络基础知识的理解,并在实践中加以应用。 (4)掌握Linux操作系统的安装、命令行操作、用户管理、磁盘管理、文件系统管理、软件包管理、进程管理、系统监测和系统故障排除。 (5)掌握Linux操作系统的网络配置、DNS、DHCP、HTTP、FTP、SMTP和POP3服务的配置与管理。 (6)为更深一步学习其它网络操作系统和软件系统开发奠定坚实的基础。 三、教学要求 (1)通过对网络基本概念、基本原理的理解,使学生加深网络基础知识在服务器领域的应用。 (2)通过实践教学,使学生掌握Linux操作系统的安装、基本配置和图形界面及命令行界面的使用方法。 (3)通过理论和实践教学,使学生掌握Linux操作系统的用户管理、磁盘管理、文件系统管理、软件包管理、进程管理、系统监测和系统故障排除的能力。 (4)通过理论和实践教学,使学生掌握Linux操作系统的网络配置、DNS、DHCP、HTTP、FTP、SMTP和POP3服务的配置与管理。 四、教学内容和课时安排 本课程共56学时,3.5学分,具体教学内容和课时安排如下:

相关文档
最新文档