国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux-0.11 boot目錄head.s詳解

這篇具有很好參考價值的文章主要介紹了Linux-0.11 boot目錄head.s詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Linux-0.11 boot目錄head.s詳解

模塊簡介

在head.s中,操作系統(tǒng)主要做了如下幾件事:

  • 重新設置中斷描述符和全局描述符
  • 檢查A20地址線是否開啟
  • 檢查數學協(xié)處理器
  • 初始化頁表并開啟分頁
  • 跳轉到main函數執(zhí)行

過程詳解

重新設置IDT和GDT

在setup.s中我們已經設置過了IDT和GDT, 為什么還要再設置一遍?

因為setup.s中設置的IDT和GDT后面會被覆蓋,因此在head.S中會重新設置一遍。

startup_32:
	movl $0x10,%eax
	mov %ax,%ds
	mov %ax,%es
	mov %ax,%fs
	mov %ax,%gs
	lss stack_start,%esp
	call setup_idt     !設置中斷
	call setup_gdt     !設置全局描述符表
	movl $0x10,%eax		# reload all the segment registers
	mov %ax,%ds		# after changing gdt. CS was already
	mov %ax,%es		# reloaded in 'setup_gdt'
	mov %ax,%fs
	mov %ax,%gs
	lss stack_start,%esp

中斷門描述符的格式如下所示:

Linux-0.11 boot目錄head.s詳解

檢查A20地址線是否開啟

下面用于檢測A20地址線是否已經開啟。

	xorl %eax,%eax
1:	incl %eax		# check that A20 really IS enabled
	movl %eax,0x000000	# loop forever if it isn't
	cmpl %eax,0x100000
	je 1b

檢查數學協(xié)處理器

下面用于檢查數學協(xié)處理器芯片是否存在

	movl %cr0,%eax		# check math chip
	andl $0x80000011,%eax	# Save PG,PE,ET
/* "orl $0x10020,%eax" here for 486 might be good */
	orl $2,%eax		# set MP
	movl %eax,%cr0
	call check_x87
	jmp after_page_tables

/*
 * We depend on ET to be correct. This checks for 287/387.
 */
check_x87:
	fninit     !向協(xié)處理發(fā)出初始化命令
	fstsw %ax  !取協(xié)處理器狀態(tài)字到ax寄存器中
	cmpb $0,%al
	je 1f			/* no coprocessor: have to set bits */
	movl %cr0,%eax
	xorl $6,%eax		/* reset MP, set EM */
	movl %eax,%cr0
	ret

初始化頁表并開啟分頁

下面這里將進行頁表的安裝,安裝的過程參考下面這張圖:
Linux-0.11 boot目錄head.s詳解

after_page_tables:
	pushl $0		# These are the parameters to main :-)
	pushl $0
	pushl $0
	pushl $L6		# return address for main, if it decides to.
	pushl $main
	jmp setup_paging

setup_paging:
	movl $1024*5,%ecx		/* 5 pages - pg_dir+4 page tables */
	xorl %eax,%eax
	xorl %edi,%edi			/* pg_dir is at 0x000 */
	cld;rep;stosl
	movl $pg0+7,pg_dir		/* set present bit/user r/w */
	movl $pg1+7,pg_dir+4		/*  --------- " " --------- */
	movl $pg2+7,pg_dir+8		/*  --------- " " --------- */
	movl $pg3+7,pg_dir+12		/*  --------- " " --------- */
	movl $pg3+4092,%edi
	movl $0xfff007,%eax		/*  16Mb - 4096 + 7 (r/w user,p) */
	std
1:	stosl			/* fill pages backwards - more efficient :-) */
	subl $0x1000,%eax
	jge 1b
	cld
	xorl %eax,%eax		 !設置頁目錄表基址寄存器cr3的值
	movl %eax,%cr3		
	movl %cr0,%eax       !設置啟動使用分頁處理
	orl $0x80000000,%eax
	movl %eax,%cr0		/* set paging (PG) bit */
	ret			/* this also flushes prefetch-queue */

跳轉到main函數執(zhí)行

在setup_paging執(zhí)行完畢之后,會通過ret返回,ret指令會將棧頂的內容彈出到PC指針中去執(zhí)行。此時esp指向的位置存放的是main函數的地址。因此接下來會執(zhí)行main函數。

注意到在將main入棧時,還一同入棧了一些其他參數

	pushl $0		# These are the parameters to main :-)
	pushl $0
	pushl $0
	pushl $L6

這里就需要回顧一下c語言的調用規(guī)約,如下圖所示:

Linux-0.11 boot目錄head.s詳解

因此這里可以得到L6是main函數的返回值。立即數0,0,0將會被作為main函數的入參。

接下來再看下面的代碼就很清晰了,實際就是在建立好頁表的映射關系后,就開始跳轉到main函數去執(zhí)行了(init/main.c)。

after_page_tables:
	pushl $0		# These are the parameters to main :-)
	pushl $0
	pushl $0
	pushl $L6		# return address for main, if it decides to.
	pushl $main
	jmp setup_paging

setup_paging:
   ...
   ret

Q & A

setup_paging在建立頁表時會將head.s的部分代碼覆蓋,怎么保證不會把正在執(zhí)行的代碼覆蓋?

可以通過反匯編查看一下system模塊的內存分布

objdump -d tools/system

如下所示:

00000000 <pg_dir>:
       0:	b8 10 00 00 00       	mov    $0x10,%eax
       5:	8e d8                	mov    %eax,%ds
	   ...
0000005a <check_x87>:
      5a:	db e3                	fninit 
      5c:	9b df e0             	fstsw  %ax
      5f:	3c 00                	cmp    $0x0,%al
	  ...
00000071 <setup_idt>:
      71:	8d 15 28 54 00 00    	lea    0x5428,%edx
      77:	b8 00 00 08 00       	mov    $0x80000,%eax
	  ...
0000008e <rp_sidt>:
      8e:	89 07                	mov    %eax,(%edi)
      90:	89 57 04             	mov    %edx,0x4(%edi)
	  ...
000000a1 <setup_gdt>:
      a1:	0f 01 15 b2 54 00 00 	lgdtl  0x54b2
      a8:	c3                   	ret    
	...
00001000 <pg0>:
	...

00002000 <pg1>:
	...

00003000 <pg2>:
	...

00004000 <pg3>:
	...
00005000 <tmp_floppy_area>:
	...
00005400 <after_page_tables>:
    5400:	6a 00                	push   $0x0
    5402:	6a 00                	push   $0x0
	...
00005412 <L6>:
    5412:	eb fe                	jmp    5412 <L6>
00005414 <int_msg>:
    5414:	55                   	push   %ebp
    5415:	6e                   	outsb  %ds:(%esi),(%dx)
	...
00005428 <ignore_int>:
    5428:	50                   	push   %eax
    5429:	51                   	push   %ecx
	...
0000544e <setup_paging>:
    544e:	b9 00 14 00 00       	mov    $0x1400,%ecx
    5453:	31 c0                	xor    %eax,%eax
    5455:	31 ff                	xor  
	...
000054aa <idt_descr>:
    54aa:	ff 07                	incl   (%edi)
    54ac:	b8 54 00 00 00       	mov    $0x54,%eax
	...

000054b2 <gdt_descr>:
    54b2:	ff 07                	incl   (%edi)
    54b4:	b8                   	.byte 0xb8
    54b5:	5c                   	pop    %esp
	...

000054b8 <idt>:
	...

00005cb8 <gdt>:
	...
    5cc0:	ff 0f                	decl   (%edi)

可以看到代碼標號setup_page的起始地址是0000544e,而內存頁表和頁目錄表的地址范圍是0x0000-0x5000。因此當程序執(zhí)行到setup_page時,將建立頁目錄表和頁表, 這將會覆蓋0x0000-0x5000的部分代碼,即pg_dir,check_x87,setup_idt,rp_sidt,setup_gdt, 并不會覆蓋到setup_page的代碼,head.s在代碼的分布計算上確實是費了一番功夫。


文中如有表達不正確之處,歡迎大家與我交流, 微信codebuilding.文章來源地址http://www.zghlxwxcb.cn/news/detail-461982.html

到了這里,關于Linux-0.11 boot目錄head.s詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Linux 0.11: 從開機到執(zhí)行shell

    Linux 0.11: 從開機到執(zhí)行shell

    參考閃客的系列,將開機到執(zhí)行shell的整個過程濃縮成本文。 https://github.com/dibingfa/flash-linux0.11-talk 當按下開機鍵的那一刻,在主板上提前寫死的固件程序? BIOS ?會將硬盤中 啟動區(qū)的 512 字節(jié) 的數據,原封不動復制到 內存中的 0x7c00 ?這個位置,并跳轉到那個位置進行執(zhí)行。

    2024年04月13日
    瀏覽(14)
  • 操作系統(tǒng)實驗 2.3系統(tǒng)調用:linux-0.11-lab “為版本0內核增加一個系統(tǒng)調用getjiffies” 和 “在用戶程序中使用新增的系統(tǒng)調用”

    操作系統(tǒng)實驗 2.3系統(tǒng)調用:linux-0.11-lab “為版本0內核增加一個系統(tǒng)調用getjiffies” 和 “在用戶程序中使用新增的系統(tǒng)調用”

    打開 vscode ,在如圖所示位置打開 ~/os/linux-0.11-lab/0 文件夾 1.定義getjiffies系統(tǒng)調用 題目中給的提示:進入到 unistd.h 文件中 閱讀代碼,可以發(fā)現上圖劃線處有個系統(tǒng)調用名為 getpid :返回當前進程號——這與我們期望實現的功能類似:通過系統(tǒng)調用返回jiffies值。 于是此時希望

    2023年04月08日
    瀏覽(109)
  • 【Linux0.11代碼分析】04 之 head.s 啟動流程

    系列文章如下: 系列文章匯總:《【Linux0.11代碼分析】之 系列文章鏈接匯總(全)》 . 1.《【Linux0.11代碼分析】01 之 代碼目錄分析》 2.《【Linux0.11代碼分析】02 之 bootsect.s 啟動流程》 3.《【Linux0.11代碼分析】03 之 setup.s 啟動流程》 4.《【Linux0.11代碼分析】04 之 head.s 啟動流程

    2024年02月03日
    瀏覽(21)
  • windows一鍵安裝redis7.0.11

    windows一鍵安裝redis7.0.11

    下載地址: https://gitcode.net/zengliguang/windows_redis7.0.11_offline_install.git ? 使用git進行進行clone下載?? 在電腦桌面或者其他文件夾下?,鼠標右鍵點擊? 選擇git?clone??,下圖中url為下載地址,Directory為本地存儲路徑,點擊ok開始下載 如下圖所示已成功下載 ? 雙擊?redis-install-win.ba

    2024年02月08日
    瀏覽(27)
  • 【公告】BSV節(jié)點軟件發(fā)布最新升級版本v1.0.11

    【公告】BSV節(jié)點軟件發(fā)布最新升級版本v1.0.11

    發(fā)表時間:2022年4月21日 信息來源:bitcoinsv.io 本次新發(fā)布的v1.0.11是基于v1.0.10版的推薦升級版本,對交易費的配置選項進行了一些更改,并修復了一些錯誤。? 本次發(fā)布的軟件里,相較此前版本的變更內容具體如下: 對以下配置選項進行了更名 ?-blockmintxfee 默認禁用 Bloom 過濾

    2023年04月08日
    瀏覽(48)
  • 阿里巴巴開源Chat2DB v1.0.11 初體驗

    阿里巴巴開源Chat2DB v1.0.11 初體驗

    作為一名阿里巴巴開源項目的擁護者,從Chat2DB開源至今都有關注這個開源項目,因為之前的版本還存在較多BUG,暫時就沒有分享,目前升級到 v1.0.11 版本后,我來談談我個人的一個使用感受 Chat2DB 是一款有開源免費的多數據庫客戶端工具,支持windows、mac本地安裝,也支持服

    2024年02月09日
    瀏覽(24)
  • springboot3.0.11-SNAPSHOT使用knife4j-openapi3所遇見的問題

    springboot3.0.11-SNAPSHOT使用knife4j-openapi3所遇見的問題

    ide2021 jdk17 springboot3.0.11-SNAPSHOT 在使用springboot3寫完一個項目后,想快速生成一篇接口文檔,供自己觀看。在網上沖浪一段時間后,發(fā)現使用Swagger文檔比較合適,通過少量的注解來完成一篇復雜的文檔。說干就干,直接cope網上的資料寫一個demo來用,發(fā)現項目無法正常啟動。在

    2024年02月04日
    瀏覽(25)
  • Docker-Compose編排Nginx1.25.1+PHP7.4.33+Redis7.0.11環(huán)境

    實踐說明:基于RHEL7(CentOS7.9)部署docker環(huán)境(23.0.1、24.0.2),編排也可應用于RHEL7-9(如AlmaLinux9.1),但因為docker的特性,適用場景是不限于此的。 文檔形成時期:2017-2023年 因系統(tǒng)或軟件版本不同,構建部署可能略有差異,但本文未做細分,對稍有經驗者應不存在明顯障礙。 因軟件

    2024年01月22日
    瀏覽(19)
  • Linux /dev目錄詳解和Linux系統(tǒng)各個目錄的作用

    在linux下,/dev目錄是很重要的,各種設備都在下面。下面簡單總結一下: dev是設備(device)的英文縮寫。 /dev這個目錄對所有的用戶都十分重要。 因為在這個目錄中包含了所有Linux系統(tǒng)中使用的外部設備。但是這里并不是放的外部設備的驅動程序,這一點和 windows ,dos操作系統(tǒng)不

    2024年04月11日
    瀏覽(21)
  • (三) Linux基本目錄詳解

    (三) Linux基本目錄詳解

    (一) Linux入門概述 (二) Linux環(huán)境搭建 (三)Linux基本目錄詳解 了解Linux文件系統(tǒng)的目錄結構,是學好Linux的至關重要的一步.,深入了解linux文件目錄結構的標準和每個目錄的詳細功能,對于我們用好linux系統(tǒng)只管重要,下面我們就開始了解一下linux目錄結構的相關知識。

    2024年02月04日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包