El jue, 14-08-2008 a las 20:00 +0200, Robert Millan escribió: > On Thu, Aug 14, 2008 at 06:38:41PM +0200, Javier Martín wrote: > > Yes, but this is a "kernel" design decision that is specified nowhere > > to the modules writers. Thus, this could change tomorrow and the > > scheme would break down. > > GRUB is being developed as a whole, which includes kernel and modules. If > we modify the kernel in a way that could break modules, it's part of the > procedure to check modules and make sure they don't break because of this > (although, of course, we could always make mistakes). >
That is a very sane policy, but in this case I'm arguing that an improvement could be made so that such process would not be necessary, or would be much lighter, regarding a particular section of the kernel because modules would not rely on certain assumptions about the internal implementation of GRUB: separation of interface and implementation. However, there is not a consistent, fully-documented kernel-module interface, and module developers usually do not know what invariants hold in their environment - they find it by trial and error. This needs to change eventually, particularly in the documentation part (please avoid GRUB ending like ALSA): the GRUBInternals page in the wiki should be filled up and updated a bit more often. WRT "kernel and modules going hand by hand", think about external modules: if the drivemap module is finally rejected for introduction in GRUB, I will not scrap it, but keep it as a module external to the official GNU sources and possibly offer it in a web in the form of patches to the official GRUB2. In this case, changes made to the kernel would not take into account that module, which would break if I weren't monitoring this list daily. Additionally, the cost of this function in platforms which don't have any structs registered yet, as the function could be a stub like this: void* grub_machine_get_platform_structure (int stidx) { grub_error (GRUB_ERR_BAD_ARGUMENT, "Struct %d not supported", stidx); return 0; } The kernel space taken would most likely be less than 50 bytes. For i386-pc, it could be like this (also lightweight) function: void* grub_machine_get_platform_structure (int stidx) { grub_errno = GRUB_ERR_NONE; switch (stidx) { case GRUB_MACHINE_I386_IVT: return /* Call to asm function that runs SIDT in real mode */ ; case GRUB_MACHINE_I386_BDA: return (void*)0x400; default: grub_error (GRUB_ERR_BAD_ARGUMENT, "Struct %d not supported", stidx); return 0; } } BTW, I've noticed that when using the function, if the result is stored in "void* p", then the success check cannot only rely on "if (p)", because 0 is also a legal address (i.e. for the IVT). Thus, the checks should be like "if (p || grub_errno == GRUB_ERR_NONE)" with the implementation ensuring that errno is correctly set on success. -Habbit
signature.asc
Description: Esta parte del mensaje está firmada digitalmente
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel