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

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

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

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结尾的都是段寄存器。其中

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

ljmp	0x9000, $go

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

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

CPU访问内存

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

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

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

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

如果你觉得有点收获,欢迎点个关注, 也欢迎分享给你身边的朋友。


#头条创作挑战赛# #Linux#

展开阅读全文

页面更新:2024-03-07

标签:内存   寄存器   字节   指令   过日子   源码   操作系统   位置   代码   基地   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top