Date: Fri, 19 Feb 1999 12:48:46 +0100 (MET) From: Emmanuel DELOGET <pixel@DotCom.FR> To: tlambert@primenet.com (Terry Lambert) Cc: hackers@FreeBSD.ORG (FreeBSD Hackers Mail List) Subject: Re: TEXT_SET() macro Message-ID: <199902191148.LAA26849@excalibur.oceanis.net> In-Reply-To: <199902130015.RAA28440@usr01.primenet.com> from Terry Lambert at "Feb 13, 1999 0:15:36 am"
next in thread | previous in thread | raw e-mail | index | archive | help
As the well known and respected Terry Lambert said... ->> ->> I wanna know how it's working both at compile time and at run time ->> ->> (for example, does a lkm (yes lkm, not kld, since I'm working on a ->> ->> 2.2.8 release...) can declare linker_sets, or add entries in a kernel ->> ->> linker_set, [for example , the sysctl_ one - seems that I'm very ->> ->> interested in sysctls :)]. Thaks a lot. -> -> The answer is that it can declare linker sets for its own use, but -> can not add entries to a kernel linker set, as in: -> ->> -> You can declare sysctls in modules, but the sysctl code will not pick ->> -> them up so it's pretty useless. There is work pending to make that ->> -> possible. ->> -> ->> This seems that the sysctl_order function is called only on ->> the system init (due to SYSINIT), but it may be possible ->> to find a workaroud (I'm working on this for 2.2.8, ->> on the base of the D. Rabson patch for -current). -> -> The reason that this doesn't work is that linker sets are an artifact -> of the linker. But I still think that it is possible to find a workaround. In fact, the kernel relies on the linker_set facilities to do the sysctl init. Since lkm/kld linker_sets and kernel ones are not 'plug and play', the best solution, I think, is to use another alternative - which is, in fact, build a real tree in the kernel memory (maybe it's not a good idea, I don't know). Doug Rabson done this on -current, and I do this on 2.2.8 (yes, I still use 2.2.8, for some reason I've allready explained -even if these reasons are not valid, in fact, the main on is : my chief told me to not use a 3.x based kernel :)...). The linker sets facilities are still used in this new version, but they are used only for the registration process. I suggest you look at the code of DR for a better understanding of what I think (but I'm sure you have allready done this, isn't it ?). -> -> [lots of very interesting info deleted - the best infos I've ever -> read about linker_sets, in fact. Thx a lot] -> -> In general, linker sets are a structure with an element count, -> followed by an array of pointers of element count length, followed -> be a NULL pointer. -> -> In application, the element count is not used, and instead the -> lists are traversed until the NULL pointer is encountered. -> Well, this last assertion seems to not be really true (at least in the 2.2.8 kernel, as I've not read the -current sources). A lot of stuff in the kernel are still using the ls_count field, and seems to not rely on the NULL entry at the end of ls_items. -> [lots of very interesting info deleted (again)] -> -> In order to make this work for KLD's, the linker set agregation would -> need to occur at runtime. There are very good reasons for doing this, -> the foremost being that an ELF section archiver could aggregate drivers -> with a generic (tiny) kernel in order to support boot devices not -> supported by the generic (tiny) kernel. It is very easy to envision a -> distribution kernel without any drivers or even VFS modules by default. -> -> Making KLD's linker sets work is another good reason. -> That would be good, yes. The idea of a driver-less kernel is very very good, since FreeBSD is a stable OS that can be used in embbeded systems (like the one we're doing now). -> -> There are two technology changes which have to occur to be able to -> support runtime instead of linktime aggregation: -> -> 1) The element count *must* be deprecated entirely, for all -> cases. This may be a mildly complex change to the C++ -> compiler, if the element count is used instead of a list -> traversal. This may be the case, if NULL is a valid tag -> for a constructor/destructor place holder. A secondary I'm not a master in C++ core design, but I think that NULL cannot be a valid entry for C/Ds, since whenever you do not specify any C or/and D, the C++ compiler creates one (if he can't, he generates an error). I may be wrong, of course, son anyone that have more informatiosn on this subject is welcome. -> issue is all code relying on linker set technology. Making -> these changes would fully normalize the lists. -> 2) Agregation of linker sets needs to span ELF sections. wouch ! I'm not mastering the ELF stuff, in fact. But it seems that I don't have to, cos you are here :) -> -> This last item is the most important, since the first item is like -> removing an appendix. Yes, but, as I said before, it's a very big appendix... Removing all the occurence of ls_count in the code should be very long. Perhaps I'll try to do this later on -current, but I have no time for this on those days, so we'll have a FreeBSD 16.4.32 for year 2012 - a new era, where Microsoft, hurted by the opensource stuff, begin to give Windows 2012 with its source code under GPL licencing... rahhh... I'll still use things that work ;) -> -> The kernel code would have to treat the linker sets as a list of -> data on which a procedure needs to be run, *and which can be later -> rerun*, as needed. -> -> This means the linker set data itself can not be treated as static. -> -> Finally, the body of the kernel and the body of divisible drivers -> within the kernel must be treated seperately. The way to do this -> is to leverage the new ELF nature of the kernel, and implement the -> kernel and the divisible drivers in seperate ELF sections. This -> allows the driver to be later severed, if necessary, without -> damaging what would otherwise be a static aggregate list. -> -> I know that GCC supports ELF section attribution of code via a -> #pragma, per the Visual C++ compiler, in its effort to supply a -> compiler capable of compiling Windows 95/98/NT/CE code, though I -> don't know if this has been echo'ed into compilers for all -> platforms (e.g.: Linux and FreeBSD). -> -> You would probably have to implement an inline function identification -> semantic, or something similar, in order to apply section naming to -> entire drivers. -> -> FreeBSD would also have to relink objects that implemented a single -> driver from multiple source files, into a single section-attributed -> module. -> -> At that point, you would be able to, at load time, treat the sysctl -> linker set data atrributed sections as a continuation of the -> initialization iteration that occurred at system load. Well... Analyzing what you said may turn into : you have to work for three years to finally add new sysctls in a lkm/kld... I think I prefer the DR solution (despite it may looks like a hack) :) -> Terry Lambert -> terry@lambert.org -- ____________________________________________________________________ Emmanuel DELOGET [pixel] pixel@{dotcom.fr,epita.fr} ---- DotCom SA -------------------------------------------------------------------- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902191148.LAA26849>