操作系统入门(五) - 混合C和汇编的kernel

Norlit OS —— 自制操作系统 第4章 C与汇编 <!-- @font-face {font-family:Helvetica} @font-face {font-family:"MS Mincho"} @font-face {font-family:宋体} @font-face {font-family:黑体} @font-face {font-family:"Cambria Math"} @font-face 阅读详情

需要配合的汇编部分

;; =================
;; 文件: 
;;   k_.asm
;; 作用: 
;;   在0x90000处启动
;;   调用c的k_main
;;   显示一串信息
;; 创建日期:
;;   2006/04/26 flyback
;; 
http://blog.youkuaiyun.com/flyback
;; mailto:fly-back@163.com
;;      =================
[BITS 32]

[global start]
[extern _k_main] ; this is in the c file

start:
 cli
 lgdt[cs:gdtrs]

 mov eax, cr0
 or eax,1
 mov cr0, eax

 mov ax, datasels
 mov ds, ax
 mov es, ax
 mov ss, ax
 mov gs, ax
 mov fs, ax
 mov esp, 0x90000
 call _k_main

 jmp $ ; crash

gdtrs :
dw gdtends - gdts - 1 ; gdt的长度
dd gdts ; gdt的物理地址
gdts:
 gdt0s:
 dw 0,0,0,0  ; 据说是一定要为0否则会有错
codesel_gdts:
 dw 0xffff  ; 界限Limit值 = 0x100000 * 0x1000 = 4GB
 dw 0   ; 基地址 = 0
 dw  0x9A00  ; 表示代码段 可读可执行
 dw 0x00CF  ; 粒度(不知道是什么意思)
 datasel_gdts:
 dw 0xffff ; 4GB
 dw 0x0  ; 基地址
 dw  0x9200 ; 数据段 可读可写
 dw  0x00CF ; 粒度
gdtends:

codesels equ codesel_gdts - gdts
datasels equ datasel_gdts - gdts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

c的部分

// main.c
#define WHITE_TXT 0x0e // 黑底白字
void k_clear_screen();
unsigned int k_printf(char *message, unsigned int line);
void update_cursor(int row, int col);

int k_main() // 象在一般c程序里的main一样
{
k_clear_screen();
k_printf("Hi!/nHow's this for a starter OS?", 0);
};

void k_clear_screen() // 清除全部的文本屏幕
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;
while(i < (80*25*2))
{
vidmem[i]=' ';
i++;
vidmem[i]=WHITE_TXT;
i++;
};
};

unsigned int k_printf(char *message, unsigned int line) // the message and then the line #
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;
i=(line*80*2);
while(*message!=0)
{
if(*message=='/n') // check for a new line
{
line++;
i=(line*80*2);
*message++;
} else {
vidmem[i]=*message;
*message++;
i++;
vidmem[i]=WHITE_TXT;
i++;
};
};
return(1);
};

还有一个ld要用到的文件
kernel.ld

OUTPUT_FORMAT("binary")
ENTRY(_start)
SECTIONS
{
  .text  0x90000 : {
    *(.text)
  }
  .data  : {
    *(.data)
  }
  .bss  :
  {      
    *(.bss)
  }
}

还有一个批处理,先不用makefil
build.bat

gcc -c c/main.c -o obj/k_.o
nasm -f aout asm/k_.asm -o obj/k_a.o
ld -T kernel.ld -s -e start -o img/KERNEL.img obj/k_a.o obj/k_.o

目录结构:
.
..
[c]
[obj]
[asm]
[img]
kernel.ld
build.bat

main.c在c里面 k_.asm在asm里面

执行build.bat,把kernel.img放在fatboot.img里面然后用bochs看看

从Kernel Panic到CUDA Kernel:深入解析操作系统内核的设计哲学与工程实践 内核(Kernel)是操作系统的核心组件,负责管理系统资源、提供硬件抽象层,并确保系统的安全与稳定运行。其核心原理在于通过划分用户空间与内核空间,利用CPU提供的不同特权级别(如Ring 0和Ring 3),实现对硬件和关键资源的受控访问。这种设计带来了显著的技术价值:它通过集中管理保障了系统安全,防止应用程序间的相互干扰;同时,通过减少不必要的上下文切换和权限检查,为需要直接硬件交互的任务(如GPU计算、网络包处理)提供了极致的性能基础。在应用场景上,无论是Linux的宏内核、VxWorks的微内核,还是 阅读详情

相关推荐

Adams中AKISPL和DX函数的妙用:打造精准的非线性衬套模型

本文深入探讨了在Adams动力学软件中,如何巧妙运用AKISPL插值函数与DX等位移测量函数,构建高精度的非线性衬套模型。文章通过实战案例,详细解析了从单轴非线性刚度到完整六自由度耦合模型的实现步骤与调试技巧,帮助工程师将复杂的实验或有限元数据转化为可靠的多体动力学仿真模型,有效提升系统仿真置信度。

sky77的博客 317

C语言结合汇编开发系统内核

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/10216660.html

weixin_30362083的博客 211

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1198

Linux Kernel Module编程,多个源文件编译成一个模块的解决方案

陆陆续续也写了几个Linux内核模块了,但每次都是把代码写在一个源文件中,上次尝试了写在两个.c文件中,结果没有编译通过。无奈之下,将其中一个.c文件重命名成.h文件,再include当另一个当中。但是,在.h文件中写函数的实现总感觉怪怪的。今天查看了以下Kbuild的文档,有如下描述:    If a kernel module is built from several sou

王以山的专栏 4811

深信服桌面云实战:从零部署到高效运维的配置全景指南

本文详细介绍了深信服桌面云从零部署到高效运维的全流程配置指南,涵盖硬件规划、平台部署、虚拟桌面发布、终端管理及性能优化等关键环节。特别强调了双万兆网络架构、分布式存储配置和智能调度功能的应用,帮助用户实现高性能、高可用的虚拟桌面环境。

weixin_28568819的博客 399

第二十届全国大学生智能车竞赛-地瓜机器人智慧医疗挑战赛技术解析与实战指南

本文深入解析了第二十届全国大学生智能车竞赛-地瓜机器人智慧医疗挑战赛的核心技术。内容涵盖从零搭建数字孪生环境、实现AI视觉任务(二维码识别、引导线追踪、目标检测)、在边缘设备部署轻量化大模型进行图生文描述,到遥操作与自主控制的平滑切换,并提供了基于ROS2的系统集成与赛场实战指南,助力参赛者高效备赛。

weixin_29252171的博客 2769

c和汇编混合编程----shellcode----弹出计算器

先用c和汇编混合编程成功弹出计算器(在VC++里运行) #include "stdio.h" #include "windows.h" int main(int argc, char* argv[]) { printf("begin\n"); HINSTANCE libHandle; char *dll="kernel32.dll"; libHandle=LoadLibrar...

qq_41683305的博客 1285

RK3568笔记二:部署手写数字识别模型

部署手写数字识别模型,使用手写数字识别(mnist)数据集训练了一个 LENET 的五层经典网络模型。Lenet是我们的深度学习入门的必学模型,是深度学习领域中的经典卷积神经网络(CNN)架构之一。过程分为:训练,导出ONNX,转化RKNN,测试。

1169

shellcode---c和汇编混合编程---弹出cmd

首先用C/C++语言实现弹出cmd #include "stdio.h" #include "windows.h" int main(int argc, char* argv[]) { printf("begin\n"); HINSTANCE libHandle; char *dll="kernel32.dll"; libHandle=LoadLibrary(dll); W...

qq_41683305的博客 1003

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

A2L文件的生成分为两章讲解:本文主要是讲模型开发,讲解如何把标定量、观测量放到链接文件中的指定位置。下一篇讲解如何使用matlab生成完整的A2L文件

认真搞搞汽车MCU 4615

iOS逆向之深入解析Hook的原理方法和安全防护

Hook简介 Hook就是一种改变程序执行流程的一种技术的统称; 一段程序的执行流程是 A --> B --> C,现在我们在 A 和 B 之间插入一段代码或者直接改变 B ,这样程序原有的执行流程就发生了改变。如下图所示: Hook的方式:Method Swizzle,fishhook,Cydia Substrate; Hook原理 一、Method Swizzle 原理 利用OC的Runtime特性,动态去改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变

╰つ栺尖篴夢ゞ 2万+

【XRT Vitis-Tutorials】C++/RTL Kernel混合编程测试

1 前言 前面文章导航: ZCU106 XRT环境搭建 ZCU106 XRT Vivado工程分析 ZCU106 XRT PetaLinux工程分析 【XRT Vitis-Tutorials】RTL Kernels测试 官方文档: 2019.2 Vitis™ Application Acceleration Development Flow Tutorials Vitis Unified Soft...

vacajk的博客 2804

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1399

Linux Kernel 源码学习必备知识之:GCC 内联汇编(AT&T格式)

原因是即使寄存器只变动一部分,它的整体也会全跟着受影响,所以在 clobber/modiy 句中声明寄存器时,可以用低 8 位名称、低 16 位名称或低 32 位或全 64 位名称,如"al"、"ax"、"eax"、"rax" 都是指 rax 寄存器,其他通用寄存器也是一样的。单独强调一下,以上的 output() 和 intput() 括号中的是 C 代码中的变量,output(C变量)和input(C变量) 就像 C 语言中的函数,将 C 变量(值或变量地址)转换成汇编代码的操作数。

嵌入式Linux内核的博客 3333

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

自己开发X86操作系统--LIUNUXOS

自制X86操作系统Liunux

要把所有那些负面的信息当做对自身行为的评价,而不是对自身价值的评判。 1448

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

操作系统学习10 x86引导程序加载C语言程序

自制操作系统学习2 加载C语言程序一、准备工具二、操作步骤1. 实现步骤2. 重点(1) 汇编语言子程序实现(2) 在C中调用汇编的方法三、编译的重点3. 编译运行 一、准备工具 bochs Virtual Machine nasm gcc ld 等。更多需要的工具已经放在码云开源仓库。 二、操作步骤 1. 实现步骤 完成引导程序开发 使用汇编语言两段子程序 使用C语言开发调用汇编子程序 编译程序,制作软盘镜像 BIOS加载并运行汇编语言的引导程序 汇编语言程序从软盘读取10扇区,当中包含C语言程序

猿来这样-谢厂节的博客 906

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

使用Assembly和c联合写kernel的时候,新的理解

对unsigned char gdt_ptr[6]数组的操作 汇编中:sgdt  [gdt_ptr]--------[]符号使得汇编的时候将其汇编成  sgdt   ds:gdt_ptr。这样在保护模式下才能访问到正确的内存地址。 C中:想取出gdt_ptr[0-1]两个字节

Jack.Tech_StoreRoom 1141

从汇编到C语言:gh_mirrors/os/os-tutorial-cn进阶指南——内核开发必备技能全解析

gh_mirrors/os/os-tutorial-cn是一个从零开始编写操作系统的中文版教程项目,它通过循序渐进的方式,帮助开发者掌握从汇编语言到C语言的内核开发必备技能,让即使是基础有限的人也能逐步构建自己的操作系统。 ## 为什么选择gh_mirrors/os/os-tutorial-cn学习内核开发? 对于想要深入了解计算机底层技术、探索操作系统工作原理的程序员来说,直接阅读Linux

gitblog_00664的博客 813

CANN/runtime:Kernel加载与执行

本章介绍如何加载并执行使用Ascend C开发的自定义Kernel。**只有在用户自己编写算子Kernel,或需要直接控制Kernel二进制加载、参数组装和任务下发时,才需要调用本章接口。**如果业务不编写算子,只是调用CANN已提供的算子能力,应优先调用aclnn算子接口,例如aclnnAdd等。aclnn接口会封装算子选择、参数处理、Kernel加载和执行流程,用户通常不需要直接调用Launc

gitblog_00034的博客 349

Ascend C算子开发范式:Kernel拆解与工程化实践

本文深入探讨了AscendC算子开发的两种范式:Kernel拆解开发与工程化程序开发。Kernel拆解开发通过精细控制硬件操作实现极致性能,适合单一算子优化;工程化开发侧重系统级思维,适合复杂算子融合。文章通过向量乘法实例对比了两者的性能差异(Kernel开发快15-30%)和适用场景,并提供了混合开发的企业级应用案例。最后提出决策框架,建议开发者根据性能需求、开发周期等因素灵活选择开发范式,掌握两种方法以适应不同业务场景。

newBorn_1991的博客 671

操作系统内核开发秘籍:用C语言完成第一个Bootloader与Kernel链接

掌握操作系统底层原理,从C语言实现简易操作系统内核入门开始。本文详解如何编写首个Bootloader并链接Kernel,涵盖实模式切换、GCC编译与链接脚本配置,助你构建最小可运行内核,值得收藏。

IterStream的博客 317

C语言在操作系统开发中的核心优势与不可替代性解析

系统编程是计算机科学的基础领域,它涉及直接与硬件交互、管理核心资源并构建软件运行平台。其核心原理在于通过编程语言实现对底层硬件的精确控制,确保性能、可预测性和资源效率。这一技术价值在于为上层应用提供稳定、高效的执行环境,是构建从嵌入式设备到大型服务器的各类计算系统的基石。在操作系统内核、设备驱动、嵌入式系统等关键应用场景中,开发者需要能够进行直接内存操作、精细控制硬件行为并编写不依赖复杂运行时的代码。C语言以其极简的运行时、对内存布局的精确控制能力以及成熟稳定的编译器生态,完美契合了这些底层开发需求。文章通

weixin_34375251的博客 448

Ascend C 算子多场景调用全解析:从 Kernel 到 PyTorch 的生态兼容之道

华为昇腾AscendC算子开发实践指南 摘要:本文深度解析华为昇腾AscendC算子的多场景开发方案,通过"核心计算逻辑+场景适配层"架构实现90%代码复用。重点剖析Kernel直调、AscendCL原生调用和PyTorch框架调用三大场景:Kernel直调延迟最低(2.3ms),适合性能优先场景;AscendCL原生部署灵活,性能仅低5-8%;PyTorch调用开发效率最高,训练吞吐提升144%。文章提供原创优化代码、实测性能数据和行业案例(智能安防、NLP大模型等),并给出场景选型决

2301_81549453的博客 1373

操作系统入门(五) - 载入32位保护模式代码为c做准备

操作系统入门(五) - 载入32位保护模式代码为c做准备 经过上千次的试验,终于还是没有能够在vmware实现用一段程序载入kernel.img然后执行32位的kernel代码,无数次的跳出无奈呀,后来知道实际上是因为gdt全局描述表没有正确载入造成的问题,至于能跳出这样提示的代码,我想没有人愿意去看吧,错的有什么好看的? 于是乎找来了鼎鼎大名的Bochs来帮忙http

魔芋的专栏 2233

探索Jupyter C Kernel:在Jupyter Notebook中无缝编写C代码

探索Jupyter C Kernel:在Jupyter Notebook中无缝编写C代码 项目地址:https://gitcode.com/gh_mirrors/ju/jupyter-c-kernel 项目简介 是一个创新的开源项目,由Brendan Rius开发,它为Jupyter Notebook提供了一个C语言的支持环境。借助此项目,开发者和数据科学家可以在熟悉的Jupyter Notebo...

gitblog_00005的博客 830
上一篇: Bochs常用调试指令翻译
下一篇: 找工作
魔芋
博客等级 码龄26年 37粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值