❶ 0.11版的linux內核中bootsect.s用的是什麼匯編
這是以前比較古老的一種匯編編譯器....
Begdata begbss這些都是一些標記,名字可以隨便改,標志著代碼段的起始位置....
❷ linux0.11 bootsect.s代碼里有shl cx,#9。這不是非法指令嗎
應該是計算2^9
❸ 在linux下無法備份bootsect.rh怎麼解決
你需要用Root帳戶(密碼即是管理員密碼)進行登錄才能取得許可權進行此操作
不是安裝完成後設置的帳戶,在安裝過程中會有一步提示你「輸入根密碼」,記得嗎,這個「根密碼」就是這個「根帳戶」——Root帳戶的密碼,根帳戶擁有最高的「超級管理員」許可權,可是進行一切系統設置的操作
❹ LINUX安裝程序的引導方式
安裝程序有從預編譯好的包(*.deb/*.rpm)安裝,deb包用dpkg命令安裝,rpm包用rpm命令安裝,命令詳細用法自己看man頁(man dpkg & man rpm),還有一種方法很煩,從源代碼編譯後安裝,首先你得有編譯環境和這個軟體所需要的所有函數庫文件,這個太多了,自己看看/lib目錄里有多少東西就知道了,編譯過程一般是先用tar解壓縮源代碼包,然後執行裡面的./configure或者./install腳本,然後,如果你執行的是./configure腳本還需要用make生成目標代碼,再用make install安裝到你的系統;安裝軟體就說完了,什麼?要使用windows下的軟體?建議你在windows下安裝好,再來linux里用wine執行,wine本身是個虛擬機,知道了吧?有點慢,兼容性也不好……,雙系統對xp沒影響,但是你不要裝vista,因為據說vista會使用MBR,這樣linux的引導管理器grub的stage1就沒處放了,啟動windows的方法很簡單啊,在/boot/grub/menu.lst里添加如下幾行:
title Windows XP #title 後面的東西隨便你寫,只是顯示給你看的
rootnoverify (hd0,0) #指定系統引導分區(就是Windows安裝所在分區)
chainloader +1 #鏈式引導載入,windows都是這樣的,按順序讀,讀一個位元組加1
hd0,0這兒式假設你windows安裝在第一個IDE通道上的主盤上的第一個分區,這個數字可能隨著你刪除分區會變,前一個數字0是規定第一個IDE通道上的主盤,後一個數字0表示第一個分區,如果你不確定是第幾個分區,在grub裡面試好了,反正啟動時有個按e進入編輯狀態的選項
❺ 為什麼linux0.11的bootsect.s中為什麼設置硬碟有效位AA55
aa55是硬體規定。。。
❻ Linux的bootsect.s 程序放在哪裡
........這個東西只存在內核源代碼里啊。教你個方法,使用搜索來查找文件位置。
find 目錄 -name bootsect.s
請把上面的目錄替換成你要開始查找源代碼的路徑所在目錄
❼ Linux系統開機時啟動內核步驟是什麼
實模式,並開始執行位於地址0xFFFF0處
的代碼,也就是ROM-BIOS起始位置的代碼。BIOS先進行一系列的系統自檢,然後初始化位
於地址0的中斷向量表。最後BIOS將啟動盤的第一個扇區裝入到0x7C00,並開始執行此處
的代碼。這就是對內核初始化過程的一個最簡單的描述。
最初,linux核心的最開始部分是用8086匯編語言編寫的。當開始運行時,核心將自
己裝入到絕對地址0x90000,再將其後的2k位元組裝入到地址0x90200處,最後將核心的其餘
部分裝入到0x10000。
當系統裝入時,會顯示Loading...信息。裝入完成後,控制轉向另一個實模式下的匯
編語言代碼boot/Setup.S。Setup部分首先設置一些系統的硬體設備,然後將核心從
0x10000處移至0x1000處。這時系統轉入保護模式,開始執行位於0x1000處的代碼。
接下來是內核的解壓縮。0x1000處的代碼來自於文件Boot/head.S,它用來初始化寄
存器和調用decompress_kernel( )程序。decompress_kernel( )程序由Boot/inflate.c,
Boot/unzip.c和Boot../misc.c組成。解壓縮後的數據被裝入到了0x100000處,這也是
linux不能在內存小於2M的環境下運行的主要原因。
解壓後的代碼在0x1010000處開始執行,緊接著所有的32位的設置都將完成: IDT、
GDT和LDT將被裝入,處理器初始化完畢,設置好內存頁面,最終調用start_kernel過程。
這大概是整個內核中最為復雜的部分。
[系統開始運行]
linux kernel 最早的C代碼從匯編標記startup_32開始執行
startup_32:
start_kernel
lock_kernel
trap_init
init_IRQ
sched_init
softirq_init
time_init
console_init
#ifdef CONFIG_MODULES
init_moles
#endif
kmem_cache_init
sti
calibrate_delay
mem_init
kmem_cache_sizes_init
pgtable_cache_init
fork_init
proc_caches_init
vfs_caches_init
buffer_init
page_cache_init
signals_init
#ifdef CONFIG_PROC_FS
proc_root_init
#endif
#if defined(CONFIG_SYSVIPC)
ipc_init
#endif
check_bugs
smp_init
rest_init
kernel_thread
unlock_kernel
cpu_idle
・startup_32 [arch/i386/kernel/head.S]
・start_kernel [init/main.c]
・lock_kernel [include/asm/smplock.h]
・trap_init [arch/i386/kernel/traps.c]
・init_IRQ [arch/i386/kernel/i8259.c]
・sched_init [kernel/sched.c]
・softirq_init [kernel/softirq.c]
・time_init [arch/i386/kernel/time.c]
・console_init [drivers/char/tty_io.c]
・init_moles [kernel/mole.c]
・kmem_cache_init [mm/slab.c]
・sti [include/asm/system.h]
・calibrate_delay [init/main.c]
・mem_init [arch/i386/mm/init.c]
・kmem_cache_sizes_init [mm/slab.c]
・pgtable_cache_init [arch/i386/mm/init.c]
・fork_init [kernel/fork.c]
・proc_caches_init
・vfs_caches_init [fs/dcache.c]
・buffer_init [fs/buffer.c]
・page_cache_init [mm/filemap.c]
・signals_init [kernel/signal.c]
・proc_root_init [fs/proc/root.c]
・ipc_init [ipc/util.c]
・check_bugs [include/asm/bugs.h]
・smp_init [init/main.c]
・rest_init
・kernel_thread [arch/i386/kernel/process.c]
・unlock_kernel [include/asm/smplock.h]
・cpu_idle [arch/i386/kernel/process.c]
start_kernel( )程序用於初始化系統內核的各個部分,包括:
*設置內存邊界,調用paging_init( )初始化內存頁面。
*初始化陷阱,中斷通道和調度。
*對命令行進行語法分析。
*初始化設備驅動程序和磁碟緩沖區。
*校對延遲循環。
最後的function'rest_init' 作了以下工作:
・開辟內核線程'init'
・調用unlock_kernel
・建立內核運行的cpu_idle環, 如果沒有調度,就一直死循環
實際上start_kernel永遠不能終止.它會無窮地循環執行cpu_idle.
最後,系統核心轉向move_to_user_mode( ),以便創建初始化進程(init)。此後,進程0開始進入無限循環。
初始化進程開始執行/etc/init、/bin/init 或/sbin /init中的一個之後,系統內核就不再對程序進行直接控制了。之後系統內核的作用主要是給進程提供系統調用,以及提供非同步中斷事件的處理。多任務機制已經建立起來,並開始處理多個用戶的登錄和fork( )創建的進程。
[init]
init是第一個進程,或者說內核線程
init
lock_kernel
do_basic_setup
mtrr_init
sysctl_init
pci_init
sock_init
start_context_thread
do_init_calls
(*call())-> kswapd_init
prepare_namespace
free_initmem
unlock_kernel
execve
[目錄]
--------------------------------------------------------------------------------
啟動步驟
系統引導:
涉及的文件
./arch/$ARCH/boot/bootsect.s
./arch/$ARCH/boot/setup.s
bootsect.S
這個程序是linux kernel的第一個程序,包括了linux自己的bootstrap程序,
但是在說明這個程序前,必須先說明一般IBM PC開機時的動作(此處的開機是指
"打開PC的電源"):
一般PC在電源一開時,是由內存中地址FFFF:0000開始執行(這個地址一定
在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此處的內容則是一個
jump指令,jump到另一個位於ROM BIOS中的位置,開始執行一系列的動作,包
括了檢查RAM,keyboard,顯示器,軟硬磁碟等等,這些動作是由系統測試代碼
(system test code)來執行的,隨著製作BIOS廠商的不同而會有些許差異,但都
是大同小異,讀者可自行觀察自家機器開機時,螢幕上所顯示的檢查訊息。
緊接著系統測試碼之後,控制權會轉移給ROM中的啟動程序
(ROM bootstrap routine),這個程序會將磁碟上的第零軌第零扇區讀入
內存中(這就是一般所謂的boot sector,如果你曾接觸過電腦病
毒,就大概聽過它的大名),至於被讀到內存的哪裡呢? --絕對
位置07C0:0000(即07C00h處),這是IBM系列PC的特性。而位在linux開機
磁碟的boot sector上的正是linux的bootsect程序,也就是說,bootsect是
第一個被讀入內存中並執行的程序。現在,我們可以開始來
看看到底bootsect做了什麼。
第一步
首先,bootsect將它"自己"從被ROM BIOS載入的絕對地址0x7C00處搬到
0x90000處,然後利用一個jmpi(jump indirectly)的指令,跳到新位置的
jmpi的下一行去執行,
第二步
接著,將其他segment registers包括DS,ES,SS都指向0x9000這個位置,
與CS看齊。另外將SP及DX指向一任意位移地址( offset ),這個地址等一下
會用來存放磁碟參數表(disk para- meter table )
第三步
接著利用BIOS中斷服務int 13h的第0號功能,重置磁碟控制器,使得剛才
的設定發揮功能。
第四步
完成重置磁碟控制器之後,bootsect就從磁碟上讀入緊鄰著bootsect的setup
程序,也就是setup.S,此讀入動作是利用BIOS中斷服務int 13h的第2號功能。
setup的image將會讀入至程序所指定的內存絕對地址0x90200處,也就是在內存
中緊鄰著bootsect 所在的位置。待setup的image讀入內存後,利用BIOS中斷服
務int 13h的第8號功能讀取目前磁碟的參數。
第五步
再來,就要讀入真正linux的kernel了,也就是你可以在linux的根目錄下看
到的"vmlinuz" 。在讀入前,將會先呼叫BIOS中斷服務int 10h 的第3號功能,
讀取游標位置,之後再呼叫BIOS 中斷服務int 10h的第13h號功能,在螢幕上輸
出字串"Loading",這個字串在boot linux時都會首先被看到,相信大家應該覺
得很眼熟吧。
第六步
接下來做的事是檢查root device,之後就仿照一開始的方法,利用indirect
jump 跳至剛剛已讀入的setup部份
第七步
setup.S完成在實模式下版本檢查,並將硬碟,滑鼠,內存參數寫入到 INITSEG
中,並負責進入保護模式。
第八步
操作系統的初始化。
❽ 我讀linux bootsect.S 文件好多不明白
這些只是定義一些常量,在會匯編代碼中會用到這些常量,
這些大多是根體系有關的量,通常固定不變
比如:boot_flag是操作系統第一個扇區的最後兩個位元組的內容
❾ 在早期的Linux中,開機時,為什麼不能直接將bootsect直接引導到0X90000處,卻要先引導到0X7c00
我記得0X7c00是boot引導的入口
但是協議規定
kernel boot setctor應該被放在90000-92000之間
所以BootSect會將自己移動到那去
❿ linux內核中bootsect 關閉軟碟機電動機的程序,看不懂
匯編是在x86平台i386的匯編,用的語法比較老用的as86匯編器,ld86連接器,這種語法類似intel匯編,但是linux0.11里就開頭用了這個,後面用的都是at&t匯編,後面的版本也全部用at&t替換了
loading system,,,上面下面都有13 10 ascii是回車換行 加起來24個字元
.org 508 是告訴匯編器分配內存地址時放在508位元組位置, 後面+.word=510 然後加上末尾的0xaa55的mbr標記剛好湊齊512位元組 組成一個可被bios識別的引導程序