精华内容
下载资源
问答
  • 内核添加文件资源
    千次阅读
    2022-02-07 11:52:51

    linux内核伪文件系统—sysfs分析

    一、sysfs简介

    sysfs是一个伪文件系统。不代表真实的物理设备,在linux内核中,sysfs文件系统将长期存在于内存中。sysfs用于对具体的内核对象(例如物理设备)进行建模,并提供一种将设备和设备驱动程序关联起来的方法。使用

    ls -l /sys
    

    命令可以查看sysfs文件系统中导出了哪些内核对象。如下图片所示:

    在这里插入图片描述

    从上图可见,sysfs文件系统中导出了block、bus、class、dev、devices、firmware、fs、kernel、module、power内核对象(不同的内核配置,可能导出的内核对象有所差异)。

    从内核源码来看。这里以bus内核对象为例,内核源码将在buses_init()函数中调用kset_create_and_add()内核函数创建bus对象集合并将其添加到sysfs文件系统中。

    开发人员可以使用sysfs来确定有关正在运行的内核的有用信息,比如:内核在每个总线(bus)上发现了哪些设备,以及每个设备绑定了哪些驱动程序,都可以从sysfs文件系统获知。除此之外,sysfs还可以用于调试、优化设备以及其他的内核子系统。

    当前块(block)子系统会使用sysfs来挂载根分区。如果禁用了sysfs,就必须在内核引导命令行上通过它的主号(major)和副号(minor)指定引导设备。例如,对于/dev/hda1设备来说,命令可以是root=03:01

    对于嵌入式系统的设计人员,根据实际运用场景,可以禁用sysfs文件系统,以节省系统资源。

    二、sysfs文件系统源码分析

    首先,linux内核中关于sysfs文件系统的源码位于(/fs/sysfs)目录下。如下图所示(源码已被编译):
    在这里插入图片描述

    Makefile文件可知,编译过程中,将编译5个源文件:file.o dir.o symlink.o mount.o group.o

    本部分内容就不分析sysfs文件系统的内部实现细节,主要分析以下两个问题:

    (1)sysfs文件系统在linux内核中如何挂载的?

    (2)linux内核如何将内核对象集添加到sysfs文件系统?

    (2-1)sysfs文件系统在linux内核中如何挂载

    start_kernel()函数中将调用vfs_caches_init(totalram_pages);函数进行虚拟文件系统的初始化,此函数中将调用mnt_init()函数,在mnt_init()函数中将调用sysfs_init()sysfs文件系统进行挂载。如下图片:
    在这里插入图片描述

    代码片段:

    void __init mnt_init(void)
    {
        //...
        
    	kernfs_init();
    
    	err = sysfs_init();
    	if (err)
    		printk(KERN_WARNING "%s: sysfs_init error: %d\n",
    			__func__, err);
    
        //....
    }
    

    (/fs/sysfs/mount.c)

    static struct file_system_type sysfs_fs_type = {
    	.name		= "sysfs",
    	.mount		= sysfs_mount,
    	.kill_sb	= sysfs_kill_sb,
    	.fs_flags	= FS_USERNS_VISIBLE | FS_USERNS_MOUNT,
    };
    
    int __init sysfs_init(void)
    {
    	int err;
    
    	sysfs_root = kernfs_create_root(NULL, KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK,
    					NULL);
    	if (IS_ERR(sysfs_root))
    		return PTR_ERR(sysfs_root);
    
    	sysfs_root_kn = sysfs_root->kn;
    
    	err = register_filesystem(&sysfs_fs_type);
    	if (err) {
    		kernfs_destroy_root(sysfs_root);
    		return err;
    	}
    
    	return 0;
    }
    

    上述代码第1-6行代码,定义了sysfs文件系统描述类型,指定了.name.mount.kill_sb.fs_flags

    sysfs_init()函数中调用kernfs_create_root()kernfs是一个通用的内核虚拟文件系统,较为复杂本文暂不做过多分析)创建了kernfs_root。接着调用register_filesystem()向内核注册sysfs文件系统。

    (2-2)linux内核如何将内核对象集添加到sysfs文件系统?

    上文写道,linux内核中调用了kset_create_and_add()内核函数创建内核对象集,从而将内核对象集添加到sysfs文件系统下,本部分来看看该函数。

    该函数有以下重要的函数调用关系:
    在这里插入图片描述

    由上图可见,kset_create_and_add()函数最后将调用到sysfs_create_dir_ns()这个函数。从而创建sysfs文件系统目录。代码片段如下所示:

    (/fs/sysfs/dir.c)

    int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
    {
    	struct kernfs_node *parent, *kn;
    
    	BUG_ON(!kobj);
    
    	if (kobj->parent)
    		parent = kobj->parent->sd;
    	else
    		parent = sysfs_root_kn;
    
    	if (!parent)
    		return -ENOENT;
    
    	kn = kernfs_create_dir_ns(parent, kobject_name(kobj),
    				  S_IRWXU | S_IRUGO | S_IXUGO, kobj, ns);
    	if (IS_ERR(kn)) {
    		if (PTR_ERR(kn) == -EEXIST)
    			sysfs_warn_dup(parent, kobject_name(kobj));
    		return PTR_ERR(kn);
    	}
    
    	kobj->sd = kn;
    	return 0;
    }
    

    三、总结

    ​ 本文从linux内核代码以及实际的系统运行效果为出发点,描述了sysfs文件系统的一些功能,并分析了linux内核如何初始化并挂载sysfs文件系统,以及inux内核如何将内核对象集添加到sysfs文件系统中的。


    由于小生知识和精力有限,如若分享的文章存在有不妥的地方,请看官们多多批评,haha!

    搜索关注【嵌入式小生】wx公众号获取更多精彩内容>>>>
    请添加图片描述

    更多相关内容
  • 实验三 添加内核模块 一实验目的 学习Linux模块的基本概念和原理学习内核模块编程的基本技术利用内核模块编程访问进程描述符操作内核的基本数据结构加深对进程的理解理解proc文件系统的作用学习proc文件的创建方法...
  • 内核添加对yaffs2文件系统的支持

    千次阅读 2016-11-14 12:38:42
    GitHub 内核添加对yaffs2文件系统的支持 AderXCoding/system/tools/yaffs2 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 1 yaffs介绍YAFFS, Yet ...
    CSDNGitHub
    内核添加对yaffs2文件系统的支持AderXCoding/system/tools/yaffs2


    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作

    1 yaffs介绍


    YAFFS, Yet Another Flash File System, 是一种类似于 JFFS/JFFS2 的专门为 Flash 设计的嵌入式文件系统. 与 JFFS 相比, 它减少了一些功能, 因此速度更快、占用内存更少. YAFFSJFFS 都提供了写均衡, 垃圾收集等底层操作. 它们的不同之处在于 :

    1. JFFS 是一种日志文件系统, 通过日志机制保证文件系统的稳定性. YAFFS 仅仅借鉴了日志系统的思想, 不提供日志机能, 所以稳定性不如 JAFFS, 但是资源占用少.

    2. JFFS 中使用多级链表管理需要回收的脏块, 并且使用系统生成伪随机变量决定要回收的块, 通过这种方法能提供较好的写均衡, 在 YAFFS 中是从头到尾对块搜索, 所以在垃圾收集上 JFFS 的速度慢, 但是能延长 NAND 的寿命.

    3. JFFS 支持文件压缩, 适合存储容量较小的系统; YAFFS 不支持压缩, 更适合存储容量大的系统.

    4. YAFFS 还带有 NAND 芯片驱动, 并为嵌入式系统提供了直接访问文件系统的 API, 用户可以不使用 Linux 中的 MTDVFS, 直接对文件进行操作. NAND Flash 大多采用 MTD+YAFFS 的模式. MTD(Memory Technology Devices, 内存技术设备)是对 Flash 操作的接口, 提供了一系列的标准函数, 将硬件驱动设计和系统程序设计分开.

    YAFFS2YAFFS 的升级版, 能更好的支持 NAND FLASH, 我们采用最新的 YAFFS2文件系统. 我们首先下载 YAFFS文件系统.

    2 内核添加对yaffs2文件系统的支持


    内核中默认是不支持 yaffs 文件系统的, 因此我们需要为内核打上 yaffs 的补丁

    File  systems  --->
        Miscellaneous  filesystems  --->
            <*>  YAFFS2  file  system  support
            [*]  Autoselect  yaffs2  format

    2.1 下载yaffs源码


    第一步, 我们需要 YAFFS2 的源码, 如果大家有兴趣想了解 YAFFS2 文件系统的驱动原理的话可以直接去访问他们的官网

    官网地址 : www.yaffs2.net

    有源码下载地址, 怕大家进去后难找, 直接贴出YAFFS2的最新源码地址吧 http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=summary

    直接点击, 点最新版本, 点击最右边的 SNAPSHOT 下载, 这个是目前最新的YAFFS2的源码了.

    或者直接访问, 即可自动下载

    http://aleph1.co.uk/gitweb?p=yaffs2.git;a=snapshot;h=HEAD;

    下载后解压缩 yaffs 源代码

    当然我们也可以使用git进行下载

    • 普通用户使用
    git clone git://www.aleph1.co.uk/yaffs2
    • 内部开发人员

    yaffs 的开发人员会有自己的开发账户, 因此可以直接访问 git 进行下载

    git clone ssh://www.aleph1.co.uk/home/aleph1/git/yaffs2

    下载内核源代码

    2.2 为内核打上patch


    第二步, 将下载下来的 YAFFS2 最新源码 YAFFS2.tar.gz 放入你 LINUX 的任意一个目录下, 执行 tar zxvf YAFFS2.tar.gz 然后进入 YAFFS2 源码包

    yafss源代码目录

    由于最新的源码再执行脚本 patch-ker.sh 时 有四个参数, 可以追加:c,l,m,s,

    ./patch-ker.sh  c/l m/s kernelpath
     if c/l is c, then copy. If l then link
     if m/s is m, then use multi version code. If s then use single version code

    patch帮助信息

    上面这段英文应该很好懂吧, 简而言之, C 是复制文件, L是链接文件, M是多种, S是单个的,

    那么在这里, 我们只需执行

    ./patch-ker.sh c m your-linux-kernel-directory

    patch内核

    执行完这条命令之后, 你将会发现在 kernel 源代码目录下发现有了 yaffs2 目录了, 并且里面也出现了好多文件

    1. 修改内核 fs/Kconfig, 增加了 yaffs2 下的 Kconfig
    # Patched by YAFFS
    source "fs/yaffs2/Kconfig"

    内核fs/Kconfig增加的信息

    1. 修改内核 fs/Makefile, 增加了 yaffs 目录的信息

    同时将原来的 Makefile 备份为 Makefile.pre.yaffs

    # Patched by YAFFS
    obj-$(CONFIG_YAFFS_FS)          += yaffs2/

    fs/Makefile增加的信息

    1. 在内核fs/目录下创建yaffs2子目录

      • 将yaffs2源码目录下的Makefile.kernel复制为内核fs/yaffs2/Makefile文件

      • 将yaffs2源码目录下的Kconfig文件复制到内核fs/yaffs2/目录下

      • 将yaffs2源码目录下的.c,.h文件(不包括子目录下的文件)复制到内核fs/yaffs2/目录下

    yaffs2子目录的信息

    2.3 配置内核


    最后就是配置编译内核, 让内核支持yaffs2文件系统

    ```cpp
    File  systems  --->
        Miscellaneous  filesystems  --->
            <*>  YAFFS2  file  system  support
            [*]  Autoselect  yaffs2  format
    
    
    配置语言选项
    
    Native  Language  support  --->
        (iso8859-1)  Default  NLS  Option
        <*>  Codepage  437(United  States,  Canada)
        <*>  Simplified  Chinese  charset(CP936,  GB2312)
        <*>  NLS  ISO8859-1  (Latin  1;  Western  European  Language)
        <*>  NLS  UTF-8

    配置内核

    yaffs2 需要内核 MTD 的支持

    若在 make menuconfig 中没有出现 yaffs2 文件系统的支持, 请检查 MTD 的配置, yaffs2 依赖于 MTD . MTD中配置了 linux 内核对 NANDFlash 的支持.

    Device Drivers --->
      Memory Technology Device (MTD) support  --->
    
    
    # 进一步把其中的NAND Flase的支持打开
    

    mtd-support

    mtd-support

    内核支持 NandFlashyaffs2 文件系统,将内核烧入 NandFlash后, 再烧入 yaffs2 文件系统, 可以使用制作好的文件系统, 也可以自己制作

    启动时(成功挂载文件系统)输出:

    yaffs:  dev  is  32505858  name  is  "mtdblock2"
    yaffs:  passed  flags  ""
    yaffs:  Attempting  MTD  mount  on  31.2,  "mtdblock2"
    yaffs:  auto  selecting  yaffs2
    yaffs_read_super:  isCheckpointed  0
    VFS:  Mounted  root  (yaffs  filesystem)  on  device  31:2.
    Freeing  init  memory:  196K


    知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作.

    展开全文
  • 主要内容 第一节 Linux 内核定制裁剪和添加 第二节 嵌入式引导系统 BootLoader 技术 第三节 文件系统的构建 ? 学习方法与建议 本章主要介绍了三个部分分别是嵌入式 linux 内核引导系统介绍和 文件系统等相关内容该...
  • 本章主要介绍了三个部分分别是嵌入式linux内核引导系统介绍和文件系统等相关内容在内核部分详细介绍了Linux操作系统内核定制裁剪和添加引导部分则介绍了嵌入式BootLoader技术最后的文件系统部分详细介绍了文件系统的...
  • 嵌入式Linux系统知识架构及层次嵌入式Linux系统构成及启动略析嵌入式Linux三剑客之uboot技术嵌入式Linux三剑客之内核技术嵌入式Linux三剑客之文件系统技术 知识架构及层次 Linux内核由三部分构成: Bootloader ...

    计算机专业基础笔记目录可以点这里:计算机专业基础笔记目录

    知识架构及层次

    Linux内核由三部分构成:

    • Bootloader:启动引导系统(可执行文件)
    • Kernel:内核(可执行文件)
    • Root File System:根文件系统
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    嵌入式Linux系统构成及启动略析

    在这里插入图片描述
    嵌入式 Linux 启动类同4X100 米接力跑,是由多个部分共同完成,包括:

    • 第一棒:bootloader 初始化PC 上则是 BIOS 初始化和 grub 启动两步)。
      首先完成内存初始化、微处理器配置、时钟初始化等基本工作,然后搬运Linux 内核到特定内存,并调用Linux 内核初始化函数(一般是head_armv.s 中的第一条指令),启动内核,把CPU 的控制权交给内核代码。
    • 第二棒:内核代码开始执行,初始化硬件,构建内存管理系统、进程管理系统、模块管理系统、中断管理系统等 Linux 各种重要功能系统,最后创建init 进程,并加载根文件系统,将控制权递交到根文件系统。
      在这里插入图片描述
    • 第三棒:内核挂载根文件系统(相当于将根文件系统内容解压缩)。
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 第四棒,根据 inittab 配置文件,加载应用程序,最后启动 shell 程序,Linux 启动完成。
      在这里插入图片描述

    嵌入式Linux三剑客之uboot技术

    Bootloader概念

    Bootloader 是操作系统内核运行前运行的一段小程序。
    功能:

    1. 初始化硬件设备,如对 CPU、SDRAM、Flash、串口等进行初始化;
    2. 加载内核到内存并执行内核代码;
    3. 提供一些命令工具,如操作flash、从PC机搬运内核到开发板等功能。

    Bootloader 相当于PC机上 BIOS 和 GRUB 功能集合体。

    UBOOT

    常见的 Bootloader:
    在这里插入图片描述

    UBOOT简介

    U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPCARM、AVR32、MIPSx8668k、Nios 与 MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件

    这个项目起源于 Magnus Damm.在 8xx PowerPC 架构下写的引导加载程序:8xxROM。1999 年十月,Wolfgang Denk 将项目移转到 SourceForge.net,但 SourceForge.net 不允许数字开头的项目名称,所以改名为 PPCBoot。2002年11 月 PPCBoot 改名为 U-Boot。

    UBOOT优势

    • 开放源码
    • 支持多种嵌入式操作系统内核,如 Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS、android
    • 支持多个处理器系列,如 PowerPC、ARM、x86、MIPS
    • 较高的可靠性和稳定性;
    • 高度灵活的功能设置,适合 U-Boot 调试、操作系统不同引导要求、产品发布等;
    • 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等
    • 较为丰富的开发调试文档与强大的网络技术支持

    UBOOT功能

    • 系统引导支持 NFS 挂载、RAMDISK (压缩或非压缩)形式的根文件系统
      支持 NFS 挂载、从 FLASH 中引导压缩或非压缩系统内核;
    • 基本辅助功能强大的操作系统接口功能;
      可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤以Linux支持最为强劲;
      支持目标板环境参数多种存储方式,如 FLASH、NVRAM、EEPROM;
    • CRC32 校验可校验 FLASH 中内核、RAMDISK 镜像文件是否完好
    • 设备驱动串口、SDRAM、FLASH、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持;
    • 上电自检功能 SDRAM、FLASH 大小自动检测;SDRAM 故障检测;CPU型号;
    • 特殊功能 XIP 内核引导;

    UBOOT工作模式

    • 启动加载模式是 Bootloader 的正常工作模式,嵌入式产品发布时,Bootloader 必须工作在这种模式下,Bootloader 将嵌入式操作系统从 FLASH 中加载到 SDRAM 中运行,整个过程是自动的。
    • 下载模式就是 Bootloader 通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的 FLASH 中。

    UBOOT源码目录

    • 源码
    • 配置文件及脚本解释器
    • Makefile文件

    在这里插入图片描述

    UBOOT编译过程

    1. 解压缩uboot源码到目录下
    2. 根据开发板进行配置
      make smdk2440
    3. 编译uboot
      make
    4. 烧写uboot.bin到开发板(使用仿真器完成)
    5. 启动开发板后,uboot就运行起来
      在这里插入图片描述

    典型uboot命令

    • nand分区命令:nand
    • 参数命令:setenv/printenv
    • 传输文件命令:load/tftp
    • 启动命令:bootm
    • 其它命令:nm/cp/date

    打印环境变量printenv
    功能:打印开发板上的环境变量值
    例:

    Uboot> printenv
    baudrate=115200
    ipaddr=192.168.1.1
    ethaddr=12:34:56:78:9A:BC
    serverip=192.168.1.5
    Environment size: 80/8188 bytes
    

    设置环境变量setenv 变量 值
    功能:设置开发板上的环境变量值
    例:

    Uboot> setenv ethaddr 12:34:56:78:9A:BC
    Uboot> setenv ipaddr 192.168.1.1
    Uboot> setenv serverip 192.168.1.254   
    			(tftp服务器的地址)
    

    保存环境变量saveenv
    功能:保存开发板上的环境变量值

    网络加载内核tftp 待加载到的内存地址 待加载文件名
    功能:通过网络将位于PC机上tftp服务器目录(如为/tftpdroot) 下的文件加载到开发板内存地址
    例:把 server(IP=环境变量中设置的serverip)中 /tftpdroot/ 下的 vmlinux 通过 TFTP 读入到物理内存 32000000 处。

    Uboot> tftp 32000000 vmlinux
    

    启动内核命令bootm 内核内存地址
    功能:将位于内核内存地址处的内核启动起来
    例:

    Uboot> bootm 0x30008000
    ## Booting image at 30008000 ...
    Starting kernel ...
    Uncompressing
    Linux......................................................................
    done.
    

    NandFlash 操作命令:nand 命令码 参数
    功能:

    • 根据命令码对 nandflash 设备进行相关操作,命令码有以下几种
    • erase
      语法形式:nand erase EraseAddr EraseSize
      功能:擦除 nand 设备从 EraseAddr 地址处 EraseSize 块大小内容
    • write
      语法形式:nand write FromMemAddr ToNandAddr size
      功能:将内存地址为 FromMemAddr 处 size 字节数据写到 nand 设备 ToNandAddr 地址处。
    • Info
      语法形式:nand info
      功能:打印 nand 设备信息
    • read
      语法形式:nand read ToMemAddr FromNandAddr size
      功能:从 Nand 设备地址为 FromNandAddr 处读取 size 字节数据到内存 ToMemAddr 处。

    嵌入式Linux三剑客之内核技术

    内核介绍(功能)

    内核是嵌入式Linux 系统的核心,负责管理系统的进程、内存、文件系统、网络和设备驱动等。如果把地球比作计算机系统,内核就是管理计算机资源的“政府”,内核中的每个功能模块相当于政府中的每个部门,如下图所示。
    在这里插入图片描述
    功能角度来看:
    在这里插入图片描述
    内核就是一系列功能模块构成,包括:

    • 系统调度
    • 进程管理
      负责管理CPU资源,以便让各个进程可以以尽量公平的方式访问CPU。进程管理还包括控制活动进程。
    • 内存管理
      Linux的成功和它优秀的内存管理联系非常密切,因为一个系统的高效性欲稳定性往往决定于它的内存管理机制。
      为了解决容量,Linux 引入了虚拟存储系统;
      为了解决快速,Linux 引入了cache、交换机制等等;
      以使得存储系统在容量上接近硬盘,在速度上接近 cache。
    • 虚拟文件系统(VFS)
      VFS 隐藏各种文件系统的具体细节,为文件操作提供统一的接口。
      在这里插入图片描述
    • 网络协议栈
      内核协议栈为Linux提供了丰富的网络协议实现。其中TCP/IP协议栈提供了所有操作系统中最高效最简洁的实现模式。
    • 设备驱动
      Linux 内核中有大量代码(约60%)都在设备驱动程序中,它们以一种特定的模式管理底层硬件设备并以统一的接口向上层进程提供底层硬件的使用。
    • 中断管理系统
      linux中断管理系统是根据处理器底层硬件中断系统来建立合理高效的软硬件响应机制。Linux中断管理系统包括中断管理架构的建立、中断服务程序的编写以及包括对硬件中断的响应等多个 部分。
    • 系统调用接口
      系统调用层为用户空间提供了一套标准的系统调用函数来访问 Linux 内核,搭起了用户空间到内核空间的桥梁。

    Linux内核中每个模块独立完成相应功能,并能与其它模块相互配合。

    Linux 内核源码及组织

    Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性。

    内核源代码下载地址:www.kernel.org

    Linux内核源码目录:

    • 源码
    • 配置文件
      • 脚本解释器及 Kconfig
      • Makefile文件
      • 其它文件(如设备树)

    在这里插入图片描述
    在这里插入图片描述

    Linux内核裁剪及编译

    • make menuconfig
    • make uImage
      在这里插入图片描述

    具体的先省略。。。我也没怎么看懂。。。

    Kconfig 的五种基本结构

    • menu/endmenu
    • menuconfig
    • config
    • choice/endchoice
    • source

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    嵌入式Linux三剑客之文件系统技术

    此处的文件系统是应用程序等数据文件的集合体。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    BusyBox

    BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。

    其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统

    BusyBox 使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于 BusyBox 中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用 BusyBox 了。BusyBox 然后可以通过 argv[0] 来调用内部工具。

    在这里插入图片描述

    Glibc

    Glibc 是提供系统调用和基本函数的 C 库。

    glic 库通常使用于 X86 架构的 Linux 系统,它虽然非常完备,但是却非常庞大,对于嵌入式系统来说,使用它意味着内存的消耗也会非常巨大。

    uClibc 是一个小型的 C 库,应用于嵌入式 Linux 系统开发。它基本实现了 glibc 的功能,几乎所有glibc 支持的应用程序都能在 uClibc 上运行。
    在这里插入图片描述

    课后作业

    1.嵌入式Linux操作系统包括(bootloader)、(Linux 内核) 、(根文件系统)三部分组成。
    2.在PC机上Linux系统编译使用的编译器名为(gcc) ,ARM处理器嵌入式编译器名为(arm-linux-gcc)。
    3.从C语言角度来理解,嵌入式Linux内核仅是众多(函数)的集合体,其有一个类似于main的函数,名称为 (start_kernel)。

    4.简述 bootloader 的功能:

    1. 初始化硬件设备,如对 CPU、SDRAM、Flash、串口等进行初始化;
    2. 加载内核到内存并执行内核代码;
    3. 提供一些命令工具,如操作flash、从PC机搬运内核到开发板等功能。

    5.在uboot中,打印开发板上环境变量值的命令为(printenv),设置IP地址为192.168.1.1的命令为(setenv ipaddr 192.168.1.1),假如嵌入式内核名为vmlinux,通过tftp加载内核的命令为 (tftp 32000000 vmlinux),启动嵌入式Linux内核的命令为(bootm 0x32000000)。

    6.嵌入式Linux内核裁剪命令为(make menuconfig);裁剪完成后生成配置选择文件(.config);编译内核命令为(make zImage) 。

    7.启动linux后常用的命令如 ifconfig、cp、ls 等通常位于(文件系统)中;嵌入式Linux环境下生成文件系统的常用工具为(mkyaffs2img);以 yaffs 方法为例,将嵌入式文件夹压缩成一个 yaffs2 格式的文件系统命令为(mkyaffs2img 文件夹 镜像文件名) 。

    8.构建嵌入式Linux系统时,烧写bootloader的工具为(hjtag);烧写Linux内核一般使用(bootloader)来烧写,烧写文件系统一般使用(bootloader)来烧写。

    测验:

    写出嵌入式Linux内核裁剪基本步骤(要求写出具体命令)

    make menuconfig
    make zImage
    # Ubuntu可以使用: make uImage
    

    如果向内核添加RC5加密代码rc5.c,拟存储到linux内核文件夹crypt目录下,并要求能以图形方式供用户裁剪,关联宏为CONFIG_RC5_ENCRYPT。写出该文件夹下Makefile文件和Kconfig文件修改内容。
    Kconfig 文件添加的内容:

    config RC5ENCRYPT
    	bool "RC5 ENCRYPT SUPORT"
    	help 
    		this is a simple test ,no use
    

    Makefile 文件添加的内容:

    obj-$(CONFIG_RC5_ENCRYPT) += rc5.o
    

    小测验

    1、构建嵌入式Linux系统是嵌入式开发的重要内容,包括bootloader裁剪和编译、Linux内核裁剪和编译以及文件系统裁剪和制作等流程。请简答:
    (1) 简述通用bootloader核心功能(2分)。
    (2) 写出嵌入式Linux内核裁剪基本步骤(要求写出具体命令)(3分)
    (3) 如果向内核添加RC5加密代码rc5.c,拟存储到linux内核文件夹crypt目录下,并要求能以图形方式供用户裁剪,关联宏为CONFIG_RC5_ENCRYPT。写出该文件夹下Makefile文件和Kconfig文件修改内容。(3分)

    (1)

    1. 初始化硬件设备,如对 CPU、SDRAM、Flash、串口等进行初始化;
    2. 加载内核到内存并执行内核代码;
    3. 提供一些命令工具,如操作flash、从PC机搬运内核到开发板等功能。

    (2)

    make menuconfig
    make zImage
    

    (3)
    Kconfig 文件添加的内容:

    config RC5ENCRYPT
    	bool "RC5 ENCRYPT SUPORT"
    	help 
    		this is a simple test ,no use
    

    Makefile 文件添加的内容:

    obj-$(CONFIG_RC5_ENCRYPT) += rc5.o
    

    2、简述sqilte的移植步骤(写出具体命令)。(2分)
    (1)下载源码包并解压缩

    (2)生成 Makefile

    ./configure CC=arm-linux-gcc –prefix=/opt/sqlite –host=arm-linux
    

    (3)编译及安装

    make
    make install
    

    安装后可以在/opt/sqilte下见到移植好的可执行程序及


    展开全文
  • 内核毕业设计资源的辅助说明资源,详细说明了如何通过内核毕业设计资源提供的内容进行平台的搭建,并且可以调试并运行。...另外添加内核毕业设计资源中必须的三个汇编头文件,上次忘添加了。 很重要!!!!!
  • 内核源代码的修改 修改平台输入时钟\Makefile文件机器代码加入NAND FLASH的分区信息添加内核对yaffs2的支持修改看门狗驱动 5. 输入make进行编译 * BusyBox最初是由 Bruce Perens在 1996年为 Debian GNU/Linux安装盘...
  • 什么是文件系统? 常规认知就是根目录下那些文件,但其实并不是那样。文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件...

    什么是文件系统?

    常规认知就是根目录下那些文件,但其实并不是那样。文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。也指用于存储文件的磁盘或分区,或文件系统种类。因此,可以说"我有2个文件系统"意思是他有2个分区,一个存文件,或他用 “扩展文件系统”,意思是文件系统的种类。 比如在linux源码下文件下的文件系统代码存放在fs文件夹(由此可知文件系统是一个程序):
    在这里插入图片描述

    • 文件系统(文件管理系统)的种类有哪些? 既然文件系统是管理磁盘文件的方法,那么肯定不止一种,比如说:FATvfatNTFSEXT(ext2、ext3、ext4)、HFS,Linux常用的是EXT系列的文件系统,windows使用的文件系统是NTFS,树莓派查看文件系统的命令是:df -T,如下如所示,type就是文件系统类型。tmpfs:是临时文件系统也叫作内存文件系统是基于内存的。vfat和ext4是基于磁盘的,也就是我们的SD卡,就是之前挂载到虚拟机的两个分区,fat分区存放boot(BootLoader)相关文件,ext4分区存放的是根目录文件。有图可以看出都是根目录下的文件但是可能来自不同的分区。
      在这里插入图片描述

    • 什么是分区? 对于windows来说,像是驱动器盘符,C盘是装系统的分区,D盘存放其他文件,但是C盘也可以放其他文件,比较随意,但是C盘、D盘的内存都是联连续的一大块。对于Linux来说,叫做文件系统结构,按照功能来分区,每个分区严格存放文件,内存不一定连续,也就是说我们在linux同一个路径下看到的文件不一定是来自同一分区。Linux磁盘分区: linux分区不同于windows,硬盘和硬盘分区在Linux都表示为设备。硬盘分区一共有三种:主分区,扩展分区和逻辑分区。 硬盘的分区主要分为主分区(Primary Partion)和扩展分区(Extension Partion)两种,主分区和扩展分区的数目之和不能大于四个。主分区(Primary Partion):可以马上被使用但不能再分区。扩展分区(Extension Partion):必须再进行分区后才能使用,也就是说它必须还要进行二次分区。逻辑分区((Logical Partion)):由扩展分区建立起来的分区,逻辑分区没有数量上限制。扩展分区只不过是逻辑分区的“容器”,实际上只有主分区和逻辑分区进行数据存储。嵌入式系统可以分为4个区,分别是bootloader(启动代码)、para(启动代码向内核传递参数的位置)、kernel(内核分区)、根分区(文件系统结构)等,与Windows、Linux分区不同 。①在嵌入式系统中,没有swap分区,只有实际的物理空间。②bootloader、para、kernel这三个分区的功能类似于Linux系统中的/boot分区,这三个分区分别存放嵌入式系统的启动代码和内核。注: Linux系统中/boot分区内存放着linux启动代码和内核源码。③根分区(/)可以构造,其功能类似于Linux系统中的根分区在这个分区中可以创建许多目录,比如/root、/home、/usr等,但不能创建/boot目录。④分区bootloader、para、kernel只能由地址来区分,而根分区只能由目录来区分。⑤嵌入式系统的驱动程序、上层软件都放在根分区.在嵌入式系统启动后,系统无法查看到bootloader、para、kernel这三个分区。

    • 什么是文件系统目录结构? 文件系统是存储设备上组织文件的方法,那么常规认知的根目录是什么呢?其实根目录就是文件系统目录结构。在Linux系统中,目录被组织成一个:单根倒置树结构,文件系统目录结构从根目录开始,用/来表示。文件名称区分大小写( 大小写敏感还需要看具体的文件系统格式 ),以.开头的为隐藏文件,路径用/来进行分割(windows中使用\来分割),文件有两个种类:元数据与数据本身.在操作linux系统时,通常会遵循以下的分层结构规则:LSB (Linux Standard Base) / FHS(Filesystem Hierarchy Standard)。
      在这里插入图片描述

    • 除了分区需要按照功能来划分,文件系统的目录结构也是按照功能划分的:

    • / 所有linux操作系统的顶点目录,不像windows,每个分区都有一个顶点目录

    • /boot 存放系统启动时相关的文件,比如kernel内核,grub引导菜单.(不要删除.)

    • /bin 存放的都是命令,但仅普通用户能执行

    • /sbin 超级管理员能执行的命令.

    • /home 存放普通用户的家目录

    • /root 超级管理员的家目录,普通用户是无法进入

    • /etc 存放配置文件的目录

    • /etc/hostname 主机名

    • /etc/hosts 本地解析域名一种方式

    • /etc/sysconfig/network-script/ifcfg-* 网卡的配置文件

    • /dev 设备目录,设备驱动,硬盘\硬盘的分区\光盘\串口…

    • /dev/null 黑洞,接收所有的东西,只进不出

    • /dev/zero 摇钱树,可以生产源源不断的数据

    • /dev/random 产生随机数的一个设备

    • /dev/pts/0 虚拟的Bash Shell终端,提供给远程用户使用 ,0代表一个终端, 1代表2个终端 以此类推

    • /usr 类似于windows的C盘下面的windows目录

    • /usr/lib 共享库文件,后缀都是so结尾, share object

    • /usr/lib64 共享库文件64位,后缀都是so结尾, share object

    • /usr/local 早期大家都把软件放在这个目录下,和windows C:\ProgramFile

    • /usr/bin 、/usr/sbin、 /var
      存放一些可变化的内容,比如/var/log日志,可以人为让其发生变化,也或者是随着时间推移产生变化

    • /tmp 存放临时文件,无论哪个用户都可以放

    • /proc 反馈当前运行的进程的状态信息,还有提供给用户的一些信息,比如说cpu和内存。

    • /run 存放程序运行后所产生的pid文件

    • /media 、/mnt 提供挂载的一个目录

    • /opt 早期第三方厂商的软件存放的目录.

    • /srv 物理设备产生的一些文件

    • 在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。/etc: 这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里。

    • 可以在proc文件下查看CPU相关的情况cat /proc/cpuinfo从下面可以看出processor是从0到3,表示cpu是四核的,然后Hardware是cpu的型号BCM2835
      在这里插入图片描述

    • 使用指令:cat /proc/meminfo可以查看内存相关信息,由下图可以看出总内存是948280KB
      在这里插入图片描述

    • 使用指令:sudo cd root发现进不去root这个文件夹,可以使用指令sudo passwd root先为root设置密码然后:su root再输入密码即可进入。退出使用指令:exit或者su pi(是要进入普通用户,pi是用户名)

    • etc下面是配置文件,若想要开机启动某个程序可以在/etc/init这个文件夹下去配置某些文件,使之开机自启。比如打开bootmisc.sh.conf:vi /etc/init/bootmisc.sh.conf然后将指令添加到脚本的最后即可。
      在这里插入图片描述

    • 但是一般不那么做,一般是在init文件夹下去模仿这个文件夹下面的文件自己去新建一个文件,然后再文件里面写入相关的指令,只需文件以.conf结尾即可。除此之外还可以修改etc下面的rc .local也是添加相关的指令即可。
      在这里插入图片描述

    什么是虚拟文件系统?

    vfs(虚拟文件系统)就是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用接口,由指令df -T可以看出不同的文件来源于不同分区,然而每个分区都有自己的文件系统,所以访问文件的方式因为文件系统的不同而不同,因为不同的文件系统文件、数据存储的方式不一样。这样访问不同分区的文件就比较麻烦,而linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。在大部分情况下,用户通过libc和kernel的VFS交互,不需要关心底层文件系统的具体实现。这样就使我们使用open、read、write等函数对文件展开操作,不需要关心它底层的文件系统。虚拟文件系统的目的: 将接口暴露给用户,屏蔽底层文件系统的差异性,它是对所有不同文件系统的抽象。

    • 虚拟文件系统的分层结构:上层:虚拟文件系统,底层:特定文件系统模块,例如:网络文件系统(nfs、smb)等其他类型文件系统。虚拟文件系统存在于内核态,用户在用户态使用open、read等函数操作文件或驱动的时候,先到vfs,然后就可以操作处于不同文件系统的文件。
      在这里插入图片描述
    • VFS在用户和文件系统之间提供了一个交换层,在 VFS 上面,是对诸如open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件,文件系统的源代码可以在 ./linux/fs 中找到。文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2 文件系统中的文件一样使用它们。

    linux内核结构框图:

    • Unix和Linux系统内核都采用的都是如下图所示的结构,其中可以看到三个层次:硬件级、内核级和用户级。用户程序通过陷入完成由用户态到内核态的转换。系统调用作为用户级与内核级交互方式,分为2部分:与文件子系统的交互和与进程控制子系统的交互。文件子系统管理文件。包括:分配文件空间、管理空闲空间、控制对文件的存取以及为用户检索数据。进程控制子系统负责进程同步、进程间通信、进程调度和存储管理。其中用户应用程序由基础C和程序库组成,程序库提供应用程序支配内核干活的接口,程序库通过系统调用接口然后操控底层各种东西,比如:程序里面调用open、read、write函数,通过程序库到达系统调用,然后会在系统调用那里会调用sys_open、sys_read、sys_write等函数,然后sys_open、sys_read、sys_write等函数会根据程序里面函数的参数判断你要打开什么类型的文件会产生不一样的指令信息,然后系统调用那里的函数会去分析打开文件的类型(磁盘上的文或者串口等设备文件),然后进行操作。
      在这里插入图片描述

    • 还有一种结构图如下图所示:
      在这里插入图片描述

    • shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。目前主要有下列版本的shell: Bourne Shell:是贝尔实验室开发的。 BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。 Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。 C Shell:是SUN公司Shell的BSD版本。

    • Linux内核主要包括5个模块:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。

    • 进程调度模块用来负责控制进程对CPU资源的使用。

    • 内存管理模块用于确保所有进程能够安全地共享机器主内存区。

    • 文件系统模块用于支持对外部设备的驱动和存储。(一些皆文件)

    • 进程间通信模块用于支持多种进程间的信息交换方式。通过系统调用实现进程间的信息交换。

    • 网络接口模块提供多种网络通信标准的访问并提供对多种网络硬件的支持。所有的模块都要通过进程调度来运行。

    Linux 系统结构:

    Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。linux内核:内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。如图:

    在这里插入图片描述

    • 内存管理: 对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。
    • 进程管理: 进程实际是某特定应用程序的一个运行实体。在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。
    • 设备驱动程序: 设备驱动程序是 Linux 内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程序,而不是 IDE 驱动程序。
    • 网络接口(NET): 提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。Linux 的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

    参考博文:Linux文件系统目录结构虚拟文件系统虚拟文件系统linux框图Linux 系统结构

    展开全文
  • 整个程序的构思是将增加系统调用号的所有操作在一个文件中体现,之后将该程序运行得到内核模块,将内核模块加载进入系统内核中,之后利用测试程序测试内核模块是否添加成功以及新增的系统调用的功能是否能够实现。...
  • 第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启动过程概述 1.2.1 Bootloader启动过程 ...
  • Linux编写内核模块及文件读写

    万次阅读 2018-01-18 15:44:55
    sysfs是什么sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。该文件系统的目录层次结构严格按照内核的数据结构组织。除了二进制文件外(只有特殊场合才使用),sysfs文件内容...
  • linux 操作系统启动过程和内核参数修改添加方法 操作系统启动过程 操作系统启动过程一般分为五个阶段:(centos7为例) BIOS初始化 加载MBR到内存 GRUB阶段 加载内核和initramfs模块 systemd阶段 BIOS初始化 上电后...
  • Linux内核编译、启动和相关驱动构建

    千次阅读 2022-04-11 19:04:49
    前面小哥主要是跟大家讲解了uboot的烧录、使用等等,而对于嵌入式Linux环境而言其实主要是分为三大块 : uboot,Linux Kernel(内核),文件系统,当然高版本的内核存在设备树文件等等,不过感觉还不足以认为是一大块,...
  • 一文了解Linux内核

    千次阅读 2022-02-24 08:13:39
    目录 ...是什么使Linux内核与其他经典Unix内核不同? Linux内核架构 Linux内核接口 Linux可加载内核模块 (The Linux Loadable Kernel Module (LKM) ) 什么是操作系统OS 操作系统(简称...
  • Docker背后的内核知识之资源隔离

    千次阅读 2021-06-28 16:00:28
    Docker 背后的内核知识—namespace 资源隔离 当谈论Docker时,常常会聊到Docker的实现方式.Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离,通过cgroups实现了资源现实,通过写时复制机制(copy-...
  • linux内核编译及添加系统调用(详细版)

    千次阅读 多人点赞 2020-03-16 20:00:46
    linux内核编译及添加系统调用 注:文章共四部分,分别是 1、编译更换内核 2、添加一个简单系统系统调用 3、添加读取/修改nice值的系统调用 4、自己设计简单(真的简单)系统调用 注:四个部分结构相似,请根据自身...
  • 老师布置的完成内核编译作业,兴致勃勃的我看了几个博主写的文章,兴奋的以为没有问题,没想到,这才是历练的开始。 Ubuntu19.10里会出现许许多多奇怪的问题,在看了50多篇博文以及不断的百度之后,我终于搞定了,...
  • linux ubuntu编写内核模块并添加

    千次阅读 2016-04-19 20:37:09
    linux ubuntu编写内核模块并添加
  • Source Insight给Linux内核创建工程

    千次阅读 2021-03-09 20:18:15
    2)解压后的文件 3)双击安装包Si35Setup.exe文件 3)双击安装包后等待3s,然后选择Agree,进入下一步。 4)接着选择下一步 5)继续点击下一步 6)选择安装路径,在这里我选择的是D盘,然后点击下一步.
  • 什么是微内核,看这一篇就够了

    千次阅读 多人点赞 2021-07-08 10:25:24
    两个系统的内核是通过进程的创建FORK的实现来比较,因为进程的创建涉及到系统调用,内存管理,文件管理等系统的主要方面。因此通过比较FORK的实现可以大致看到内核的差别。 微内核的代表:Minix,在Minix中,操作...
  • Linux学习之内核模块编程

    千次阅读 2021-04-03 22:53:45
    内核模块显示进程控制块信息 安装模块 内核模块文件知识
  • 近年来,我国自主研发操作系统被反复提及。近期,一个计算机领域内非常专业的词来到了几乎所有人的视线内,这就是——微内核。人们对操作系统内核的讨论越来越热烈,甚至有人说我不懂什么叫微内核,什么...
  • 内核模块化编程

    千次阅读 2022-01-29 15:59:35
    1 编写内核模块文件test.c 2 编写Makefile 3 编译生成test.ko 内核模块的概念介绍 Linux 内核整体结构已经很庞大,包含了很多的组件,而对于我们工程师而言,有两种方法将需要的功能包含进内核当中。 一:将所有...
  • 一文看懂Linux内核!Linux内核架构和工作原理详解

    万次阅读 多人点赞 2021-01-29 15:14:27
    手把手带你实现一个Linux内核文件系统 简介 作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux...
  • Linux内核调试方法

    千次阅读 2021-09-30 16:46:33
    内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。 一 调试前的准备 在调试一个bug之前,我们所要做的准备...
  • 杭电网安操作系统实验一:Linux 内核编译及添加系统调用一、实验介绍:二、任务描述:三、具体实验步骤:(一)实验思路:(二)遇到问题及解决办法:(三)核心代码与结果展示:<1>掌握Linux 内核的编译与...
  • LINUX内核目录文件说明以及配置并编译内核的方法

    万次阅读 多人点赞 2017-06-09 10:28:26
    在下载内核前,我们应该讨论一些重要的术语和事实。Linux内核是一个宏内核,这意味着整个操作系统都运行在内核预留的内存里。说的更清楚一些,内核是放在内存里的。内核所使用的空间是内核预留的。只有内核可以使用...
  • 文章目录使用工具及环境编译安装依赖编译前的配置开始编译安装内核验收成果结果系统调用准备阶段声明和定义系统调用函数添加一个系统调用id进行编译运行检验结束参考链接OK,THANKS FOR READING.BYE BYE~ 有个操作...
  • 操作系统微内核架构研究

    千次阅读 2020-11-18 17:02:46
    内核是操作系统内核的一种,在工控系统...本文较为全面地研究了微内核技术的各个方面,包括微内核的定义、微内核的体系架构、微内核的发展历史、微内核的特点、微内核的应用场景,以及麒麟软件所进行的部分研究工作。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 153,785
精华内容 61,514
热门标签
关键字:

内核添加文件资源