///////////////////////////////////////////////////////////////////////////////
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern char saved_command_line[];
/*
* Kesmeler hala etkin değil. Gerekli kurulumu yap, sonra etkinleştir
*/
lock_kernel();
printk(linux_banner);
/* Linux'da bellek yönetimi, esp. for setup_arch()
* Linux-2.4.4 MM Başlangıç durumuna getirme */
setup_arch(&command_line);
printk("Kernel command line: %s\n", saved_command_line);
/* linux/Documentation/kernel-parameters.txt
* The Linux BootPrompt-HowTo */
parse_options(command_line);
trap_init() {
#ifdef CONFIG_EISA
if (isa_readl(0x0FFFD9) == 'E'+('I'<<8)+('S'<<16)+('A'<<24))
EISA_bus = 1;
#endif
#ifdef CONFIG_X86_LOCAL_APIC
init_apic_mappings();
#endif
set_xxxx_gate(x, &func); // kurulum kapıları
cpu_init();
}
init_IRQ();
sched_init();
softirq_init() {
for (int i=0; i<32: i++)
tasklet_init(bh_task_vec+i, bh_action, i);
open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
}
time_init();
/*
* HACK ALERT! Bu erken. PCI ve bunun gibi kurulumları bitirdikten
* ve console_init()'in bunu farketmesinde önce konsolu etkinleştirmeliyiz.
* Birşeylerin kötü gitmesi durumunda bunun erkenden çıktı olmasını isteriz.
*/
console_init();
#ifdef CONFIG_MODULES
init_modules();
#endif
if (prof_shift) {
unsigned int size;
/* only text is profiled */
prof_len = (unsigned long) &_etext - (unsigned long) &_stext;
prof_len >>= prof_shift;
size = prof_len * sizeof(unsigned int) + PAGE_SIZE-1;
prof_buffer = (unsigned int *) alloc_bootmem(size);
}
kmem_cache_init();
sti();
// BogoMips mini-Howto
calibrate_delay();
// linux/Documentation/initrd.txt
#ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start && !initrd_below_start_ok &&
initrd_start < min_low_pfn << PAGE_SHIFT) {
printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
"disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
initrd_start = 0;
}
#endif
mem_init();
kmem_cache_sizes_init();
pgtable_cache_init();
/*
* Yüksek belleğe (highmem) sahip olan mimariler için, num_mappedpages
* çekirdeğin kullanabileceği bellek miktarını ifade eder. Diğer mimariler
* için toplam sayfa ile aynıdır. Her iki rakama da ihtiyaç duyarız çünkü
* bazı altsistemler çekirdeğin ne kadar bellek kullanabileceğine dayanarak
* başlangıç durumuna getirilir.
*/
if (num_mappedpages == 0)
num_mappedpages = num_physpages;
fork_init(num_mempages);
proc_caches_init();
vfs_caches_init(num_physpages);
buffer_init(num_physpages);
page_cache_init(num_physpages);
#if defined(CONFIG_ARCH_S390)
ccwcache_init();
#endif
signals_init();
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
#if defined(CONFIG_SYSVIPC)
ipc_init();
#endif
check_bugs();
printk("POSIX conformance testing by UNIFIX\n");
/*
* İlk işlemdeki (thread) iyi gidenleri sayarız
* atıl (idlers) gibi init de kilitsiz bir çekirdek işlemidir,
* sistem çağrısı yapar (ve böylece kilitlenir).
*/
smp_init() {
#ifndef CONFIG_SMP
# ifdef CONFIG_X86_LOCAL_APIC
APIC_init_uniprocessor();
# else
do { } while (0);
# endif
#else
/* Check smp_init(). */
#endif
}
rest_init() {
// init process, pid = 1
kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
unlock_kernel();
current->need_resched = 1;
// idle process, pid = 0
cpu_idle(); // never return
}
}