申博真人娱乐网直营 Chinaunix首页 | 论坛 | 申博真人娱乐网直营
  • 博客访问: 1100120
  • 博文数量: 53
  • 博客积分: 1165
  • 博客等级: 下士
  • 技术积分: 1807
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-19 14:56
个人简介
本文来源:http://www.155245.com/www_lesports_com/

申博真人娱乐网直营,北京汇通阳光信息技术有限公司地址:北京市海淀区学院路30号科群大厦西楼511室/508室电话:010-62681584传真:010-82822406Mail:business#qudong.com发信时将#改为@西安分公司地址:西安市科技二路77号西安光电园A座309室电话:029-88663689传真:029-88866445Mail:business#qudong.com发信时将#改为@广告联系/商务合作电话:010-62681584Mail:suchun#qudong.com发信时将#改为@Mob:13521099440联系人:苏先生网站合作及友情链接电话:029-88663689Mail:web#qudong.com发信时将#改为@Mob:13259812000投稿、发稿咨询还有一个比较好玩的系统是战鹰系统,相当于其他游戏的战宠和飞行道具,只要玩家在线15分钟即可激活,可以为玩家提供属性加成,甚至战斗的时候还会前来助阵,然后它的另外一个功能是帮助玩家跨越场景或飞跃峡谷,总之是一个功用强大的宠物宝宝系统,培养起来很有成就感哦。该公司还计划建造100兆瓦太阳能发电场,利用太阳能电力通过电解反应把水转化为氢,未来将由尼古拉一型卡车把氢燃料从太阳能发电场转运到加氢站,从而实现从能源制造到消费整个过程的完全零排放。具体到带动品质消费的中产阶级,瑞信去年10月发布的全球财富报告显示,现阶段中国中产阶级的人口数超过1亿,李克强总理在常务会议上表示中国中等收入者已有3亿人,马云预计未来10到20年中国累计有5亿中产阶级…中国消费市场正在面临一场品质革命,而用干衣机烘干衣物,省时、省力又杀菌防尘,与当前消费者追求品质生活与健康生活的理念相契合。

  那时候20岁的小女孩脸上还有婴儿肥,肉嘟嘟的好想戳一下      3年后主演的电视剧《义不容情》在香港及东南亚地区均创下了高收视。公司数量五年翻十倍商业航天势头迅猛当前,市场对于商业航天的需求越来越高。现在回过头看,这些论断和指示都是前瞻性的、战略性的,对于我们这些年青人是很大的鼓励。讯据国外媒体报道,美国空军美国空军首次升级后的全球宽带卫星通信系统(WGS)预计于12月7日发射升空。

  房地产、制造业仍是主要投资领域  从地方披露数据来看,目前房地产业、制造业仍然是民间投资的主要去向。3年里,许多科研人员为嫦娥三号和玉兔号默默坚守,中科院国家天文台研究员魏建彦就是其中的一员。减去13%的含水量,粉垄耕作每亩干谷产量为388.82公斤,比拖拉机耕作的284.85公斤增产103.97公斤,增产率为36.50%。一起来看看视频就知道,又是一个大写加粗的福利!随后两度被封!直播界流传着这样一句话:直播发于秀场,兴于网红,盛于明星,衰于广告,毁于色情。

试用产品:【泰拉苾】生物再生抗皱眼霜试用时间:2016.11.23----2016.11.30提交试用报告时间:2016.12.01----2016.12.30我们将在活动结束后筛选并公布幸运用户,邮寄【泰拉苾】生物再生抗皱眼霜试用品。此外,“一带一路”大数据中心还与哈萨克斯坦政府初步达成协议,计划在哈萨克斯坦首都建设中亚“一带一路”大数据区域分中心。小小的这个区域放了这么多功能另外还有一个小问题,索尼把解锁键、音量键、快速拍照唤醒键都放到屏幕右侧,听来就似乎有些闹心。该县负责人称:希望能尽量帮助有意恢复农业经营的农户。

专注于操作系统内核的实现

文章分类
文章存档

2015年(2)

2014年(16)

2013年(18)

2012年(17)

分类: C/C++

2015-04-14 12:54:51


         hello world程序绝对经典的让人落泪,这是很多人的第一个程序。这个程序在Brian KernighanDennis M. Ritchie合著的《The C Programme Language》中使用而广泛流行。该程序也体现了两位作者心向世界的博大情怀。

         本人编程也是从hello world程序开始的,但是我很多人写的hello world程序都需要库和操作系统的支持才能运行。今天我想来用C语言重新实现一个裸机版hello world程序,即不需要操作系统和库的支持,顺便纪念一下hello world程序和C语言。

         首先看看实现裸机版的hello world程序所需要的工具:

  1. LINUX操作系统

  2. 编译器:GCCLDnasm

  3. 文件编辑器

  4. Make

  5. GRUB引导器(安装LINUX时已经自带了)

下面我们从上向下完成hello world程序,首先来写好main函数,如下:

点击(此处)折叠或打开

  1. void main()
  2. {
  3.     printf("hello world!");
  4.     return;
  5. }


是不是很熟悉,这样的程序,我想很多人闭着眼一通盲码,都可以正确无误

好了,上面的代码依然是调用了printf函数输出“hello world!”字符串的,由于这裸机版的程序,所以不能调用库中的printf函数,而是要自己亲自实现该函数。下面就去实现一个最简单的printf函数。如下:

点击(此处)折叠或打开

  1. void printf(char* fmt,...)
  2. {
  3.     _strwrite(fmt);
  4.     return;
  5. }


确实够简单了,没有像通常的printf函数处理多个参数,也没有对参数进行格式化处理,而是调用了_strwrite函数,下面接着实现_strwrite函数,如下:

点击(此处)折叠或打开

  1. void _strwrite(char* string)
  2. {
  3.     char* p_strdst=(char*)(0xb8000);
  4.     while(*string)
  5.     {
  6.         *p_strdst=*string++;
  7.         p_strdst+=2;
  8.     }
  9.     return;
  10. }


_strwrite函数才是输出字符串的核心函数,它把字符串的每个字符,依次写入以0xb8000为开始地址的内存空间,这个内存空间默认映射是显卡的显存,并且我们知道计算机启动时显卡默认工作在字符模式下。对应于屏幕是每行80个字符,一共有25行。

         可是有了这些代码就可以了吗,当然不行,因为是裸机,所以在调用C函数之前,还要初始化栈和CPU的一些寄存器,更为关键的是我们的程序要被GRUB引导加载,而这些动作用C语言又无法实现,这时我们的大汇编语言就该上场了,发挥它神奇的作用了,下面来用汇编语言写一段代码,如下:

点击(此处)折叠或打开

  1. MBT_HDR_FLAGS    EQU 0x00010003
  2. MBT_HDR_MAGIC    EQU 0x1BADB002
  3. MBT_HDR2_MAGIC    EQU 0xe85250d6
  4. global _start
  5. extern main
  6. [section .start.text]
  7. [bits 32]
  8. _start:
  9.     jmp _entry
  10. ALIGN 8
  11. mbt_hdr:
  12.     dd MBT_HDR_MAGIC
  13.     dd MBT_HDR_FLAGS
  14.     dd -(MBT_HDR_MAGIC+MBT_HDR_FLAGS)
  15.     dd mbt_hdr
  16.     dd _start
  17.     dd 0
  18.     dd 0
  19.     dd _entry

  20. ;以上是GRUB所需要的头
  21. ALIGN 8
  22. mbt2_hdr:
  23.     DD    MBT_HDR2_MAGIC
  24.     DD    0
  25.     DD    mbt2_hdr_end - mbt2_hdr
  26.     DD    -(MBT_HDR2_MAGIC + 0 + (mbt2_hdr_end - mbt2_hdr))
  27.     DW    2, 0
  28.     DD    24
  29.     DD    mbt2_hdr
  30.     DD    _start
  31.     DD    0
  32.     DD    0
  33.     DW    3, 0
  34.     DD    12
  35.     DD    _entry
  36.     DD 0
  37.     DW    0, 0
  38.     DD    8
  39. mbt2_hdr_end:
  40. ;以上是GRUB2所需要的头
  41. ;包含两个头是为了同时兼容GRUB、GRUB2

  42. ALIGN 8

  43. _entry:
  44.     ;关中断
  45.     cli
  46.     ;关不可屏蔽中断
  47.     in al, 0x70
  48.     or al, 0x80
  49.     out 0x70,al
  50.     ;重新加载GDT
  51.     lgdt [GDT_PTR]
  52.     jmp dword 0x8 :_32bits_mode

  53. _32bits_mode:
  54.     ;下面初始化C语言可能会用到的寄存器
  55.     mov ax, 0x10
  56.     mov ds, ax
  57.     mov ss, ax
  58.     mov es, ax
  59.     mov fs, ax
  60.     mov gs, ax
  61.     xor eax,eax
  62.     xor ebx,ebx
  63.     xor ecx,ecx
  64.     xor edx,edx
  65.     xor edi,edi
  66.     xor esi,esi
  67.     xor ebp,ebp
  68.     xor esp,esp
  69.     ;初始化栈,C语言需要栈才能工作
  70.     mov esp,0x9000
  71.     ;调用C语言函数main
  72.     call main
  73.     ;让CPU停止执行指令
  74. halt_step:
  75.     halt
  76.     jmp halt_step


  77. GDT_START:
  78. knull_dsc: dq 0
  79. kcode_dsc: dq 0x00cf9e000000ffff
  80. kdata_dsc: dq 0x00cf92000000ffff
  81. k16cd_dsc: dq 0x00009e000000ffff
  82. k16da_dsc: dq 0x000092000000ffff
  83. GDT_END:

  84. GDT_PTR:
  85. GDTLEN    dw GDT_END-GDT_START-1
  86. GDTBASE    dd GDT_START



这段代码不必多说,上面的注释已经写的很好了,汇编程序代码也写好了,最后的工作就是编译链接程序了,编译还好说,但是链接就不能用通常链接应用程序的方法了,因为这时裸机程序,所以我们得写个链接脚本来控制链接过程,如下:

点击(此处)折叠或打开

  1. ENTRY(_start)
  2. OUTPUT_ARCH(i386)
  3. SECTIONS
  4. {
  5. . = 0x200000;
  6. __begin_start_text = .;
  7. .start.text : ALIGN(4) { *(.start.text) }
  8. __end_start_text = .;
  9. __begin_text = .;
  10. .text : ALIGN(4) { *(.text) }
  11. __end_text = .;
  12. __begin_data = .;
  13. .data : ALIGN(4) { *(.data) }
  14. __end_data = .;
  15. __begin_rodata = .;
  16. .rodata : ALIGN(4) { *(.rodata) *(.rodata.*) }
  17. __end_rodata = .;
  18. __begin_kstrtab = .;
  19. .kstrtab : ALIGN(4) { *(.kstrtab) }
  20. __end_kstrtab = .;
  21. __begin_bss = .;
  22. .bss : ALIGN(4) { *(.bss) }
  23. __end_bss = .;
  24. }


上面的链接脚本最关键的是告诉LD链接器,我们的程序从0x200000的内存地址开始运行。最后还要写个makefile控制编译、链接过程。如下:

点击(此处)折叠或打开

  1. MAKEFLAGS = -sR
  2. MKDIR = mkdir
  3. RMDIR = rmdir
  4. CP = cp
  5. CD = cd
  6. DD = dd
  7. RM = rm
  8. ASM = nasm
  9. CC = gcc
  10. LD = ld
  11. ASMBFLAGS = -f elf
  12. CFLAGS = -c -Os -std=c99 -m32 -Wall -Wshadow -W -Wconversion -Wno-sign-conversion -fno-stack-protector -fomit-frame-pointer -fno-builtin -fno-common -ffreestanding -Wno-unused-parameter -Wunused-variable
  13. LDFLAGS = -s -static -T hello.lds -n --oformat binary
  14. PMHELLO_OBJS :=
  15. PMHELLO_OBJS += entry.o helkrlmain.o vgastr.o
  16. PMHELLO_BIN = pmhello.bin
  17. .PHONY : build clean all link
  18. all: clean build link
  19. clean:
  20. $(RM) -f *.o *.bin
  21. build: $(PMHELLO_OBJS)
  22. link: $(PMHELLO_BIN)
  23. $(PMHELLO_BIN): $(PMHELLO_OBJS)
  24. $(LD) $(LDFLAGS) -o $@ $(PMHELLO_OBJS)
  25. %.o : %.asm
  26. $(ASM) $(ASMBFLAGS) -o $@ $<
  27. %.o : %.c
  28. $(CC) $(CFLAGS) -o $@ $<


安装测试,在linux系统下则非常方便,因为linux系统已经安装好了GRUB2,默认情况下,只要把pmhello.bin文件复制到linux系统的/boot/目录下,同时修改/boot/grub/目录下的grub.cfg文件。如下图所示:

 

重启计算机就可以看到PMHELLO启动选项了……

该项目代码地址是:

给主人留下些什么吧!~~

wodemaya20192019-07-25 08:15:09

厉害呀,前辈,这个程序安装到u盘,是不是就能开机启动呢

frankey20092016-10-11 12:38:17

这个牛逼了

申博真人娱乐网直营lmnos2016-03-24 13:35:26

leon_yu:这篇文章怎么还在首页啊,CU小编春节放假几个月?

这我就不知道?

回复 | 举报

leon_yu2016-02-16 17:31:16

这篇文章怎么还在首页啊,CU小编春节放假几个月?

lmnos2015-06-02 22:30:30

qfire:哥,你的内功好深厚!,能否介绍一些书籍给小弟学习一下(有关操作系统内核开发方面的),非常感谢!

这只是一点小case 到时看我的书吧

回复 | 举报
太阳城申博游戏下载官方 申博代理登入 www.1388msc.com 申博太阳城游戏帐号登入 菲律宾申博官方网址 申博开户直营网
菲律宾太阳娱乐登入网址 申博138娱乐官方网 申博手机版下载登入 太阳城申博代理加盟 老虎机微信支付充值 申博游戏手机版
申博太阳城138官网直营 www.22msc.com 新版太阳城申博开户 申博138代理直营网 www.yl3999.com 菲律宾申博娱乐直营网