• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Linux内核系列—10.操作系统开发之内核HelloWorld,linuxhelloworld

Linux内核系列—10.操作系统开发之内核HelloWorld,linuxhelloworld

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了linux内核,linux内核完全剖析,linux内核源码下载,linux内核下载,linux内核设计与实现等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Linux内核系列—10.操作系统开发之内核HelloWorld,linuxhelloworld


a.我们先来体验一下在Linux下用汇编编程的感觉,见代码

[section .data]	; 数据在此

strHello	db	"Hello, world!", 0Ah
STRLEN		equ	$ - strHello

[section .text]	; 代码在此

global _start	; 我们必须导出 _start 这个入口,以便让链接器识别

_start:
	mov	edx, STRLEN
	mov	ecx, strHello
	mov	ebx, 1
	mov	eax, 4		; sys_write
	int	0x80		; 系统调用
	mov	ebx, 0
	mov	eax, 1		; sys_exit
	int	0x80		; 系统调用

编译方法:

nasm -f elf hello.asm -o hello.o

ld -m elf_i386 -s -o hello hello.o

./hello

运行结果是打印出Hello, world!

入口点默认的是_start,我们不但要定义它,而且要通过global这个关键字将它导出,这样链接程序才能找到它。两个系统调用不用深究,因为在我们自己的OS中根本用不到Linux的系统调用。

b.汇编和C同步使用

; 编译链接方法
; (ld 的‘-s’选项意为“strip all”)
;
; $ nasm -f elf foo.asm -o foo.o
; $ gcc -c bar.c -o bar.o
; $ ld -s hello.o bar.o -o foobar
; $ ./foobar
; the 2nd one
; $

extern choose	; int choose(int a, int b);

[section .data]	; 数据在此

num1st		dd	3
num2nd		dd	4

[section .text]	; 代码在此

global _start	; 我们必须导出 _start 这个入口,以便让链接器识别
global myprint	; 导出这个函数为了让 bar.c 使用

_start:
	push	dword [num2nd]	; `.
	push	dword [num1st]	;  |
	call	choose		;  | choose(num1st, num2nd);
	add	esp, 8		; /

	mov	ebx, 0
	mov	eax, 1		; sys_exit
	int	0x80		; 系统调用

; void myprint(char* msg, int len)
myprint:
	mov	edx, [esp + 8]	; len
	mov	ecx, [esp + 4]	; msg
	mov	ebx, 1
	mov	eax, 4		; sys_write
	int	0x80		; 系统调用
	ret
	

1.由于在bar.c中用到函数myprint(),所以要用关键字global将其导出。

2.由于用到本文件外定义的函数choose(),所以要用关键字extern声明。

3.不管是myprint()还是choose(),遵循的都是C调用约定,后面的参数先入栈,并由调用者清理堆栈。

void myprint(char* msg, int len);

int choose(int a, int b)
{
	if(a >= b){
		myprint("the 1st one\n", 13);
	}
	else{
		myprint("the 2nd one\n", 13);
	}

	return 0;
}

编译和执行的过程:

nasm -f elf -o foo.o foo.asm

gcc -m32 -c -o bar.o bar.c

ld -m elf_i386 -s -o foobar foo.o bar.o

./foobar

运行结果:the 2nd one

有了关键字global和extern就可以方便地在汇编和C代码之间自由来去。

 

一个码农的日常 

【源码】

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 内核内存分配常用函数使用
  • Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader
  • Linux内核系列—10.操作系统开发之内核HelloWorld,linuxhelloworld
  • Linux内核系列—11.操作系统开发之ELF格式,linuxelf
  • Linux内核系列—9.操作系统开发之Loader,linuxloader
  • Linux内核系列—7.操作系统开发之中断和异常,linux内核
  • Linux内核系列—8.操作系统开发之时钟中断,linux内核
  • Linux内核系列—6.操作系统开发之内存分页机制,linux分页
  • Linux内核系列—5.操作系统开发之特权级及特权级的转移,linux特权
  • Linux内核系列—4.操作系统开发之LDT,linuxldt

相关文章

  • 2017-05-26【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新,androidtinker
  • 2017-05-26用设计精美的阅读指读应用项目源码,设计精美源码
  • 2017-05-26Linux简介及常用命令使用5--linux shell编程入门,5--linux编程入门
  • 2017-05-26Android5.0之Toobar的使用
  • 2017-05-26Android pm命令详解
  • 2017-05-26切割字符串,js分割字符串
  • 2017-05-26android中使用图文并茂的按钮,android图文并茂
  • 2017-05-26React Native,reactnative
  • 2017-05-26MTK处理器手机 解锁Bootloader 教程,mtkbootloader
  • 2017-05-26Android事件分发

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 解决Android后台清理APP后,程序自动重启的问题,androidapp
    • 7.6.1 Socket学习网络基础准备
    • Android--Dialog对话框
    • 2.5.5 ExpandableListView(可折叠列表)的基本使用
    • Android四大组件之Activity
    • Android MotionEvent详解
    • Drawable资源的初步使用
    • Android中的 Multiple dex files define 编译错误引发的思考
    • 有了malloc/free,为什么还要new/delete?
    • Android Studio 错误解决办法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有