Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Jan 2009 21:25:32 +0530
From:      Mehul Chadha <mehulc87@gmail.com>
To:        freebsd-hackers@freebsd.org, freebsd-ia32@freebsd.org
Subject:   doubts regarding System Initialization working (SYSINIT)
Message-ID:  <251d650c0901230755n769de861u1fe2e76dd28bbde8@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hello all,
                I have been browsing through the FreeBSD kernel's
source code trying to understand its working .

In the mi_startup() in /sys/kern/init_main.c all the SYSINIT objects
are sorted using bubble sort and then they are executed in order.

My doubt is that we have declared the pointer to the struct sysinit as
const pointer to a const in the macro definition of SYSINIT ie  when
the macro

SYSINIT(kmem, SI_SUB_KMEM, SI_ORDER_FIRST, kmeminit, NULL)  is
expanded  completely we get the following

static struct sysinit kmem_sys_init = { SI_SUB_KMEM, SI_ORDER_FIRST,
(sysinit_cfunc_t)(sysinit_
nfunc_t)kmeminit, ((void *)(((void *)0))) }; static void const * const
__set_sysinit_set_sym_kmem_sys_init __attribute__((__section__("set_"
"sysinit_set"))) __attribute__((__used__)) = &kmem_sys_init;

Here we see that the pointer is of type const and to a const but when we sort
and swap using
                              *sipp=*xipp;

We are trying to change the address of const pointer to a new address
in which case it should segfault but it works fine.

Why does it not segfault it seems I have not understood the concept
behind using const *const... I will be very thankful if you can help
me with it.


Regards,
Mehul



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?251d650c0901230755n769de861u1fe2e76dd28bbde8>