精华内容
下载资源
问答
  • 以前在windows的GUI编程中,让我印象最...Timer功能实在是太重要了,如果没有定时器,操作系统很多任务都做不了,至少你编程画个时钟,搞个闹钟程序什么的,你就没法实现。从这节开始,我们看看timer功能是怎么实现的。

    本节对应的视频讲解,源代码,调试过程,请参看网易云课堂:
    Linux kernel Hacker, 从零构建自己的内核

    以前在windows的GUI编程中,让我印象最深刻的MFC里面的onTimer回调。也就是你设置一个定时器,当指定的时间过去后,系统会触发你给定的回调函数。Timer功能实在是太重要了,如果没有定时器,操作系统很多任务都做不了,至少你编程画个时钟,搞个闹钟程序什么的,你就没法实现。从这节开始,我们看看timer功能是怎么实现的。

    下图是用于实现中断功能的8259A芯片:
    这里写图片描述

    主控制器的IRQ0对应的就是时钟中断,只要我们做好相关配置,那么在指定间隔内,IRQ0导线就会像CPU发送中断信号。首先我们代码要做的是初始化8259A时,打开这一中断功能,在内核实现的汇编部分做如下修改(kernel.asm):

    init8259A:
    ....
    mov  al, 11111000b ;允许键盘和时钟中断
         out  021h, al
         call io_delay
    ....

    注意看,三个0表示打开主8259A的IRQ0, IRQ1, IRQ2三根信号线,IRQ0对应的就是时钟中断,打开IRQ0后,当中断信号发送到CPU时,我们需要CPU调用我们提供的中断程序,因此还需做以下修改:

    
    LABEL_IDT:
    %rep  32
        Gate  SelectorCode32, SpuriousHandler,0, DA_386IGate
    %endrep
    
    ;响应时钟中断的中断描述符
    .020h:
        Gate SelectorCode32, timerHandler,0, DA_386IGate
    
    .021h:
        Gate SelectorCode32, KeyBoardHandler,0, DA_386IGate
    
    %rep  10
        Gate  SelectorCode32, SpuriousHandler,0, DA_386IGate
    %endrep
    
    .2CH:
        Gate SelectorCode32, mouseHandler,0, DA_386IGate
    

    我们在中断向量表中,增加了一个用于调用时钟中断的描述符,该描述符对应的中断调用,名字叫timerHandler。

    我们继续看timerHandler的实现:

    _timerHandler:
    timerHandler equ _timerHandler - $$
         push es
         push ds
         pushad
         mov  eax, esp
         push eax
    
         call intHandlerForTimer
    
    
         pop  eax
         mov  esp, eax
         popad
         pop  ds
         pop  es
         iretd

    这段代码的实现跟以前的中断处理方法一样,先把寄存器压到堆栈上保存起来,然后调用C语言实现的中断处理函数intHandlerForTimer。

    在查看C语言对intHandlerForTimer的实现之前,我们需要搞清楚的是,如何配置时钟中断,使其在一秒内发生几次中断合适?我们这里暂定1秒内产生100次中断,这种中断频率足以满足我们系统开发需求。于是我们需要做相应配置,配置的方法是,像8259A芯片的对应端口发送指定数据,首先需要向端口0x43发送一个数值0x34, 紧接着向端口0x40发送两个数据0x9c,0x2d, 这样时钟中断就能在1秒内发生100次了。

    配置代码如下(Timer.h):

    #define PIT_CTRL   0x0043
    #define PIT_CNT0   0x0040
    
    
    void init_pit(void);
    
    struct TIMERCTL {
        unsigned int count;
        unsigned int timeout;
        struct FIFO8 *fifo;
        unsigned char data;
    };
    
    struct TIMERCTL* getTimerController();
    
    void settimer(unsigned int timeout, struct FIFO8 *fifo, unsigned char data);
    

    init_pit(void) 就是用来实现时钟中断配置的,它的作用是向指定端口发送指定数据,TIMERCTL 数据结构叫时钟管理器,其中的count用来记录时钟中断发送了多少次, timeout用来计时,一旦timeout为0,管理器将触发指定动作,其他的数据在后面我们会详细解释。我们看看时钟中断的初始化实现:

    void  init_pit(void) {
        io_out8(PIT_CTRL, 0x34);
        io_out8(PIT_CNT0, 0x9c);
        io_out8(PIT_CNT0, 0x2e);
    
        timerctl.count = 0;
        timerctl.timeout = 0;
    }

    我们可以看到,初始化就如同前面我们所说的,向指定端口发送一些指定数据而已。

    设置好中断机制后,我们可以实现超时功能,也就是通过时钟管理器设置一个时间片,一旦时间片结束后,让时钟管理器触发我们提供的一个函数,这个时间片的大小对应的就是TIMECTRL结构体里面的timeout.

    我先看看C语言模块是怎么响应中断信号的:

    void intHandlerForTimer(char *esp) {
        io_out8(PIC0_OCW2, 0x60);
        timerctl.count++;
    
        if (timerctl.timeout > 0) {
            timerctl.timeout--;
            if (timerctl.timeout == 0) {
                fifo8_put(timerctl.fifo, timerctl.data);
            }
        }
        return;
    }

    每次响应中断信号时,先向8259A发送一个命令,命令的数值是0x60,要求8259A下次继续发送中断信号,如果不这么做,下次芯片就不给我们发送信号了。然后把时钟管理器的count计数加一,对应中断响应的次数。每次中断发送,我们都把时间片对应的数值减一,如果时间片减少到0,表明超时,此时向时钟管理器附带的FIFO队列写入一个数据。FIFO队列我们在实现鼠标响应的章节介绍过,这个队列的作用主要用来通知内核,超时发生了,在内核的主循环里面会不停的监控时钟管理器这个队列是否为空,如果是空,那么内核就认为没有超时事件发生,如果队列里面有数据,那表明超时事件发生了。

    那么怎么设定超时对应的时间片呢?我们在时钟管理器的实现中,增加一个settimer函数:

    void settimer(unsigned int timeout, struct FIFO8 *fifo, unsigned char data) {
        int eflags;
        eflags = io_load_eflags();
        io_cli();//暂时停止接收中断信号
        timerctl.timeout = timeout;//设定时间片
        timerctl.fifo = fifo;//设定数据队列,内核在主循环中将监控这个队列
        timerctl.data = data;
        io_store_eflags(eflags);//恢复接收中断信号
        return;
    }
    
    struct TIMERCTL* getTimerController() {
        return &timerctl;
    }

    io_load_eflags() 和 io_store_eflags()这两个函数我们以前提到过,CPU会根据一系列状态信息来调整自己的运行状况,例如当前中断功能是否打开,是否有计算溢出等等,这些状态信息都存储在指定寄存器的指定比特位中(CPU上的相关硬件),io_load_eflags()就是获取这些信息,把他们存储到变量eflags中,io_store_eflags(eflags)是把前面存储的状态信息重新设置回去, io_cli()的作用是让CPU停止接收一切中断信号,也就是设置对应的比特位让CPU运行时忽略到来的中断请求,io_store_eflags作用就是重新恢复原来状态,让CPU重新接收中断信号。

    我们再看看内核主循环的处理:

    ....
    static struct FIFO8 timerinfo;
    static char timerbuf[8];
    ....
    void CMain(void) {
        ....
        init_pit();
        fifo8_init(&timerinfo, 8, timerbuf);
        settimer(500, &timerinfo, 1);
        ....
    }

    内核启动时,初始化时钟控制器,并初始化一个FIFO队列和用于该队列的缓冲区,通过settimer函数,设置一个5秒的超时时间片,数值1对应TIMERCTL结构体里面的data, 这个数据的作用在后面我们会看到。

    void CMain(void) {
        ....
        int data = 0;
        int count = 0;
        struct TIMERCTL *timerctl = getTimerController();
    
        for(;;) {
           char* pStr = intToHexStr(timerctl->timeout);
           boxfill8(shtMsgBox->buf, 160, COL8_C6C6C6, 40, 28, 119, 43);
           showString(shtctl, shtMsgBox, 40, 28, COL8_000000,pStr);
    
           io_cli();
           if (fifo8_status(&keyinfo) + fifo8_status(&mouseinfo) +
     fifo8_status(&timerinfo)  == 0) {
    
               io_sti();
           } ....
    
          else {
          //超时发生后进入这里
               io_sti();
               showString(shtctl, sht_back, 0, 0, COL8_FFFFFF, "5[sec]");
          }
    }

    在进入内核主循环前,先获取时钟控制器,然后把控制器对应的时间片信息转换成字符串后,显示到Message Box 窗体里。每次循环时,看看控制器对应的数据队列里面是否有数据,如果有数据表明超时发送,于是进入最后的else 部分,在else 里面, 我们在桌面的左上角打印出一个字符串”5[sec]”。

    上面代码编译后,系统启动时画面如下,一开始时Message Box窗体里的计数一直减小:
    这里写图片描述

    五秒后,Message Box 里面的数值变为0,然后桌面左上角的字符串会显示出来,表示超时发送了:
    这里写图片描述

    展开全文
  • Linux 内核和 Windows 内核什么区别?

    千次阅读 多人点赞 2021-02-20 09:46:29
    对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。 这两个操作系统各有千秋,不分...

    微信搜索「小林coding」,更多图解系、网络文章等你来撩哦!

    Windows 和 Linux 可以说是我们比较常见的两款操作系统的。

    Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。

    对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。

    这两个操作系统各有千秋,不分伯仲。

    操作系统核心的东西就是内核,这次我们就来看看,Linux 内核和 Windows 内核有什么区别?


    内核

    什么是内核呢?

    计算机是由各种外部硬件设备组成的,比如内存、cpu、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人就由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节。

    内核

    内核有哪些能力呢?

    现代操作系统,内核一般会提供 4 个基本能力:

    • 管理进程、线程,决定哪个进程、线程使用 CPU,也就是进程调度的能力;
    • 管理内存,决定内存的分配和回收,也就是内存管理的能力;
    • 管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力;
    • 提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。

    内核是怎么工作的?

    内核具有很高的权限,可以控制 cpu、内存、硬盘等硬件,而应用程序具有的权限很小,因此大多数操作系统,把内存分成了两个区域:

    • 内核空间,这个内存空间只有内核程序可以访问;
    • 用户空间,这个内存空间专门给应用程序使用;

    用户空间的代码只能访问一个局部的内存空间,而内核空间的代码可以访问所有内存空间。因此,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在内核态执行。

    应用程序如果需要进入内核空间,就需要通过系统调用,下面来看看系统调用的过程:

    内核程序执行在内核态,用户程序执行在用户态。当应用程序使用系统调用时,会产生一个中断。发生中断后, CPU 会中断当前在执行的用户程序,转而跳转到中断处理程序,也就是开始执行内核程序。内核处理完后,主动触发中断,把 CPU 执行权限交回给用户程序,回到用户态继续工作。


    Linux 的设计

    Linux 的开山始祖是来自一位名叫 Linus Torvalds 的芬兰小伙子,他在 1991 年用 C 语言写出了第一版的 Linux 操作系统,那年他 22 岁。

    完成第一版 Linux 后,Linux Torvalds 就在网络上发布了 Linux 内核的源代码,每个人都可以免费下载和使用。

    Linux 内核设计的理念主要有这几个点:

    • MutiTask,多任务
    • SMP,对称多处理
    • ELF,可执行文件链接格式
    • Monolithic Kernel,宏内核
    MutiTask

    MutiTask 的意思是多任务,代表着 Linux 是一个多任务的操作系统。

    多任务意味着可以有多个任务同时执行,这里的「同时」可以是并发或并行:

    • 对于单核 CPU 时,可以让每个任务执行一小段时间,时间到就切换另外一个任务,从宏观角度看,一段时间内执行了多个任务,这被称为并发。
    • 对于多核 CPU 时,多个任务可以同时被不同核心的 CPU 同时执行,这被称为并行。

    SMP

    SMP 的意思是对称多处理,代表着每个 CPU 的地位是相等的,对资源的使用权限也是相同的,多个 CPU 共享同一个内存,每个 CPU 都可以访问完整的内存和硬件资源。

    这个特点决定了 Linux 操作系统不会有某个 CPU 单独服务应用程序或内核程序,而是每个程序都可以被分配到任意一个 CPU 上被执行。

    ELF

    ELF 的意思是可执行文件链接格式,它是 Linux 操作系统中可执行文件的存储格式,你可以从下图看到它的结构:

    ELF 文件格式

    ELF 把文件分成了一个个分段,每一个段都有自己的作用,具体每个段的作用这里我就不详细说明了,感兴趣的同学可以去看《程序员的自我修养——链接、装载和库》这本书。

    另外,ELF 文件有两种索引,Program header table 中记录了「运行时」所需的段,而 Section header table 记录了二进制文件中各个「段的首地址」。

    那 ELF 文件怎么生成的呢?

    我们编写的代码,首先通过「编译器」编译成汇编代码,接着通过「汇编器」变成目标代码,也就是目标文件,最后通过「链接器」把多个目标文件以及调用的各种函数库链接起来,形成一个可执行文件,也就是 ELF 文件。

    那 ELF 文件是怎么被执行的呢?

    执行 ELF 文件的时候,会通过「装载器」把 ELF 文件装载到内存里,CPU 读取内存中的指令和数据,于是程序就被执行起来了。

    Monolithic Kernel

    Monolithic Kernel 的意思是宏内核,Linux 内核架构就是宏内核,意味着 Linux 的内核是一个完整的可执行程序,且拥有最高的权限。

    宏内核的特征是系统内核的所有模块,比如进程调度、内存管理、文件系统、设备驱动等,都运行在内核态。

    不过,Linux 也实现了动态加载内核模块的功能,例如大部分设备驱动是以可加载模块的形式存在的,与内核其他模块解藕,让驱动开发和驱动加载更为方便、灵活。

    分别为宏内核、微内核、混合内核的操作系统结构

    与宏内核相反的是微内核,微内核架构的内核只保留最基本的能力,比如进程调度、虚拟机内存、中断等,把一些应用放到了用户空间,比如驱动程序、文件系统等。这样服务与服务之间是隔离的,单个服务出现故障或者完全攻击,也不会导致整个操作系统挂掉,提高了操作系统的稳定性和可靠性。

    微内核内核功能少,可移植性高,相比宏内核有一点不好的地方在于,由于驱动程序不在内核中,而且驱动程序一般会频繁调用底层能力的,于是驱动和硬件设备交互就需要频繁切换到内核态,这样会带来性能损耗。华为的鸿蒙操作系统的内核架构就是微内核。

    还有一种内核叫混合类型内核,它的架构有点像微内核,内核里面会有一个最小版本的内核,然后其他模块会在这个基础上搭建,然后实现的时候会跟宏内核类似,也就是把整个内核做成一个完整的程序,大部分服务都在内核中,这就像是宏内核的方式包裹着一个微内核。


    Windows 设计

    当今 Windows 7、Windows 10 使用的内核叫 Windows NT,NT 全称叫 New Technology。

    下图是 Windows NT 的结构图片:

    Windows NT 的结构

    Windows 和 Linux 一样,同样支持 MutiTask 和 SMP,但不同的是,Window 的内核设计是混合型内核,在上图你可以看到内核中有一个 MicroKernel 模块,这个就是最小版本的内核,而整个内核实现是一个完整的程序,含有非常多模块。

    Windows 的可执行文件的格式与 Linux 也不同,所以这两个系统的可执行文件是不可以在对方上运行的。

    Windows 的可执行文件格式叫 PE,称为可移植执行文件,扩展名通常是.exe.dll.sys等。

    PE 的结构你可以从下图中看到,它与 ELF 结构有一点相似。

    PE 文件结构


    总结

    对于内核的架构一般有这三种类型:

    • 宏内核,包含多个模块,整个内核像一个完整的程序;
    • 微内核,有一个最小版本的内核,一些模块和服务则由用户态管理;
    • 混合内核,是宏内核和微内核的结合体,内核中抽象出了微内核的概念,也就是内核中会有一个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序;

    Linux 的内核设计是采用了宏内核,Window 的内核设计则是采用了混合内核。

    这两个操作系统的可执行文件格式也不一样, Linux 可执行文件格式叫作 ELF,Windows 可执行文件格式叫作 PE。


    巨人的肩膀
    1. https://en.wikipedia.org/wiki/Monolithic_kernel
    2. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
    3. https://en.wikipedia.org/wiki/Windows_NT
    展开全文
  • 1.1 Linux 内核什么? linus 说,内核就是为上层应用程序提供运行环境并管理整个系统软硬件资源的一个程序。(管理和服务程序) 1.2 Linux 体系结构及内核功能 Linux 操作系统从上到下,可以分为:用户应用程序、库...
    1.1 Linux 内核是什么?

    linus 说,内核就是为上层应用程序提供运行环境并管理整个系统软硬件资源的一个程序。(管理和服务程序)

    1.2 Linux 体系结构及内核功能

    Linux 操作系统从上到下,可以分为:用户应用程序、库、内核、驱动程序。图形表示如下



    1.内核要完成如下的功能

    1)进程管理

    2)内存管理

    3)提供文件系统支持

    4)设备控制

    5)中断和异常响应

    6)网络功能


    1.3 内核版本号和补丁制作

    1.版本号的含义

    linux-2.6.30.1
    VERSION = 2
    PATCHLEVEL = 6
    SUBLEVEL = 30
    EXTRAVERSION = 1
    说明:
    2
    .6 - 内核主版本号(偶数稳定.每隔2~3 年出一个稳定版本)

    30 - 次版本号(不分寄偶,每2 个月发布一个稳定版本)
    1- 扩展版本号(bug fix)

    2.补丁的制作以及打补丁

    1)制作补丁

    diff  -Nur   linux-2.6.10   linux-2.6.13   >  2.6.33.13.patch

    含义:制作从linux-2.6.33.10到linux-2.6.33.13的补丁包

    2)补丁的安装

    进入到要打补丁的目录

    cd  linux-2.6.33.10

    patch  -p1 < ../2.6.33.13.patch其中 -p1 表示忽略一级目录

    1.4内核源码目录结构

    ├── arch
    ├── block
    ├── COPYING
    ├── CREDITS
    ├── crypto
    ├── Documentation
    ├── drivers
    ├── firmware
    ├── fs
    ├── include
    ├── init
    ├── ipc
    ├── Kbuild
    ├── kernel
    ├── lib
    ├── MAINTAINERS
    ├── Makefile
    ├── mm
    ├── modules.builtin
    ├── modules.order
    ├── Module.symvers
    ├── net
    ├── README
    ├── REPORTING-BUGS
    ├── samples
    ├── scripts
    ├── security
    ├── sound
    ├── System.map
    ├── tools
    ├── usr
    ├── virt
    ├── vmlinux
    ├── vmlinux.o
    └── webee210_defconfig

    arch:体系结构

    1.5 内核配置及编译

    1)解压内核

    tar xvf linux-2.6.35.7-webee210.tar.bz2  -C /opt/src/

    需要注意的是因为内核源码中有硬连接,所以不能解压在windows的文件系统中

    2)检查交叉编译环境

    arm-linux-gcc -v

    检查Makefile里面的交叉编译器

    ARCH= arm

    CROSS_COMPILE=arm-linux

    3)配置内核

    默认配置文件存放目录: arch/arm/configs
    生存默认配置文件: cp xxx_deconfig .config
    自定义配置: make menuconfig

    4)编译

    make
    make zImage 只编译


    展开全文
  • 如果将所有的设备驱动和内核功能都集成在内核中,则内核会不断的庞大,对我们的内核裁剪也会带来更大的挑战,为了解决这个问题,Linux内核引入内核模块机制,通过动态加载内核模块,从而实现在运行过程中扩展内核的...

    Linux内核是整体性结构,各个子系统紧密联系,上接用户控件,下接硬件,作为一个大程序在内核控件运行。

    如果将所有的设备驱动和内核功能都集成在内核中,则内核会不断的庞大,对我们的内核裁剪也会带来更大的挑战,为了解决这个问题,Linux内核引入内核模块机制,通过动态加载内核模块,从而实现在运行过程中扩展内核的功能。

    内核模块是什么?

    ①  内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。

    ②  内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。

    ③  如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。这还意味着一个臃肿的内核。

     

    模块机制的优点:

    ①  减小内核映像尺寸,增加系统灵活性;

    ②  节省开发时间;修改内核,不必重新编译整个内核。

    ③  模块的目标代码一旦被链入内核,作用和静态链接的内核目标代码完全等价。

     

    模块机制的缺点:

    ①  对系统性能有一定损失;

    ②  使用不当时会导致系统崩溃;

     

    接下来通过<hello world模块>介绍一下内核模块的实现:

    首先先附上模块的代码(hello_world.c)

    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
     
    static int hello_init(void)
    {
        printk("hello world module!\n");
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk("good bye module!\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
     
    MODULE_LICENSE("GPL");

    内核模块至少包含两个函数:

    入口函数->初始化函数(xxx_init()):模块加载时,被调用

    出口函数->卸载函数(xxx_exit()):模块卸载时,被调用

    模块的入口函数名和出口函数名可以任意命名,通过宏module_init()申明入口函数,通过宏module_exit()申明出口函数。模块需要包含头文件:#include <linux/module.h>

     

    内核模块证书:2.4内核后,引入识别代码是否在GPL许可下发布的机制。在使用非公开的源代码产品时会得到警告。通过宏MODULE_LICENSE(“GPL”),设置模块遵守GPL证书,取消警告信息。

     

    内核模块的构建:

    管理模块源码方法:①模块源码加入到内核源码树中。② 模块源码饭仔内核源码树之外。

    注:本文介绍的是放在内核源码树外编译。

     

    接下来是Makefile的实现:

           首先附上Makefile的源码:

    KERNEL_DIR = /home/FAN/linux-kernel
     
    all:
        make -C $(KERNEL_DIR) M=`pwd` modules
    
    clean:
        make -C $(KERNEL_DIR) M=`pwd` modules clean
        rm -rf modules.order Module.symvers
    
    obj-m += hello_world.o

    其中:

    1、KERNEL_DIR:参数,赋值内核的位置,例如我的内核源码的路径:/home/fan/linux-kernrl

    2、当终端执行make时,会运行make -C $(KERNEL_DIR) M=`pwd` modules,其中M=`pwd`指向是模块所在的路径。

    3、当终端执行make clean时,会运行下面两条命令,将编译生成的文件删除

    make -C $(KERNEL_DIR) M=`pwd` modules clean

        rm -rfmodules.order Module.symvers

     

    4、obj-m += hello_world.o:

         其中 –m 表示将hello_world.c编译成模块

                         –y 表示将hello_world.c编译进内核镜像中

     

    编译生成文件:

    在终端运行make,则会生成hello_world.ko文件.

    将hello_world.ko发送到板子上,

    然后在板子上运行insmod hello_world.ko,会调用hello_init()函数

                         运行rmmod hello_world.ko,会调用hello_exit()函数

     

    下图为运行结果:

    展开全文
  • 这是一个好的功能,扩展了操作系统的内核功能,却不需要重新启动系统,是一种动态加载的技术。 特点:动态加载,随时载入,随时卸载,扩展功能 2、内核模块的加载作用 内核模块只是向linux内核预先注册自己,以...
  • Linux内核开发_2_Initramf

    2020-05-13 18:16:54
    在最初,Linus(Linux内核的作者)早期想要编写一个能够与chech(CPU缓存)的文件系统,Linus在rasmfs(ram(与内存交互的文件系统)上的chech(缓存功能)上做了封装,使其能够对主板上的L1和L2等不同级别的缓存进行交互,.....
  • Linux内核模块开发

    千次阅读 2011-07-15 16:45:54
    什么内核模块Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件呢:方法一:把所有的组件都编译进内核文件,即zImage或bzImage。但这样会导致两个问题:一是生成的内核文件过大;
  • 嵌入式系统简介一般定义:以应用为中心、以计算机技术为基础、软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。广义上讲:凡是带有微处理器的专用硬件系统都可以称为嵌入式...
  • 由于不同用户物理设备以及对内核功能需求的差异性,需要一种类似插件的运行机制——编写插件实现所需功能,然后嵌入到内核中,与内核形成一个整体。 Linux内核模块 便是这样的插件。作为 Linux 内核的扩展手段,可以...
  • 一丶理论知识,什么是过滤. 过滤就是在不影响上层跟下层的情况下,加入我们的新一层的设备. 当请求数据发送过来的时候.我们可以对这个数据进行操作.这个就是过滤的基本含义. 二丶过滤使用的API.以及简单的功能....
  • 内核只提供操作系统的基本功能和特性,如内存管理,进程调度,文件管理等等。 发行版的版本和内核版本是两回事,发行版由厂商更新,linux内核由linus的开发团队更新。 发行版除了发行版本必定还有一个内核版本,表示...
  • Linus当时完成的内核什么特点呢?当时的内核功能简单,但最重要的是其具有了进程调度功能,它启动了两个进程,一个进程打印出一串"AAAA...", 另一个进程打印出一串"BBBB...." 既然我们现在的系统内核已经具备了...
  • 虽然在平时的开发中,对于头文件也没有犯过什么大的错误,但是总觉得对头文件这块理解得不是很透彻。所以趁着这次嵌入式开发的机会,好好对头文件这部分的内容进行了分析和总结。下面我们主要从两个方面对头文件进行...
  • 今天发现Linux 内核使用的仍然是 GPLv2,很困惑为什么不用 GPLv3? 看了一下这篇文章: https://www.cnet.com/news/torvalds-no-gpl-3-for-linux/ https://doc.yonyoucloud.com/doc/sfd-gpl/gplv3.html 我理解的大致...
  • 能够独立完成驱动的功能开发任务能够分析和优化驱动的性能,针对特定硬件扬长避短能够充分了解模块相关软硬件能力、发展方向,辅助应用工程师最大化利用硬件能力能够辅助硬件工程师规划硬件设计,预防问题,谋求功能...
  • 模拟器开发以及嵌入式系统内核调试lmjx 2004-12-25limiao@yeah.net 一、模拟器的开发1. 什么是模拟器模拟器是一组应用程序,它运行于一个OS之上(linux或windows),提供对目标板功能的模拟,包括中断系统,RAM,...
  • 先给自己打个广告,本人的微信公众号正式...内核模块是具有独立功能的程序,它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在kerne space中运行。模块编程和内核版本密切相连,因为...
  • 引言树莓派所使用的操作系统是基于linux内核开发的,由于linux内核完全免费公开,因此我们可以修改树莓派的操作系统,实现对树莓派更深层次的掌控。本文主要介绍树莓派内核模块编程的基础知识,为以后的深入学习奠定...
  • 转自... 首先准备条件: ...android开发环境 (eclipse , jdk , sdk ) ...总之,在这个过程中,他提示你少了什么,那么你就通过sudo apt-get install xxx安装什么 (多用Tab键补全功能
  • ESP32是乐鑫继ESP8266之后推出的一款亲民的WIFI模块,既支持WIFI,...别问我为什么推荐这个开发环境,因为别的开发环境,我!不!会!乐鑫ESP32好了,下面进入正题,首先,你得下载原生的Arduino IDE,版本越新越好...
  • 引言树莓派所使用的操作系统是基于linux内核开发的,由于linux内核完全免费公开,因此我们可以修改树莓派的操作系统,实现对树莓派更深层次的掌控。本文主要介绍树莓派内核模块编程的基础知识,为以后的深入学习奠定...
  • 文章目录一、Huwaei LiteOS背景介绍:二、...  Huawei LiteOS 是华为面向物联网领域开发的一个基于实时内核的轻量级操作系统。基础内核支持任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管
  • 与上一版本相比,统信桌面操作系统V20专业版(1020)推出了全新风格的启动器、上线了众多功能强大的自研应用,如扫描管理、备份还原、安装器、文件保险箱功能。统信"终端"重新上线,稳定性和兼容性大幅度提升。统信...
  • 从运行中的内核完成,就像Chrome开发工具中的自动完成一样 可以检查代码以显示正在运行的内核提供的有用信息 每种语言一个内核(因此您可以在同一个命名空间中运行多个文件的片段) 如果出现任何问题,请中断或重新...
  • Linux内核模块

    2020-05-13 11:01:24
    本质上module是一段内核代码,它运行在cpu的特权层(Ring 0 on X86),与内核代码具有相同的功能。 它是kernel的动态扩展,在需要时被加载,在不需要时被移除,可减少内核的footprint。 便于驱动、文件系统等的二次...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 963
精华内容 385
关键字:

内核开发什么功能