精华内容
下载资源
问答
  • 2016-07-11 11:04:10

    世界上绝大部分的操作系统内核都是用C语言编写的,然而这是为什么喃?

    这个问题我们就必须结合C语言的特点了!


    C语言有三大特点:


    1 非常好的可移植性

    可移植性就是指与软件从某一环境转移到另一环境下的难易程度。也就是更换不同体系结构的软/硬件平台,修改的代码越少越好。因为不同机器的C语言源码(主要是函数库中的函数名和其参数)都是差不多的,所以C语言的可移植性好。


    2 能够直接访问硬件

    操作系统需要和下层的硬件打交道,直接访问硬件就可以提高效率,这对于操作系统来说很重要。能直接访问硬件的语言还有汇编语言,但为什么操作系统不用汇编语言?因为汇编是低级语言,不能实现操作系统复杂的功能。C语言是高级语言也容易阅读和理解。


    3运行效率高

    操作系统需要对上层的需求做出快速的反应,所以这点也很重要。


    综合以上几点,C语言是首选。


    一个在努力中的未来程序员,如果有更好的想法,欢迎评论。

    更多相关内容
  • 编写一个C语言程序作为Linux内核的shell命令行解释程序,所执行的结果需和系统命令行方式保持一致,理解系统使怎样进行命令的解析和执行。 基本运行方式:[COMMAND命令 OPTIONS选项 ARGUMENTS参数] 表1 命令格式 ...
  • 使用 C语言 编写内核

    2021-08-09 17:00:25
    使用 gcc 编译 c语言 -c 编译、汇编到目标代码,不进行链接,也就是直接生成目标文件 -o 将输出的文件以指定文件名来储存,有同名文件存在时直接覆盖 gcc -c -o kernel/main.o kernel/main.c 编译:编译号之后只是个...

    gcc 命令

    • 使用 gcc 编译 c语言
      -c 编译、汇编到目标代码,不进行链接,也就是直接生成目标文件
      -o 将输出的文件以指定文件名来储存,有同名文件存在时直接覆盖
      gcc -c -o kernel/main.o kernel/main.c
    • 编译:编译号之后只是个目标文件,也称为待重定位文件,重定位指的是文件里面所用的符号还没有安排地址,这些符号的地址需要将来与其他目标文件“组成”一个可执行文件时再重新定位(编排地址〉,这里的符号就是指该目标文件中所调用的函数或使用的变量,而这里的“组成”就是指链接。需要在所有目标文件都到齐了,将它们链接到 起时再重新定位(编排地址)
    • 使用 gcc 链接
      -Ttext指定虚拟地址
      -e 用来指定程序的起始地址(默认为_start
      gcc kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin
    • 编译链接
      生成的test.bin不再是目标文件,而是可执行文件
      gcc -o ./kernel/test.bin ./kernel/main.c
    • main 函数不是第一个执行的代码,它一定是被其它代码调用的,main函数在运行库代码初始化完环境后才被调用

    文件头

    二进制文件的运行方法
    • 在文件头中写入和程序属性有关的信息
    • 将这种具有程序头格式的程序文件从外存读入到内存后,从该程序文件的程序头中读出入口地址, 要直接跳进入口地址执行,跨过程序头才行。
      在这里插入图片描述
    • header.S
      编译后生成的文件是 header.binnams -o header.bin header.S
      在这里插入图片描述
    • 调用方的执行过程
      在这里插入图片描述
      在这里插入图片描述
    • 在实际中,程序头和程序体相分离的文件叫 elf 格式

    将内核载入内存

    • 将内核写入磁盘
      dd if=./test/kernel/kernel.bin of=hd60M.img bs=512 count=200 seek=9 conv=notrunc
    • 可以将编译、链接、写入硬盘写成一个脚本
      gcc -c -o test/kernel/main.o test/kernel/main.c && gcc test/kernel/main.o -Ttext 0xc0001500 -e main -o test/kernel/kernel.bin && dd if=./test/kernel/kernel.bin of=hd60M.img bs=512 count=200 seek=9 conv=notrunc
    • 修改 loader.S
      加载内核:需要把内核文件加载到内存缓冲区。
      初始化内核:需要在分页后,将加载进来的 elf 内核文件安置到相应的虚拟内存地址,然后跳过去执行,从此 loader 的工作结束。
    • 把内核文件从硬盘上加载到内存中
         mov eax, KERNEL_START_SECTOR               ; kernel.bin所在的扇区号
         mov ebx, KERNEL_BIN_BASE_ADDR              ; 从磁盘读出后,写入到ebx指定的地址。加载到的内存地址
         mov ecx, 200			                      ; 读入的扇区数
      
         call rd_disk_m_32
      
         ; 创建页目录及页表并初始化页内存位图
         call setup_page
      
    • 初始化内核:初始化内核就是根据 elf 规范将内核文件中的段( segment )展开到(复制到)内存中的相应位置
    展开全文
  • 内核链表-C语言

    2022-02-18 19:04:43
  • C语言——内核链表

    2021-07-21 19:41:21
    内核链表 内核链表的节点 struct list_head{ struct list_head * next, *prev; }; 被管理的数据 struct stu{ int age; struct list_head * mbr; }; 相关的操作接口 1. 初始化内核链表 struct list_head { ...

    内核链表

    内核链表的节点
    struct list_head{
    	struct list_head * next, *prev;
    };
    
    被管理的数据
    struct stu{
    	int age;
    	struct list_head * mbr;
    };
    
    相关的操作接口

    1. 初始化内核链表

    struct list_head {
    	struct list_head *next, *prev;
    };
    
    //方法一:
    #define LIST_HEAD_INIT(name) { &(name), &(name) }
    #define LIST_HEAD(name) \
    struct list_head name = LIST_HEAD_INIT(name)
    
    
    //方法二:
    ptr = malloc(struct list_head)
    #define INIT_LIST_HEAD(ptr) do { \    -----------------------ptr的类型struct list_head *
    	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
    } while (0)
    //思考:do {}while(0)为何这样定义宏?有何有点
    
    

    2. 插入节点

    //头插法
    void list_add(struct list_head *new, struct list_head *head)
    //尾插法
    void list_add_tail(struct list_head *new, struct list_head *head)
    
    

    3. 删除 / 移动节点

    //移除
    void list_del(struct list_head *entry)
    //移动到头
    void list_move(struct list_head *list,struct list_head *head)
    //移动到尾
    void list_move_tail(struct list_head *list,struct list_head *head)
    
    

    4. 判断内核链表是否为空

    //判断循环链表是否为空,为空返回1,
    int list_empty(struct list_head *head)
    

    5. 遍历

    list_for_each(pos, head) 
    

    pos-----循环控制指针,struct list_head *
    head----struct list_head * ,指向的是内核链表的头节点

    list_for_each_prev(pos, head) 
    

    参数含义同上

    list_for_each_safe(pos, n, head) 
    

    参数含义同上 n也是小结构体指针,用于临时保存下一个内核链表节点的地址。

    list_for_each_entry(pos, head, member)     
    list_for_each_entry_safe(pos, n, head, member)  
    

    pos-----是大结构体指针,例如struct stu *
    head—是小结构体指针,指向内核链表的头节点
    member--------小结构体在大结构体中的名字
    n----------是大结构体指针,用于临时保存下一个大结构体的地址

    6. 由小结构的地址体获得大结构体的地址

    list_entry(ptr, type, member)
    

    ptr---------------小结构体指针
    type------------- 大结构体的类型
    member--------小结构体在大结构体中的名字

    展开全文
  • 嵌入式内核为什么选择C语言C语言的特点:具有出色的可移植性,能在多种不同体系结构的软/硬件平台上运行;(1)可移植性是指在移植到别的操作系统的时候,需要修改的代码越少,移植性越好。举个例子,假如我们要...
  • 嵌入式开发为什么选择C语言1.从语言特点来说①C语言有出色的可移植性,能在多种不同体系结构的软/硬平台上运行。②简洁紧凑,使用灵活的语法机制,并能直接访问硬件能够直接访问硬件的语言有:汇编和C语言汇编属于...
  • c语言内核链表

    2018-08-16 19:25:34
    c语言内核链表主函数,适用于Linux平台的。可以直接套用,
  • 角色名上也可使用可见性修饰符号。 多重性:放在靠近关联端的部分,表示在关联关系中源端的一个对象可以与目标类的多少个对象之间有关联。 导航性:一个布尔值,用来说明运行时刻是否可能穿越一个关联。 限定符:是...
  • 先来个简单的,欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。 1 int main(void) { 2 while(1); 3 return 0; 4 } 它没法再简单啦,简单的程序似乎能帮助咱们更容易的理解所学的知识,哈哈,我说的是...
  • 说明 ...pip install jupyter-c-kernel sudo install_c_kernel 如果遇到各种各样的问题,请从 github 的这个网址来找解决办法 https://github.com/brendan-rius/jupyter-c-kernel/issues ...
  • 首先 C 是一门语言,包含了一些规定的语法和结构,但并没有包含到我们平常所用的函数,如 printf() 和 scanf(),这些只是由 C 标准库所提供的。之所以存在 C 标准库,是因为这些已经编好的函数是我们平常编程经常...
  • 1.创建boot.asm引导内核程序 创建boot.asm文件,内容:
  • 理解Linux内核最好预备的知识点:懂C语言懂一点操作系统的知识熟悉少量相关算法懂计算机体系结构Linux内核的特点:结合了unix操作系统的一些基础概念Linux内核的任务:1.从技术层面讲,内核是硬件与软
  • 其实简单来说,进程无非就是处于运行期的程序及其相关资源的总和。这里读者应该注意“相关资源”一词...事实上,Linux 内核使用 task_struct 结构体描述进程的资源的,它的C语言部分代码如下,请看:task_struct ...
  • 《嵌入式Linux与物联网开发——C语言内核深度解析》这本书很适合新人嵌入式工程师学习,这本书有两个推荐的点:第一个是以嵌入式的视角重新解读C语言,在实际硬件和应用场景下重新讲解相关概念;第二个是补充了很多...
  • 1. 为什么需要裁剪内核 在前面的移植过程中,内核编译出来有 2414KB,而 Nand Flash 的 mtd 分区中指定了 kernel 分区为 2M=2048KB,所以需要对内核进行裁剪,去除不必要的内容。 2. 内核裁剪方法 内核裁剪的方法...
  • 在阅读linux2.6 版本内核的虚拟文件系统和驱动子系统的时候,我发现内核用c语言编写其实也是有一点不方便,特别是内核中大量存在了对象的概念,比如说文件对象,描述起来使用对象描述,但是对象在c语言中的构建远...
  • 相对于汇编语言,用c 语言写内核是非常爽的事,马上我们就要步入内核实践中啦,所以现在和大伙儿聊聊c语言内核的体会。 通常,我们写的代码都是直接编译成可执行文件,那是因为我们是在写用户程序,操作系统...
  • Linux内核中常用的C语言技巧

    千次阅读 2019-03-06 09:03:20
    Linux内核中常用的C语言技巧 相信读者在阅读本文之前已经学习过C语言了,但是想...GCC的C编译器除了支持ANSI C标准之外,还对C语言进行了很多的扩充。这些扩充对代码优化、目标代码布局以及安全检查等方面提供了很...
  • C语言内核等待队列机制介绍C语言内核等待队列机制介绍C语言内核等待队列机制介绍
  • 我们打开VS2017,建立如图所示的项目,取名:MyFirstDriver.点击确定 由于,我写这个都是写.C的文件,因此我尝试使用.CPP文件,实现一下第一个FirstDriver.建立一个.cpp文件。 然后输入我们的代码#ifdef __...
  • 学习嵌入式一段时间了,开始学习Linux内核、驱动了,发现看不懂?看内核代码还是感觉很吃力,云里雾里?本期课程主要侧重于数据结构基本功的学习和Linux内核中的面向对象思想。掌握了这两项技能,再去分析Linux内核...
  • 文章目录前言一、用户态和内核态的区分二、为什么要区分用户态和内核CPU指令集权限三、用户态和内核态切换切换开销用户态到内核态切换的场景总结 前言 这篇文章记录笔者对于操作系统用户态和内核态的复习整理 一、...
  • 硅产品知识产权(SIP)平台解决方案和数字信号...CEVA-Toolbox包括使用优化器安防监控知识CEVA下一代通信和多媒体SoC推出GHz DSP内核(ApplicationOptimizer)东西,可让使用开拓职员完备以C语言轻易开拓软件,从
  • linus说了,内核用c。(语言与实现逻辑没有必然关系,C++不够透明,干了很多程序员不知道的事。内核要稳定,可靠,高效。c对应汇报短小精干。) Other 内核时计算机为数不多知道电脑要干什么的情形 Reference ...
  • 内核红黑树MAP--C语言

    2019-01-17 11:08:15
    封装了linux 内核 红黑树,纯C语言,外层已经封装好了,直接使用,有压力测试,很不错
  • 《嵌入式Linux与物联网开发——C语言内核深度解析》这本书很适合新人嵌入式工程师学习,这本书有两个推荐的点:第一个是以嵌入式的视角重新解读C语言,在实际硬件和应用场景下重新讲解相关概念;第二个是补充了很多...
  • Linux内核Rust编程语言编写最近,微软打算选择Rust作为C和C++的安全替代品。Rust是一种由Mozilla领导的系统编程语言,专注于安全性,速度和并发性。它最初是Mozilla的一个研究项目,用于更安全,更快速地重写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 762,937
精华内容 305,174
关键字:

内核为什么用c