lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sun, 01 Jul 2007 15:19:30 -0700
From:	Jeremy Fitzhardinge <jeremy@...p.org>
To:	"Ahmed S. Darwish" <darwish.07@...il.com>
CC:	linux-kernel@...r.kernel.org
Subject: Re: [i386] Questions regarding provisional page tables initialization

Ahmed S. Darwish wrote:
> Hi list,
>
> AFAIK, in the initializaion phase, kernel builds pages tables with two
> mappings, identity and PAGE_OFFSET + C mapping. The provisional _global
> directory_ is contained in swapper_pg_dir variable. while the provisional 
> _page tables_ are stored starting from pg0, right after _end.
>
> There're some stuff that confused me for a full day about the code (head.S)
> that  accomplishes the above words:
>
> 	movl $(pg0 - __PAGE_OFFSET), %edi
> 	movl $(swapper_pg_dir - __PAGE_OFFSET), %edx	
> 	movl $0x007, %eax			/* 0x007 = PRESENT+RW+USER */
> 10:
> 	leal $0x007(%edi),%ecx			/* Create PDE entry */
>
> What does the address of 7 bytes displacement after %edi - the physical address
> of pg0 - represent ?. Why not just putting the address of %edi (the address of
> pagetable cell to be mapped by swapper_pg_dir) in %ecx without displacement?
>   

The pte format contains the pfn in the top 20 bits, and flags in the 
lower 12 bits.  As the comment says "0x007 = PRESENT+RW+USER".

>         page_pde_offset = (__PAGE_OFFSET >> 20)
> 	movl %ecx,(%edx)			/* Store identity PDE entry */
> 	movl %ecx,page_pde_offset(%edx)		/* Store kernel PDE entry */
>
> Why the pde_offset is PAGE_OFFSET >> 20 instead of PAGE_OFFSET >> 22 ?
> * 22 to right shift the whole page_shift (12) and pgdir_shift (10) bits.
>   

As Andreas said, its (PAGE_OFFSET >> 22) << 2.

>         [...]
> 	/* Initialize the 1024 _page table_ cells with %eax (0x007) */
> 	movl $1024, %ecx
> 11:
> 	stosl
> 	addl $0x1000,%eax
> 	loop 11b
>
> The page table entries beginning from pg0 (pointed by %edi) and following pages 
> are initialized with  the series 7 + 8 + 8 + ... for each cell. This series has
> the property of setting the PRESENT+RW+USER bits in the whole entries to 1 but it
> sets lots of the entries BASE address to 0 too. Why is this done ?
>   

I don't follow you.  Are you overlooking the 'L' on stosl?

    J
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ