資源簡介
linux內核版本
2.6.16的內核版本
源代碼
內核分析
代碼片段和文件信息
/*
?*?arch/alpha/boot/bootp.c
?*
?*?Copyright?(C)?1997?Jay?Estabrook
?*
?*?This?file?is?used?for?creating?a?bootp?file?for?the?Linux/AXP?kernel
?*
?*?based?significantly?on?the?arch/alpha/boot/main.c?of?Linus?Torvalds
?*/
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?“ksize.h“
extern?unsigned?long?switch_to_osf_pal(unsigned?long?nr
struct?pcb_struct?*?pcb_va?struct?pcb_struct?*?pcb_pa
unsigned?long?*vptb);
extern?void?move_stack(unsigned?long?new_stack);
struct?hwrpb_struct?*hwrpb?=?INIT_HWRPB;
static?struct?pcb_struct?pcb_va[1];
/*
?*?Find?a?physical?address?of?a?virtual?object..
?*
?*?This?is?easy?using?the?virtual?page?table?address.
?*/
static?inline?void?*
find_pa(unsigned?long?*vptb?void?*ptr)
{
unsigned?long?address?=?(unsigned?long)?ptr;
unsigned?long?result;
result?=?vptb[address?>>?13];
result?>>=?32;
result?<<=?13;
result?|=?address?&?0x1fff;
return?(void?*)?result;
}
/*
?*?This?function?moves?into?OSF/1?pal-code?and?has?a?temporary
?*?PCB?for?that.?The?kernel?proper?should?replace?this?PCB?with
?*?the?real?one?as?soon?as?possible.
?*
?*?The?page?table?muckery?in?here?depends?on?the?fact?that?the?boot
?*?code?has?the?L1?page?table?identity-map?itself?in?the?second?PTE
?*?in?the?L1?page?table.?Thus?the?L1-page?is?virtually?addressable
?*?itself?(through?three?levels)?at?virtual?address?0x200802000.
?*/
#define?VPTB ((unsigned?long?*)?0x200000000)
#define?L1 ((unsigned?long?*)?0x200802000)
void
pal_init(void)
{
unsigned?long?i?rev;
struct?percpu_struct?*?percpu;
struct?pcb_struct?*?pcb_pa;
/*?Create?the?dummy?PCB.??*/
pcb_va->ksp?=?0;
pcb_va->usp?=?0;
pcb_va->ptbr?=?L1[1]?>>?32;
pcb_va->asn?=?0;
pcb_va->pcc?=?0;
pcb_va->unique?=?0;
pcb_va->flags?=?1;
pcb_va->res1?=?0;
pcb_va->res2?=?0;
pcb_pa?=?find_pa(VPTB?pcb_va);
/*
?*?a0?=?2?(OSF)
?*?a1?=?return?address?but?we?give?the?asm?the?vaddr?of?the?PCB
?*?a2?=?physical?addr?of?PCB
?*?a3?=?new?virtual?page?table?pointer
?*?a4?=?KSP?(but?the?asm?sets?it)
?*/
srm_printk(“Switching?to?OSF?PAL-code?..?“);
i?=?switch_to_osf_pal(2?pcb_va?pcb_pa?VPTB);
if?(i)?{
srm_printk(“failed?code?%ld\n“?i);
__halt();
}
percpu?=?(struct?percpu_struct?*)
(INIT_HWRPB->processor_offset?+?(unsigned?long)?INIT_HWRPB);
rev?=?percpu->pal_revision?=?percpu->palcode_avail[2];
srm_printk(“Ok?(rev?%lx)\n“?rev);
tbia();?/*?do?it?directly?in?case?we?are?SMP?*/
}
static?inline?void
load(unsigned?long?dst?unsigned?long?src?unsigned?long?count)
{
memcpy((void?*)dst?(void?*)src?count);
}
/*
?*?Start?the?kernel.
?*/
static?inline?void
runkernel(void)
{
__asm__?__volatile__(
“bis?%0%0$27\n\t“
“jmp?($27)“
:?/*?no?outputs:?it?doesn‘t?even?return?*/
:?“r“?(START_ADDR));
}
extern?char?_end;
#define?KERNEL_ORIGIN?\
((((unsigned?long)&_end)?+?51
- 上一篇:深入淺出統計學中文版
- 下一篇:管理運籌學3.0
評論
共有 條評論