前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux源码学习笔记day3 为访问内存做好哪些准备?

Linux源码学习笔记day3 为访问内存做好哪些准备?

作者头像
用户1072003
发布2023-02-23 17:06:59
2790
发布2023-02-23 17:06:59
举报
文章被收录于专栏:码上读书码上读书

上一次,我们看到已经把操作系统最开始的512个字节,通过256次复制到0x90000处,然后跳转到0x9000:go这里去执行。

今天我们主要看一下go标签具体做了啥?

代码语言:javascript
复制
go:	mov	%cs, %ax		# 将ds,es,ss都设置成移动后代码所在的段处(0x9000)
	mov	%ax, %ds
	mov	%ax, %es
	mov	%ax, %ss

	mov	$0xFF00, %sp # put stack at 0x9ff00.

这里看的都是mov指令。前四行就是把 cs 给到 ax, ds, es, ss 这几个寄存器。最后一行是 把寄存器sp的值给弄成 0xFF00。

简单认识这些寄存器

那为什么要这么弄呢? 我们需要对这些寄存器有一些基本了解。

以s结尾的都是段寄存器。其中

  • ds 是数据段寄存器,访问内存时作为基地址。现在的值是0x9000。
  • es 是扩展段寄存器,现在也是0x9000。
  • ss 是段寄存器,访问栈空间作为基地址,一般和栈顶寄存器sp搭伙过日子 (ss:sp)。现在ss是0x9000,sp是0xFF00,所以ss:sp指向的地址是0x9FF00处。
  • cs 是代码段寄存器, CPU要执行的代码在内存的位置,和寄存器ip 搭伙过日子(cs:ip)。

比如上次遇到过的那个跳转指令:

代码语言:javascript
复制
ljmp	0x9000, $go

这里cs 就是 0x9000, ip 就是 go。继续把这张图完善一下:

现在栈顶指针指向的位置也出来了。

CPU访问内存

CPU访问内存主要有三种途径:

  • 访问代码 cs:ip
  • 访问数据 ds:偏移量
  • 访问栈空间 ss:sp

那现在就明白了,给这些寄存器赋值就是为了给访问内存做好准备。

那一个操作系统的代码肯定不止 512个字节, 下一步我们接着学习,怎么把剩下的代码给弄到内存里来运行的?

我是老张!一个陪你成长的码农。我们下次见!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上读书 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单认识这些寄存器
  • CPU访问内存
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档