linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* __init()
@ 2005-08-11 12:23 raja
  2005-08-11 12:47 ` __init() linux-os (Dick Johnson)
  0 siblings, 1 reply; 6+ messages in thread
From: raja @ 2005-08-11 12:23 UTC (permalink / raw)
  To: linux-c-programming, linux-kernel

Hi,
     Is there any way to execute my own __init() instead of default 
__init() while running an executable.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: __init()
  2005-08-11 12:23 __init() raja
@ 2005-08-11 12:47 ` linux-os (Dick Johnson)
  2005-08-12 19:29   ` fdisk & LBA Nanakos Chrysostomos
  0 siblings, 1 reply; 6+ messages in thread
From: linux-os (Dick Johnson) @ 2005-08-11 12:47 UTC (permalink / raw)
  To: raja; +Cc: linux-c-programming, linux-kernel


On Thu, 11 Aug 2005, raja wrote:

> Hi,
>     Is there any way to execute my own __init() instead of default
> __init() while running an executable.
> -

Sure you link your object file with your own instead of using
the default....

     gcc -c -o myprog.o myprog.c
     as -o start.o start.S

     ld -o myprog myprog.o start.o /lib/libc.so.6
                         |       |              |___ runtime lib
                         |       |__________________ Your startup
                         |__________________________ Your program

Startup starts with a label _start. You may have to write it
in assembly. It calls main() and must never return. Instead
it calls exit() with whatever main() returned, to quit.

__init() is some M$ thing. Linux executables start with
_start().

Cheers,
Dick Johnson
Penguin : Linux version 2.6.12 on an i686 machine (5537.79 BogoMips).
Warning : 98.36% of all statistics are fiction.
.
I apologize for the following. I tried to kill it with the above dot :

****************************************************************
The information transmitted in this message is confidential and may be privileged.  Any review, retransmission, dissemination, or other use of this information by persons or entities other than the intended recipient is prohibited.  If you are not the intended recipient, please notify Analogic Corporation immediately - by replying to this message or by sending an email to DeliveryErrors@analogic.com - and destroy all copies of this information, including any attachments, without reading or disclosing them.

Thank you.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* fdisk & LBA
  2005-08-11 12:47 ` __init() linux-os (Dick Johnson)
@ 2005-08-12 19:29   ` Nanakos Chrysostomos
  2005-08-12 19:45     ` Lennart Sorensen
  0 siblings, 1 reply; 6+ messages in thread
From: Nanakos Chrysostomos @ 2005-08-12 19:29 UTC (permalink / raw)
  To: linux-c-programming; +Cc: linux-kernel

Hi all,i want to retrieve the partition table of a primary extended
partition.
My MBR partition table ,says that the LBA Partition Start sector for the
extended partition is 10281600.It is the same that i find with my C code
and through fdisk usage.
How can i use this value to seek(lseek) to this point through the main
block file (/dev/hda or /dev/hdb) and read the partition table of the
logical partition?



Thanks in advance.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: fdisk & LBA
  2005-08-12 19:29   ` fdisk & LBA Nanakos Chrysostomos
@ 2005-08-12 19:45     ` Lennart Sorensen
  2005-08-12 20:48       ` Nanakos Chrysostomos
  0 siblings, 1 reply; 6+ messages in thread
From: Lennart Sorensen @ 2005-08-12 19:45 UTC (permalink / raw)
  To: Nanakos Chrysostomos; +Cc: linux-c-programming, linux-kernel

On Fri, Aug 12, 2005 at 10:29:13PM +0300, Nanakos Chrysostomos wrote:
> Hi all,i want to retrieve the partition table of a primary extended
> partition.
> My MBR partition table ,says that the LBA Partition Start sector for the
> extended partition is 10281600.It is the same that i find with my C code
> and through fdisk usage.
> How can i use this value to seek(lseek) to this point through the main
> block file (/dev/hda or /dev/hdb) and read the partition table of the
> logical partition?

Multiply by the sector size (probably 512 bytes).

Len Sorensen

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: fdisk & LBA
  2005-08-12 19:45     ` Lennart Sorensen
@ 2005-08-12 20:48       ` Nanakos Chrysostomos
  2005-08-12 21:11         ` Lennart Sorensen
  0 siblings, 1 reply; 6+ messages in thread
From: Nanakos Chrysostomos @ 2005-08-12 20:48 UTC (permalink / raw)
  To: Lennart Sorensen; +Cc: linux-c-programming

Yes,the sector size is 512 bytes,but this is not the beginning of my
fourth partition.Please check the code below,and if you can please test
it..

mbr.c
------
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>


struct mbr {
        unsigned char boot_indicator;
        unsigned char s_head;
        unsigned char s_sector;
        unsigned char s_cylinder;
        unsigned char f_desc;
        unsigned char e_head;
        unsigned char e_sector;
        unsigned char e_cylinder;
        unsigned int rs_sector;
        unsigned int n_sectors;
} __attribute__((packed));



int main()
{
        int fd;
        struct mbr s;


        fd= open("/dev/hdb",O_RDONLY);
        lseek(fd,0x01ee,SEEK_SET); /* This is the 4rth entry,extended for
me*/
        read(fd,&s,sizeof(struct mbr));

        printf("Partition Entry 1:\n");
        printf("Boot Indicator: %#x\n",s.boot_indicator);
        printf("Starting head %u, cylinder %u, sector
%u.\n",s.s_head,((s.s_sector &
0xc0)<<2)+s.s_cylinder,s.s_sector&0x3f);
        printf("Filesystem descriptor: %#x\n",s.f_desc);
        printf("Ending head %u, cylinder %u, sector
%u.\n",s.e_head,((s.e_sector & 0xc0)<<2)+
s.e_cylinder,s.e_sector&0x3f);
        printf("Starting sector: %u\n",s.rs_sector);
        printf("Number of sectors in partition: %u\n",s.n_sectors);

        fd= open("/dev/hdb4",O_RDONLY); /* Where is this in hdb,offset??*/
        lseek(fd,446L,SEEK_SET);
        read(fd,&s,sizeof(struct mbr));

        printf("\nPartition Entry 4: Extended partition\n");
        printf("Boot Indicator: %#x\n",s.boot_indicator);
        printf("Starting head %u, cylinder %u, sector
%u.\n",s.s_head,((s.s_sector &
0xc0)<<2)+s.s_cylinder,s.s_sector&0x3f);
        printf("Filesystem descriptor: %#x\n",s.f_desc);
        printf("Ending head %u, cylinder %u, sector
%u.\n",s.e_head,((s.e_sector & 0xc0)<<2)+
s.e_cylinder,s.e_sector&0x3f);
        printf("Starting sector: %u\n",s.rs_sector);
        printf("Number of sectors in partition: %u\n",s.n_sectors);

        return 0;
}




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: fdisk & LBA
  2005-08-12 20:48       ` Nanakos Chrysostomos
@ 2005-08-12 21:11         ` Lennart Sorensen
  0 siblings, 0 replies; 6+ messages in thread
From: Lennart Sorensen @ 2005-08-12 21:11 UTC (permalink / raw)
  To: Nanakos Chrysostomos; +Cc: linux-c-programming

On Fri, Aug 12, 2005 at 11:48:22PM +0300, Nanakos Chrysostomos wrote:
> Yes,the sector size is 512 bytes,but this is not the beginning of my
> fourth partition.Please check the code below,and if you can please test
> it..
> 
> mbr.c
> ------
> #include <fcntl.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
> 
> 
> struct mbr {
>         unsigned char boot_indicator;
>         unsigned char s_head;
>         unsigned char s_sector;
>         unsigned char s_cylinder;
>         unsigned char f_desc;
>         unsigned char e_head;
>         unsigned char e_sector;
>         unsigned char e_cylinder;
>         unsigned int rs_sector;
>         unsigned int n_sectors;
> } __attribute__((packed));
> 
> 
> 
> int main()
> {
>         int fd;
>         struct mbr s;
> 
> 
>         fd= open("/dev/hdb",O_RDONLY);
>         lseek(fd,0x01ee,SEEK_SET); /* This is the 4rth entry,extended for
> me*/
>         read(fd,&s,sizeof(struct mbr));
> 
>         printf("Partition Entry 1:\n");
>         printf("Boot Indicator: %#x\n",s.boot_indicator);
>         printf("Starting head %u, cylinder %u, sector
> %u.\n",s.s_head,((s.s_sector &
> 0xc0)<<2)+s.s_cylinder,s.s_sector&0x3f);
>         printf("Filesystem descriptor: %#x\n",s.f_desc);
>         printf("Ending head %u, cylinder %u, sector
> %u.\n",s.e_head,((s.e_sector & 0xc0)<<2)+
> s.e_cylinder,s.e_sector&0x3f);
>         printf("Starting sector: %u\n",s.rs_sector);
>         printf("Number of sectors in partition: %u\n",s.n_sectors);
> 
>         fd= open("/dev/hdb4",O_RDONLY); /* Where is this in hdb,offset??*/

It is wherever the partition entry in sector 0 of hdb says partition 4
starts.

Why didn't you just print all the partition table entries above rather
than just #1, especially since in this case it is number 4 you care
about.

Print out the start sector number for partition 4 above and you should
find the offset for the extended partition table, in the cases where
partition 4 is the extended partition.

Seek to that location, read the partition table there.  That should
contain either just a primary partition, or a primary partition and
another extended partition.

In case it had another extended partition, repeat until no more extended
partitions found.

>         lseek(fd,446L,SEEK_SET);
>         read(fd,&s,sizeof(struct mbr));
> 
>         printf("\nPartition Entry 4: Extended partition\n");
>         printf("Boot Indicator: %#x\n",s.boot_indicator);
>         printf("Starting head %u, cylinder %u, sector
> %u.\n",s.s_head,((s.s_sector &
> 0xc0)<<2)+s.s_cylinder,s.s_sector&0x3f);
>         printf("Filesystem descriptor: %#x\n",s.f_desc);
>         printf("Ending head %u, cylinder %u, sector
> %u.\n",s.e_head,((s.e_sector & 0xc0)<<2)+
> s.e_cylinder,s.e_sector&0x3f);
>         printf("Starting sector: %u\n",s.rs_sector);
>         printf("Number of sectors in partition: %u\n",s.n_sectors);
> 
>         return 0;
> }

Say you had this partition table:
         start sector    number of sectors
pri1     1               10 (hda1)
pri2     11              20 (hda2)
pri3     31              10 (hda3)
pri4     41              100 (extended)

then at sector 41 you would find another partition table:
pri1     42              9 (hda5)
pri2     51              90 (extended)

Then sector 51 contains a partition table:
pri1     52              19 (hda6)
pri2     71              70 (extended)

Then sector 71 has a partition table:
pri1     72              69 (hda7)

And no more extended entries, so you are done.

C/H/S entries are entirely ignored (or should be) on modern drives.
Only start sector and total sectors are relevant as far as I understand
things.

Len Sorensen

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-08-12 21:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-11 12:23 __init() raja
2005-08-11 12:47 ` __init() linux-os (Dick Johnson)
2005-08-12 19:29   ` fdisk & LBA Nanakos Chrysostomos
2005-08-12 19:45     ` Lennart Sorensen
2005-08-12 20:48       ` Nanakos Chrysostomos
2005-08-12 21:11         ` Lennart Sorensen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).